Skip to content

[공통] 팀원 모집 기능 구현 #2335

Description

@taejinn

🔍 개요

팀원 모집글 작성, 조회, 지원자 관리, 프로필, 채팅, 알림 기능을 구현합니다.

API 요청 및 응답 구조는 아래 Swagger 명세를 기준으로 합니다.

https://team-recruitment-api.peridot-ocean.workers.dev/

작업 진행 방식

담당자는 아래 범위를 기준으로 GitHub Sub-issue를 생성하고 이 대표 이슈에 연결합니다.

@taejinn

공통 데이터 모델, DB 마이그레이션, 상태 계산, 동시성 제어를 담당합니다.

  • POST /team-recruitments/{recruitmentId}/applications
  • GET /team-recruitments/me/applications
  • GET /team-recruitments/{recruitmentId}/applications
  • GET /team-recruitments/{recruitmentId}/applications/{applicationId}
  • PUT /team-recruitments/{recruitmentId}/applications/{applicationId}/status

@insik03

모집글과 팀원 모집 프로필 기능을 담당합니다.

  • GET /team-recruitments
  • POST /team-recruitments
  • GET /team-recruitments/{recruitmentId}
  • PUT /team-recruitments/{recruitmentId}
  • DELETE /team-recruitments/{recruitmentId}
  • PUT /team-recruitments/{recruitmentId}/close
  • GET /team-recruitments/me/created
  • GET /team-recruitment-profiles/me
  • PUT /team-recruitment-profiles/me

@dnjswldnd-3513

채팅과 알림 기능을 담당합니다.

  • GET /chatroom/team-recruitment/{recruitmentId}/{chatRoomId}
  • POST /chatroom/team-recruitment/{recruitmentId}/applications/{applicationId}/direct
  • GET /chatroom/team-recruitment/{recruitmentId}/{chatRoomId}/messages
  • POST /chatroom/team-recruitment/{recruitmentId}/{chatRoomId}/messages
  • GET /team-recruitments/notifications
  • POST /team-recruitments/notifications/{notificationId}/read
  • POST /team-recruitments/notifications/mark-all-read

공통 구현 기준

네이밍 및 DTO

  • Path Variable과 Query Parameter는 camelCase로 작성합니다.
  • Java 변수명과 DTO record 컴포넌트명은 camelCase로 작성합니다.
  • Request와 Response DTO는 record를 사용합니다.
  • 외부 JSON 필드는 기존 KOIN DTO 컨벤션에 맞춰 snake_case로 직렬화합니다.
  • 신규 DTO에는 @JsonNaming(SnakeCaseStrategy.class)을 적용합니다.
  • 오류 응답은 기존 KOIN 오류 응답 형식을 사용합니다.

모집 상태

  • 승인된 인원이 역할별 모집 인원에 도달하면 해당 역할의 is_closedtrue로 계산합니다.
  • 일부 역할만 마감된 경우 모집글의 statusRECRUITING을 유지합니다.
  • 모든 역할이 마감되거나 모집 기한이 지나면 모집글의 statusCLOSED로 계산합니다.
  • 모집글이 마감되면 정원이 남은 역할도 is_closedtrue로 반환합니다.
  • 대기 중인 지원자는 모집된 인원에 포함하지 않습니다.

지원자 처리

  • 동일한 사용자가 같은 모집글에 중복 지원할 수 없도록 처리합니다.
  • 마감된 모집글이나 역할에는 지원할 수 없도록 처리합니다.
  • 지원 승인 시 모집 정원을 초과하지 않도록 트랜잭션 기반 동시성 제어를 적용합니다.
  • 승인과 거절에 따른 지원 상태와 모집 인원 변경을 하나의 트랜잭션에서 처리합니다.

권한

  • 모집글 수정, 삭제, 마감, 지원자 관리는 모집글 작성자만 수행할 수 있습니다.
  • 지원서 상세는 해당 모집글 작성자만 조회할 수 있습니다.
  • 팀 채팅방은 모집글 작성자와 승인된 지원자만 참여할 수 있습니다.
  • 개인 채팅방은 모집글 작성자와 해당 지원자만 참여할 수 있습니다.

채팅

  • 채팅 메시지는 폴링 방식으로 조회합니다.
  • 최신 메시지 조회에는 afterMessageId를 사용합니다.
  • 이전 메시지 조회에는 beforeMessageId를 사용합니다.
  • 조회 개수는 limit으로 제한합니다.

알림

  • 알림 목록은 page, limit 기반 페이지네이션을 적용합니다.
  • 클라이언트에서는 페이지네이션 결과를 이용해 무한 스크롤로 처리할 수 있도록 응답합니다.
  • 지원 등록, 승인, 거절, 모집글 삭제, 모집 종료 등의 상태 변경에 맞춰 알림을 생성합니다.

완료 조건

  • 담당 API가 Swagger 요청 및 응답 구조와 일치합니다.
  • 인증, 권한, 입력값 검증과 상태 계산이 적용되어 있습니다.
  • 중복 지원과 모집 인원 동시성 문제가 방지되어 있습니다.
  • 주요 성공 및 실패 상황에 대한 테스트가 작성되어 있습니다.
  • 전체 테스트가 통과합니다.
  • 작업 PR에 해당 Sub-issue가 연결되어 있습니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

기능새로운 기능을 개발합니다.주요하위 이슈들을 묶은 상위 이슈입니다.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions