조회 속도를 위해 주문 요약에 상품명과 합계 금액을 복사하려 합니다. 중복을 안전하게 유지하려면 무엇을 정해야 하나요?
잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?
답변과 점검 포인트 펼치기답변 접기
구두 답변
정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.
반정규화는 조인·계산을 줄이려고 이미 다른 곳에 있는 사실이나 파생 값을 읽기 경로에 복제하는 선택입니다. 주문 목록에 상품명과 합계를 함께 저장하면 조회는 단순해질 수 있지만, 자동으로 원본과 같아지지는 않습니다. 먼저 복사본이 상품의 현재 이름인지, 주문 당시 이름인지, 합계가 권위 있는 원장인지 캐시성 파생 값인지 의미를 정해야 합니다. 의미가 다르면 같은 컬럼에 섞지 않겠습니다.
원본과 복사본의 생명주기를 정합니다
주문 당시 상품명·가격은 현재 카탈로그와 다른 역사적 사실입니다. 이 값은 주문 상세에 스냅샷으로 저장하고 상품 변경 이벤트가 덮어쓰지 않도록 합니다. 반대로 현재 상품명을 주문 요약에 보여 주려는 것이라면 카탈로그를 원본으로 하고 요약은 재생성 가능한 읽기 모델로 분류합니다. 상세 행에서 합계를 계산할 수 있다면 저장 합계는 파생 값이며 할인·세금·반올림·환불을 포함하는 계산 규칙과 재계산 기준을 명시해야 합니다.
같은 DB 안에서 원본과 요약을 함께 바꾸면 하나의 트랜잭션으로 묶어 즉시 일관성을 얻을 수 있지만 쓰기 시간이 길어지고 요약 갱신 범위가 커집니다. 별도 서비스나 검색 인덱스라면 DB 커밋 뒤 이벤트로 비동기 갱신해 읽기 지연을 허용할 수 있습니다. 이 경우 이벤트 중복·순서 뒤바뀜·소비자 장애·재처리를 고려해 전체 상태를 담은 이벤트는 적용 버전보다 낮은 것을 무시할 수 있지만, 증분 합계는 중간 이벤트를 생략하면 값이 틀리므로 ID 중복 제거와 순서·갭 처리가 필요합니다.
불일치 탐지와 재구축을 운영 계약으로 만듭니다
요약 테이블의 각 행에 원본 버전·계산 기준·갱신 시각을 저장하면 얼마나 낡았는지 확인하기 쉽습니다. 주기적으로 원본과 요약의 해시·합계·행 수를 대조하고, 차이가 나면 원본에서 해당 주문을 다시 계산하는 보정 작업을 실행합니다. 이벤트가 유실될 수 있다면 transactional outbox나 CDC를 사용하되, 그것도 소비자 적용과 조회 가시성을 자동으로 같은 시점에 만들지는 않습니다.
정규화 원본의 조인이 실제로 병목인지 실행 계획·반환량·p99로 확인한 뒤 반정규화를 도입하겠습니다. 복사본을 둘 때는 소유자, 갱신 트리거, 허용 신선도, 삭제·환불 처리, 재구축 명령과 운영 지표를 문서화해야 합니다. 캐시와 읽기 모델을 같은 것으로 보지 않고, 캐시가 사라져도 원본에서 복구 가능한지와 역사적 스냅샷이 절대 바뀌면 안 되는지를 분리하겠습니다. 조회가 빨라졌다는 단일 숫자보다 불일치 탐지·복구 시간이 전체 비용에 포함됩니다.
복사본의 의미를 ‘현재 상품명’으로 정했다면 상품 변경이 과거 주문 화면까지 바꾸는 것이 의도인지 확인해야 합니다. 그렇지 않다면 주문 당시 스냅샷과 현재 카탈로그를 별도 필드로 제공하겠습니다. 비동기 읽기 모델은 일시적 불일치를 숨기지 않고 버전·last_updated를 노출하거나, 중요한 화면은 원본 확인을 거치게 합니다. 재구축은 새 이벤트를 잃지 않도록 기준 시점과 증분 적용 순서를 정해야 하며, 무작정 전체 테이블을 다시 만들지 않겠습니다.
득점 포인트
이해가 드러나는 지점을 확인해 보세요.
- 현재 상태와 역사적 스냅샷의 의미를 분리한다.
- 비동기 복제의 중복·순서·장애를 버전·멱등·재구축으로 연결한다.
- 실제 병목과 허용 신선도를 근거로 도입한다.
감점 포인트
놓치기 쉬운 조건과 오해를 짚어 보세요.
- DB에 복사해 두면 원본 변경과 자동 동기화된다고 말한다.
- 주문 당시 가격을 현재 상품 가격으로 다시 계산한다.
- 불일치 탐지와 재구축 없이 조회 속도만 평가한다.
더 파고들 거리
하나 더 질문하며 이해의 범위를 넓혀 보세요.
- 읽기 모델의 늦은 이벤트를 버전으로 버립니다. 전체 상태 이벤트와 증분 이벤트는 왜 처리 조건이 다른가요?
- 원본과 일부 요약 행이 다릅니다. 전체 삭제 없이 대조·선택 재생성·실시간 이벤트 적용을 어떻게 조합하나요?
- 합계 저장과 조회 계산의 CPU·I/O·정정 비용을 측정해 보세요.
득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.
원리부터 공부하고 싶다면
답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.