PostgreSQL 미드레벨 시스템 설계 면접
새 면접Q. 대규모 이벤트 로그 시스템에서 일일 1억 건의 이벤트가 발생합니다. PostgreSQL의 선언적 파티셔닝(Declarative Partitioning)을 사용하여 Range 파티셔닝과 List 파티셔닝을 설계할 때, 각각의 적합한 사용 사례를 설명하고, 파티션 프루닝(Partition Pruning)이 쿼리 성능에 미치는 영향과 파티션 키 선택 시 고려사항을 설명해주세요.
Range 파티셔닝은 시간 기반 데이터(월별, 일별)에 적합하며 오래된 데이터 삭제가 용이합니다. List 파티셔닝은 지역, 카테고리 등 명확한 그룹핑이 가능한 경우 사용하며, Hash 파티셔닝은 균등 분산이 필요할 때 적합합니다. 파티션 프루닝은 WHERE 절의 파티션 키 조건을 통해 불필요한 파티션 스캔을 제거하여 성능을 크게 향상시킵니다. 파티션 키는 쿼리 패턴과 일치해야 하며, 너무 많은 파티션(수천 개 이상)은 플래닝 오버헤드를 증가시킬 수 있습니다. 파티션 관리 자동화를 위해 pg_partman 같은 확장을 고려할 수 있습니다.
- • Range 파티셔닝은 시간 기반 데이터, List는 카테고리 기반에 적합
- • 파티션 프루닝으로 불필요한 파티션 스캔 제거
- • 파티션 키는 주요 쿼리 패턴과 일치해야 함
- • 과도한 파티션 수는 플래닝 오버헤드 증가
- • 자동 파티션 관리 전략 필요
파티션된 테이블에서 글로벌 인덱스와 로컬 인덱스의 차이는 무엇이며, PostgreSQL은 어떤 방식을 지원하나요?
Q. PostgreSQL의 통계 정보(Statistics)가 쿼리 플래너의 실행 계획 수립에 어떻게 활용되는지 설명하고, pg_stat_statements와 pg_stat_user_tables 뷰를 활용한 쿼리 성능 모니터링 전략을 제시해주세요. 또한 통계 정보가 부정확할 때 발생하는 문제와 해결 방법을 설명해주세요.
PostgreSQL의 통계 정보는 각 컬럼의 데이터 분포, 가장 빈번한 값(MCV), NULL 비율, 히스토그램 등을 포함하며 쿼리 플래너가 비용 기반으로 최적의 실행 계획을 선택하는 데 사용됩니다. pg_stat_statements는 실행된 쿼리의 통계를 추적하여 느린 쿼리를 식별하고, pg_stat_user_tables는 테이블별 스캔 횟수와 인덱스 사용률을 모니터링합니다. 통계가 부정확하면 플래너가 잘못된 실행 계획을 선택할 수 있으며, 이는 ANALYZE 명령으로 통계를 갱신하거나 default_statistics_target을 증가시켜 해결합니다. 특정 컬럼의 통계 샘플링을 ALTER TABLE SET STATISTICS로 조정할 수 있습니다.
- • 통계 정보는 데이터 분포, MCV, 히스토그램 포함
- • pg_stat_statements로 쿼리 성능 추적
- • pg_stat_user_tables로 테이블 접근 패턴 분석
- • 부정확한 통계는 ANALYZE로 갱신
- • 컬럼별 통계 샘플링 조정 가능
extended statistics(확장 통계)는 언제 사용하며, 어떤 상황에서 쿼리 플래너의 추정 정확도를 개선할 수 있나요?
Q. 금융 서비스 API에서 민감한 개인정보(주민등록번호, 계좌번호)를 PostgreSQL에 저장해야 합니다. pgcrypto 확장을 활용한 컬럼 레벨 암호화 전략과 투명한 데이터 암호화(TDE) 방식을 비교하고, 암호화된 데이터에 대한 검색 및 인덱싱 제약사항과 해결 방안을 설명해주세요.
pgcrypto는 애플리케이션 레벨에서 특정 컬럼만 선택적으로 암호화할 수 있어 유연하지만, 암호화된 데이터는 인덱싱이 불가능하고 검색이 어렵습니다. TDE는 파일 시스템 레벨에서 전체 데이터를 암호화하여 투명하게 작동하지만 PostgreSQL 커뮤니티 버전은 기본 지원하지 않습니다. 암호화된 데이터 검색을 위해서는 해시 기반 검색(HMAC)을 사용하거나, 마스킹된 부분 데이터를 별도 컬럼에 저장하거나, 토큰화(Tokenization) 방식을 고려할 수 있습니다. 키 관리는 AWS KMS나 HashiCorp Vault 같은 외부 시스템을 활용하는 것이 안전합니다.
- • pgcrypto는 컬럼 레벨 선택적 암호화 제공
- • 암호화된 컬럼은 인덱싱과 검색에 제약
- • 해시 기반 검색이나 토큰화로 검색 문제 해결
- • TDE는 투명하지만 커뮤니티 버전 미지원
- • 외부 키 관리 시스템 활용 권장
SSL/TLS를 통한 전송 계층 암호화와 데이터 암호화의 차이는 무엇이며, 각각 어떤 위협으로부터 보호하나요?
Q. 대용량 데이터를 반환하는 검색 API에서 페이지네이션을 구현해야 합니다. OFFSET/LIMIT 방식과 Cursor 기반 페이지네이션(Keyset Pagination)의 성능 차이를 설명하고, 각각의 장단점과 적합한 사용 사례를 비교해주세요. 또한 정렬 순서가 변경되는 동적 데이터에서 페이지네이션의 일관성을 보장하는 방법을 제시해주세요.
OFFSET/LIMIT 방식은 구현이 간단하고 임의 페이지 접근이 가능하지만, OFFSET이 클수록 모든 이전 행을 스캔해야 하므로 성능이 급격히 저하됩니다. Cursor 기반 페이지네이션은 마지막 레코드의 키 값을 기준으로 WHERE 절을 사용하여 일정한 성능을 유지하며 대용량 데이터에 적합하지만, 임의 페이지 접근이 불가능하고 복잡한 정렬 조건 처리가 어렵습니다. 동적 데이터의 일관성을 위해서는 스냅샷 격리 수준의 트랜잭션을 사용하거나, 타임스탬프 기반 필터링을 추가하거나, 버전 관리를 통해 페이지네이션 세션을 유지할 수 있습니다. 무한 스크롤에는 Cursor 방식이, 전통적인 페이지 네비게이션에는 OFFSET/LIMIT이 적합합니다.
- • OFFSET/LIMIT은 간단하지만 대용량에서 성능 저하
- • Cursor 기반은 일정한 성능이지만 임의 페이지 접근 불가
- • 인덱스를 활용한 Cursor 방식이 대용량에 적합
- • 동적 데이터는 스냅샷 격리나 타임스탬프 필터링으로 일관성 보장
- • 사용 사례에 따라 적절한 방식 선택
PostgreSQL의 FETCH FIRST와 ROWS 절을 사용한 SQL:2008 표준 페이지네이션과 기존 LIMIT/OFFSET의 차이는 무엇인가요?
Q. 프로덕션 환경에서 PostgreSQL의 성능 저하를 사전에 감지하고 대응하기 위한 모니터링 지표와 임계값을 설계해야 합니다. 캐시 히트율, 커넥션 사용률, 트랜잭션 처리량, 복제 지연, 디스크 I/O 대기 등 핵심 지표를 설명하고, 각 지표의 정상 범위와 알림 기준을 제시해주세요. 또한 pg_stat 뷰들을 활용한 실시간 모니터링 쿼리 전략을 설명해주세요.
캐시 히트율(shared_buffers)은 99% 이상이 이상적이며 90% 이하면 메모리 부족을 의심해야 합니다. 커넥션 사용률은 max_connections의 80%를 넘으면 경고하고 connection pooling을 검토해야 합니다. 트랜잭션 처리량(TPS)과 쿼리 응답 시간은 베이스라인 대비 급격한 변화를 감지해야 합니다. 복제 지연은 1초 이상이면 주의하고 10초 이상이면 심각한 상태입니다. 디스크 I/O 대기가 높으면 인덱스 부족이나 쿼리 최적화가 필요합니다. pg_stat_database로 전체 DB 통계를, pg_stat_activity로 현재 실행 중인 쿼리를, pg_stat_replication으로 복제 상태를 모니터링하며, 이를 Prometheus와 Grafana로 시각화하는 것이 일반적입니다.
- • 캐시 히트율 99% 이상 유지
- • 커넥션 사용률 80% 초과 시 경고
- • 복제 지연 1초 이상 주의
- • pg_stat 뷰들로 실시간 모니터링
- • Prometheus/Grafana로 시각화
Long-running query를 자동으로 감지하고 종료하는 정책을 어떻게 설계하시겠습니까? statement_timeout과 idle_in_transaction_session_timeout의 적절한 설정값은 무엇인가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!