PostgreSQL 주니어 기술면접
새 면접Q. PostgreSQL에서 COMMIT과 ROLLBACK의 역할을 설명하고, SAVEPOINT를 사용하여 부분 롤백을 수행하는 방법과 이를 사용하는 실무 시나리오를 설명해주세요.
COMMIT은 트랜잭션의 모든 변경사항을 영구적으로 데이터베이스에 반영하고, ROLLBACK은 트랜잭션 시작 시점으로 모든 변경사항을 되돌립니다. SAVEPOINT는 트랜잭션 내에서 중간 지점을 표시하여 ROLLBACK TO SAVEPOINT 명령으로 특정 지점까지만 롤백할 수 있게 합니다. 예를 들어 주문 처리 중 배송지 정보는 저장하고 결제 정보만 롤백해야 할 때, SAVEPOINT를 결제 전에 설정하면 결제 실패 시 배송지 정보는 유지하면서 결제 부분만 롤백할 수 있습니다. 이를 통해 복잡한 트랜잭션에서 부분적인 오류 처리가 가능해집니다.
- • COMMIT은 변경사항을 영구 저장, ROLLBACK은 전체 취소
- • SAVEPOINT는 트랜잭션 내 중간 지점 표시
- • ROLLBACK TO SAVEPOINT로 부분 롤백 가능
- • 복잡한 비즈니스 로직에서 세밀한 오류 처리 가능
SAVEPOINT를 여러 개 중첩해서 사용할 수 있나요? 그리고 SAVEPOINT 사용 시 성능에 영향을 주는 요소는 무엇인가요?
Q. PostgreSQL에서 UNION, UNION ALL, INTERSECT, EXCEPT의 차이점을 설명하고, 각각 어떤 상황에서 사용하는 것이 적절한가요? 특히 UNION과 UNION ALL의 성능 차이에 대해서도 설명해주세요.
UNION은 두 쿼리 결과를 합치면서 중복을 제거하고, UNION ALL은 중복을 제거하지 않고 모두 포함합니다. INTERSECT는 두 쿼리 결과의 교집합을, EXCEPT는 첫 번째 쿼리 결과에서 두 번째 쿼리 결과를 제외한 차집합을 반환합니다. UNION은 중복 제거를 위해 정렬과 비교 작업이 필요하므로 UNION ALL보다 성능이 떨어지며, 중복이 없거나 중복을 허용할 수 있다면 UNION ALL을 사용하는 것이 효율적입니다. 예를 들어 활성 사용자와 휴면 사용자 테이블을 합칠 때 중복이 없다면 UNION ALL을 사용하고, 여러 로그 테이블에서 고유한 사용자 ID만 추출할 때는 UNION을 사용합니다.
- • UNION은 중복 제거, UNION ALL은 중복 포함
- • INTERSECT는 교집합, EXCEPT는 차집합
- • UNION ALL이 UNION보다 성능이 우수함
- • 중복 제거가 불필요하면 UNION ALL 사용 권장
UNION을 사용할 때 각 SELECT 문의 컬럼 개수나 데이터 타입이 다르면 어떻게 되나요?
Q. PostgreSQL에서 대리 키(Surrogate Key)와 자연 키(Natural Key)의 차이점을 설명하고, 각각의 장단점과 실무에서 어떤 경우에 어떤 키를 선택하는 것이 적절한지 설명해주세요.
대리 키는 비즈니스 의미가 없는 인위적으로 생성된 식별자(예: SERIAL, UUID)이고, 자연 키는 비즈니스 데이터 자체가 가진 고유한 값(예: 주민등록번호, 이메일)입니다. 대리 키는 불변성이 보장되고 단순하여 조인 성능이 좋지만 추가 저장 공간이 필요하고, 자연 키는 추가 컬럼이 불필요하고 의미가 명확하지만 비즈니스 규칙 변경 시 키 값이 변경될 수 있어 참조 무결성 유지가 어렵습니다. 실무에서는 대부분 대리 키를 PRIMARY KEY로 사용하고 자연 키에는 UNIQUE 제약조건을 추가하는 방식을 선호하며, 이는 유연성과 안정성을 동시에 확보할 수 있기 때문입니다.
- • 대리 키는 인위적 식별자, 자연 키는 비즈니스 데이터
- • 대리 키는 불변성과 단순성 제공
- • 자연 키는 의미가 명확하지만 변경 가능성 존재
- • 실무에서는 대리 키를 PRIMARY KEY로, 자연 키는 UNIQUE로 설정하는 혼합 방식 선호
UUID를 대리 키로 사용할 때의 장단점은 무엇이며, SERIAL 타입과 비교했을 때 어떤 차이가 있나요?
Q. PostgreSQL에서 LIMIT와 OFFSET을 사용한 페이지네이션의 문제점을 설명하고, 대용량 데이터에서 더 효율적인 페이지네이션 방법인 Cursor-based Pagination(키셋 페이지네이션)의 동작 원리와 장점을 설명해주세요.
LIMIT와 OFFSET을 사용한 페이지네이션은 OFFSET 값이 커질수록 건너뛰어야 할 행을 모두 스캔해야 하므로 성능이 급격히 저하됩니다. 예를 들어 OFFSET 10000이면 10000개의 행을 읽고 버려야 합니다. Cursor-based Pagination은 마지막으로 조회한 레코드의 키 값을 기준으로 WHERE 절을 사용하여 다음 데이터를 조회하는 방식으로, 예를 들어 WHERE id > 1000 ORDER BY id LIMIT 20과 같이 인덱스를 활용합니다. 이 방식은 OFFSET과 달리 항상 일정한 성능을 유지하며, 인덱스 스캔만으로 빠르게 원하는 위치의 데이터를 찾을 수 있어 대용량 데이터 페이지네이션에 적합합니다.
- • OFFSET은 건너뛴 행도 모두 스캔하여 성능 저하
- • Cursor-based Pagination은 마지막 조회 키 값 기준으로 WHERE 절 사용
- • 인덱스를 활용하여 일정한 성능 유지
- • 대용량 데이터에서 훨씬 효율적
Cursor-based Pagination을 사용할 때 정렬 기준이 고유하지 않은 컬럼(예: created_at)인 경우 어떤 문제가 발생할 수 있고, 어떻게 해결할 수 있나요?
Q. PostgreSQL에서 NOT NULL 제약조건과 DEFAULT 값의 역할을 설명하고, 두 제약조건을 함께 사용할 때의 동작 방식과 실무에서의 활용 예시를 설명해주세요.
NOT NULL 제약조건은 해당 컬럼에 NULL 값이 저장되는 것을 방지하여 데이터 무결성을 보장하고, DEFAULT 값은 INSERT 시 명시적으로 값을 제공하지 않았을 때 자동으로 설정되는 기본값을 지정합니다. 두 제약조건을 함께 사용하면 값이 제공되지 않을 때 DEFAULT 값이 자동으로 채워지므로 NOT NULL 제약조건을 위반하지 않습니다. 예를 들어 사용자 테이블의 status 컬럼에 NOT NULL과 DEFAULT 'active'를 설정하면, 회원가입 시 상태를 명시하지 않아도 자동으로 'active'가 설정되어 항상 유효한 값을 보장합니다. 이는 애플리케이션 로직을 단순화하고 데이터 일관성을 높이는 데 유용합니다.
- • NOT NULL은 NULL 값 저장 방지
- • DEFAULT는 값 미제공 시 자동 설정되는 기본값
- • 두 제약조건 함께 사용 시 기본값으로 NOT NULL 충족
- • 애플리케이션 로직 단순화와 데이터 일관성 향상
DEFAULT 값으로 함수를 사용할 수 있나요? 예를 들어 현재 시각을 자동으로 저장하려면 어떻게 해야 하나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!