<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 사용자 검색 이력을 기록하고 조회합니다.

모집 공고 — CRUD · 검색 · 필터링

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)으로 자신의 제출 내역을 추적할 수 있으며, 밴드 관리자는 모집 공고와 지원서 데이터를 결합한 평탄화된 쿼리를 통해 후보자를 조회합니다.