시퀀스 다이어그램
유저 대기열 토큰 기능 API
유저 대기열 토큰 발급 API
sequenceDiagram
title 유저 대기열 토큰 발급 API
autonumber
actor client as 사용자
participant controller as 토큰 컨트롤러
participant service as 토큰 서비스
participant repository as 토큰 래포지토리
client->>+controller: 대기열 토큰 발급 요청 <br> [POST] /token
controller->>+service: 토큰 발급 요청
service->>+repository: 토큰 조회
alt 토큰이 존재함
repository->>service: 토큰 반환 <br> 토큰상태: WAITING / ACTIVE
else 토큰이 존재하지 않음
service->>repository: 토큰 생성 <br> 토큰상태: WAITING
repository->>-service: 토큰 반환
end
service->>-controller: 토큰 반환
controller->>-client: 토큰 발급 성공 <br> 201 Created
대기 순번 조회 요청 API
sequenceDiagram
title 대기 순번 조회 API
autonumber
actor client as 사용자
participant controller as 토큰 컨트롤러
participant service as 토큰 서비스
participant repository as 토큰 래포지토리
loop 5초 간격으로 대기열 토큰의 대기순번 조회 요청 (Polling)
Note over client,controller: 토큰이 유효하며, 상태는 WAITING 임을 가정
client->>+controller: 대기열 토큰의 대기 순번 조회 요청 <br> [GET] /token/sequence
controller->>+service: 대기열 토큰의 대기 순번 조회 요청
service->>+repository: 대기열 토큰의 상태정보 요청
repository->>repository: 대기열 큐에서 대기열 토큰의 상태정보 확인
repository->>-service: 대기열 큐 상태정보 응답 (예: 대기순서, 토큰 상태)
%% opt 대기순번이 1번인 경우
%% service->>+repository: 대기열 토큰의 상태를 WAITING 에서 ACTIVE 로 변경요청
%% repository->>-service: 대기열 토큰 상태 변경
%% end
service->>-controller: 현재 대기순번, 토큰상태 표시
controller->>-client: 대기 순번 조회 성공 <br> 200 OK
end
대기열 토큰의 상태를 활성화(ACTIVE) 변경하는 스케줄러
sequenceDiagram
title 5초마다 토큰 상태를 활성화 로 변경하는 스케줄러
autonumber
participant scheduler as 토큰 스케줄러
participant service as 토큰 서비스
participant repository as 토큰 래포지토리
loop 5초마다 토큰 상태를 확인하고 변경 및 삭제 처리
scheduler->>+service: 토큰의 상태를 "대기(WAITING)" 에서 "활성(ACTIVE)" 으로 변경 스케줄러 실행
service->>+repository: 대기열에서 토큰유효시간이 만료된 토큰 삭제
repository->>-service: 삭제완료
service->>+repository: 현재 대기열에 존재하는 "활성(ACTIVE)" 토큰 개수 조회
repository->>-service: "활성(ACTIVE)" 토큰 개수 반환
service->>service: 활성상태 토큰 빈자리 개수 계산 ( N = 100 - 활성상태 토큰 개수 )
opt 빈자리가 존재할 경우 ( N > 0 )
service->>+repository: 대기 순서가 오래된 순으로 "대기(WAITING)" 토큰 N개 조회
repository->>-service: 대기토큰 N개 반환
service->>+repository: 토큰 상태를 "대기(WAITING)" 에서 "활성(ACTIVE)" 으로 변경
repository->>-service: 업데이트 완료
end
service->>-scheduler: 스케줄로 변환 종료
end
토큰 유효성 검증 공통 로직
sequenceDiagram
title 토큰 유효성 검증 공통 로직
autonumber
actor client as 사용자
participant tokenValidator as 토큰 인터셉터
participant tokenService as 토큰 서비스
participant tokenRepository as 토큰 래포지토리
client->>+tokenValidator: 토큰 유효성 검증 요청
tokenValidator->>+tokenService: 토큰의 유효성 검증 요청 <br> 토큰 상태가 ACTIVE 이고 토큰이 유효한지 확인
tokenService->>+tokenRepository: 토큰 상태 검증
tokenRepository->>-tokenService: 토큰 상태 응답
alt 토큰 유효기간이 유효한 경우
opt 토큰 상태가 ACTIVE 일 때
tokenService->>tokenValidator: 토큰 유효성 검증 응답
tokenValidator->>client: 유효한 토큰임을 검증 완료
end
else 토큰 유효기간이 만료된 경우
tokenService->>-tokenValidator: 토큰 유효기간 만료 예외 발생
tokenValidator->>-client: 예외 메시지 전달 <br> 401 Unauthorized
end
예약가능 날짜/ 좌석 API
예약 가능 날짜 목록 조회 API
sequenceDiagram
title 특정 콘서트의 예약 가능한 날짜 목록 조회 API
autonumber
actor client as 사용자
participant tokenValidator as 토큰 인터셉터
participant controller as 콘서트 컨트롤러
participant service as 콘서트 서비스
participant repository as 콘서트 래포지토리
client->>+controller: 콘서트 예약 가능한 날짜 목록 조회 요청 <br> [GET] /concerts/{concert_id}/dates
%% 토큰 유효성 검증
Note over client, tokenValidator: 토큰이 유효하다고 가정
tokenValidator-->>+tokenValidator: 토큰 유효성 검증 요청
tokenValidator-->>-controller: 유효한 토큰임을 확인 완료
%% 콘서트 예약 가능한 날짜 목록 조회
controller->>+service: 예약 가능한 날짜 조회
service->>+repository: 예약 가능한 날짜 select 쿼리문 조회
repository->>-service: 쿼리문 응답 반환
service->>-controller: 예약 가능한 날짜 반환
controller->>-client: 예약 가능한 날짜 목록 반환 <br> 200 OK
예약가능한 좌석 정보 조회 API
sequenceDiagram
title 특정날짜에서 예약 가능한 좌석 정보 조회 API
autonumber
actor client as 사용자
participant tokenValidator as 토큰 인터셉터
participant controller as 콘서트 컨트롤러
participant service as 콘서트 서비스
participant repository as 콘서트 래포지토리
client->>+controller: 콘서트의 특정날짜에서 예약 가능한 좌석정보 요청 <br> [GET] /concerts/{concert_id}/seats?date={date}
%% 토큰 유효성 검증
Note over client, tokenValidator: 토큰이 유효하다고 가정
tokenValidator-->>+tokenValidator: 토큰 유효성 검증 요청
tokenValidator-->>-controller: 유효한 토큰임을 확인 완료
%% 예약이 가능한 좌석 정보 조회
controller->>+service: 예약 가능한 좌석 정보 조회
service->>+repository: 예약 가능한 좌석 select 쿼리문 조회
repository->>-service: 쿼리문 응답 반환
alt 예약 가능한 좌석 데이터가 1개 이상 일 때 (최대 50개)
service->>controller: 예약 가능한 좌석 정보 응답
controller->>client: 예약 가능한 좌석 정보 응답 <br> 200 OK
else 예약 가능한 좌석 데이터가 존재하지 않을 때
service->>-controller: 예약 가능한 좌석 데이터가 존재하지 않음 예외 발생
controller->>-client: 잘못된 응답 <br> 404 Not Found
end
좌석 예약 요청 API
sequenceDiagram
title 좌석 예약 요청 API
autonumber
actor client as 사용자
participant tokenValidator as 토큰 인터셉터
participant controller as 에약 컨트롤러
participant service as 예약 서비스
participant repository as 예약 래포지토리
client->>+controller: 콘서트의 특정날짜에서 예약 가능한 좌석정보 요청 <br> [POST] /reservations
%% 토큰 유효성 검증
Note over client, tokenValidator: 토큰이 유효하다고 가정
tokenValidator-->>+tokenValidator: 토큰 유효성 검증 요청
tokenValidator-->>-controller: 유효한 토큰임을 확인 완료
%% 좌석 예약
controller->>+service: 특정 날짜(date)의 특정 좌석(seat_id)의 상태 확인
service->>+repository: 특정 날짜에 특정 좌석의 상태 정보 관련 select 쿼리문 요청
repository->>-service: 특정 날짜에 특정 좌석의 상태 정보 데이터 반환
alt 해당 좌석의 상태가 "예약 가능" 인 경우
service->>+repository: 좌석 상태를 "예약 불가능" 으로 변경 요청
repository->>-service: 좌석 상태 변경
service->>+repository: 예약 상태를 결제 대기중(PENDING_PAYMENT) 으로 변경 요청
repository->>-service: 예약 상태 변경
service->>controller: 사용자에게 5분 내에 결제해야 확정된 자리 입니다 메시지 전달
controller->>client: 해당 좌석 예약 성공 <br> 201 Created
else 해당 좌석의 상태가 "예약 불가능" 인 경우
service->>-controller: 이미 예약된 좌석이므로 좌석 예약 불가 예외 발생
controller->>-client: 예약 실패 예외 메시지 응답 <br> 409 Conflict
end
임시예약이 만료된 좌석의 상태 변경 스케줄러
sequenceDiagram
title 임시예약이 만료된 좌석상태 변경 스케줄러
autonumber
participant scheduler as 임시예약 만료처리 스케줄러
participant service as 예약 서비스
participant repository as 예약 래포지토리
loop 10초 간격으로 스케줄러 처리
scheduler->>+service: 임시예약 유효시간 5분 내에 결제되지 않은 예약을 취소처리 스케줄러 실행
service->>+repository: 현재 시각 기준으로 만료된 임시예약 조회 <br> 임시예약: 좌석상태는 "예약 불가능", 예약상태는 "결제대기(PENDING_PAYMENT)"
repository->>-service: 만료된 임시예약 데이터 반환
alt 만료된 임시예약 데이터가 존재한 경우
service->>+repository: 좌석상태 변경 <br> 임시예약 만료처리: 좌석상태는 "예약 가능", 예약 상태는 "예약취소(CANCELED)" 로 변경
repository->>-service: 업데이트 완료
else 만료된 임시예약 데이터가 존재하지 않은 경우
service->>-scheduler: 만료된 임시예약 없음 응답
end
end
잔액 충전 / 조회 API
잔액 충전 API
sequenceDiagram
title 잔액 충전 API
autonumber
actor client as 사용자
participant tokenValidator as 토큰 인터셉터
participant controller as 포인트 컨트롤러
participant service as 포인트 서비스
participant repository as 포인트 래포지토리
client->>+controller: 잔액 충전 API <br> [PATCH] /points
%% 토큰 유효성 검증
Note over client, tokenValidator: 토큰이 유효하다고 가정
tokenValidator-->>+tokenValidator: 토큰 유효성 검증 요청
tokenValidator-->>-controller: 유효한 토큰임을 확인 완료
%% 포인트 충전
controller->>+service: 포인트 충전금을 더하여 잔액 업데이트 요청
alt 충전이 가능한 금액의 정책에 부합한 경우
service->>+repository: 잔액 업데이트
repository->>-service: 잔액 업데이트 완료 및 잔액 반환
controller->>client: 잔액 업데이트 성공 <br> 200 OK
else 충전이 가능한 금액의 정책에 부합하지 않은 경우
service->>-controller: 포인트 충전금 정책에 부합하지 않으므로 예외 발생
controller->>-client: 포인트 충전 실패 예외 메시지 응답 <br> 400 Bad Request
end
잔액 조회 API
sequenceDiagram
title 잔액 조회 API
autonumber
actor client as 사용자
participant tokenValidator as 토큰 인터셉터
participant controller as 포인트 컨트롤러
participant service as 포인트 서비스
participant repository as 포인트 래포지토리
client->>+controller: 잔액 조회 API <br> [GET] /points
%% 토큰 유효성 검증
Note over client, tokenValidator: 토큰이 유효하다고 가정
tokenValidator-->>+tokenValidator: 토큰 유효성 검증 요청
tokenValidator-->>-controller: 유효한 토큰임을 확인 완료
%% 포인트 잔액 조회
controller->>+service: 포인트 조회 요청
service->>+repository: 포인트 select 쿼리문 요청
repository->>-service: 포인트 잔액 반환
service->>-controller: 포인트 잔액 반환
controller->>-client: 잔액 반환 성공 <br> 200 OK
결제 API
sequenceDiagram
title 결제 요청 API
autonumber
actor client as 사용자
participant tokenValidator as 토큰 인터셉터
participant controller as 결제 컨트롤러
participant paymentService as 결제 서비스
participant reserveService as 예약 서비스
participant pointService as 포인트 서비스
participant repository as 결제 래포지토리
client->>+controller: 결제 요청 API <br> [POST] /payments
%% 토큰 유효성 검증
Note over client, tokenValidator: 토큰이 유효하다고 가정
tokenValidator-->>+tokenValidator: 토큰 유효성 검증 요청
tokenValidator-->>-controller: 유효한 토큰임을 확인 완료
controller->>+paymentService: 예약좌석 결제 요청
%% 이미 좌석이 임시예약 상태인지 확인
Note over paymentService,reserveService: 예약좌석이 임시예약 상태임을 가정
paymentService-->>+reserveService: 예약좌석 상태 조회
reserveService-->>-paymentService: 예약좌석 임시예약 상태 반환 <br> 좌석상태: "예약 불가능", 예약상태: "결제 대기중(PENDING_PAYMENT)"
%% 포인트 차감
Note over paymentService,pointService: 결제금액보다 많은 포인트를 보유함을 가정
paymentService-->>+pointService: 결제금액만큼 포인트 차감
pointService-->>pointService: 포인트 차감 및 포인트 히스토리 적재
pointService-->>-paymentService: 포인트 차감후 잔액 반환
%% 예약확정으로 변경
paymentService->>+reserveService: 결제완료후 예약좌석의 상태를 변경 <br> 예약상태를 결제 대기중(PENDING_PAYMENT) 에서 확정(CONFIRMED)으로 변경
reserveService->>-paymentService: 상태 변경 완료
%% 결재내역 생성
paymentService->>+repository: 결재내역 생성
repository->>-paymentService: 결제내역 반환
paymentService->>-controller: 예약확정 및 결제 성공
controller->>-client: 예약확정 및 결제 성공 <br> 2O1 Created
좌석예약부터 결제까지 전체 플로우 나타내기
sequenceDiagram
title 좌석예약부터 결제까지 도메인별 플로우 나타내기
autonumber
actor client as 사용자
participant Concert
participant Reservation
participant Point
participant Payment
client->>+Concert: 콘서트의 예약 가능한 날짜 목록 조회 요청
Concert->>-client: 예약 가능한 날짜 목록 응답
client->>+Concert: 예약 가능한 좌석 정보 조회 요청 <br> (예: concert_id, 예약날짜)
Concert->>-client: 예약 가능한 좌석 정보 응답
client->>+Reservation: 좌석 임시 예약 요청 <br> (예: concert_id, 예약날짜, 예약좌석번호)
Reservation->>-client: 좌석 임시 예약 응답
opt 임시예약 성공시
client->>+Point: 잔액 조회 요청
Point->>-client: 잔액 반환
opt 잔액이 좌석 결제 금액 보다 적은 경우
client->>+Point: 부족한 금액만큼 잔액 충전 요청
Point->>-client: 충전후 잔액 반환
end
end
client->>+Payment: 결제 요청
Payment->>Payment: 결제 처리
alt 결제 성공시
Payment->>+Reservation: 예약확정 상태변경 요청
Reservation->>Reservation: 상태변경 처리
Reservation->>-Payment: 상태변경 응답
Payment->>client: 결제 성공응답
else 결제 실패 시
Payment->>+Reservation: 임시예약 취소 상태변경 요청
Reservation->>Reservation: 상태변경 처리
Reservation->>-Payment: 상태변경 응답
Payment->>-client: 결제 실패 예외 응답
end