1. 문제 상황
관리자 쿠폰 발급 기능은 여러 회원을 대상으로 쿠폰을 일괄 지급하는 구조입니다.
처음에는 하나의 요청 안에서 여러 회원 발급을 순차 처리하므로, 전체를 하나의 트랜잭션으로 묶는 방식도 고려할 수 있었습니다.
하지만 이 방식에는 문제가 하나 있었는데요
만약 대상 회원이 100명일때 99번째 사람이 쿠폰 발급에 성공했지만, 마지막 1명이 발급 조건에 맞지 않거나 중복 발급 제한에 걸려 예외가 발생하면 트랜잭션이 롤백 되어 나머지 99명의 정상 발급까지 모두 취소될 수 있었습니다
2. 왜 문제가 되었는가
관리자 쿠폰 발급은 겉으로는 하나의 기능처럼 보이지만 실제로는 여러 회원에게 동일한 작업을 반복 수행하는 독립 작업에 가깝습니다.
각 회원의 발급 성공 여부는 다른 회원의 발급 가능 여부와 직접적인 비즈니스 의존성이 없습니다.
그런데 이를 하나의 트랜잭션으로 묶으면 다음과 같은 문제가 발생합니다.
1) 한 건 실패가 전체 실패로 확산된다.
한명만 조건 불일치, 중복 발급, 데이터 정합성 문제로 실패해도 위에서 말한것 처럼 전체 요청이 롤백.
결과적으로 정상 발급 가능한 회원들까지 함께 실패 처리됩니다.
2) 운영 효율이 떨어진다.
운영자는 실제로를 “실패한 회원만 확인해서 다시 처리” 하면 되는데, 전체 롤백 구조에서는 전체 대상을 다시 실행해야 할 수 있습니다.
즉, 부분 실패를 허용하면 쉽게 끝날 일을 전체 재처리 문제로 키우게 됩니다.
3) 대량 처리와 긴 트랜잭션이 맞지 않는다.
대상자가 많아질 수록 하나의 트랜잭션에서 오래 유지되고, 실패시 롤백 범위도 커집니다.
이는 트래잭션 부담이 커지고, 장애 발생 시 영향 범위도 넓어집니다.
3 검토한 방식
###
회원 1명 단위로 독립적인 트랜잭션 처리
대안으로는 각 회원 발급을 별도 트랜잭션으로 분리하는 방식이 있습니다. 즉, 상위 로직은 회원 목록을 순회만 하고, 실제 회원 1건 발급은 각각 새로운 트랜잭션 안에서 수행하는 구조입니다.
이 방식에서는 특정 회원 발급에 실패하더라도 그 회원 건만 롤백되고, 다음 회원 처리는 계속 진행됩니다. 따라서 부분 성공이 가능하고, 운영자는 성공/실패 회원을 구분하여 관리할 수 있습니다.
4 최종 선택
최종적으로 관리자 쿠폰 발급은 회원 1명 단위 REQUIERES_NEW 트랜잭션으로 처리하는 방식으로 정리했다.
즉,
- 상위 서비스는 대상 회원 목록을 조회하고 반복 수행만 담당
- 실제 회원 1건 쿠폰 발급은 별도 서비스에서 **
REQUIRES_NEW**로 처리 - 각 회원은 독립적으로 커밋 또는 롤백
- 실패 회원은 결과 목록에 남기고, 나머지 회원은 계속 발급 진행
이렇게 트랜잭션 경계를 나누면 관리자 일괄 발급의 본질인 독립 작업들의 집합이라는 특성을 제대로 반영할 수 있습니다.
5 회원가입 쿠폰 발급과의 차이
이 트랜잭션 전략은 관리자 쿠폰 발급에는 잘 맞지만, 회원가입 쿠폰 발급에는 동일하게 적용하기 어렵습니다.
회원가입 쿠폰은 여러 회원을 독립 처리하는 배치성 작업이 아니라, 한 명의 가입 흐름 안에서 수행되는 부가 처리이기 때문입니다. 그래서 회원가입 쿠폰은 “가입 성공과 쿠폰 발급을 어디까지 하나의 완료 조건으로 볼 것인가”를 먼저 정책적으로 정해야 합니다.
예를 들어,
- 가입과 쿠폰 발급을 하나의 사용자 경험으로 강하게 묶는다면 → 가입 트랜잭션과 함께 처리하는 방식이 더 자연스럽습니다.
- 가입은 본 흐름이고 쿠폰은 부가 혜택이라면 → 가입 완료 후 후처리로 분리하는 것이 더 적합합니다.
즉, 관리자 발급은 회원 간 독립성이 핵심이고, 회원가입 쿠폰은 한 회원의 가입 경험과의 결합도가 핵심입니다.
이 차이 때문에 관리자 발급에 사용한 회원별 REQUIRES_NEW 전략을 회원가입 쿠폰에 그대로 적용하는 것은 적절하지 않을 수 있다.
6 결론
관리자 쿠폰 발급은 다수 회원을 대상으로 하는 일괄 작업이지만, 실제로는 회원별 발급이 서로 독립적인 구조입니다.
따라서 전체를 하나의 트랜잭션으로 묶기보다, 회원 1명 단위로 REQUIRES_NEW 트랜잭션을 분리하여 부분 성공을 허용하는 방식이 더 적합합니다.
이 전략을 통해 한 회원의 실패가 전체 발급 실패로 번지는 문제를 방지할 수 있었고, 운영 측면에서도 실패 회원만 추적,재처리할 수 있어 효율적인 관리가 가능해졌습니다.
반면 회원가입 쿠폰 발급은 단일 회원의 가입 경험에 속한 처리이므로, 관리자 대량 발급과는 다른 기준으로 트랜잭션 정책을 설계해야 합니다.