> 선행: #26, #39 (PR #40 머지 후 진행) ## #️⃣ 요청 유형 - [ ] 새로운 기능 추가 - [x] 기존 기능 개선 - [ ] 성능 개선 ## #️⃣ 기능 개요 (Summary) - **기능(What)**: `/me/songs`를 버전마다 한 건씩이 아니라 **곡(root)당 최종본 1건**만 보여주고, 프론트가 버전 목록·되돌리기 API를 쓸 수 있게 응답에 `root_generation_id`를 추가 - **이유(Why)**: 사용자는 곡의 최종본 하나만 접근하고 이력은 버전 목록으로 본다. 확정 단계는 두지 않고 "삭제되지 않은 완료 버전 중 가장 최신"을 최종본으로 간주 (되돌리기가 이후 버전을 삭제하므로 성립) ## #️⃣ 기술적 설계 ### `GET /api/v1/me/songs` - 같은 `root_generation_id` 중 `status = COMPLETED AND deleted_at IS NULL`인 행의 최댓값 `generation_id` 1건만 조회 - `total_count`, `total_pages`는 곡(root) 수 기준. 장르 필터는 기존대로 (수정본이 부모의 장르를 물려받으므로 최종본 기준과 동일) - 정렬은 기존 유지(`created_at` 내림차순). 최종본 기준이라 수정하면 목록 위로 올라옴 - 응답 항목에 `root_generation_id` 추가. `song_id`는 최종본 버전의 ID (오디오 재생용) ### SSE `complete` 결과 - `result`에 `root_generation_id` 추가 (생성·수정 직후 프론트가 root를 알 수 있도록). 최초 생성곡은 `song_id`와 같은 값 ### 곡 이름 - 수정본 생성 시 이름에 `(수정본)`을 덧붙이지 않고 부모 이름을 그대로 사용 - `name`이 30자 컬럼이라 여러 번 수정하면 넘칠 수 있는 기존 문제도 함께 해소 - 이름은 모든 버전이 같으므로 목록은 최종본 행의 `name`을 사용 (원본 행 조회 불필요) ## #️⃣ 작업 상세 내용 (To-Do) - [ ] `/me/songs` 쿼리를 곡(root)당 최신 유효 버전 1건으로 변경 (장르 필터 유/무 2개) - [ ] `SongItemResponse`, `CompletionResult`에 `root_generation_id` 추가 - [ ] 수정본 이름에 `(수정본)`을 붙이지 않도록 변경 - [ ] 통합 테스트 갱신/추가: 곡당 1건, 되돌리기 후 최종본 변경, 수정본 이름, 장르 필터, 페이징 개수 - [ ] Swagger 갱신: `MeControllerDocs`(곡 단위 목록), SSE 완료 예시에 `root_generation_id` - [ ] 프론트 공유: 목록이 곡 단위로 바뀜, `root_generation_id`로 버전 목록·되돌리기 호출 ## 참고 / 범위 외 - 곡 이름 변경 API는 별도 이슈 (나중에 내 프로젝트 화면에서 수정). 그때 이름을 원본 행에만 둘지 전체 버전을 함께 바꿀지 결정 - root가 NULL인 기존 곡은 배포 후 백필(PR #40 안내) 전까지 목록에서 보이지 않음. 백필을 배포 직후 실행하는 전제 - #27(수정 API 개편)이 `SongModificationRequest.from`을 함께 바꾸므로 머지 순서에 따라 충돌 가능
Activity
seoyeoki commentedon Oct 12, 2026
내 곡 목록(
/me/songs)은 작업하지 않고 더미 화면으로 남겨두기로 해서 진행하지 않습니다. 본문은 설계 기록으로 남겨 두고, 목록과 무관한 버그였던 '수정본 이름이 30자를 넘는 문제'는 #44 으로 분리했습니다.