Topic (오늘의 주제)
정규화 (Normalization)
: 데이터베이스 설계 과정에서 중복을 최소화하고 데이터의 무결성을 유지하기 위해 테이블을 구조적으로 분해하는 과정.
Why (왜 사용하는가? 왜 중요한가?)
- 실무: 데이터를 중복 저장하면 수정 시 한쪽만 수정되어 데이터가 불일치하는 **이상 현상(Anomaly)**이 발생하여 서비스 로직이 꼬이게 된다.
- 구조적 의미: 저장 공간을 효율적으로 사용하게 해주지만, 테이블이 쪼개지므로 조회 시 조인(Join) 연산이 늘어나 읽기 성능에는 트레이드오프(Trade-off)가 있다.
- 면접 의도: DB 설계의 기초 체력을 확인하며, 무조건적인 정규화가 정답이 아님(반정규화의 필요성)을 알고 상황에 맞춰 설계할 수 있는지 본다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | 하나의 테이블을 속성(Attribute) 간의 종속성을 분석하여 여러 개의 테이블로 쪼개는 과정. |
| 목표 | 이상 현상(Anomaly) 방지, 중복 제거, 데이터 무결성 보장. |
| 동작 방식 | 제 1정규화(1NF) → 제 2정규화(2NF) → 제 3정규화(3NF) → BCNF ... 순서로 진행. (실무에선 보통 3NF까지만 진행) |
| 장점/단점 | 장점: 데이터 정확성 증가, 저장 공간 절약, 이상 현상 제거. 단점: 테이블이 많아져서 JOIN 연산 증가로 인한 조회 성능 저하 가능성, 쿼리 작성의 복잡성 증가. |
| 비교 | vs 반정규화(Denormalization): 조회 성능 향상을 위해 의도적으로 중복을 허용하고 테이블을 합치는 것. 정규화와는 반대 개념. |
💡 핵심: 정규화 단계별 요약 (이것만 외우세요!)
- 제 1정규화 (1NF): 모든 값은 **원자값(Atomic Value)**이어야 한다. (하나의 칸에 값 2개 넣기 금지)
- 제 2정규화 (2NF): 부분 함수 종속 제거. (PK가 2개 이상일 때, PK 일부에만 의존하는 컬럼을 딴 방으로 분리)
- 제 3정규화 (3NF): 이행 함수 종속 제거. (A→B, B→C 일 때, A→C가 되는 관계를 분리. 즉, PK가 아닌 일반 컬럼에 의존하는 녀석을 분리)
Interview Answer Version (면접 답변식 요약)
"정규화는 데이터의 중복을 줄이고 무결성을 지키기 위해 테이블을 분해하는 과정입니다.
가장 큰 목적은 데이터 변경 시 발생할 수 있는 **이상 현상(Anomaly)**을 방지하는 것입니다. 보통 실무에서는 제 3정규화까지 수행하여 설계합니다.
하지만 정규화가 과해지면 조인 연산이 많아져 조회 성능이 저하될 수 있으므로, 서비스 특성에 따라 적절히 반정규화를 고려해야 합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. 이상 현상(Anomaly) 3가지 (정규화를 안 하면 생기는 일)
면접에서 "왜 정규화를 해야 하죠?"라고 물으면 아래 3가지를 예시로 들면 좋습니다.
- 삽입 이상: 불필요한 데이터를 함께 넣지 않으면 새 데이터를 저장할 수 없는 현상.
- 갱신 이상: 중복된 데이터 중 일부만 수정되어 데이터 불일치가 일어나는 현상.
- 삭제 이상: 필요한 데이터를 지우려다 원치 않는 다른 정보까지 같이 삭제되는 현상.
2. 무조건 3NF가 정답은 아니다 (반정규화의 필요성)
- 쇼핑몰의 '주문 내역' 조회 시 상품명, 배송지, 회원 정보 등을 매번 5~6개 테이블을 조인해서 가져온다면 DB 부하가 심할 것입니다.
- 이럴 때는 주문_상세 테이블에 상품명을 중복해서 넣어두는 반정규화를 적용하여 조인 없이 한 번에 조회하도록 튜닝합니다.
- 기준: 데이터 정합성(쓰기)이 중요하면 정규화, 조회 속도(읽기)가 중요하면 반정규화를 고려합니다.
예상 꼬리 질문 정리
- "반정규화(Denormalization)는 언제, 어떻게 수행하나요?"
- (조인 비용이 너무 커서 조회 성능이 안 나올 때, 통계 테이블을 따로 만들거나 컬럼을 중복 저장하는 기법 설명)
- "제 2정규화와 제 3정규화의 차이점을 쉽게 설명해 보세요."
- (2NF는 복합키(PK가 여러 개)일 때 발생하고, 3NF는 일반 컬럼 간의 종속성(A->B->C) 때문에 발생한다는 차이 강조)
- "BCNF(Boyce-Codd Normal Form)는 무엇인가요?"
- (3NF를 만족하면서, 모든 결정자가 후보키 집합에 속해야 한다는 더 강력한 조건. 보통 3NF 설명 후 "더 엄격한 기준" 정도로 언급)
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: 트랜잭션 (Transaction) (0) | 2025.12.22 |
|---|---|
| Daily Dev Q&A: DDL, DML, DCL (0) | 2025.12.18 |
| Daily Dev Q&A: 자바의 람다 표현식 (0) | 2025.12.16 |
| Daily Dev Q&A: RDBMS (0) | 2025.12.15 |
| Daily Dev Q&A: 프레임워크(Framework) (0) | 2025.12.13 |