DB정규화는 왜 할까?

뿌이·2025년 3월 13일

CS

목록 보기
11/12
post-thumbnail

DB 정규화를 하는 이유

데이터베이스 설계에 있어 정규화(Normalization)는 항상 논의되는 주제입니다. 특히 개발자로서 "왜 정규화를 해야 하는가?"라는 질문은 단순한 교과서적 대답 이상의 실질적인 이해가 필요합니다. 이 글에서는 DB 정규화의 개념적 이유부터 실무 개발자 관점에서의 심층적 가치까지 살펴보겠습니다.

1. 정규화의 기본 개념과 목적

정규화는 관계형 데이터베이스 설계에서 데이터 중복을 최소화하고 데이터 무결성을 향상시키기 위한 프로세스입니다.
--> 이렇게 까지만 답변한다면 너무 개념에 가까운 대답이라, 신입이 대답하는 수준에 가깝고, 경력직 개발자라면 왜 실질적으로 실무에서 정규화를 하는지에 대한 답변을 해야한다.(본 글 4번 참고)

  • 데이터 중복 최소화: 동일한 데이터가 여러 테이블에 중복되어 저장되는 것을 방지
  • 데이터 무결성 보장: 데이터의 정확성과 일관성 유지
  • 이상현상(Anomaly) 방지: 삽입, 수정, 삭제 과정에서 발생할 수 있는 논리적 오류 예방

2. 데이터 이상현상 문제

정규화되지 않은 데이터베이스에서는 다음과 같은 이상현상이 발생할 수 있습니다

삽입 이상(Insertion Anomaly)

새로운 데이터를 추가하기 위해 불필요한 데이터까지 함께 추가해야 하는 문제입니다. 예를 들어, 학생과 수강 과목이 하나의 테이블에 있을 경우, 아직 수강 신청을 하지 않은 신입생 정보는 과목 정보 없이는 추가할 수 없게 됩니다.

갱신 이상(Update Anomaly)

중복된 데이터 중 일부만 변경되어 데이터 불일치가 발생하는 문제입니다. 동일한 교수 정보가 여러 강의 레코드에 중복되어 있는 경우, 한 곳만 업데이트되면 데이터 일관성이 깨집니다.

삭제 이상(Deletion Anomaly)

특정 데이터를 삭제할 때 의도치 않게 필요한 다른 데이터까지 함께 삭제되는 문제입니다. 학생이 수강 중인 과목 정보를 삭제하면서 유일하게 저장된 과목 정보까지 손실될 수 있습니다.

3. 개발자 관점에서의 정규화 가치

교과서적인 개념을 넘어, 실제 개발 환경에서 정규화가 갖는 가치는 더 깊습니다

3.1 기술 부채 방지

정규화되지 않은 데이터베이스는 시간이 지날수록 기술 부채가 누적됩니다. 초기에는 빠른 개발이 가능할지 모르나, 장기적으로는 데이터 불일치와 버그 해결에 몇 배의 시간이 소요됩니다. 정규화는 이러한 기술 부채를 사전에 방지합니다.

3.2 유지보수 용이성

애플리케이션 생명주기에서 개발보다 유지보수에 더 많은 비용이 소요됩니다. 정규화된 데이터베이스는 구조가 명확하여 버그 수정과 기능 추가가 예측 가능하고 효율적으로 이루어집니다.

3.3 협업 효율성

팀 프로젝트에서 다른 개발자가 데이터베이스를 이해하고 작업할 때, 정규화된 구조는 학습 곡선을 낮춥니다. 정규화되지 않은 DB는 암묵적 지식에 의존하게 되어 인수인계와 협업이 어려워집니다.

3.4 비즈니스 로직 변경 대응력

비즈니스 요구사항은 지속적으로 변합니다. 정규화된 데이터베이스는 데이터 관계가 명확히 모델링되어 있어 새로운 요구사항이나 변경 요청에 더 유연하게 대응할 수 있습니다.

4. 정규화와 성능 최적화의 관계

정규화와 성능은 일반적으로 트레이드오프 관계에 있다고 여겨지지만, 실제로는 더 복잡한 관계를 가집니다

4.1 정규화가 성능을 향상시키는 측면

  • 디스크 I/O 감소: 중복 데이터가 줄어들어 데이터 페이지 수가 감소하므로 디스크 읽기/쓰기 작업이 더 효율적으로 이루어집니다.
  • 인덱스 효율성 증가: 테이블이 논리적으로 분리되어 있어 인덱스가 더 작고 효율적으로 작동합니다. 특히 높은 선택성을 가진 쿼리에서 효과적입니다.
  • 캐시 활용도 향상: 작은 테이블은 데이터베이스 캐시에 더 효율적으로 로드되어 메모리 내 처리 비율이 높아집니다.
  • 동시성 처리 개선: 데이터가 논리적 단위로 분리되어 있어 동시 트랜잭션 처리 시 락(lock)의 범위가 축소되고 경합이 감소합니다.

4.2 성능 최적화를 위한 선택적 접근

실제 프로젝트에서는 정규화와 성능 사이의 균형이 중요합니다

  • 3NF까지 정규화 후 선택적 비정규화: 일반적으로 3정규형까지 정규화한 후, 성능 요구사항에 따라 특정 부분을 선택적으로 비정규화하는 방식이 권장됩니다.
  • 읽기 vs 쓰기 워크로드 분석: 읽기 작업이 많은 시스템에서는 일부 비정규화가 유리할 수 있으며, 쓰기 작업이 많은 시스템에서는 정규화가 더 효과적일 수 있습니다.
  • 데이터 볼륨과 액세스 패턴 고려: 대용량 데이터와 특정 액세스 패턴에 따라 정규화 수준을 조정할 수 있습니다.

5. 결론: 정규화는 장기적 투자

DB 정규화는 단순히 중복 제거를 위한 것이 아니라, 데이터 모델의 논리적 일관성과 무결성을 보장하기 위한 근본적인 방법론입니다. 개발자로서 정규화는 단기적 편의보다 장기적 안정성과 확장성에 투자하는 것입니다.

정규화된 데이터베이스는

  • 더 예측 가능한 성능 특성을 제공합니다
  • 애플리케이션 로직의 복잡성을 줄입니다
  • 변화하는 비즈니스 요구사항에 더 유연하게 적응합니다
  • 개발 팀의 생산성을 향상시킵니다

결국 적절한 정규화는 프로젝트의 생명주기 전반에 걸쳐 기술적 건전성과 비즈니스 민첩성을 모두 지원하는 핵심 요소입니다. 모든 프로젝트가 동일한 수준의 정규화를 필요로 하지는 않지만, 정규화의 원칙을 이해하고 상황에 맞게 적용하는 것은 모든 데이터베이스 설계자와 개발자에게 필수적인 역량입니다.

단, 과도한 정규화는 조인 연산이 많아져 성능 저하를 일으킬 수 있으므로 실제 시스템 요구사항에 맞게 적절한 수준의 정규화를 적용하는 것이 중요

profile
기록이 쌓이면 지식이 된다.

0개의 댓글