JavaScript 미드레벨 시스템 설계 면접

JavaScript 미드레벨 (3~7년) 시스템 설계 5문항 조회수 40 · 2026-08-12 (수) 07:41:32
1 API 설계
Medium

Q. 대규모 이커머스 사이트에서 상품 검색 API를 설계한다고 가정합니다. 검색어, 카테고리 필터, 가격 범위, 정렬 옵션 등 다양한 파라미터를 처리해야 할 때, Query Parameter 방식과 POST Body 방식 중 어떤 것을 선택할지 각각의 장단점을 설명하고, RESTful 관점에서 적절한 설계 방식을 제시해주세요. 또한 검색 결과가 수천 개일 때 응답 데이터 구조를 어떻게 설계할지 설명해주세요.

GET 요청의 URL 길이 제한과 캐싱 가능성, 그리고 검색이라는 행위의 의미론적 특성을 고려해보세요.

A. 모범답안

검색 API는 데이터 조회이므로 GET 메서드를 사용하는 것이 RESTful 원칙에 부합하며, Query Parameter 방식을 선택하는 것이 적절합니다. 이 방식은 URL이 북마크 가능하고 브라우저 캐싱을 활용할 수 있다는 장점이 있지만, URL 길이 제한(약 2048자)이 있어 복잡한 필터는 제한될 수 있습니다. 응답 데이터는 pagination 메타데이터(total, page, pageSize, hasNext)와 실제 items 배열을 분리하여 구조화하고, 각 상품 객체는 필요한 필드만 선택적으로 반환하는 Sparse Fieldsets 패턴을 적용합니다. 매우 복잡한 검색 조건이 필요한 경우 POST /search 엔드포인트를 별도로 제공하되, 이는 예외적인 경우로 한정하고 문서화에 명시합니다. 검색 결과는 캐시 키로 쿼리 파라미터 조합을 해싱하여 Redis에 저장하고, TTL을 짧게(5-10분) 설정하여 실시간성과 성능의 균형을 맞춥니다.

핵심 포인트
  • • GET 메서드와 Query Parameter 사용이 RESTful 원칙에 부합
  • • URL 캐싱 가능성과 북마크 가능성 확보
  • • 응답 데이터의 pagination 메타데이터 분리 구조화
  • • 복잡한 검색 조건은 예외적으로 POST 허용
답변에 넣으면 좋은 키워드
RESTful Query Parameter Pagination Sparse Fieldsets 캐싱 전략 URL 길이 제한
실무에서는

검색 기능이 있는 모든 웹 서비스에서 사용자 경험과 성능을 동시에 고려한 API 설계가 필요합니다.

Follow-up 질문

검색 API의 응답 시간이 느려질 경우, Elasticsearch 같은 검색 엔진 도입 외에 API 레벨에서 적용할 수 있는 최적화 방안은 무엇이 있을까요?

2 아키텍처
Hard

Q. 실시간 채팅 애플리케이션을 구축할 때, WebSocket과 HTTP Long Polling, Server-Sent Events(SSE) 중 어떤 방식을 선택할지 각각의 동작 원리와 장단점을 비교하고, 수평 확장(Scale-out) 시 여러 서버 인스턴스 간 메시지 동기화를 어떻게 구현할지 아키텍처 설계 방안을 제시해주세요. 또한 연결이 끊겼을 때의 재연결 전략과 메시지 유실 방지 방법을 설명해주세요.

양방향 통신 필요성과 연결 유지 비용, 그리고 Pub/Sub 패턴을 활용한 서버 간 메시지 브로드캐스팅을 고려해보세요.

A. 모범답안

실시간 채팅은 양방향 통신이 필수이므로 WebSocket이 가장 적합하며, 단일 TCP 연결로 낮은 레이턴시와 오버헤드를 제공합니다. Long Polling은 구현이 간단하지만 요청마다 HTTP 오버헤드가 있고, SSE는 서버에서 클라이언트로만 단방향 통신이 가능하므로 채팅에는 부적합합니다. 수평 확장 시에는 Redis Pub/Sub을 활용하여 각 서버 인스턴스가 채팅방별 채널을 구독하고, 메시지를 받으면 해당 채널로 publish하여 모든 인스턴스에 브로드캐스팅합니다. Sticky Session 대신 Redis를 메시지 버스로 사용하면 사용자가 어느 서버에 연결되어 있어도 메시지를 받을 수 있습니다. 재연결 전략은 Exponential Backoff 알고리즘을 적용하고, 클라이언트는 마지막으로 받은 메시지 ID를 저장하여 재연결 시 누락된 메시지를 요청하는 방식으로 유실을 방지합니다. 메시지는 MongoDB나 PostgreSQL에 영구 저장하여 히스토리 조회와 복구를 지원합니다.

