역정규화 ↩️

Lzhtk·2025년 6월 1일

오늘은 역정규화와 역정규화가 왜 필요한지 알아보자❗❕

정규화와 역정규화

  • 정규화란 데이터의 중복을 줄이고 무결성을 높이기 위해 테이블을 분리하는 작업을 말한다.
  • 정규화는 일반적으로 1~5단계까지 존재하며, 데이터 일관성을 유지하는 데 목적이 있다.
  • 역정규화란 이러한 정규화된 테이블 구조를 일부 다시 합치거나, 중복 데이터를 허용하여 설계하는 작업이다.
  • 즉, 역정규화는 성능이나 실용성을 위해 정규화 원칙을 의도적으로 완화하는 설계 기법이다.

역정규화가 필요한 상황과 고려할 사항

  • 이렇게 실용성이나 성능을 위해 사용하는 역정규화가 필요한 상황은 언제 일까 ❔ 🤷‍♂️
    1️⃣ 정규화로 인해 조인이 많아져 조회 성능이 저하된 경우
    2️⃣ 조회 작업이 입력/갱신 작업보다 훨씬 많은 경우
    3️⃣ 통계, 집계, 리포트용으로 쿼리가 빈번하게 실행되며 성능이 중요한 경우
  • 위와 같은 상황에서 역정규화가 유용한 것은 알겠다. 그럼 역정규화를 사용할 때 고려할 점은?
    1️⃣ 데이터 중복으로 인한 저장 공간이 증가된다는 점
    2️⃣ 데이터 변경 시 무결성을 유지하기 위한 추가 로직 필요할 때
    3️⃣ 쿼리 패턴을 충분히 분석한 뒤 제한적으로 적용해야 한다.

역정규화를 적용하면 안 되는 경우

  • 아래와 같은 상황에서는 역정규화가 오히려 문제를 일으킬 수 있다.
    • 데이터 변경이 빈번한 경우
    • 결제, 정산과 같이 강한 데이터 정합성이 요구되는 도메인
    • 하나의 데이터 변경이 여러 테이블에 영향을 미치는 구조
  • 이 경우 역정규화는 트랜잭션 복잡도와 오류 가능성을 크게 증가시킨다.

역정규화의 대표적인 적용 방식

  • 역정규화는 다양한 형태로 적용될 수 있다.
    • 자주 조회되는 컬럼을 다른 테이블에 중복 저장
    • 통계/집계 결과를 미리 계산하여 별도 테이블에 저장
    • 읽기 성능 최적화를 위한 전용 테이블 또는 View 구성

역정규화의 장단점

  • 우리가 알아본 역정규화의 장단점을 정리하면 아래와 같다.
    • 장점
      1️⃣ 조인 성능 향상
      • 조인 없이 한 번에 데이터를 읽을 수 있어 쿼리 성능 향상
        2️⃣ 쿼리 구조의 단순화
      • 복잡한 조인 없이도 데이터를 쉽게 조회 가능
        3️⃣ 통계, 집계와 같은 처리 최적화
      • 미리 계산된 데이터를 저장해두면 실시간 집계를 할 필요가 없어진다.
    • 단점
      1️⃣ 데이터 중복 발생
      • 여러 테이블에 동일한 데이터가 저장됨 -> 용량 증가 및 동기화 문제 우려
        2️⃣ 데이터 무결성 저하 우려
      • 데이터 변경 시 모든 관련 테이블을 동기화하지 않을 시 데이터 무결성을 해침
        3️⃣ 코드/로직의 복잡도 증가
      • 중복 데이터를 관리하기 위한 추가 비즈니스 로직이 필요할 수 있기에 복잡도 증가
        4️⃣ DML 작업의 성능 저하 가능성
      • 여러 곳에 데이터를 갱신해야 하기에 DML 쿼리의 복잡도가 증가할 우려가 있다.

역정규화 적용 전 고려해야 할 대안 ⚠

  • 그렇기에 역정규화는 최후의 선택이어야 한다.
  • 적용 전에 다음과 같은 방법을 먼저 검토하는 것이 바람직하다.
    • 인덱스 최적화
    • 쿼리 개선
    • 캐시 도입
  • 이러한 방법으로도 해결되지 않는 경우에만 역정규화를 고려해야 한다.

마무리 🔚

오늘은 역정규화에 대해 알아보았다.
역정규화는 성능 향상을 위한 강력한 도구이지만, 항상 정답은 아니다.
데이터 특성과 쿼리 패턴을 충분히 분석한 뒤, 필요한 부분에 한해 신중하게 적용하도록 해보자💯

0개의 댓글