PostgreSQL 주니어 시스템 설계 면접

PostgreSQL 주니어 (1~3년) 시스템 설계 3문항 조회수 49 · 2026-09-14 (월) 22:10:57
1 데이터베이스 파티셔닝
Medium

Q. 월간 1억 건 이상의 주문 데이터가 쌓이는 이커머스 서비스의 orders 테이블이 점점 느려지고 있습니다. PostgreSQL의 테이블 파티셔닝을 도입하려고 할 때, 파티셔닝 전략(Range, List, Hash)을 어떻게 선택하고 설계하시겠습니까? 주문 데이터의 특성을 고려하여 파티션 키 선택 기준과 파티션 단위, 그리고 오래된 데이터 관리 방안을 포함해서 설명해주세요.

주문 데이터는 시간순으로 쌓이고 최근 데이터 위주로 조회되며, 과거 데이터는 보관 또는 삭제 정책이 필요합니다.

A. 모범답안

주문 데이터는 Range 파티셔닝을 created_at(주문일시) 기준으로 월 단위로 나누는 것이 적합합니다. 이유는 주문 데이터가 시간순으로 누적되고 최근 1~3개월 데이터를 주로 조회하기 때문입니다. 각 월별 파티션을 별도 테이블로 분리하면 쿼리 성능이 향상되고, 오래된 파티션은 DROP TABLE로 빠르게 삭제하거나 별도 아카이브 스토리지로 이동할 수 있습니다. 파티션 생성은 매월 자동화 스크립트로 미리 생성하고, 인덱스도 각 파티션마다 독립적으로 관리합니다. 조회 쿼리에서 WHERE 절에 created_at 조건을 포함하면 Partition Pruning이 발생해 필요한 파티션만 스캔하므로 성능이 크게 개선됩니다. 추가로 status나 user_id 같은 자주 조회되는 컬럼에는 각 파티션별로 로컬 인덱스를 생성합니다.

핵심 포인트
  • • Range 파티셔닝을 created_at 기준 월 단위로 설계
  • • 최근 데이터 위주 조회 패턴에 적합한 시간 기반 파티셔닝
  • • 오래된 파티션은 DROP 또는 아카이브로 관리
  • • Partition Pruning을 활용한 쿼리 성능 최적화
  • • 각 파티션별 독립적인 인덱스 관리
답변에 넣으면 좋은 키워드
Range 파티셔닝 Partition Pruning 파티션 키 로컬 인덱스 아카이브 테이블 분할
실무에서는

대용량 로그, 주문, 이벤트 데이터를 다루는 서비스에서 테이블 파티셔닝으로 조회 성능을 개선하고 데이터 라이프사이클을 효율적으로 관리합니다.

Follow-up 질문

만약 특정 국가별로 데이터를 분리해야 하는 요구사항이 추가된다면 파티셔닝 전략을 어떻게 변경하시겠습니까? 다중 레벨 파티셔닝을 고려해보세요.

2 읽기 전용 복제본 설계
Medium

Q. 사용자 트래픽이 증가하면서 PostgreSQL 마스터 DB의 CPU 사용률이 80%를 넘어가고 있습니다. 분석 결과 쓰기는 전체의 20%, 읽기가 80%를 차지합니다. 읽기 부하를 분산하기 위해 읽기 전용 복제본(Read Replica)을 도입하려고 합니다. 애플리케이션 레벨에서 읽기/쓰기를 어떻게 분리할지, 복제 지연 문제를 어떻게 처리할지, 그리고 복제본이 여러 개일 때 로드밸런싱 전략을 포함하여 전체 아키텍처를 설계해주세요.

읽기와 쓰기 연결을 분리하고, 복제 지연에 민감한 데이터와 그렇지 않은 데이터를 구분해야 합니다.

A. 모범답안

