ID: key_26_22_05_25_P1_1_3 Created date: 5월 25 2026 월요일
연관 문서
개요
이슈의 생성·조회·수정·삭제 API를 구현한다. 프로젝트 관리 API도 함께 포함한다.
- 예상 소요: 4~5일
- 선행 조건: 1-1_DB-DDL-Flyway-마이그레이션, 1-2_서버-Auth-API 완료
- 완료 기준: 이슈 CRUD 전체 API Postman 테스트 통과
API 목록
| Method | Path | 설명 |
|---|---|---|
| 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 반환 |
| 통합 테스트 | 전체 시나리오 통과 |