현재 API 분석(ReservationFacade)
개요
ReservationFacade는 하나의 애플리케이션 내에서 콘서트 좌석 예약과 결제 처리 프로세스를 단일 진입점에서 관리
모놀리식(Monolithic) 아키텍처 기반으로 운영되며, 모든 예약 및 결제 프로세스가 하나의 애플리케이션 내부에서 동작하는 구조
이 방식에서는 하나의 데이터베이스와 단일 트랜잭션 범위 내에서 좌석 예약, 결제, 사용자 정보(잔액) 갱신 등이 진행된다.
주요 기능
좌석 예약 : 좌석의 예약 가능 여부를 확인한 후 예약 정보를 생성
결제 처리 : 예약 정보를 조회, 결제 진행, 좌석 상태와 예약 상태 업데이트, 그리고 관련 토큰 만료 처리
기술적 특징
트랜잭션 관리 : 각 메서드는 Spring의
@Transactional을 통해 단일 트랜잭션으로 실행되어, 문제가 발생할 경우 전체 작업이 롤백동시성 제어 :
@RedisLock어노테이션을 활용하여 동일 좌석에 대한 동시 접근을 막아 데이터 무결성을 보장
로직 분석
A. 좌석 예약 프로세스 (reserveSeat)
동작 흐름
좌석 상태 확인
Concert Service의
reserveSeat를 호출하여, 지정된 좌석의 예약 가능 여부를 확인좌석이 이미 예약되어 있으면,
CustomException과 함께SeatErrorCode.SEAT_ALREADY_RESERVED예외를 발생시켜 예약 프로세스를 중단
예약 정보 생성
예약이 가능하면 Reservation Service의
createReservation을 호출하여 예약 데이터를 생성 후 반환
특징
전체 로직이 하나의 트랜잭션으로 처리되며, Redis 기반 락으로 동일 좌석에 대한 동시 요청을 제어함
@RedisLock(prefix = "seat:", key = "#reservationCmd.seatId")
B. 결제 처리 프로세스 (payReservation)
동작 흐름
예약 조회 및 검증
예약 정보 조회
reservationService.findById(paymentCmd.reservationId())를 호출하여 해당 예약 정보를 조회
유효성 체크
조회된 예약 객체가 없으면
SeatErrorCode.SEAT_NOT_RESERVED오류를 발생예약 객체의
validate()메서드를 통해 결제 진행 전 금액, 상태 등 비즈니스 조건을 확인
결제 처리
예약된 좌석의 가격(seatPrice)을 조회한 후, 아래의 메소드를호출하여 사용자의 결제를 진행
userService.processPayment(paymentCmd.userId(),paymentCmd.paymentAmount())
해당 호출을 통해 사용자의 결제 처리가 완료되고, 남은 잔액(remainingBalance)이 반환
좌석 및 예약 상태 업데이트
Concert Service를 호출하여 좌석 상태를 결제 완료 상태로 변경
Reservation Service를 통해 예약 상태를 갱신
토큰 만료 처리
Token Service를 통해 해당 사용자의 토큰을 조회하고, 만료 처리함
최종 결과 반환
PaymentResult 객체에 결제 관련 정보를 담아 반환
특징:
여러 도메인(예약, 결제, 좌석, 사용자, 토큰)이 하나의 트랜잭션 내에서 호출되며, Redis 락으로 동시 결제 요청을 제어
트랜잭션 분석
트랜잭션 단위:
processPayment()는@Transactional을 통해 예약 조회 → 잔액 차감 → 결제 내역 저장 → 예약 확정을 하나의 트랜잭션 내에서 처리함.주요 트랜잭션 범위
예약 정보 조회 (
ReservationRepository)사용자 잔액 차감 (
UserRepository)결제 정보 저장 (
ReservationRepository) ⇒ 예약 기록이 결제 기록을 대체한다예약 확정 처리 (
ReservationRepository)
트랜잭션 실패 시 : 중간 과정에서 오류 발생 시 잔액 차감 및 결제 정보 저장 롤백
Last updated