핵심 포인트
  • • WebSocket의 양방향 통신과 낮은 레이턴시 장점
  • • Redis Pub/Sub을 활용한 서버 간 메시지 동기화
  • • Exponential Backoff 재연결 전략
  • • 메시지 ID 기반 누락 메시지 복구 메커니즘
답변에 넣으면 좋은 키워드
WebSocket Redis Pub/Sub 수평 확장 Exponential Backoff 메시지 유실 방지 Sticky Session
실무에서는

슬랙, 디스코드 같은 실시간 협업 도구나 채팅 서비스에서 안정적인 메시지 전달과 확장성을 보장해야 합니다.

Follow-up 질문

동시 접속자가 10만 명을 넘어갈 경우 WebSocket 연결 수를 줄이기 위한 아키텍처 개선 방안은 무엇이 있을까요?

3 캐싱 전략
Hard

Q. 소셜 미디어 플랫폼에서 사용자 피드 API의 캐싱 전략을 설계한다고 가정합니다. 사용자마다 다른 피드를 보여줘야 하고, 새 게시물이 실시간으로 추가되며, 좋아요와 댓글 수가 자주 변경되는 상황에서, Cache-Aside 패턴과 Write-Through 패턴 중 어떤 것이 적합한지 비교하고, 캐시 무효화(Invalidation) 전략을 어떻게 설계할지 설명해주세요. 또한 Thundering Herd 문제를 어떻게 방지할지 방안을 제시해주세요.

사용자별 개인화된 데이터의 캐싱 복잡도와 데이터 일관성, 그리고 동시 다발적 캐시 미스 상황을 고려해보세요.

A. 모범답안

사용자 피드는 읽기가 압도적으로 많고 개인화되어 있으므로 Cache-Aside 패턴이 적합하며, 각 사용자 ID를 캐시 키에 포함시켜 user:feed:{userId} 형태로 구성합니다. Write-Through는 모든 쓰기 시 캐시를 업데이트해야 하므로 피드처럼 복잡한 집계 데이터에는 비효율적입니다. 캐시 무효화는 Time-based Expiration(TTL 5-10분)을 기본으로 하고, 새 게시물 작성 시에는 팔로워들의 피드 캐시를 즉시 삭제하는 대신 다음 요청 시 재생성하는 Lazy Invalidation 방식을 적용합니다. 좋아요/댓글 수는 Eventually Consistent 방식으로 처리하되, 실시간성이 중요하면 해당 게시물 부분만 별도 캐시 키로 분리합니다. Thundering Herd 방지를 위해서는 캐시 재생성 시 분산 락(Redis SETNX)을 획득한 첫 번째 요청만 DB 조회를 수행하고, 나머지는 짧은 시간 대기 후 캐시를 읽도록 구현합니다. 추가로 Probabilistic Early Expiration을 적용하여 TTL의 90% 시점부터 확률적으로 캐시를 갱신하면 만료 시점이 분산됩니다.

핵심 포인트
  • • Cache-Aside 패턴과 사용자별 캐시 키 구성
  • • Lazy Invalidation을 통한 효율적인 캐시 무효화
  • • 분산 락을 활용한 Thundering Herd 방지
  • • Probabilistic Early Expiration으로 만료 시점 분산
답변에 넣으면 좋은 키워드
Cache-Aside Lazy Invalidation Thundering Herd 분산 락 TTL Eventually Consistent
실무에서는

인스타그램, 트위터 같은 소셜 미디어에서 수백만 사용자의 개인화된 피드를 빠르게 제공하면서 메모리 비용을 관리해야 합니다.

Follow-up 질문

피드 데이터를 Redis에 저장할 때 메모리 사용량을 최적화하기 위한 데이터 구조 설계 방안은 무엇이 있을까요?

4 API 설계
Medium

Q. RESTful API에서 버전 관리를 구현할 때 URL Path 방식(/v1/users), Query Parameter 방식(?version=1), Header 방식(Accept: application/vnd.api+json;version=1) 중 어떤 것을 선택할지 각각의 장단점을 비교하고, 실무에서 API 버전 업그레이드 시 하위 호환성(Backward Compatibility)을 유지하면서 점진적으로 마이그레이션하는 전략을 제시해주세요. 또한 Deprecation 정책은 어떻게 설계할지 설명해주세요.

API의 가시성과 캐싱, 그리고 클라이언트 마이그레이션의 용이성을 함께 고려해보세요.

A. 모범답안

