이번 중간 프로젝트 때 사용된 데이터베이스 정규화와 반정규화 개념을 알아보고 프로젝트에서 설계한 ERD와 비교해보고자 한다.
SQLD 공부할 때는 단순히 개념만 외워서 직접 적용해볼 기회가 없었는데 이번 프로젝트를 통해 테이블 정규화와 반정규화 개념을 확실하게 습득할 수 있었다.
DB 정규화(Normalization)
: 데이터의 중복을 제거하고 데이터의 일관성과 무결성을 유지하기 위해 데이터를 구조적으로 나누는 과정
목적
데이터 중복을 최소화하고 데이터의 무결성을 유지하기 위해서. 또한, 변경 이상(삽입, 삭제, 갱신 이상)을 방지함
단점
복잡한 JOIN으로 인한 성능 저하
쿼리 작성 어려움
DB 반정규화(Denormalization)
성능 향상을 위해 정규화된 데이터를 의도적으로 중복하거나 테이블을 통합하는 과정
목적
1. 데이터 조회 성능 향상
2. JOIN 최소화
3. 처리 속도 개선
장점
1. 빠른 데이터 조회
2. 시스템 성능 개선
3. 단순한 SQL 작성
단점
1. 데이터 중복 발생
2. 무결성 유지 어려움
3. 변경 시 복잡한 처리 필요
개념들은 다음과 같고 우리 팀의 ERD 설계는 다음과 같다.

다음과 같이 총 9개의 테이블로 이루어져있다.
이번 프로젝트의 주제는 편의점 상품의 “꿀조합”을 판매하는 쇼핑몰을 만드는 것이고 편의점 꿀조합 상품은 CU, GS25에서 크롤링해온 개별상품들을 조합하여 만든다.
그렇기 때문에 크롤링 해온 개별상품들은 SingleDTO에 저장이 되고, 꿀조합상품은 개별상품들을 더하여 생성하므로 ComboDTO에 저장된다.
ProductSingleDTO은 개별상품의 이름, 가격, 재고 등의 정보만 담긴 제1정규형을 만족하는 테이블이다.
ComboDTO는 꿀조합상품명, 카테고리, 편의점명 등으로 구성되어 꿀조합 상품을 만들기 위해 합쳐지는 개별 상품들은 저장되지 않는다.
ComboDTO에는 구성품 하나하나를 저장하지 않고 ComboComponentDTO를 생성하여 이 꿀조합 구성품 테이블 안에 개별상품의 PK값을 저장한다.
그러면 구성품 테이블의 값들은 전부 개별상품의 PK가 저장되어있기에 조인을 통해 개별상품의 정보를 가져올 수 있고, 해당 개별상품들로 구성되는 꿀조합 상품의 PK를 저장함으로써 한 꿀조합 상품 내에 저장되는 개별상품들의 정보를 알고, 가격이나 재고 등의 정보를 가져올 수 있는 것이다.
즉, 이건 제2정규형을 고려해서 구성품 테이블을 따로 두고 의존성을 분리한 구조이다.
반대로, 반정규화 예시를 들어보면 주문 상세 테이블을 예시로 들 수 있다.
주문 상세 테이블에는 총가격이라는 컬럼을 추가하였다. 얘는 계산 가능한 값이지만 성능과 편의를 위해 추가했다.
또한, 이 주문 상세 테이블을 통해 꿀조합 테이블, 개별상품 테이블, 주문 테이블과 조인하여 주문 내역 상세 정보에 많은 정보를 한번에 끌어올 수 있다.
이번 프로젝트는 정규화와 반정규화를 알맞은 상황에 적절히 이용하는 것이 굉장히 중요함을 느낄 수 있는 프로젝트였다.
이론으로 익힌 다양한 개념을 실제 프로젝트에서 많이 적용시켜볼 수 있도록 노력해야겠다.
'웹 개발' 카테고리의 다른 글
[Spring] 1일차 (0) | 2025.04.16 |
---|---|
싱글톤 패턴이란? (0) | 2025.04.15 |
do, did (1) | 2025.04.11 |
java.util.Date와 java.sql.Date 차이 (0) | 2025.04.10 |
DAO에서 while(rs.next)를 사용할 때 (0) | 2025.04.09 |