쿠폰, 어디에 쓸 수 있나요? — 이벤트 기반 적용 상품 조회 시스템 구축
쿠폰·상품 변경을 실시간 반영해 적용 가능 상품을 Elasticsearch에 인덱싱했다.
29CM Commerce Core Engineering의 Sale Pricing 팀은 유저가 가장 자주 묻던 “이 쿠폰은 어떤 상품에 쓸 수 있어요?”라는 질문에 답하기 위해, 쿠폰 적용 가능 상품 목록 조회 기능을 2025년 2월 론칭했다.
단순한 목록 조회처럼 보이지만 실제로는 훨씬 복잡했다. 쿠폰에 상품이 매핑돼 있어도 상품의 판매가나 쿠폰 허용 여부 같은 개별 설정에 따라 적용 가능 여부가 달라지고, 쿠폰과 상품의 관계도 운영 정책과 할인 스케줄에 따라 계속 변했다. 특히 “제외 매핑”은 특정 상품을 빼고 29CM의 수십만 개 활성 상품 전체를 대상으로 판단해야 해서, 신규 상품 등록이나 재활성화까지 자동 반영되는 구조가 필요했다.
또한 기존 PLP/SRP와 동일한 사용자 경험도 요구됐다. 카테고리, 가격대, 브랜드 필터와 인기순·최신순·가격순 정렬을 그대로 제공해야 했기 때문에, 상품별 쿠폰 적용 가능 정보를 Elasticsearch에 인덱싱하는 방향으로 설계했다.
핵심 요구사항은 세 가지였다.
- 실시간 데이터 동기화: 쿠폰·상품 변경 시 즉시 반영
- 다양한 매핑 방식 지원: 포함 매핑과 제외 매핑을 동일한 구조로 처리
- 검색 최적화: ES 인덱싱으로 빠른 필터링과 정렬 제공
구현은 이벤트 기반 아키텍처로 구성했다. 상품 또는 쿠폰 생성/수정 시 A.쿠폰 적용 가능 상품 갱신 Kafka 토픽에 메시지를 발행하고, Coupon-Event-Worker가 이를 소비해 각 쿠폰-상품 쌍의 적용 가능 여부를 판별했다. 적용 가능하면 쿠폰 적용 가능 상품 반정규화 Table에 저장하고, 불가능하면 삭제했다.
이 반정규화 테이블의 변경 사항은 Debezium으로 캡처해 B.쿠폰 적용 가능 상품 CDC 토픽으로 발행했고, 다시 Coupon-Event-Worker가 이를 소비해 변경된 상품 기준으로 전체 적용 가능 쿠폰 목록을 조회한 뒤 C.쿠폰 적용 가능 상품 싱크 토픽에 보냈다. 최종적으로 ES-Indexer가 이 메시지를 받아 상품 단위로 적용 가능 쿠폰 목록을 Elasticsearch에 인덱싱했다.
이 구조로 인해 쿠폰 설정 변경이나 상품 변경이 발생할 때마다 최신 상태가 실시간에 가깝게 유지됐고, 포함·제외 매핑 같은 복잡한 정책도 동일한 데이터 구조로 표현할 수 있었다. 더 중요한 점은 반정규화 테이블 덕분에 “특정 상품에 특정 쿠폰이 적용 가능한지”를 단일 테이블 조회로 빠르게 판단할 수 있게 되면서, 쿠폰 도메인 전반의 성능과 유지보수성까지 함께 개선됐다는 점이다.
개발 과정에서는 여러 차례 설계가 바뀌었다. 처음에는 여러 Batch를 병렬 운영하는 구조를 검토했지만, 팀 피드백을 반영해 이벤트 기반 구조로 수렴했다. 초기에 메시지가 과도하게 발행돼 소비 병목이 생기자 Batch Consuming, Kafka 튜닝, 갱신 대상만 발행하도록 하는 로직 개선으로 처리량을 끌어올렸다.
약 2달 반 동안 같은 팀의 양유림 개발자와 함께 설계부터 론칭까지 진행했고, 수많은 유저가 기다리던 기능을 실제로 선보였다는 점에서 큰 보람을 느꼈다. 결과적으로 이번 프로젝트는 단순한 “쿠폰 사용처 조회”를 넘어, 쿠폰 도메인 전체를 더 단순하고 빠르게 만드는 기반을 만들었다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.