Database 기술면접 Q&A

Jihye Gim·2026년 5월 20일

Codeit SB11

목록 보기
16/22

Database 기술면접 Q&A 20선


1. 인덱스(Index)란 무엇이고 어떻게 동작하나요?

A. 인덱스는 데이터 검색 속도를 높이기 위한 별도의 자료구조입니다. 대부분의 RDBMS는 B-Tree 인덱스를 기본으로 사용합니다.

  • B-Tree의 리프 노드에 (인덱스 키값, 실제 데이터 위치)를 저장
  • WHERE, ORDER BY, JOIN 조건에 인덱스 컬럼이 있으면 Full Scan 대신 인덱스 탐색
  • 단점: 쓰기(INSERT/UPDATE/DELETE) 시 인덱스도 갱신되어 오버헤드 발생. 인덱스 자체가 추가 디스크 공간 사용.

2. 트랜잭션의 ACID 속성을 설명해주세요.

A.

  • Atomicity(원자성): 트랜잭션의 모든 작업이 전부 성공하거나 전부 실패. 중간 상태 없음.
  • Consistency(일관성): 트랜잭션 완료 후 DB가 항상 유효한 상태 유지. 무결성 제약 조건 준수.
  • Isolation(격리성): 동시 실행 트랜잭션이 서로 영향을 주지 않음. 격리 수준으로 조절.
  • Durability(지속성): 커밋된 트랜잭션의 결과는 시스템 장애 후에도 보존. WAL(Write-Ahead Log)로 구현.

3. 트랜잭션 격리 수준(Isolation Level) 4가지를 설명해주세요.

A.

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
READ UNCOMMITTED발생발생발생
READ COMMITTED방지발생발생
REPEATABLE READ방지방지발생
SERIALIZABLE방지방지방지
  • MySQL InnoDB 기본값: REPEATABLE READ (MVCC로 Phantom Read 대부분 방지)
  • PostgreSQL 기본값: READ COMMITTED

4. N+1 문제란 무엇이고 해결 방법은?

A. 1번의 쿼리로 N개의 결과를 가져온 후, 각 결과마다 추가 쿼리 N번이 발생하는 문제.

SELECT * FROM orders;                    -- 1번
SELECT * FROM products WHERE id = 1;    -- N번 반복
SELECT * FROM products WHERE id = 2;
...

해결 방법:

  • JOIN 쿼리: 한 번에 연관 데이터 조회
  • Eager Loading: JPA에서 fetch = FetchType.EAGER 또는 JOIN FETCH
  • Batch Fetching: IN 절로 한 번에 조회 (@BatchSize)
  • DataLoader 패턴: GraphQL 환경에서 배치 로딩

5. 정규화(Normalization)란 무엇이고 장단점은?

A. 데이터 중복을 제거하고 이상 현상(Anomaly)을 방지하기 위해 테이블을 분리하는 과정.

  • 1NF: 원자값, 반복 그룹 제거
  • 2NF: 부분 함수 종속 제거 (복합 PK의 일부에만 종속된 컬럼 분리)
  • 3NF: 이행 함수 종속 제거 (PK가 아닌 컬럼에 종속된 컬럼 분리)
  • BCNF: 결정자가 후보키가 아닌 경우 분리

장점: 중복 제거, 일관성 유지, 저장 공간 절약 단점: JOIN 증가로 읽기 성능 저하 → 읽기 최적화 필요 시 역정규화(Denormalization) 고려


6. 옵티마이저(Optimizer)와 실행 계획(Execution Plan)이란?

A. 옵티마이저는 SQL을 가장 효율적으로 실행하기 위한 실행 계획을 수립하는 DBMS의 핵심 엔진입니다.

  • 비용 기반(Cost-Based): 통계 정보(행 수, 분포도)를 바탕으로 비용을 계산해 최적 경로 선택
  • EXPLAIN / EXPLAIN ANALYZE: 실행 계획 확인 명령어
  • 주요 확인 지표: Full Table Scan 여부, 인덱스 사용 여부, 조인 방식(Nested Loop/Hash/Merge), rows 추정치

7. Lock(잠금)의 종류와 차이를 설명해주세요.

