본문 바로가기
CS/기술 면접 대비

[백엔드 기술 면접] #6 시스템 설계

by 경험의 가치 2024. 11. 20.

Q. SNS에서 친구 관계에 대해 기록을 하고 싶다. 어떤 종류의 DB를 사용하는 것이 적절할까? 그 이유는?

A. 그래프 데이터베이스(예: Neo4j)가 적절합니다. 이유는 친구 관계를 노드(사용자)와 엣지(친구 관계)로 모델링할 수 있으며, 관계를 빠르게 탐색하고 쿼리하는 데 최적화되어 있기 때문입니다.

 

Q. 사용자의 위치 정보를 기반으로 근처의 상점을 추천하는 기능을 구현하려고 한다. 어떤 데이터베이스를 사용할 것이며, 어떻게 구현할 것인가?

A. 사용자의 위치 정보를 기반으로 근처의 상점을 추천하는 기능을 구현하기 위해 PostgreSQL 데이터베이스를 사용하는 것이 적합합니다. 그 이유는 PostgreSQL의 PostGIS 확장이 지리적 데이터를 효율적으로 처리하고 쿼리하는 데 최적화되어 있기 때문입니다. PostGIS는 공간 데이터 타입을 지원하며, 거리 계산, 포함 관계, 교차 여부 등 다양한 공간 연산을 수행할 수 있습니다. 이를 통해 사용자의 현재 위치를 기준으로 특정 반경 내에 있는 상점을 빠르게 검색할 수 있습니다. 구현 방법은 다음과 같습니다. 먼저, 상점 정보를 저장할 테이블을 생성하고, 위치 정보를 저장할 공간 데이터 타입을 지정합니다. 그런 다음, 사용자의 현재 위치를 입력 받아 해당 위치를 중심으로 특정 반경 내에 있는 상점을 검색하는 쿼리를 작성합니다. 이렇게 하면 사용자의 위치 정보를 기반으로 근처의 상점을 효율적으로 추천할 수 있습니다. PostgreSQL과 PostGIS의 조합을 통해 공간 데이터를 효과적으로 관리하고 쿼리할 수 있어, 이 기능을 구현하는 데 적합한 솔루션입니다.

 

Q. 실시간 인기 급상승 검색어를 구현하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. Redis의 Sorted Set을 사용하는 것이 적합합니다. Sorted Set은 스코어를 기반으로 원소를 정렬하여 저장하므로, 검색어의 조회 수를 스코어로 저장하면 실시간으로 인기 검색어를 효율적으로 관리할 수 있습니다.

 

Q. 사용자 인증을 위한 시스템을 구현하려고 한다. 이때, 다중 기기 접속을 막고, 로그인 중인 사용자를 강퇴시킬 수 있어야 한다. 어떤 인증 방식을 활용할 것이며, 어떻게 구현할 것인가?

A. 이러한 요구 사항을 충족하기 위해 세션 기반 인증 방식을 사용하는 것이 적합합니다. 세션 기반 인증을 통해 각 사용자의 로그인 상태를 서버에서 관리할 수 있으며, 다중 기기 접속을 막고, 로그인 중인 사용자를 강퇴시키는 기능을 구현할 수 있습니다.

 

Q. 대규모 로그 데이터를 실시간으로 분석하고 싶다. 어떤 기술 스택을 사용할 것이며, 어떻게 구현할 것인가?

A. ELK 스택(Elasticsearch, Logstash, Kibana)을 사용하는 것이 적합합니다. Logstash로 로그 데이터를 수집하고, Elasticsearch로 저장 및 검색하며, Kibana로 시각화하여 실시간 분석을 할 수 있습니다. 만약 클라우드 환경이라면 AWS Kinesis와 AWS Lambda, AWS Elasticsearch를 조합하여 사용할 수 있습니다.

 

Q. 실시간으로 가격 변동을 반영하는 쇼핑몰을 구축하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. 실시간으로 가격 변동을 반영하는 쇼핑몰을 구축하기 위해 SSE(Server-Sent Events)와 Redis를 사용하는 것이 적합합니다. SSE는 서버에서 클라이언트로 일방향 통신을 통해 실시간 업데이트를 제공하며, Redis는 빠른 읽기/쓰기 성능을 제공하는 인메모리 데이터 저장소입니다.

 

