grep

Engineering

쿠폰, 어디에 쓸 수 있어요? — 이벤트 기반 적용 상품 조회 시스템 구축

29CM

2025년 4월 21일

원문에서 보기 ↗

안녕하세요, 29CM Commerce Core Engineering 에서 Sale Pricing 팀으로 일하고 있는 백엔드 개발자 조한석이라고 합니다.

저는 주로 쿠폰, 결제혜택 등 할인과 가격 도메인을 개발하고 있는데요, 쿠폰 시스템을 개발하고 관리하면서 사용자들로부터 가장 많이 받았던 질문이 있습니다.

“이 쿠폰은 어떤 상품에 쓸 수 있어요?”

이 질문은 오랫동안 29CM 사용자들이 쿠폰과 관련해 가장 자주 문의한 내용 중 하나였습니다.

유저의 쿠폰함에서 보유한 쿠폰을 확인할 수 있지만, 해당 쿠폰을 어떤 상품에 적용할 수 있는지 확인할 방법이 없었습니다. 그래서 지금까지 사용자들은 쿠폰 사용처를 찾기 위해 일일이 상품 페이지를 방문하며 확인해야 했습니다. 🥲

2025년 2월, 마침내 오랜 숙원과 같았던 쿠폰 적용 가능 상품 목록 조회 기능을 론칭하게 되었습니다!

‘쿠폰 적용 가능 상품 목록’

겉보기엔 단순히 쿠폰과 연결된 상품 목록을 조회해 보여주는 간단한 기능처럼 보일 수 있지만, 실제로는 예상보다 훨씬 복잡한 과제였습니다.

쿠폰 적용 가능 상품 조회의 어려움

1️⃣ 쿠폰과 상품 설정을 모두 고려해야 하는 복잡성

쿠폰 설정 시 특정 상품들을 쿠폰 적용 대상으로 매핑하지만, 이것만으로는 실제 적용 가능 여부를 완전히 결정할 수 없었습니다. 왜냐하면,

따라서 쿠폰 적용 가능 상품을 정확히 판단하려면, 쿠폰에 설정된 상품 목록만 확인해서는 안 됩니다. 쿠폰 설정과 상품의 개별 설정을 함께 검증하는 복합적인 로직이 필요합니다.

2️⃣ 실시간으로 변화하는 쿠폰 적용 조건

쿠폰과 상품 간의 관계는 고정되어 있지 않고 지속적으로 변화합니다.

따라서 쿠폰 적용 가능 상품은 한 번 결정되면 변하지않는 정적 정보가 아닌, 실시간으로 변동하는 동적 데이터입니다. 이로 인해 사용자가 조회하는 시점의 최신 쿠폰 및 상품 정보를 기반으로 적용 가능 여부를 실시간으로 판단해야 하는 기술적 과제가 존재했습니다.

3️⃣ 복잡한 쿠폰 매핑 방식에 대한 대응

쿠폰 설정에는 다양한 매핑 방식이 있으며, 그중에서도 특히 까다로운 방식은 ‘제외 매핑’이었습니다.

이러한 ‘포괄적 적용 + 예외 처리’ 방식은 단순 매핑보다 훨씬 더 복잡한 로직과 높은 확장성을 요구했으며, 시스템 설계 과정에서 가장 큰 도전 과제 중 하나였습니다.

4️⃣ 기존 상품 검색 경험과의 일관성 유지 필요

사용자 경험 측면에서 쿠폰 적용 가능 상품 목록 역시 29CM의 기존 상품 목록 페이지(PLP, SRP)와 동일한 사용성을 제공해야 했습니다.

이를 위해, 상품별 쿠폰 적용 가능 정보를 Elasticsearch(ES)에 인덱싱하는 구조를 설계하여 기존의 필터링, 정렬, 페이지네이션 기능을 완벽하게 지원할 수 있도록 했습니다.

쿠폰 적용 가능 상품 목록 조회를 위한 핵심 요구사항

앞서 설명한 복잡한 상황을 해결하기 위해 다음과 같은 핵심 요구사항을 도출했습니다.

  1. 실시간 데이터 동기화 — 쿠폰 및 상품 설정 변경 시, 적용 가능 여부 정보가 즉시 반영되어야 합니다.
  2. 다양한 매핑 방식 지원 — ‘제외 매핑’과 같은 복잡한 쿠폰 설정에서도, 신규 상품 등록 또는 기존 상품 변경 시 적용 가능 여부가 자동으로 반영되어야 합니다.
  3. 검색 최적화를 위한 인덱싱 — 사용자 경험과 성능 향상을 위해, 상품별 쿠폰 적용 가능 정보를 Elasticsearch에 인덱싱하여 빠른 검색 및 필터링을 지원해야 합니다.

이러한 요구사항은 단순한 데이터 조회를 넘어서는, 복잡한 시스템 구축이 필요함을 명확히 보여주었습니다.

설계 및 구현: 이벤트 기반 실시간 데이터 처리 시스템

앞서 언급한 도전 과제와 요구사항을 충족하기 위해, 다음과 같이 이벤트 기반 아키텍처를 중심으로 한 실시간 데이터 처리 시스템을 설계하고 구현했습니다.

전체 구조 및 흐름

1️⃣ [A.쿠폰 적용 가능 상품 갱신] 메시지 발행

A.쿠폰 적용 가능 상품 갱신 Topic Message

2️⃣ [A.쿠폰 적용 가능 상품 갱신] 메시지 소비 및 데이터 갱신

쿠폰 적용 가능 상품 반정규화 Table

