ID: key_26_22_05_25_P1_1_3 Created date: 5월 25 2026 월요일

연관 문서


개요

이슈의 생성·조회·수정·삭제 API를 구현한다. 프로젝트 관리 API도 함께 포함한다.


API 목록

MethodPath설명
POST/api/v1/projects프로젝트 생성
GET/api/v1/projects내 프로젝트 목록
GET/api/v1/projects/{projectId}프로젝트 상세
POST/api/v1/projects/{projectId}/issues이슈 생성
GET/api/v1/projects/{projectId}/issues이슈 목록 (필터링)
GET/api/v1/issues/{issueId}이슈 상세
PUT/api/v1/issues/{issueId}이슈 수정
DELETE/api/v1/issues/{issueId}이슈 삭제 (Soft)
GET/api/v1/issue-types이슈 타입 목록
GET/api/v1/projects/{projectId}/statuses상태 목록

Claude Code 작업 수행서

목표

프로젝트 및 이슈 도메인 API를 완전하게 구현한다. 이슈 key 자동 생성(CIRA-1, CIRA-2…) 및 필터링 로직을 포함한다.


작업 지시

CIRA 서버에 프로젝트 및 이슈 CRUD API를 구현해줘. CLAUDE.md 컨벤션 준수.

[프로젝트 경로]
- C:\workspace\tsh\boilerplate\be\befw-app-server

[수행 작업]

1. 도메인 패키지 구성

   com.tsh.starter.befw.app.server/
   ├── interfaces/controller/cira/ProjectController.java
   ├── apService/cira/ProjectService.java
   └── apService/cira/dto/
       ├── CreateProjectRequest.java  (key, name, description, project_type)
       ├── ProjectResponse.java
       └── ProjectSummaryResponse.java
   ├── interfaces/controller/cira/IssueController.java
   ├── apService/cira/IssueService.java
   └── apService/cira/dto/
       ├── CreateIssueRequest.java
       ├── UpdateIssueRequest.java
       ├── IssueResponse.java          (상세 — 모든 필드 포함)
       ├── IssueSummaryResponse.java   (목록 — 핵심 필드만)
       └── IssueFilterRequest.java     (필터링 파라미터)

2. 이슈 key 자동 생성 로직
   - 형식: {projectKey}-{순번} (예: CIRA-1, CIRA-2)
   - 동시성 처리: @Lock(LockModeType.PESSIMISTIC_WRITE) 또는 DB sequence
   - projects 테이블에 issue_sequence(INT DEFAULT 0) 컬럼 추가 마이그레이션 작성

3. 이슈 목록 필터링 (GET /projects/{projectId}/issues)
   쿼리 파라미터:
   - status: 상태 ID (복수 가능 ?status=id1&status=id2)
   - priority: HIGHEST/HIGH/MEDIUM/LOW/LOWEST
   - assigneeId: 담당자 UUID
   - issueType: 이슈 타입 ID
   - sprintId: 스프린트 ID (null이면 백로그)
   - keyword: 제목 검색 (ILIKE)
   - page, size: 페이지네이션
   구현: JPA Specification 또는 QueryDSL

4. 이슈 생성 시 기본 동작
   - issue_logs 에 "이슈 생성" 기록
   - issue_positions 에 초기 Lexorank 값 삽입 (board_columns의 마지막 위치)
   - reporter_id = 현재 로그인 사용자

5. 이슈 수정 시 기본 동작
   - 변경된 필드만 issue_logs에 기록 (old_value → new_value)
   - updated_at 자동 갱신 (@PreUpdate 또는 Auditing)

6. 이슈 삭제 (Soft Delete)
   - DELETE /issues/{issueId} → deleted_at = NOW() 설정
   - 물리 삭제 금지
   - 삭제된 이슈의 하위 sub-task도 동시 삭제

7. 권한 검증
   - 프로젝트 멤버만 이슈 생성/수정 가능
   - 프로젝트 Admin만 이슈 삭제 가능
   - 비멤버 접근 시 403 (PROJECT_PERMISSION_DENIED)

8. 초기 데이터 (V120__init_data.sql)
   - 기본 이슈 타입: Epic, Story, Task, Bug, Sub-task
   - 기본 우선순위는 Enum 처리 (별도 테이블 불필요)

9. 통합 테스트
   - 이슈 생성 → 목록 조회 → 상세 조회 → 수정 → 삭제 시나리오
   - TestContainers PostgreSQL 사용

[준수 사항]
- PageResponse<IssueSummaryResponse> 형태로 목록 반환
- 이슈 상세(IssueResponse)에는 assignee, reporter 사용자 정보 포함
- N+1 방지: @EntityGraph 또는 fetch join 사용

완료 기준

항목기준
이슈 생성key 자동 발급, issue_logs 기록
이슈 목록필터 5종 + 페이지네이션 동작
이슈 수정변경 필드 issue_logs 기록
이슈 삭제Soft Delete, deleted_at 설정
권한 검증비멤버 403 반환
통합 테스트전체 시나리오 통과

후행 작업