A.

  • Shared Lock (S Lock, 읽기 락): 읽기 작업 시 사용. 다른 읽기와 동시 가능. 쓰기는 불가.
  • Exclusive Lock (X Lock, 쓰기 락): 쓰기 작업 시 사용. 다른 읽기/쓰기 모두 블로킹.
  • 낙관적 락(Optimistic Lock): 충돌이 드물다고 가정. 버전(version) 컬럼으로 충돌 감지. 충돌 시 예외 발생 후 재시도.
  • 비관적 락(Pessimistic Lock): 충돌이 자주 발생한다고 가정. SELECT FOR UPDATE로 미리 잠금.

8. MVCC(Multi-Version Concurrency Control)란?

A. 읽기/쓰기 충돌을 줄이기 위해 데이터의 여러 버전을 유지하는 동시성 제어 방식.

  • 읽기 작업은 데이터를 잠그지 않고 트랜잭션 시작 시점의 스냅샷을 읽음
  • 쓰기 작업은 새 버전을 생성 (기존 버전 보존)
  • InnoDB: Undo Log에 이전 버전 저장. PostgreSQL: 테이블에 여러 버전 직접 저장(VACUUM으로 청소)
  • 장점: 읽기-쓰기 간 블로킹 없음. 단점: 저장 공간 증가, Vacuum 필요

9. 파티셔닝(Partitioning)과 샤딩(Sharding)의 차이는?

A.

  • 파티셔닝: 하나의 DB 서버 내에서 테이블을 물리적으로 분리. 관리는 DBMS가 담당.
    • Range: 날짜 범위로 분리 (2024년 데이터 / 2025년 데이터)
    • Hash: 해시값으로 균등 분배
    • List: 특정 값 목록으로 분리
  • 샤딩: DB 서버를 여러 대로 나누어 데이터 분산. 수평 확장(Scale-Out).
    • 구현 복잡성 높음. Cross-shard 조인, 분산 트랜잭션이 어렵.

10. 인덱스를 타지 않는 경우(인덱스 무효화)는?

A.

  • 함수 사용: WHERE YEAR(created_at) = 2024WHERE created_at BETWEEN ...으로 변경
  • 묵시적 형변환: WHERE user_id = '123' (user_id가 INT면 형변환 발생)
  • LIKE 앞 와일드카드: WHERE name LIKE '%홍' (앞에 %는 인덱스 불가)
  • OR 조건: 복합 인덱스에서 OR 사용 시 풀스캔 가능성
  • NOT 연산: WHERE status != 'ACTIVE'
  • 낮은 카디널리티: 성별(M/F) 같은 컬럼은 인덱스 효과 미미

11. 조인(JOIN) 종류를 설명해주세요.

A.

  • INNER JOIN: 양쪽 테이블에 모두 존재하는 행만 반환
  • LEFT OUTER JOIN: 왼쪽 테이블 전체 + 오른쪽 일치 행 (없으면 NULL)
  • RIGHT OUTER JOIN: 오른쪽 테이블 전체 + 왼쪽 일치 행
  • FULL OUTER JOIN: 양쪽 테이블 전체 (MySQL 미지원, UNION으로 구현)
  • CROSS JOIN: 카테시안 곱. 양쪽 행 수의 곱만큼 결과 행 생성

12. 데드락(Deadlock)이 DB에서 발생하는 이유와 해결책은?

A. 두 트랜잭션이 서로 상대방의 락을 기다리며 무한 대기하는 상황.

T1: 테이블A 락 획득 → 테이블B 락 대기
T2: 테이블B 락 획득 → 테이블A 락 대기 → 교착

해결:

  • DB가 자동 감지 후 희생자(Victim) 선택하여 롤백
  • 트랜잭션에서 테이블 접근 순서를 항상 동일하게 유지
  • 트랜잭션을 짧게 유지
  • 낙관적 락으로 전환 고려

13. 클러스터 인덱스와 비클러스터 인덱스의 차이는?

A.

  • 클러스터 인덱스(Clustered Index): 인덱스 순서대로 실제 데이터가 물리적으로 정렬. 테이블당 1개. InnoDB에서 Primary Key가 클러스터 인덱스.
    • 범위 검색 매우 빠름. 삽입 시 재정렬 발생.
  • 비클러스터 인덱스(Non-Clustered Index): 인덱스 리프 노드에 실제 데이터의 위치(PK 또는 RID) 저장. 테이블당 여러 개 가능.
    • 인덱스 → 실제 데이터 2단계 접근(Index Scan + Lookup).

14. EXPLAIN 결과에서 중요하게 봐야 할 항목은?

