🔍 개요
팀원 모집글 작성, 조회, 지원자 관리, 프로필, 채팅, 알림 기능을 구현합니다.
API 요청 및 응답 구조는 아래 Swagger 명세를 기준으로 합니다.
https://team-recruitment-api.peridot-ocean.workers.dev/
작업 진행 방식
담당자는 아래 범위를 기준으로 GitHub Sub-issue를 생성하고 이 대표 이슈에 연결합니다.
공통 데이터 모델, 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
모집글과 팀원 모집 프로필 기능을 담당합니다.
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
채팅과 알림 기능을 담당합니다.
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_closed를 true로 계산합니다.
- 일부 역할만 마감된 경우 모집글의
status는 RECRUITING을 유지합니다.
- 모든 역할이 마감되거나 모집 기한이 지나면 모집글의
status를 CLOSED로 계산합니다.
- 모집글이 마감되면 정원이 남은 역할도
is_closed를 true로 반환합니다.
- 대기 중인 지원자는 모집된 인원에 포함하지 않습니다.
지원자 처리
- 동일한 사용자가 같은 모집글에 중복 지원할 수 없도록 처리합니다.
- 마감된 모집글이나 역할에는 지원할 수 없도록 처리합니다.
- 지원 승인 시 모집 정원을 초과하지 않도록 트랜잭션 기반 동시성 제어를 적용합니다.
- 승인과 거절에 따른 지원 상태와 모집 인원 변경을 하나의 트랜잭션에서 처리합니다.
권한
- 모집글 수정, 삭제, 마감, 지원자 관리는 모집글 작성자만 수행할 수 있습니다.
- 지원서 상세는 해당 모집글 작성자만 조회할 수 있습니다.
- 팀 채팅방은 모집글 작성자와 승인된 지원자만 참여할 수 있습니다.
- 개인 채팅방은 모집글 작성자와 해당 지원자만 참여할 수 있습니다.
채팅
- 채팅 메시지는 폴링 방식으로 조회합니다.
- 최신 메시지 조회에는
afterMessageId를 사용합니다.
- 이전 메시지 조회에는
beforeMessageId를 사용합니다.
- 조회 개수는
limit으로 제한합니다.
알림
- 알림 목록은
page, limit 기반 페이지네이션을 적용합니다.
- 클라이언트에서는 페이지네이션 결과를 이용해 무한 스크롤로 처리할 수 있도록 응답합니다.
- 지원 등록, 승인, 거절, 모집글 삭제, 모집 종료 등의 상태 변경에 맞춰 알림을 생성합니다.
완료 조건
- 담당 API가 Swagger 요청 및 응답 구조와 일치합니다.
- 인증, 권한, 입력값 검증과 상태 계산이 적용되어 있습니다.
- 중복 지원과 모집 인원 동시성 문제가 방지되어 있습니다.
- 주요 성공 및 실패 상황에 대한 테스트가 작성되어 있습니다.
- 전체 테스트가 통과합니다.
- 작업 PR에 해당 Sub-issue가 연결되어 있습니다.
🔍 개요
팀원 모집글 작성, 조회, 지원자 관리, 프로필, 채팅, 알림 기능을 구현합니다.
API 요청 및 응답 구조는 아래 Swagger 명세를 기준으로 합니다.
https://team-recruitment-api.peridot-ocean.workers.dev/
작업 진행 방식
담당자는 아래 범위를 기준으로 GitHub Sub-issue를 생성하고 이 대표 이슈에 연결합니다.
@taejinn
공통 데이터 모델, DB 마이그레이션, 상태 계산, 동시성 제어를 담당합니다.
POST /team-recruitments/{recruitmentId}/applicationsGET /team-recruitments/me/applicationsGET /team-recruitments/{recruitmentId}/applicationsGET /team-recruitments/{recruitmentId}/applications/{applicationId}PUT /team-recruitments/{recruitmentId}/applications/{applicationId}/status@insik03
모집글과 팀원 모집 프로필 기능을 담당합니다.
GET /team-recruitmentsPOST /team-recruitmentsGET /team-recruitments/{recruitmentId}PUT /team-recruitments/{recruitmentId}DELETE /team-recruitments/{recruitmentId}PUT /team-recruitments/{recruitmentId}/closeGET /team-recruitments/me/createdGET /team-recruitment-profiles/mePUT /team-recruitment-profiles/me@dnjswldnd-3513
채팅과 알림 기능을 담당합니다.
GET /chatroom/team-recruitment/{recruitmentId}/{chatRoomId}POST /chatroom/team-recruitment/{recruitmentId}/applications/{applicationId}/directGET /chatroom/team-recruitment/{recruitmentId}/{chatRoomId}/messagesPOST /chatroom/team-recruitment/{recruitmentId}/{chatRoomId}/messagesGET /team-recruitments/notificationsPOST /team-recruitments/notifications/{notificationId}/readPOST /team-recruitments/notifications/mark-all-read공통 구현 기준
네이밍 및 DTO
record를 사용합니다.@JsonNaming(SnakeCaseStrategy.class)을 적용합니다.모집 상태
is_closed를true로 계산합니다.status는RECRUITING을 유지합니다.status를CLOSED로 계산합니다.is_closed를true로 반환합니다.지원자 처리
권한
채팅
afterMessageId를 사용합니다.beforeMessageId를 사용합니다.limit으로 제한합니다.알림
page,limit기반 페이지네이션을 적용합니다.완료 조건