개요

게임을 개발하면서 데이터는 최대한 적게 저장하면 좋은 것이 아닌가 하는 생각을 가지고 있었다. 

커머스 도메인의 특징을 이해하고 데이터 무결성에 대해 학습한 과정을 작성해보고자 한다. 

 

문제 상황 

주문과 상품 비즈니스 로직 구현을 위해 erd를 설계하고 있었다. 

주문과 상품 사이에 주문 아이템이라는 테이블로 연관관계를 설정하였는데 

이때 주문 아이템에 이름과 가격을 기록해야하는가에 대한 의문이 들었다. 

 

원인 분석 

게임을 개발할때는 현재 상태의 데이터를 저장하는 것이 필요하지 과거의 데이터를 저장할 필요는 없다 

예를들어 지금의 공격력으로 연산을 하지 과거의 공격력을 사용하지 않기 때문이다 

(단 BM관련 시스템에서는 남길 필요가 있겠다 커머스의 상품 구매와 비슷하므로) 

그러나 커머스의 상품은 판매 시점이 언제인가에 따라서 가격이 변동될 수 있다. 심지어 이름도 마찬가지다. 

이렇게 가격이 변동된 이후에 환불을 하게되면 회사 입장에서는 손실이 될 수 있다. 

따라서 상품 테이블을 직접 참조하여 가격을 가져오는 것이 아니라 

주문할 당시에 가격을 참조해야하기때문에 이를 테이블에 기록해야한다. 

 

문제 해결 

 

조금 더 찾아보니 이는 데이터베이스의 "정합성"을 지키는 행위라고 한다. 

 

정합성이란 데이터들이 서로 논리적으로 일관성있게 맞아떨어지는 상태를 의미하는데 

예시1) 

어제 주문했던 상품은 4,000원이었음
근데 오늘 가격이 5,000원으로 오르면서 과거 주문도 5,000원으로 바뀜

과거 기록 오류 → 정합성 깨짐

예시2) 

상품 테이블에서 itemId=3 삭제
근데 주문아이템 테이블엔 itemId=3이 남아 있음

참조 깨짐 → 정합성 깨짐

 

그렇다면 정합성을 어떻게 해결할 수 있을까?

1. 주문아이템에 “그 당시 가격”을 저장
- 상품 가격이 바뀌어도 과거 주문이 영향을 받지 않음

2. 트랜잭션(Transaction) 사용
- 주문 생성과 주문아이템 생성이 둘 다 성공해야만 commit
- 하나라도 실패하면 전체 롤백

3. 외래키(FK)로 참조 무결성 확보
- 주문아이템이 존재하려면 productId/productName이 존재해야 함

4.데이터 정합성 검증 로직
- 총 금액 계산
- 재고 검증
- 사용자 정보 검증

 

마무리

도메인의 특성을 이해하고 그에 따른 erd를 설계하는 것이 중요함을 알게 되었다. 

 

+ Recent posts