<aside> 📌
세션 모집 시스템은 특정 악기 파트가 필요한 밴드와 뮤지션을 매칭하는 기능을 제공합니다. 모집 공고 게시부터 세션 멤버 등록까지 전체 생명주기를 관리합니다.
sequenceDiagram
participant Band as "밴드 오너"
participant RecruitCmd as "SessionRecruitmentCommandService"
participant User as "뮤지션"
participant AppCmd as "SessionApplicationCommandService"
participant BandDomain as "Band 도메인"
Band->>RecruitCmd: "createSessionRecruitment(Part, Genre, SkillLevel)"
User->>AppCmd: "SessionApplication 제출"
Band->>AppCmd: "심사 → BAND_ACCEPTED"
User->>AppCmd: "최종 수락 확정"
AppCmd->>BandDomain: "registerSessionMember(type=SESSION)"
| Service | 기능 |
|---|---|
| SessionRecruitmentCommandService | 모집 공고의 생성, 수정, 소프트 삭제를 처리합니다. |
| SessionRecruitmentQueryService | 복합 검색, 상세 조회, 최근 조회 이력을 관리합니다. |
| SessionApplicationCommandService | 지원서 생명주기 관리와 registerSessionMember 로직을 담당합니다. |
| SessionRecruitmentSearchKeywordService | 사용자 검색 이력을 기록하고 조회합니다. |
SessionRecruitment 엔티티가 중심 모델로서 악기 파트(Part), 실력 수준(SkillLevel), 장르(Genre), 지역(Region) 같은 음악적 요구사항 및 시간 관련 데이터를 함께 저장합니다.
밴드(오너로 검증된 경우)는 모집 공고를 생성, 수정, 소프트 삭제할 수 있으며, 시스템은 저장 전 마감일이 미래 날짜인지 검증합니다(validateDeadlineAt).
예약된 배치 작업이 마감 24시간 이내이면서 아직 리마인더가 발송되지 않은 모집 공고를 식별하고, 밴드 오너에게 알림을 보내 참여를 유지시킵니다.
sequenceDiagram
participant Scheduler as "SessionRecruitmentReminderScheduler"
participant Repo as "SessionRecruitmentRepository"
participant Push as "Push Notification"
participant Band as "밴드 오너"
Scheduler->>Repo: "마감 24시간 이내 · 미발송 공고 조회"
Repo-->>Scheduler: "대상 SessionRecruitment 목록"
Scheduler->>Push: "리마인더 발송"
Push->>Band: "마감 임박 알림"
| 개념 | 코드 엔티티 | 위치 |
|---|---|---|
| 모집 공고 | SessionRecruitment | domain/session/entity/SessionRecruitment.java |
| 공고 생성 | createSessionRecruitment | SessionRecruitmentCommandServiceImpl.java#L31 |
| 소프트 삭제 | delete() | SessionRecruitment.java#L73 |
| 마감일 검증 | validateDeadlineAt | SessionRecruitmentCommandServiceImpl.java#L111 |
| 조회 이력 추적 | SessionRecruitmentViewRepository | domain/session/repository/ |
| 관심 시스템 | SessionRecruitmentInterestService | domain/session/service/ |
| 마감 스케줄러 | SessionRecruitmentReminderScheduler | domain/session/scheduler/ |
| 검색 이력 | SessionRecruitmentSearchKeyword | domain/session/entity/ |
시스템은 두 가지 엔티티 타입으로 지원 과정을 관리합니다. SessionApplication은 재사용 가능한 템플릿이고, SessionApplicationSubmission은 지원서를 특정 모집 공고에 연결하는 개별 인스턴스입니다.
| Status | 의미 |
|---|---|
| PENDING | 사용자가 지원한 직후의 초기 상태입니다. |
| BAND_ACCEPTED | 밴드가 검토 후 승인했으며 사용자의 최종 확인을 기다리는 상태입니다. |
| REJECTED | 밴드가 거절했거나, 밴드 승인 이후 사용자가 거절한 경우입니다. |
| ACCEPTED | 최종 확인이 완료되어 멤버십이 부여된 상태입니다. |
| CANCELED | 결정이 내려지기 전에 사용자가 지원을 철회한 상태입니다. |
stateDiagram-v2
[*] --> PENDING : "사용자 지원 제출"
PENDING --> BAND_ACCEPTED : "밴드 승인"
PENDING --> REJECTED : "밴드 거절"
PENDING --> CANCELED : "사용자 철회"
BAND_ACCEPTED --> ACCEPTED : "사용자 최종 확인"
BAND_ACCEPTED --> REJECTED : "사용자 거절"
ACCEPTED --> [*] : "registerSessionMember 실행"
지원자는 커서 기반 페이지네이션(getMyApplicationSubmissions)으로 자신의 제출 내역을 추적할 수 있으며, 밴드 관리자는 모집 공고와 지원서 데이터를 결합한 평탄화된 쿼리를 통해 후보자를 조회합니다.