상품 테이블과 주문 테이블에 중복된 칼럼이 있는데 왜 그런거죠?

2023. 6. 7. 16:35자바/스프링 삽질 기록

728x90
반응형

이번에는 웹 장바구니 미션을 진행했다. 장바구니에 물건을 담고, 이를 주문하는 프로세스를 개발하는 미션을 진행했다. 이러한 비즈니스 요구사항 속에서 구성했던 데이터베이스 테이블은 다음과 같다.

 

상품 테이블
주문 테이블
주문한 상품 테이블

 

얼핏 보기에는 정규화가 안되어있는 모습을 볼 수 있다. orders_item 테이블을 살펴보면 total_price라는 컬럼이 존재한다. 해당 컬럼은 사실 orders_item 테이블의 quantity 컬럼과 product 테이블의 price 컬럼의 값을 곱하면 구할 수 있는 정보이다. 따라서 이는 정규화가 올바르게 되지 않은 모습을 알 수 있다.

 

그럼에도 불구하고 위와 같이 구성했던 이유는 상품의 정보가 언제든지 바뀔 여지가 있기 때문이었다. 만약 order_item에서 단순히 수량 정보만 가지고 있다면 나중에 상품 가격이 수정되었을 때 주문했던 시기의 가격이 아닌 현재 상품의 가격으로 파악해서 클라이언트에게 잘못된 값을 전달할 수도 있기 때문이다.

이 문제에 대해서 한번 고민해보고 이를 해결하기 위한 두 가지 방법을 생각해봤다.

 

1. product의 정보가 수정될 때마다 새로운 데이터를 추가

 

 

 

상품 테이블을 위와 같이 구성할 수 있다. 상품에 status 칼럼을 추가해서 해당 상품이 올바른 정보를 가지고 있는지 판단해볼 수 있다. 매번 insert 쿼리가 전달될 때마다 기존 상품 정보의 status를 0으로 바꿔주고 새로운 상품 정보를 insert 해줄 수 있다.

 

이 경우에는 기존 상품을 수정하더라도 status만 수정하면 되기에 아까 언급한 문제를 해결할 뿐더러 소스 코드 상의 어려움도 많이 없을 것이라 판단된다. 기존 상품 정보의 id를 그대로 참조하고 있기 때문에 여전히 기존 상품의 가격을 참고할 수 있고 주문 조회 시에도 주문할 때의 가격, 이름 등을 기존 정보를 그대로 참고할 수 있다. 또한 데이터가 중요한 요즘, 이 방식을 많이 사용한다고 들었다. status라는 컬럼을 추가해서 각 상품의 유효성을 판단한다면 주문 목록 조회할 때에도 큰 어려움이 없을 것이라 생각했다.

다만 예상되는 단점으로는 데이터의 수정이 빈번하다는 점이 있다. 기존 데이터가 조금만 수정되더라도 쿼리를 매번 날려서 데이터베이스에 새로운 상품을 저장해야한다는 점은 또 다른 문제를 낳는다. 

또한 장바구니에 담은 상품과 상품 테이블의 저장된 상품의 불일치 문제가 있다는 것도 이를 적용하지 못하는 커다란 제약사항으로 남는다. 만약 A라는 유저가 상품을 장바구니에 두거나 주문을 하고 있을 때 상품의 정보를 수정한다면, 모든 유저의 장바구니에 담겨있는 상품의 정보를 수정해야한다. 이에 따라 오버헤드가 너무 크게 된다는 단점이 있다. 더군다나 지금 장바구니에 담겨 있는 상품은 변경하지 못하도록 코드가 작성되어있기 때문에 이는 문제가 될 여지가 무척 크다. 

 

2. order_item에서 가격 정보를 함께 저장

 

주문한 상품 테이블

미션을 진행하면서 실제로 선택한 방법이다.

 

컬럼을 위와 같이 추가한다면 주문할 당시의 상품 가격을 모두 저장할 수 있어서 처음 언급한 불일치 문제를 해결할 수 있다. 

 

그러나 값을 주문 아이템 테이블에서도 저장한다는 점 때문에 중복된 값을 저장한다는 문제가 있지만 고작 컬럼 하나 추가한다고 해서 발생하는 비용은 그리 많지 않다고 판단된다. 무결성이 지켜지지 않을 수 있다는 문제 또한 존재한다. 소스 코드 단에서 이러한 무결성을 고려해야하는 문제가 있기야 하지만 완전한 무결성을 보장하는 것보단 `구매자에게 그 당시에 결제했던 실제 금액을 알려주는 것이 더 중요하다`고 판단되기 때문에 2번째 방법을 선택하는 것이 더 좋아보인다. 물론 첫번째 방법보다 현재 소스코드에서 수정해야하는 범위도 적어보이고 말이다!

 

그래서 결국 두번째 방법을 선택했다!

 

테이블 설계를 할 때에도 기획적인 부분, 백엔드 뿐만이 아니라 클라이언트에게 제공해주는 주요 가치가 무엇인지 따지는 것이 굉장히 중요하다는 것을 느꼈다.

 

No Silver Bullet

 

점점 배울 수록 100% 정답은 없다는 것을 느낀다. 그럴수록 다각도에서 문제를 바라보고 서비스에서 제공하는 주요한 가치가 무엇인지를 아는 것이 굉장히 중요하게 느껴진다.

728x90
반응형