본문 바로가기

문제 해결, 기술 비교/실무 업무 회고

할인 쿠폰 개선하기

728x90
반응형

개요


할인쿠폰을 사용하면서 고도화해야 하는 요청들이 있었습니다.

또한 다양한 정책의 할인이 필요한 경우도 있었습니다. 이 과정들을 정리합니다.

 

 

1. 할인쿠폰 설계 개선하기


 기존 할인쿠폰 테이블은 제품의 특정 상품을 제한하거나 사용 조직을 제한할 수 없었습니다. 그러다보니 다른 부서에서 만든 할인쿠폰을 사용하는 문제, 특정 제품이 아닌 전체 제품에 할인쿠폰이 적용되는 문제가 있었습니다. 따라서 할인쿠폰 테이블과 연관관계를 가지고 있던 할인쿠폰 제품 테이블을 개선하고 할인쿠폰 사용조직 테이블을 추가했습니다. 

 

  • 할인쿠폰 상품 테이블 개선

 기존에 할인쿠폰기본(TB_DC_B) 테이블은 제품테이블(TB_PRDT)와 N:M 관계를 가지고 있었고 중간 테이블인 할인쿠폰 제품(TB_DC_PROD) 테이블이 있었습니다. 하지만 임의의 제품의 특정 상품군만 할인쿠폰을 사용하고 싶어 N:M 관계를 상품테이블(TB_ITEM)으로 변경하고 중간 테이블(TB_DC_PROD)의 PK에 SEQ_NO를 추가했습니다. 제품에 따른 특정 상품들을만 쿠폰 대상으로 지정할 수 있었습니다.

 

TB_PRDT 테이블 대신 TB_ITEM 테이블 연관관계

 

 

제품 및 상품코드 설정 화면

 

  • 할인쿠폰 사용조직 테이블 생성

 기존에는 사용조직을 제한할 수 없었습니다. 따라서 할인쿠폰기본(TB_DC_B) 테이블과 사용조직 테이블(TB_ORG)를 N:N 관계로 하여 할인쿠폰 조직 테이블(TB_DC_ORG_D) 중간테이블을 만들었습니다. 할인쿠폰 등록 시 사용 조직을 제한 할 수 있습니다.

 

 

할인쿠폰 조직 테이블(TB_DC_ORG_D) 테이블 생성

 

 

사용조직 설정 화면

 

 

2. 다중 할인 일괄 적용


 기존에 렌탈 특정 기간동안 할인을 적용할 수 있습니다. 하지만 반대로 말해서 띄엄띄엄 특정 회차에 할인 적용은 불가능합니다. 현업에서 고객이 렌탈 기간을 다 채우기 위해서 일정 주기의 텀을 두고 할인을 적용하기를 원했습니다. 초기에 할인쿠폰 테이블에 1:N 연관관계를 가지는 기간테이블을 만들까 고민했습니다. 하지만, 이 할인은 프로모션 성격으로 자주 발생하지 않는 일종의 예외 케이스라는 것을 알았습니다. 따라서, 방식을 바꿔 원하는 특정 회차 1번 할인을 해주는 동일한 할인쿠폰을 여러 개 만들어 그룹으로 묶어주도록 했습니다.

 

TB_DC_TERM 생성은 하지 않도록

 

 

 같은 그룹으로 묶어야 되는 할인쿠폰의 PK들을 공통코드에 넣어두고, 할인쿠폰을 사용할때마다 같은 그룹이 존재하는지 검사하는 로직을 추가했습니다. 사용자는 프로모션 할인쿠폰을 하나라도 적용하면 관련된 그룹 내에 있는 모든 할인쿠폰이 동시에 적용하도록 개선되었습니다. 

 

공통코드에서 조회하여 일괄 처리

 

 할인쿠폰 적용 시, 위와 같이  PK 정보를 담은 공통코드가 있다면 하나만 선택해도 모든 프로모션이 함꺼번에 적용이됩니다. 수기로 하나씩 등록하다가 실수하는 일도 없고 테이블 정보 및 코드의 많은 부분을 고치지 않고 구현했습니다. 

 

 

3. 상시할인 개발하기


  • "영업시스템" 위약금 문제 상시 할인으로 해결하기

 렌탈제품을 반환할 시 '의무렌탈가' 기준으로 일할 사용료를 계산하여 위약금을 계산합니다. 만약 '의무렌탈가'가 2만원인데 할인으로 1만원만 매달 납부하다가 반환한다면 2만원 기준으로 위약금을 계산해야 합니다. 하지만 현업에서 할인으로 납부금액을 1만원을 만드는 대신 애초에 '의무렌탈가'를 1만원으로 프로모션 상품을 판매하고 있었습니다. 만약 해당 프로모션을 이용하는 고객이 반환한다면 위약금은 1만원 기준으로 계산되므로 회사에서는 손해입니다.

 

 이 문제를 해결하기 위해서 상시할인을 만들었습니다. 이 프로모션 상품들은 접수가 될 때 자동으로 1만원 할인이 들어가며 '의무렌탈가'에 영향을 주지 않습니다. 다시말해 할인이 필요한 특정 상품들만 상시할인에 등록해 제품 접수 시 상시할인에 포함된 상품이라면 자동으로 1만원 할인쿠폰을 사용해 '최종 렌탈가'가 할인되도록 합니다.(제품 접수 시 자동으로 등록되므로 사용자는 할인을 신경 쓸 필요가 없습니다.) '의무렌탈가' 2만원은 유지되므로 반환 시 2만원 기준으로 위약금이 계산되고, 상시할인으로 할인금액 1만원이 자동 적용되므로 최종 렌탈가 1만원입니다.

 

 