애플리케이션에서 데이터베이스 커넥션을 마스터용과 복제본용으로 분리하여 관리합니다. 쓰기 작업과 강한 일관성이 필요한 읽기(방금 등록한 내 데이터 조회)는 마스터로, 통계나 목록 조회 같은 약한 일관성을 허용하는 읽기는 복제본으로 라우팅합니다. 복제본이 여러 개일 경우 애플리케이션 레벨에서 라운드로빈 또는 랜덤 방식으로 로드밸런싱하거나, PgBouncer나 HAProxy 같은 커넥션 풀러를 통해 분산합니다. 복제 지연이 중요한 경우 애플리케이션에서 pg_last_wal_replay_lsn을 확인하여 지연 시간을 체크하거나, 쓰기 후 일정 시간은 마스터에서 읽도록 세션 스티키 정책을 적용합니다. 모니터링에서는 복제 지연(replication lag)을 지속적으로 확인하고 임계치를 설정합니다.

핵심 포인트
  • • 마스터와 복제본 커넥션을 애플리케이션에서 분리
  • • 쓰기와 강한 일관성 읽기는 마스터, 약한 일관성 읽기는 복제본
  • • 복제본 다중화 시 로드밸런서 또는 애플리케이션 레벨 라우팅
  • • 복제 지연 모니터링 및 임계치 설정
  • • 쓰기 후 읽기 일관성이 필요한 경우 세션 스티키 전략
답변에 넣으면 좋은 키워드
Read Replica 읽기 쓰기 분리 복제 지연 로드밸런싱 일관성 커넥션 라우팅
실무에서는

대규모 서비스에서 읽기 부하가 쓰기보다 훨씬 많을 때 읽기 전용 복제본으로 부하를 분산하여 마스터 DB 성능을 확보합니다.

Follow-up 질문

복제본에서 읽은 데이터가 너무 오래된 것으로 판단되면 자동으로 마스터로 폴백하는 로직을 구현한다면 어떤 방식으로 설계하시겠습니까?

3 API 응답 캐싱 전략
Medium

Q. PostgreSQL 데이터베이스를 사용하는 상품 목록 API가 있습니다. 상품 데이터는 자주 변경되지 않지만 조회 요청이 초당 1000건 이상 발생합니다. Redis 같은 캐시 레이어를 도입하려고 할 때, 어떤 데이터를 캐싱할지, 캐시 키 설계는 어떻게 할지, TTL은 어떻게 설정할지, 그리고 상품 정보가 업데이트되었을 때 캐시 무효화(invalidation) 전략을 어떻게 설계하시겠습니까?

캐시 키에는 필터 조건이 포함되어야 하고, 데이터 변경 시 캐시를 어떻게 갱신할지 고려해야 합니다.

A. 모범답안

상품 목록 API의 캐시 키는 'product:list:{category}:{sort}:{page}'처럼 조회 조건(카테고리, 정렬, 페이지)을 포함하여 설계합니다. 상품 상세 정보는 'product:detail:{product_id}' 형태로 개별 캐싱합니다. TTL은 상품 정보의 변경 빈도에 따라 5~10분 정도로 설정하되, 업데이트가 발생하면 즉시 무효화하는 하이브리드 방식을 사용합니다. 캐시 무효화 전략은 상품 정보 업데이트 시 해당 product_id의 상세 캐시를 DELETE하고, 관련된 목록 캐시는 카테고리별로 패턴 매칭(SCAN 또는 태그 기반)으로 삭제하거나 TTL에 의존합니다. Write-Through 방식으로 DB 업데이트와 동시에 캐시도 갱신하거나, Cache-Aside 패턴으로 캐시 미스 시 DB 조회 후 캐시에 저장하는 방식 중 선택합니다. 모니터링에서는 캐시 히트율과 응답 시간을 추적합니다.

핵심 포인트
  • • 조회 조건을 포함한 구조화된 캐시 키 설계
  • • 상품 상세와 목록을 분리하여 캐싱
  • • TTL과 명시적 무효화를 결합한 하이브리드 전략
  • • 데이터 변경 시 관련 캐시 즉시 삭제
  • • 캐시 히트율 모니터링 및 성능 측정
답변에 넣으면 좋은 키워드
Redis 캐시 키 TTL 캐시 무효화 Cache-Aside Write-Through 캐시 히트율
실무에서는

조회가 많고 변경이 적은 데이터(상품, 카테고리, 설정)를 캐싱하여 데이터베이스 부하를 줄이고 API 응답 속도를 개선합니다.

Follow-up 질문

만약 상품 재고 정보처럼 실시간성이 중요한 데이터는 어떻게 캐싱 전략을 다르게 가져가야 할까요?

댓글 0

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

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