새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

1 분 소요

Coupon 테이블 설계 트레이드오프

지금 쿠폰 테이블 메타데이터는 아래와 같습니다.

Column Data Type Constraints/Defaults Description
coupon_id BIGINT Primary Key, Auto Increment 쿠폰 아이디
code VARCHAR(50) 코드
discount_amount DECIMAL(10,2) 할인 금액
start_date DATETIME 시작일
end_date DATETIME 종료일
seller_id BIGINT 발행자 아이디 (seller_id)
created_at DATETIME 생성일
updated_at DATETIME 수정일
created_by VARCHAR(100) 생성자
updated_by VARCHAR(100) 수정자
delete_yn VARCHAR(1) Default: ‘N’ 삭제 여부 (기본값: ‘N’)

쿠폰 테이블중 쿠폰의 정보를 구분하는 필드는 code입니다.

예를 들어 유니크한 쿠폰 번호가 있을 수 있고 어느 이용자에게나 해당 쿠폰 번호를 입력하면 모두 발급되는 쿠폰이 있을 수 있습니다.

해당 쿠폰 번호를 저장하는 필드가 code 입니다.

지금 개발하는 토이 프로젝트는 신규 회원 모집을 위한 목적으로 신규가입시 시스템이 회원에게 자동으로 신규 가입 환영 쿠폰을 발행합니다.

신규 가입 환영 쿠폰을 발행하려면 coupon 테이블에 신규가입 쿠폰이 들어있어야합니다.

쿠폰 테이블에 신규 가입 쿠폰을 저장한다면 code 필드에 NEWJOIN 라고 쿠폰 번호를 추가하여 저장합니다.

신규가입으로 자동으로 쿠폰을 발행할 때 쿠폰 서비스에서 쿠폰 테이블을 조회해서 신규가입 쿠폰에 대한 정보를 가져온다면 code 필드에서 NEWJOIN이라는 필드로 가져올것입니다.

그런데 쿠폰 번호는 동적으로 계속 변경될 수 있는 필드며 해당 쿠폰이 무슨 쿠폰인지 알기 위해서는 prefix에 설명이 추가되어야합니다. NEWJOIN2025 그러면 해당 쿠폰은 신규가입 쿠폰이라는 것을 알 수 있습니다.

그런데 찜찜한건 회원가입 서비스가 쿠폰 서비스에게 신규가입 쿠폰발행을 요청할 때 쿠폰 번호를 알고 있다는건 논리적으로 맞지가 않으니 쿠폰 번호는 쿠폰 서비스가 가지고 있어야합니다.

다시 쿠폰 서비스가 신규가입 쿠폰발행 동작을 할 때 조회할 쿠폰 번호를 찾아보고 해당 값을 찾아서 가지고 데이터베이스에서 조회를 해야합니다.

그러면 쿠폰 번호는 쿠폰 서비스가 가지고 있는게 아니라 쿠폰 엔티티가 신규가입 쿠폰 번호에 대한 비즈니스 로직을 가지고 있는것 이 맞습니다.

그러면 다시 쿠폰 번호에 대한 비즈니스 로직을 가지고 있는데 반환 값이 문자열을 반환해야하는데 신규 가입으로 가입되는 경우에는 고정값을 가지고 있으므로 상수 처리하는 것이 다양한 책임을 분리할 수 있을거같습니다.

그러면 쿠폰 엔티티는 쿠폰 번호를 상수화 하려니 그 많은 쿠폰 번호를 객체로 만들 필요는 없다는 걸 느꼇습니다.

그러면 다시 신규가입인 경우에만 고유하면서 비즈니스적으로 알 수있는 쿠폰 상수를 저장하거나 로직을 만드는 것이 좋다고 생각이 들었습니다.

또 다른 방법은 필드를 추가하는 방법입니다.

예를 들어 coupon_type이라는 필드를 추가한다면 코드와 상관없이 coupon_type : NEWJOIN 으로 저장한다면 충분히 확장성있고 이벤트가 추가되어도 필드타입만 추가해서 조회하면 됩니다.

타입이 추가되면 이벤트인지, 회원가입 쿠폰인지 , 여러 타입을 구분할 수 있지만 지금 비즈니스 요구사항에는 필요하지 않은 정보로 추가하지 않기로 했습니다.

하지만 장기 비즈니스라면 추가하는 것이 맞다고 생각이 듭니다. 해당 쿠폰이 어떤 경로를 통해서 발행이 되었는지 확인할 수도 있고, 분류하거나 , 통계를 낼 수도 있다고 생각이 들었습니다.

댓글남기기