이번 최종 프로젝트의 전체적인 흐름을 적었습니다.
도메인과 엔티티를 분리해서 진행해서, 테이블을 기준으로 담당하는 기능들을 설명해 봤습니다.
먼저 대회 서비스에는 3개의 테이블이 있습니다.
- p_competitions
- 대회 서비스의 메인테이블로써, 전반적인 흐름을 관리한다.
- 대회 생성 (최소 참가 인원수를 설정)
- 대회 정보 수정
- 대회 게시(대회의 isReadable 필드를 true로 변경 및 상태를 PUBLISHED로 변경)
- 대회 참가 신청(대회의 현재 참가 인원수를 +1)
- 대회 참가 취소(대회의 현재 참가 인원수를 -1)
- 대회 시작(대회 상태를 ONGOING으로 변경)
- 대회 취소(대회 진행 중(ONGOING)에서 CANCELED로 변경)
- 대회 종료(대회 상태를 FINISHED로 변경)
- 대회 서비스의 메인테이블로써, 전반적인 흐름을 관리한다.
- p_competition_change_notices
- 대회가 게시되었을 때(= 대회의 boolean 필드 isReadable이 true일 때) 대회의 정보가 변경되면 row를 생성한다.
- 대회명, 대회 설명, 대회 기간이 변경될 때, 전후값(before/after)과 변경 이유(reason)를 테이블에 기록한다.
- 대회가 게시되었을 때(= 대회의 boolean 필드 isReadable이 true일 때) 대회의 정보가 변경되면 row를 생성한다.
- p_competition_participant
- 유저가 대회에 참가신청을 넣을 시 생성되는 데이터다.
(competition.register()을 호출해서, 현재 참가인원수를 +1 하고 난 후, competitionParticipantRepository.save(participant)를 호출한다.)
- 유저가 대회에 참가신청을 넣을 시 생성되는 데이터다.
아래는 MVP 시연 때, scenario.http를 통해 보여드린 흐름입니다.

그리고 랭킹 서비스에는 1개의 테이블로 구성됩니다.
- p_rankings
- 매매 체결 성공 시, 매매를 한 유저의 총자산을 전달받아 Redis Sorted Set에 저장
- 대회 종료 시, 최종 순위를 DB에 저장 및 Redis에도 저장
- 특정 대회의 순위 목록 조회
- 내 순위 조회
지금까지 기능들은 어느 정도 완성을 했고, 아래는 아직 더 구현해야 할 것 들입니다.
- 헤더에서 유저정보 받아오기
( 생성/수정/삭제자 기록, 내 랭킹 조회 등 ) - 에러코드가 지금은 2개만 사용하는데 상황에 맞게 세분화할 예정
- new BusinessException(ErrorCode.COMPETITION_NOT_FOUND))
- new BusinessException(ErrorCode.INVALID_INPUT) - 응답 body 객체로 감싸서 반환
아래는 지금까지 좀 신경 써서 구현한 부분입니다.
- 대회 신청 시에 비관락 적용
- DB저장 후, 내부 스프링 이벤트로 발행해서 AFTER_COMMIT시에 이벤트 발행
'내배캠' 카테고리의 다른 글
| TIL - 프로젝트에 같은 모듈을 중복으로 import 하면? (0) | 2026.05.08 |
|---|---|
| TIL - 코드리뷰 피드백 정리 (0) | 2026.05.07 |
| TIL - Redis 및 Kafka 사용 시 DB와의 분산트랜잭션 문제 해결하기 (0) | 2026.05.02 |
| 전자기기로 이해하는 헥사고날 아키텍처 (1) | 2026.04.30 |
| TIL - 공통 모듈의 ErrorCode, 어떻게 관리해야 할까 (0) | 2026.04.26 |