A.

  • type: 접근 방식. ALL(풀스캔, 최악) → indexrangerefeq_refconst(최적)
  • key: 실제 사용된 인덱스명. NULL이면 인덱스 미사용.
  • rows: 옵티마이저가 예측한 검색 행 수. 실제와 차이가 크면 통계 업데이트 필요.
  • Extra: Using filesort(정렬 추가 발생), Using temporary(임시 테이블 사용), Using index(커버링 인덱스, 효율적)

15. 커버링 인덱스(Covering Index)란?

A. 쿼리에 필요한 모든 컬럼이 인덱스에 포함되어 실제 테이블 데이터를 조회하지 않아도 되는 인덱스.

sql

-- name, email로 구성된 복합 인덱스
CREATE INDEX idx_name_email ON users(name, email);
SELECT name, email FROM users WHERE name = '홍길동';
-- 테이블 접근 없이 인덱스만으로 결과 반환 → EXPLAIN Extra: Using index
  • I/O 횟수 대폭 감소. 읽기 성능 극대화.

16. ORM(Object-Relational Mapping)의 장단점은?

A. 장점:

  • SQL 대신 객체 지향 코드로 DB 조작. 생산성 향상.
  • DB 종류 변경 시 코드 변경 최소화 (포터빌리티)
  • 자동 쿼리 생성, 캐시, 지연 로딩 등 편의 기능

단점:

  • 복잡한 쿼리 표현의 한계. 성능 최적화 어려움.
  • N+1 문제 등 ORM 특유의 함정
  • 내부 동작을 이해하지 못하면 오히려 성능 저하
  • 해결: 복잡한 쿼리는 Native Query / QueryDSL 사용

17. 캐시와 DB를 함께 쓸 때 데이터 정합성은 어떻게 유지하나요?

A.

  • Cache-Aside: 캐시 미스 시 DB 조회 후 캐시에 저장. 캐시가 원본과 달라질 수 있음.
  • Write-Through: DB 쓰기 시 캐시도 동시에 갱신. 항상 일치하지만 쓰기 지연 발생.
  • TTL 설정: 캐시에 만료 시간을 두어 일정 주기로 갱신. 일시적 불일치 허용.
  • 캐시 무효화(Invalidation): DB 쓰기 시 관련 캐시 키 즉시 삭제. 다음 읽기 시 DB에서 갱신.
  • 완벽한 정합성이 필요하면 캐시를 쓰지 않거나 분산 락으로 원자적 처리.

18. 인덱스 설계 시 카디널리티(Cardinality)가 중요한 이유는?

A. 카디널리티는 컬럼의 유니크한 값의 수(중복 제거 후)를 의미합니다.

  • 높은 카디널리티: user_id, email → 인덱스 효과 매우 좋음. 소수의 행만 필터링.
  • 낮은 카디널리티: 성별(2가지), 상태(3가지) → 인덱스 효과 미미. 결과가 전체의 10~30%면 Full Scan이 오히려 빠를 수 있음.
  • 복합 인덱스: 카디널리티 높은 컬럼을 앞에 배치. (user_id, status) > (status, user_id)

19. 데이터베이스 리플리케이션(Replication)이란?

A. Master(Primary) DB의 변경사항을 Slave(Replica) DB에 자동으로 복제하는 기술.

  • 목적: 고가용성(Master 장애 시 Slave로 페일오버), 읽기 부하 분산(읽기는 Slave로).
  • 비동기 리플리케이션: Master가 Slave 반영을 기다리지 않음. 성능 좋으나 데이터 지연 가능.
  • 동기 리플리케이션: 모든 Slave에 반영 확인 후 커밋. 일관성 높으나 성능 저하.
  • 주의: 읽기-쓰기 분리 시 복제 지연(Replication Lag)으로 최신 데이터 불일치 가능.

20. NoSQL과 RDBMS를 언제 선택해야 하나요?

A.

기준RDBMSNoSQL
데이터 구조정형, 스키마 고정비정형, 유연한 스키마
트랜잭션ACID 완벽 지원제한적 (종류마다 다름)
확장성수직 확장수평 확장 용이
조인복잡한 조인 가능어려움
적합 사례금융, 결제, 주문채팅, 로그, 실시간 피드
  • 선택 기준: 트랜잭션 일관성이 중요하면 RDBMS, 대용량/고속 읽기·쓰기가 중요하면 NoSQL. 실무에서는 두 가지를 혼합 사용하는 것이 일반적.
profile
Rookie

0개의 댓글