Express 시니어 시스템 설계 면접
새 면접Q. 월간 활성 사용자 1000만 명 규모의 소셜 미디어 플랫폼에서 사용자 피드를 제공하는 RESTful API를 설계해야 합니다. 각 사용자는 평균 500명을 팔로우하고, 피드는 실시간성이 중요합니다. Express 기반으로 이 API의 엔드포인트 구조, 페이지네이션 전략, 응답 형식을 어떻게 설계하시겠습니까? 특히 성능과 확장성을 고려한 설계 트레이드오프를 설명해주세요.
Cursor 기반 페이지네이션과 Offset 기반의 장단점, 그리고 피드 생성 시점(Pull vs Push 모델)을 고려해보세요.
GET /api/v1/feed 엔드포인트를 설계하며, cursor 기반 페이지네이션을 채택합니다. Offset 방식은 대규모 데이터에서 OFFSET 연산이 느리지만, cursor는 마지막 조회 ID 기준으로 조회해 성능이 일정합니다. 응답에는 next_cursor와 has_more 필드를 포함해 클라이언트가 다음 페이지 존재 여부를 알 수 있게 합니다. 피드 생성은 Fanout-on-write(Push) 방식으로 게시물 작성 시 팔로워들의 피드 캐시를 미리 구성하되, 팔로워가 많은 인플루언서는 Fanout-on-read(Pull) 방식을 혼합해 Write 부하를 분산합니다. Rate limiting은 사용자당 분당 60회로 제한하고, ETag 헤더를 활용해 변경되지 않은 피드는 304 응답으로 대역폭을 절약합니다. API 버저닝은 URL 경로에 포함시켜 하위 호환성을 유지합니다.
- • Cursor 기반 페이지네이션으로 대규모 데이터 성능 보장
- • Hybrid Fanout 전략으로 읽기/쓰기 부하 균형
- • ETag와 캐싱 헤더를 활용한 대역폭 최적화
- • 명확한 API 버저닝 전략
대규모 SNS 서비스에서 타임라인 피드 API를 설계할 때 읽기 성능과 실시간성을 동시에 확보해야 하는 상황
인플루언서의 팔로워 수 기준을 어떻게 정하고, 두 가지 Fanout 방식을 어떻게 분기 처리하시겠습니까?
Q. Express 애플리케이션을 마이크로서비스 아키텍처로 전환하는 프로젝트를 리드하고 있습니다. 현재 모놀리식 구조는 사용자, 주문, 결제, 재고 도메인이 하나의 서버에 있습니다. 서비스를 어떤 기준으로 분리하고, 서비스 간 통신은 어떻게 설계하시겠습니까? API Gateway 도입과 데이터 일관성 문제에 대한 전략도 함께 설명해주세요.
Domain-Driven Design의 Bounded Context 개념과 Saga 패턴, 그리고 동기/비동기 통신의 트레이드오프를 생각해보세요.
DDD의 Bounded Context를 기준으로 사용자(User), 주문(Order), 결제(Payment), 재고(Inventory) 서비스로 분리합니다. 각 서비스는 독립적인 데이터베이스를 가지며, 서비스 간 직접 DB 접근을 금지해 결합도를 낮춥니다. API Gateway는 Express + http-proxy-middleware로 구현하여 라우팅, 인증, Rate Limiting을 중앙화하고, 클라이언트는 단일 엔드포인트만 알면 됩니다. 서비스 간 동기 통신은 gRPC로 빠른 응답이 필요한 조회에 사용하고, 비동기 통신은 RabbitMQ나 Kafka로 이벤트 기반 처리에 활용합니다. 분산 트랜잭션은 Saga 패턴의 Choreography 방식으로 구현하여, 주문 생성 시 OrderCreated 이벤트를 발행하면 결제와 재고 서비스가 각각 처리하고 실패 시 보상 트랜잭션을 실행합니다. Circuit Breaker 패턴을 적용해 특정 서비스 장애가 전체로 전파되지 않도록 합니다.
- • Bounded Context 기반 서비스 분리와 데이터베이스 독립성
- • API Gateway를 통한 횡단 관심사 중앙화
- • 동기(gRPC)/비동기(메시지 큐) 통신의 적절한 혼용
- • Saga 패턴으로 분산 트랜잭션 처리
모놀리식 서비스가 특정 도메인의 트래픽 증가로 병목이 발생할 때 독립적 확장을 위해 마이크로서비스로 전환하는 상황
Saga 패턴에서 Orchestration 방식과 Choreography 방식의 차이는 무엇이고, 각각 어떤 상황에 적합합니까?
Q. Express 기반 이커머스 API 서버가 블랙프라이데이 세일 기간에 평소 대비 50배의 트래픽을 처리해야 합니다. 수평 확장을 위한 무상태(stateless) 서버 설계, 로드 밸런싱 전략, 데이터베이스 병목 해결 방안을 구체적으로 설명해주세요. 특히 세션 관리와 파일 업로드 처리는 어떻게 하시겠습니까?
세션 저장소의 외부화, Read Replica, Connection Pooling, CDN 활용을 고려해보세요.
모든 Express 인스턴스를 stateless로 설계하기 위해 세션은 Redis Cluster에 저장하고 express-session의 store를 connect-redis로 설정합니다. JWT 토큰 방식도 병행하여 인증이 필요 없는 조회 API는 토큰만으로 처리해 Redis 부하를 줄입니다. 로드 밸런서는 Nginx나 AWS ALB를 사용하며, Least Connection 알고리즘으로 각 서버의 부하를 균등하게 분산합니다. 데이터베이스는 Master-Slave Replication을 구성해 읽기 쿼리는 여러 Read Replica로 분산하고, Connection Pool 크기를 적절히 조정해 연결 오버헤드를 줄입니다. 상품 이미지 같은 정적 자원은 S3 + CloudFront로 CDN 처리하고, 파일 업로드는 Pre-signed URL을 발급해 클라이언트가 직접 S3에 업로드하도록 해 서버 부하를 우회합니다. Auto Scaling Group을 구성해 CPU 사용률 70% 기준으로 자동 스케일 아웃되도록 설정합니다.
- • Redis 기반 외부 세션 저장소로 stateless 서버 구현
- • Read Replica와 Connection Pool로 DB 병목 해결
- • Pre-signed URL로 파일 업로드 부하 분산
- • Auto Scaling과 적절한 로드 밸런싱 알고리즘
대규모 프로모션이나 이벤트 기간에 갑작스러운 트래픽 급증을 안정적으로 처리해야 하는 상황
Redis Cluster가 장애로 다운되면 세션이 모두 유실됩니다. 이를 방지하기 위한 고가용성 전략은 무엇입니까?
Q. 뉴스 포털 사이트의 기사 조회 API를 Express로 개발 중입니다. 기사는 분당 수천 건 조회되지만 내용 변경은 드뭅니다. 다층 캐싱 전략(CDN, Redis, Application Level)을 어떻게 설계하고, 캐시 무효화(invalidation)는 어떻게 처리하시겠습니까? 실시간 조회수 집계도 함께 고려해주세요.
Cache-Aside 패턴, TTL 전략, Write-Through와 Write-Behind의 차이, 그리고 조회수 집계의 정확성과 성능 트레이드오프를 생각해보세요.
CDN 레벨에서는 CloudFront에 기사 HTML을 5분 TTL로 캐싱하고, Cache-Control 헤더를 public, max-age=300으로 설정합니다. Redis 레벨에서는 기사 상세 데이터를 Cache-Aside 패턴으로 1시간 TTL 캐싱하며, 키는 article:{id} 형태로 구조화합니다. Application 레벨에서는 node-cache로 인기 기사 목록을 메모리에 30초간 캐싱해 Redis 조회도 줄입니다. 기사 수정 시에는 Redis의 해당 키를 즉시 삭제하고, CloudFront는 Invalidation API로 무효화하되 비용을 고려해 와일드카드 경로로 묶습니다. 실시간 조회수는 Redis의 INCR 명령으로 카운트하고, 1분마다 배치로 DB에 동기화하는 Write-Behind 방식을 사용해 DB Write 부하를 줄입니다. 조회수 표시는 100 단위로 반올림해 보여줘 캐싱 효율을 높이고, 정확한 값은 관리자 대시보드에서만 제공합니다.
- • CDN-Redis-Application 3단계 캐싱으로 계층별 최적화
- • Cache-Aside 패턴과 적절한 TTL 전략
- • 기사 수정 시 능동적 캐시 무효화
- • Write-Behind 패턴으로 조회수 집계 최적화
대규모 콘텐츠 서비스에서 읽기 트래픽이 압도적으로 많고 데이터 변경은 드문 경우 다층 캐싱으로 성능과 비용을 최적화하는 상황
캐시 스탬피드(Cache Stampede) 문제가 발생할 수 있는 상황과 이를 방지하기 위한 방법을 설명해주세요.
Q. Express로 구축한 공개 API를 외부 파트너사에 제공하려고 합니다. API 키 기반 인증, Rate Limiting, 요청 검증, 응답 암호화를 포함한 보안 전략을 수립해야 합니다. 각 보안 계층을 어떻게 구현하고, API 남용을 방지하기 위한 모니터링 전략은 무엇입니까?
API Key + Secret 조합, Sliding Window Rate Limiting, 입력 검증 레이어, 그리고 이상 패턴 탐지를 고려해보세요.
API 키 인증은 X-API-Key 헤더로 받고, HMAC-SHA256 서명을 함께 검증해 키 탈취 시에도 요청 위조를 방지합니다. express-rate-limit 미들웨어로 IP별, API 키별 Rate Limiting을 적용하되, Redis 기반 Sliding Window 알고리즘으로 정확한 시간 윈도우 제어를 구현합니다. 요청 검증은 Joi나 express-validator로 스키마 기반 검증을 수행하고, 파라미터 타입, 길이, 포맷을 엄격히 체크해 인젝션 공격을 방어합니다. 민감한 응답 데이터는 TLS 1.3 전송 암호화 외에 필드 레벨에서 AES-256으로 추가 암호화하고, 파트너사별 공개키로 암호화해 전달합니다. 모니터링은 CloudWatch나 ELK 스택으로 API 호출 패턴을 분석하고, 짧은 시간 내 과도한 실패 요청, 비정상적인 엔드포인트 접근, 지리적 이상 패턴을 탐지해 자동 차단합니다. API 사용량 대시보드를 제공해 파트너사가 자체적으로 사용량을 모니터링하도록 합니다.
- • API Key + HMAC 서명으로 이중 인증
- • Redis 기반 Sliding Window Rate Limiting
- • 다층 검증과 암호화로 데이터 보호
- • 이상 패턴 탐지 기반 능동적 모니터링
B2B API 플랫폼에서 다양한 파트너사에게 안전하고 공정하게 API를 제공하면서 남용을 방지해야 하는 상황
파트너사가 Rate Limit을 초과했을 때 단순 차단 대신 어떤 유연한 정책을 적용할 수 있습니까?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!