Dailly Dev Q&A: 정규화

2025. 12. 18. 08:56·Archive/Daily Dev Q&A

Topic (오늘의 주제)

정규화 (Normalization)

: 데이터베이스 설계 과정에서 중복을 최소화하고 데이터의 무결성을 유지하기 위해 테이블을 구조적으로 분해하는 과정.

Why (왜 사용하는가? 왜 중요한가?)

  • 실무: 데이터를 중복 저장하면 수정 시 한쪽만 수정되어 데이터가 불일치하는 **이상 현상(Anomaly)**이 발생하여 서비스 로직이 꼬이게 된다.
  • 구조적 의미: 저장 공간을 효율적으로 사용하게 해주지만, 테이블이 쪼개지므로 조회 시 조인(Join) 연산이 늘어나 읽기 성능에는 트레이드오프(Trade-off)가 있다.
  • 면접 의도: DB 설계의 기초 체력을 확인하며, 무조건적인 정규화가 정답이 아님(반정규화의 필요성)을 알고 상황에 맞춰 설계할 수 있는지 본다.

Core Concept (핵심 개념 정리)

요소 내용
개념 정의 하나의 테이블을 속성(Attribute) 간의 종속성을 분석하여 여러 개의 테이블로 쪼개는 과정.
목표 이상 현상(Anomaly) 방지, 중복 제거, 데이터 무결성 보장.
동작 방식 제 1정규화(1NF) → 제 2정규화(2NF) → 제 3정규화(3NF) → BCNF ... 순서로 진행. (실무에선 보통 3NF까지만 진행)
장점/단점 장점: 데이터 정확성 증가, 저장 공간 절약, 이상 현상 제거.

단점: 테이블이 많아져서 JOIN 연산 증가로 인한 조회 성능 저하 가능성, 쿼리 작성의 복잡성 증가.
비교 vs 반정규화(Denormalization): 조회 성능 향상을 위해 의도적으로 중복을 허용하고 테이블을 합치는 것. 정규화와는 반대 개념.

💡 핵심: 정규화 단계별 요약 (이것만 외우세요!)

  1. 제 1정규화 (1NF): 모든 값은 **원자값(Atomic Value)**이어야 한다. (하나의 칸에 값 2개 넣기 금지)
  2. 제 2정규화 (2NF): 부분 함수 종속 제거. (PK가 2개 이상일 때, PK 일부에만 의존하는 컬럼을 딴 방으로 분리)
  3. 제 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 부하가 심할 것입니다.
  • 이럴 때는 주문_상세 테이블에 상품명을 중복해서 넣어두는 반정규화를 적용하여 조인 없이 한 번에 조회하도록 튜닝합니다.
  • 기준: 데이터 정합성(쓰기)이 중요하면 정규화, 조회 속도(읽기)가 중요하면 반정규화를 고려합니다.

예상 꼬리 질문 정리

  1. "반정규화(Denormalization)는 언제, 어떻게 수행하나요?"
    • (조인 비용이 너무 커서 조회 성능이 안 나올 때, 통계 테이블을 따로 만들거나 컬럼을 중복 저장하는 기법 설명)
  2. "제 2정규화와 제 3정규화의 차이점을 쉽게 설명해 보세요."
    • (2NF는 복합키(PK가 여러 개)일 때 발생하고, 3NF는 일반 컬럼 간의 종속성(A->B->C) 때문에 발생한다는 차이 강조)
  3. "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
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: 트랜잭션 (Transaction)
  • Daily Dev Q&A: DDL, DML, DCL
  • Daily Dev Q&A: 자바의 람다 표현식
  • Daily Dev Q&A: RDBMS
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    DevFestIncheon2025
    jpa
    devlog
    SpringBoot
    aws_s3
    클로드코드
    backend
    커리어리셋
    프로젝트회고
    REACT
    Spring비교
    network
    java
    프로덕트개발자
    데브페스트
    Project_Review
    til
    경기기후바이브코딩
    OrphanRemova
    spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Dailly Dev Q&A: 정규화
상단으로

티스토리툴바