상시 할인이면 제품 접수 시 자동으로 할인이 적용된다

 

 

  • feat. "다이렉트몰" 위약금 문제

 다이렉트몰에서 접수되면 상시할인 로직을 별도로 타지 않고 바로 영업시스템 DB로 정보가 들어옵니다. 영업시스템으로 데이터를 INSERT하는 프로시져는 제품 접수 시 상시할인이 적용되지 않아 수정이 필요했습니다. 하지만 프로시져는 내부에서 관리하지 않는 소스코드이므로 수정이 불가능해서 다른 방법을 생각했습니다. 다이렉트몰에는 '의무렌탈가' 가격이 노출되고 있기 때문에 애초에 의무렌탈가를 2만원으로 만들면 안되고 1만원으로 만들어야 했습니다.

 

 의무렌탈가와 동일한 가격으로 설정하지만 활용하지 않았던 '정상가' 칼럼을 이용했습니다. 상품 사용여부(USE_YN)이 N이면서 다이렉트몰 노출여부(DIRECTMALL_SELF_YN)이 Y인 상품들은 반환할 때 정상가 기준으로 반환하도록 했습니다. 즉, '의무렌탈가'는 1만원으로 만들어 고객들은 1만원으로 보지만 정상가는 2만원으로 하여 반환 시 2만원 기준으로 위약금이 계산되는 방식입니다.

다이렉트몰 여부에 따라서 반환 금액 기준이 바뀐다



 가장 중요한 것은 반환할 때 적용된 할인이 모두 제외되어야 합니다. 즉, 다이렉트몰 상품은 애초에 의무렌탈가가 할인된 가격인 1만원이어도 상관이 없습니다. 다이렉트몰 상품은 의무렌탈가와 상관없이 무조건 정상가를 기준으로 반환 위약금이 계산되기 때문입니다.

 

따라서 아래와 같이 다이렉트몰 상품인 경우에 반환 시 '의무렌탈가'가 아닌 정상가를 확입니다.

다이렉트몰 전용상품 여부 조사 추가

 

다이렉트몰 전용 상품인 경우 아래와 같이 반환금 금액 계산 기준은 정상가입니다.

다이렉트몰인 경우에는 정상가(BASIC_PRICE)로 위약금 계산

 

 

 

4. 소유권이전완료 할인쿠폰 만들기


 렌탈을 모두 완료한 고객들 대상으로 재계약을 독려하기 위해서 소유권이전완료 할인쿠폰을 만들었습니다. 제품 접수 이전에 고객번호를 등록할 때 소유권 이전완료 이력이 있다면 재렌탈 할인쿠폰이 사용가능으로 표시됩니다.

 

  •  렌탈 완료 고객을 구분하는 방법은?

 영업시스템의 한계는 같은 고객이어도 다른 고객번호(PK)를 가질 수 있다는 점입니다. 따라서 A고객이 렌탈을 모두 완료했다고 하더라도 새로운 고객번호 B로 주문을 접수하면 재렌탈인지 신규고객인지 구분할 수 없습니다. 따라서, 재렌탈 여부를 확인하는 절차가 필요했습니다. 이름, 개인/법인 휴대폰, 생년월일(사업자번호)  4가지를 확인 할 수 있는 화면을 만들었습니다. 이름을 개명한 경우, 휴대폰 번호를 바꾼 경우가 있을 수 있으므로 OR조건으로 고객을 조회합니다. 고객을 클릭하면 이벤트로 렌탈 이력을 확인하여 재렌탈인지 아닌지 확인 할 수 있습니다.

 

 

 

소유권이전완료 고객 조회 화면

 

소유권이전완료 된 주문번호를 선택하면 해당 주문번호로 신규 주문의 접수건이 연동됩니다.

 

 

소유권이전 고객조회로 할인 대상 주문번호 검색

 

1개의 주문번호 당 1번의 할인을 받도록 하기위해 할인 적용 대상 테이블에 해당 주문번호를 저장하도록 개선했습니다.

 

 

5. 정액 정률 순서 변경하기


 여러 쿠폰이 같이 사용되면 기존에는 정률 -> 정액으로 계산하였으나 정액 -> 정률로 계산을 변경하였습니다. 

 

ex) 의무렌탈가 5000원에 10%할인 1000원 할인

  • 정률 -> 정액 할인(과거)

(5000 * 0.9) - 1000 = 3500

 

  • 정액 -> 정률 할인(현재)

(5000 - 1000) * 0.9 = 3600

 

정액을 먼저 계산하는 일이 정률을 먼저 계산하는 것보다 가격에서 유리합니다

 

 

아쉬운 점


  • 테이블 구조

처음부터 설계가 가능하다면 할인쿠폰 테이블에서 PK, FK를 아래와 같은 방식으로 바꿀 것입니다. JPA를 사용한다면 N:M 연관관계에 있는 테이블은 각 테이블의 고유 ID만 PK로 가지는 전략이 좋습니다.

 

N:M 테이블 관계를 설계하는 방법은 다음 링크를 참고하면 됩니다 (N:M 테이블 관계 설계하기)

 

 

할인쿠폰 사용조직 테이블 개선

 

할인쿠폰 제품 테이블 개선

 

728x90
반응형