URL Path 방식(/v1/users)이 가장 명확하고 직관적이며, API 문서화와 클라이언트 구현이 쉽고 CDN 캐싱도 용이하여 실무에서 가장 많이 사용됩니다. Header 방식은 RESTful 원칙에 더 부합하지만 가시성이 떨어지고 디버깅이 어렵습니다. Query Parameter 방식은 선택적 버전 지정이 가능하지만 URL이 복잡해지고 캐싱 키 관리가 어렵습니다. 하위 호환성 유지를 위해서는 Breaking Change가 없는 변경(필드 추가, 선택적 파라미터 추가)은 같은 버전 내에서 처리하고, 필드 삭제나 타입 변경 같은 Breaking Change만 새 버전을 만듭니다. 점진적 마이그레이션은 새 버전 출시 후 최소 6개월의 유예 기간을 두고, 구버전 API 응답 헤더에 Deprecation과 Sunset 헤더를 포함시켜 클라이언트에게 경고합니다. API Gateway나 프록시 레이어에서 버전별 라우팅을 처리하면 백엔드 코드 중복을 최소화할 수 있으며, 구버전 요청을 내부적으로 신버전으로 변환하는 어댑터 패턴을 적용할 수 있습니다.

핵심 포인트
  • • URL Path 방식의 명확성과 캐싱 용이성
  • • Breaking Change만 새 버전으로 분리
  • • Deprecation/Sunset 헤더를 통한 명시적 경고
  • • 어댑터 패턴을 활용한 버전 간 변환
답변에 넣으면 좋은 키워드
API 버전 관리 Backward Compatibility Breaking Change Deprecation Sunset 헤더 어댑터 패턴
실무에서는

공개 API를 제공하는 서비스에서 수천 개의 클라이언트 앱이 의존하고 있을 때 안정적인 버전 관리가 필수적입니다.

Follow-up 질문

GraphQL을 사용하면 API 버전 관리 문제를 어떻게 해결할 수 있으며, RESTful API와 비교했을 때 어떤 트레이드오프가 있을까요?

5 아키텍처
Hard

Q. Node.js로 구축한 API 서버에서 파일 업로드 기능을 설계할 때, 작은 이미지(1MB 이하)와 대용량 비디오 파일(수 GB)을 모두 처리해야 하는 상황입니다. Multipart Upload, Resumable Upload, Presigned URL 방식을 비교하고, 각 파일 크기별로 적절한 업로드 전략을 제시해주세요. 또한 업로드 중 서버가 재시작되거나 네트워크가 끊겼을 때의 복구 메커니즘과, S3 같은 객체 스토리지 연동 시 고려해야 할 아키텍처 설계 포인트를 설명해주세요.

서버의 메모리와 네트워크 부하, 그리고 업로드 실패 시 재시도 비용을 고려해보세요.

A. 모범답안

작은 이미지는 일반 Multipart Form Data로 서버를 거쳐 S3에 업로드하는 방식이 구현이 간단하고 적합하지만, 대용량 파일은 서버 메모리와 대역폭을 소진하므로 클라이언트가 S3 Presigned URL을 받아 직접 업로드하는 방식을 적용해야 합니다. Presigned URL 방식은 서버 부하를 제거하고 업로드 속도를 높이며, S3 Multipart Upload API와 결합하면 파일을 청크 단위로 나눠 병렬 업로드할 수 있습니다. Resumable Upload를 위해서는 각 청크의 ETag를 클라이언트에 저장하고, 업로드 중단 시 이미 완료된 청크는 건너뛰고 나머지만 재개합니다. 서버는 업로드 세션 정보를 Redis에 저장하여 서버 재시작 시에도 복구 가능하도록 하고, 일정 시간 동안 완료되지 않은 Multipart Upload는 S3 Lifecycle Policy로 자동 삭제하여 스토리지 비용을 방지합니다. 업로드 완료 후에는 Lambda나 백그라운드 작업으로 이미지 리사이징, 비디오 트랜스코딩 같은 후처리를 비동기로 수행하며, 상태는 데이터베이스에 기록하여 클라이언트가 폴링하거나 WebSocket으로 알림을 받을 수 있도록 합니다.

핵심 포인트
  • • 파일 크기별 차별화된 업로드 전략
  • • Presigned URL과 S3 Multipart Upload 결합
  • • 청크별 ETag 저장을 통한 Resumable Upload
  • • Lifecycle Policy로 미완료 업로드 정리
답변에 넣으면 좋은 키워드
Presigned URL Multipart Upload Resumable Upload S3 청크 업로드 Lifecycle Policy
실무에서는

유튜브, 넷플릭스 같은 비디오 플랫폼이나 구글 드라이브 같은 파일 공유 서비스에서 안정적인 대용량 파일 업로드 처리가 핵심 기능입니다.

Follow-up 질문

동시에 수천 명의 사용자가 대용량 파일을 업로드할 때 S3 요청 제한(Rate Limit)을 고려한 아키텍처 설계 방안은 무엇이 있을까요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!