Q. 채팅 애플리케이션에서 실시간 메시징 기능을 구현하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. 채팅 애플리케이션에서 실시간 메시징 기능을 구현하려면 WebSocket을 사용하는 것이 적합합니다. WebSocket은 클라이언트와 서버 간의 양방향 통신을 실시간으로 지원하므로, 채팅 애플리케이션의 실시간 메시징 요구 사항을 충족할 수 있습니다. WebSocket을 통해 클라이언트와 서버 간의 지속적인 연결을 설정하여 실시간으로 메시지를 주고받을 수 있습니다. 또한, STOMP(Simple Text Oriented Messaging Protocol)를 WebSocket과 함께 사용하여 메시징 프로토콜을 표준화하고, 다양한 메시징 패턴을 구현할 수 있습니다. 클라이언트는 STOMP를 통해 메시지를 구독하고 발행할 수 있으며, 서버는 이를 처리하여 다른 클라이언트에게 전달합니다. 메시지 전달의 내구성과 신뢰성을 높이기 위해 RabbitMQ와 같은 메시지 브로커를 사용하는 것도 좋은 방법입니다. RabbitMQ는 메시지를 큐에 저장하고, 큐에서 메시지를 소비자에게 전달하여 메시지가 손실되지 않고 정확히 한 번 전달되도록 보장할 수 있습니다. 이러한 구성으로 채팅 애플리케이션의 실시간 메시징 기능을 안정적이고 확장 가능하게 구현할 수 있습니다.

 

Q. API Rate Limiter를 구현하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. API Rate Limiter를 구현하기 위해 Redis를 사용하는 것이 적합합니다. Redis는 인메모리 데이터 저장소로 매우 빠른 읽기/쓰기 속도를 제공하므로, 실시간으로 API 요청을 제한하는 데 효과적입니다.

 

Q. 이미지 리사이징 기능을 구현하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. 이미지 리사이징 기능을 구현하기 위해 AWS S3와 AWS Lambda를 조합하여 사용하는 것이 적합합니다. 먼저, 사용자가 이미지를 업로드하면 해당 이미지를 S3 버킷에 저장합니다. S3에서 객체 생성 이벤트가 발생하면, 이를 트리거로 Lambda 함수를 호출합니다. Lambda 함수는 S3 버킷에서 업로드된 이미지를 가져와서 필요한 크기로 리사이징을 수행합니다. S3 보관 비용이 문제가 된다면 Lambda@Edge를 이용하여 실시간 이미지 리사이징을 구축할 수도 있습니다.

 

Q. 이메일 알림 기능을 구현하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. 이메일 알림 기능을 구현하기 위해 AWS SES(Simple Email Service)와 AWS Lambda를 사용하는 것이 적합합니다. 특정 이벤트가 발생하면, 이를 트리거로 Lambda 함수가 호출됩니다. Lambda 함수는 AWS SES를 통해 지정된 이메일 주소로 알림 이메일을 전송합니다. 이를 통해 다양한 이벤트에 대한 실시간 이메일 알림 기능을 구현할 수 있습니다.

 

Q. 유튜브나 구글 드라이브와 같이 대규모 파일을 효율적으로 처리하고 저장하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. 대규모 파일을 효율적으로 처리하고 저장하기 위해 AWS S3와 AWS Lambda를 사용하는 것이 적합합니다. 사용자가 파일을 업로드하면 해당 파일을 S3 버킷에 저장합니다. S3에서 객체 생성 이벤트가 발생하면, 이를 트리거로 Lambda 함수가 호출되어 파일을 처리합니다. 처리된 파일은 다시 S3 버킷에 저장되며, 필요한 메타데이터는 DynamoDB에 저장하여 관리할 수 있습니다.

 

Q. 웹 애플리케이션의 정적 콘텐츠를 지역별로 보다 빠르게 제공하려고 한다. 어떤 기술을 사용할 것이며, 어떻게 구현할 것인가?

A. 웹 애플리케이션의 정적 콘텐츠를 빠르게 제공하기 위해 AWS CloudFront와 같은 CDN(Content Delivery Network)을 사용하는 것이 적합합니다. 먼저, 정적 콘텐츠(이미지, CSS, JavaScript 파일 등)를 AWS S3 버킷에 저장합니다. 그런 다음, AWS CloudFront를 사용하여 S3 버킷을 원본(origin)으로 설정하고, CloudFront 배포(distribution)를 생성합니다. CloudFront는 전 세계 여러 엣지 로케이션(edge locations)에 콘텐츠를 캐시하여 사용자가 가까운 서버에서 콘텐츠를 제공받을 수 있도록 합니다. 이를 통해 웹 애플리케이션의 로드 속도를 크게 향상시킬 수 있습니다. CloudFront를 설정한 후, 웹 애플리케이션에서 정적 콘텐츠를 제공할 때 S3 버킷 URL 대신 CloudFront 배포의 도메인 이름을 사용하면 됩니다. 이러한 방식으로 정적 콘텐츠를 효율적으로 관리하고 빠르게 제공할 수 있습니다.