PostgreSQL 시니어 프레임워크 기술면접
새 면접Q. PostgreSQL의 Full-Text Search 기능을 구현할 때 tsvector와 tsquery의 역할과 차이점을 설명하고, GIN 인덱스를 사용한 전문 검색 최적화 전략을 제시해주세요. 또한 다국어(한국어, 영어, 일본어) 문서 검색 시스템을 구축할 때 text search configuration과 dictionary를 어떻게 설정하고 관리하시겠습니까?
tsvector는 문서를 검색 가능한 토큰으로 변환한 정규화된 형태이며, tsquery는 검색 쿼리를 표현하는 타입입니다. GIN 인덱스는 tsvector 컬럼에 생성하여 빠른 전문 검색을 가능하게 하며, gin_pending_list_limit 파라미터로 성능을 조정할 수 있습니다. 다국어 지원을 위해서는 각 언어별 text search configuration(korean, english, japanese)을 정의하고, 언어별 컬럼을 분리하거나 언어 식별 컬럼과 함께 partial index를 활용하는 전략이 효과적입니다. pg_trgm 확장과 조합하여 유사 검색 기능도 구현할 수 있습니다.
- • tsvector는 정규화된 토큰 저장소, tsquery는 검색 표현식
- • GIN 인덱스를 통한 전문 검색 최적화 및 파라미터 튜닝
- • 다국어 지원을 위한 text search configuration 설정 및 언어별 인덱스 전략
- • pg_trgm 확장을 활용한 유사 검색 및 하이브리드 접근
ElasticSearch와 PostgreSQL Full-Text Search를 비교했을 때, 각각의 장단점과 어떤 상황에서 PostgreSQL의 전문 검색을 선택하는 것이 적합한지 설명해주세요.
Q. PostgreSQL의 Trigger를 사용할 때 BEFORE, AFTER, INSTEAD OF 트리거의 차이점과 실행 순서를 설명하고, 각각의 적합한 사용 사례를 제시해주세요. 또한 대량의 데이터 변경 시 트리거로 인한 성능 저하를 방지하기 위한 전략과, PL/pgSQL 함수에서 RAISE EXCEPTION과 RETURN을 통한 트리거 제어 방법을 설명해주세요.
BEFORE 트리거는 데이터 변경 전 실행되어 값을 수정하거나 작업을 취소할 수 있고, AFTER 트리거는 변경 후 실행되어 감사 로그나 연쇄 작업에 적합하며, INSTEAD OF 트리거는 뷰에 대한 작업을 실제 테이블 작업으로 변환합니다. 대량 작업 시에는 세션 변수(session_replication_role)를 'replica'로 설정하여 트리거를 일시 비활성화하거나, WHEN 조건절로 실행 범위를 제한하고, 배치 작업은 트리거 대신 명시적 프로시저로 처리하는 것이 좋습니다. RAISE EXCEPTION으로 트랜잭션을 롤백하고, RETURN NULL로 작업을 취소할 수 있습니다.
- • BEFORE는 값 수정 및 검증, AFTER는 감사 로그 및 연쇄 작업, INSTEAD OF는 뷰 작업 변환
- • session_replication_role 설정 또는 WHEN 조건절로 성능 최적화
- • 대량 작업 시 트리거 우회 전략 및 명시적 프로시저 사용
- • RAISE EXCEPTION과 RETURN을 통한 트리거 흐름 제어
Statement-level 트리거와 Row-level 트리거의 차이점과 성능상 트레이드오프를 설명하고, Transition Table(OLD TABLE, NEW TABLE)을 활용한 대량 데이터 처리 방법을 제시해주세요.
Q. PostgreSQL의 Deadlock 감지 메커니즘과 deadlock_timeout 파라미터의 역할을 설명하고, 복잡한 비즈니스 로직에서 데드락을 예방하기 위한 설계 원칙을 제시해주세요. 또한 pg_locks 뷰와 pg_stat_activity 뷰를 활용하여 실시간으로 Lock 상황을 모니터링하고 문제를 진단하는 방법을 설명해주세요.
PostgreSQL은 deadlock_timeout(기본 1초) 이후 주기적으로 wait-for 그래프를 검사하여 순환 대기를 감지하고, 가장 비용이 적은 트랜잭션을 희생시켜 데드락을 해소합니다. 데드락 예방을 위해서는 모든 트랜잭션에서 리소스 접근 순서를 일관되게 유지하고, 트랜잭션 길이를 최소화하며, SELECT FOR UPDATE는 인덱스를 활용하여 범위를 좁혀야 합니다. pg_locks와 pg_stat_activity를 조인하여 blocked/blocking 관계를 파악하고, lock mode와 waiting 상태를 분석하여 문제 쿼리를 식별할 수 있습니다.
- • deadlock_timeout 이후 wait-for 그래프 검사로 데드락 감지
- • 리소스 접근 순서 일관성 유지 및 트랜잭션 최소화로 예방
- • pg_locks와 pg_stat_activity 조인으로 blocking 관계 분석
- • lock mode 이해 및 waiting 상태 모니터링
Lock 경합이 심한 환경에서 lock_timeout과 statement_timeout을 어떻게 설정하고 관리해야 하는지, 그리고 애플리케이션에서 이러한 타임아웃 에러를 어떻게 처리해야 하는지 설명해주세요.
Q. PostgreSQL의 Foreign Data Wrapper(FDW)의 동작 원리와 아키텍처를 설명하고, postgres_fdw를 사용하여 샤딩된 데이터베이스를 통합 조회하는 시스템을 구축할 때의 성능 최적화 전략을 제시해주세요. 또한 use_remote_estimate 옵션과 fetch_size 파라미터가 쿼리 성능에 미치는 영향을 설명해주세요.
FDW는 외부 데이터 소스를 로컬 테이블처럼 접근할 수 있게 하는 표준 인터페이스로, postgres_fdw는 원격 PostgreSQL 서버에 접속하여 쿼리를 푸시다운합니다. use_remote_estimate를 true로 설정하면 원격 서버의 통계 정보를 활용하여 더 정확한 쿼리 플랜을 생성하지만 추가 네트워크 비용이 발생합니다. fetch_size는 한 번에 가져올 행 수를 조정하여 네트워크 왕복을 줄이며, 대용량 결과셋에서는 큰 값으로 설정하는 것이 유리합니다. 샤딩 환경에서는 파티션 프루닝과 병렬 쿼리를 활용하고, 가능한 한 필터링과 집계를 원격에서 수행하도록 쿼리를 작성해야 합니다.
- • FDW는 외부 데이터 소스 통합 인터페이스, 쿼리 푸시다운으로 성능 향상
- • use_remote_estimate로 정확한 플랜 생성과 네트워크 비용 트레이드오프
- • fetch_size 조정으로 네트워크 왕복 최적화
- • 샤딩 환경에서 파티션 프루닝 및 원격 필터링 활용
FDW를 사용한 분산 조인과 일반적인 데이터베이스 복제 방식을 비교했을 때, 각각의 장단점과 적합한 사용 사례를 설명해주세요.
Q. PostgreSQL의 Background Worker 프로세스 구조와 동작 원리를 설명하고, 커스텀 Background Worker를 구현할 때 고려해야 할 사항들을 제시해주세요. 또한 pg_cron과 같은 스케줄링 확장을 프로덕션 환경에서 사용할 때의 장단점과, 애플리케이션 레벨 스케줄러와 비교한 트레이드오프를 분석해주세요.
Background Worker는 postmaster가 관리하는 독립적인 프로세스로, shared memory와 locking을 통해 다른 백엔드와 통신하며, bgw_main 함수에서 작업을 수행합니다. 구현 시에는 시그널 핸들링, 트랜잭션 관리, 에러 핸들링을 적절히 처리해야 하며, shared_preload_libraries에 등록하여 서버 시작 시 로드됩니다. pg_cron은 데이터베이스 내부에서 스케줄링하여 네트워크 지연이 없고 트랜잭션 컨텍스트를 유지하지만, 데이터베이스 재시작 시 영향을 받고 복잡한 워크플로우 관리가 어렵습니다. 애플리케이션 스케줄러는 유연성과 분산 처리가 가능하지만 데이터베이스와의 연결 관리가 필요합니다.
- • Background Worker는 독립 프로세스로 shared memory 통신
- • 시그널 핸들링, 트랜잭션 관리, shared_preload_libraries 등록 필요
- • pg_cron은 네트워크 지연 없고 트랜잭션 유지하지만 유연성 제한
- • 애플리케이션 스케줄러는 유연하나 연결 관리 오버헤드 존재
PostgreSQL Extension을 개발할 때 C 언어로 작성하는 방법과 PL/pgSQL로 작성하는 방법의 차이점을 설명하고, 각각의 성능 특성과 적합한 사용 사례를 제시해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!