3️⃣ [B.쿠폰 적용 가능 상품 CDC] 메시지 발행

B.쿠폰 적용 가능 상품 CDC Topic Message

4️⃣ [C.쿠폰 적용 가능 상품 싱크] 메시지 발행

C.쿠폰 적용 가능 상품 싱크 Topic Message

5️⃣ Elasticsearch에 최종 결과 인덱싱

위 설계 및 구현 내용을 간단히 요약하자면,

설계 및 구현 내용 요약

결과적으로 이러한 구조를 통해 앞서 언급한 요구사항들을 성공적으로 충족할 수 있었습니다.

설계 과정에서 ‘쿠폰 적용 가능 상품 반정규화 테이블’의 추가적인 활용 가치도 중요하게 고려했습니다.

쿠폰 도메인에서 가장 빈번하게 사용되는 로직 중 하나는 특정 상품에 특정 쿠폰이 적용 가능한지 판단하는 것입니다. 기존에는 이런 판단을 위해 여러 테이블을 조회하고 복잡한 조건식을 계산해야 했습니다. 이러한 방식은 성능 저하와 유지보수의 어려움을 동시에 초래했습니다.

하지만 이번에 구축한 반정규화 테이블과 실시간 데이터 갱신 시스템 덕분에, 이제는 단일 테이블 조회만으로도 쿠폰 적용 가능 여부를 즉시 확인할 수 있게 되었습니다. 이는 단순히 하나의 기능 개선에 그치지 않고, 쿠폰 서비스 전반의 성능과 안정성을 크게 향상시키는 기반이 되었습니다.

결과적으로 본 프로젝트를 통해 초기 목표였던 쿠폰 적용 가능 상품 목록 조회 기능뿐만 아니라, 쿠폰 도메인 전반의 기능 개선까지 성공적으로 이끌어냈습니다.

개발 과정에서 마주한 어려움

복잡한 쿠폰 매핑 구조와 실시간 갱신의 필요성으로 인해 설계 과정에서 몇 가지 어려움이 있었습니다.

🔸 반복된 설계 변경

쿠폰의 다양한 매핑 유형과 상품 변경 시에도 발생하는 갱신 요구로 인해, 초기에는 여러 Batch를 병렬로 운영하는 구조를 고려했습니다.

그러나 팀 내 피드백을 반영해 설계가 여러 차례 변경되었고, 그 결과 현재의 이벤트 기반 구조로 수렴하게 되었습니다. 복잡한 도메인 정책과 까다로운 요구사항에 맞춰 반복적으로 설계를 조정해야 했던 점이 특히 어려웠습니다.

🔸 메시지 처리 최적화

초기 구현 당시, 단순한 로직으로 인해 지나치게 많은 메시지가 발행되면서 소비 속도에 병목이 발생했습니다. 이 문제를 해결하기 위해 다음과 같은 시행착오를 거쳤습니다.

이러한 다단계 최적화 과정을 통해, 대용량 데이터 환경에서도 실시간에 가까운 갱신 성능을 확보할 수 있었습니다.

복잡한 도메인 로직과 대용량 데이터 처리라는 두 과제를 동시에 해결해야 했던, 도전적인 여정이었습니다.

마치며

설계부터 론칭까지 약 2달 반이라는 시간 동안 같은 팀의 개발자 양유림님과 함께 이 프로젝트를 진행했습니다. 쉽지 않은 여정이었지만, 도전적인 문제를 함께 해결해 나가는 과정은 재미있었고, 무엇보다 보람찼습니다.

특히 이번 구조 설계는 단순히 쿠폰 적용 가능 상품 목록 조회 기능 구현을 넘어서, 쿠폰 도메인 전반의 개선까지 함께 고려했다는 점에서 의미가 있었습니다.

반정규화 테이블을 통해 복잡했던 쿠폰 적용 판단 로직을 단순화하고, 성능과 유지보수성을 함께 개선할 수 있었습니다.

고객 피드백

작업 중 가장 보람을 느꼈던 순간은, 수많은 유저분들로부터 오랫동안 요청받아온 기능을 마침내 선보였을 때였습니다. “드디어 이 기능이 생겼네요!”라는 반가운 피드백을 들을 때마다, 실제로 유저들의 불편을 해소했다는 점에서 큰 보람과 성취감을 느낄 수 있었습니다.

쿠폰 적용 가능 상품 목록 페이지

앞으로도 많은 29CM 유저분들이 이 기능을 통해 더 편리하게 쇼핑하시길 바랍니다. 여러분의 소중한 쿠폰, 이제 어디에 사용할 수 있는지 쉽게 확인하세요!

MUSINSA CAREER

함께할 동료를 찾습니다.

29CM팀은 ‘고객의 더 나은 선택을 돕는다’라는 미션으로 출발했습니다. 우리는 우리만의 방식으로 콘텐츠를 제공하며, 브랜드와 고객 모두에게 대체 불가능한 커머스 플랫폼을 만들어가고 있습니다. 이 미션을 이루기 위해 우리는 흥미로우면서도 복잡한 문제들을 해결하고 있습니다. 만약 우리와 함께 이 문제들을 해결해 보고 싶다면, 주저하지 말고 29CM에 합류하세요!

🚀 팀 무신사 채용 페이지 (무신사/29CM 전체 포지션 확인이 가능해요)

🚀 팀 무신사 테크 소식을 받아보는 링크드인

🚀 무신사 테크 블로그

🚀 29CM 테크 블로그

🚀 무신사 테크 유튜브 채널

채용이 완료되면 공고가 닫힐 수 있으니 빠르게 지원해 주세요!