From cef7785896fa28668716f0bc8d8d13d0546b606d Mon Sep 17 00:00:00 2001 From: Kim Seoyeon Date: Fri, 9 Oct 2026 13:54:15 +0900 Subject: [PATCH] refactor: remove reference track feature Reference tracks are no longer part of the product, so drop the request field, the AI payload field, the no-op upload endpoint, and the entity. Closes #24 Co-Authored-By: Claude Opus 5.5 --- e2e_test.py | 3 +- .../api/domain/humming/dto/HummingDTO.java | 1 - .../domain/humming/dto/ReferenceTrackDTO.java | 46 ------------------- .../domain/humming/entity/ReferenceTrack.java | 45 ------------------ .../repository/ReferenceTrackRepository.java | 7 --- .../controller/GenerationControllerDocs.java | 6 +-- .../dto/MusicGenerationDTO.java | 11 ++--- .../service/MusicGenerationService.java | 23 ++-------- .../upload/controller/UploadController.java | 6 --- .../controller/UploadControllerDocs.java | 7 --- 10 files changed, 11 insertions(+), 144 deletions(-) delete mode 100644 src/main/java/com/humix/api/domain/humming/dto/ReferenceTrackDTO.java delete mode 100644 src/main/java/com/humix/api/domain/humming/entity/ReferenceTrack.java delete mode 100644 src/main/java/com/humix/api/domain/humming/repository/ReferenceTrackRepository.java diff --git a/e2e_test.py b/e2e_test.py index 97444aa..e1e1a84 100644 --- a/e2e_test.py +++ b/e2e_test.py @@ -180,8 +180,7 @@ def info(msg): "humming_id": humming_id, "title": "E2E Test Song", "genre": "pop", - "mood": "happy", - "reference_track_id": None + "mood": "happy" }, headers=headers, timeout=15 diff --git a/src/main/java/com/humix/api/domain/humming/dto/HummingDTO.java b/src/main/java/com/humix/api/domain/humming/dto/HummingDTO.java index 9fd3ac1..c319883 100644 --- a/src/main/java/com/humix/api/domain/humming/dto/HummingDTO.java +++ b/src/main/java/com/humix/api/domain/humming/dto/HummingDTO.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.humix.api.domain.humming.entity.Humming; -import com.humix.api.domain.humming.entity.ReferenceTrack; import com.humix.api.domain.member.entity.Member; import java.time.LocalDateTime; diff --git a/src/main/java/com/humix/api/domain/humming/dto/ReferenceTrackDTO.java b/src/main/java/com/humix/api/domain/humming/dto/ReferenceTrackDTO.java deleted file mode 100644 index 21f8fc1..0000000 --- a/src/main/java/com/humix/api/domain/humming/dto/ReferenceTrackDTO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.humix.api.domain.humming.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.humix.api.domain.humming.entity.ReferenceTrack; -import com.humix.api.domain.member.entity.Member; - -import java.time.LocalDateTime; - -public class ReferenceTrackDTO { - //참조곡 업로드 후 정보 저장 요청 - public record ReferenceTrackSaveRequest( - @JsonProperty("file_key") String fileKey, - @JsonProperty("audio_name") String audioName, - @JsonProperty("duration_seconds") int durationSeconds - ) { - // DTO를 ReferenceTrack 엔티티로 변환하는 매핑 메서드 - public ReferenceTrack from(Member member, String s3FileUrl, String audioName, int durationSeconds) { - return ReferenceTrack.builder() - .member(member) - .audioName(audioName) - .s3FileUrl(s3FileUrl) - .durationSeconds(durationSeconds) - .build(); - } - } - - //참조곡 업로드 후 정보 저장 응답 - public record ReferenceTrackSaveResponse( - @JsonProperty("reference_track_id") Long referenceTrackId, - @JsonProperty("audio_name") String audioName, - @JsonProperty("file_url") String fileUrl, - @JsonProperty("duration_seconds") int durationSeconds, - @JsonProperty("created_at") LocalDateTime createdAt - ) { - //ReferenceTrack 엔티티를 응답 DTO로 변환하는 메서드 - public static ReferenceTrackSaveResponse from(ReferenceTrack referenceTrack) { - return new ReferenceTrackSaveResponse( - referenceTrack.getId(), - referenceTrack.getAudioName(), - referenceTrack.getS3FileUrl(), - referenceTrack.getDurationSeconds(), - referenceTrack.getCreatedAt() - ); - } - } -} diff --git a/src/main/java/com/humix/api/domain/humming/entity/ReferenceTrack.java b/src/main/java/com/humix/api/domain/humming/entity/ReferenceTrack.java deleted file mode 100644 index 3cc924e..0000000 --- a/src/main/java/com/humix/api/domain/humming/entity/ReferenceTrack.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.humix.api.domain.humming.entity; - -import com.humix.api.domain.member.entity.Member; -import jakarta.persistence.*; -import lombok.*; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import java.time.LocalDateTime; - -@Entity -@Table(name = "reference_track") -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@EntityListeners(AuditingEntityListener.class) -public class ReferenceTrack { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "reference_track_id") - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "uuid", nullable = false) - private Member member; - - @Column(name = "audio_name", length = 255, nullable = false) - private String audioName; - - @Column(name = "s3_file_url", length = 512, nullable = false) - private String s3FileUrl; - - @Column(name = "duration_seconds", nullable = false) - private Integer durationSeconds; - - @CreatedDate - @Column(name = "created_at", updatable = false) - private LocalDateTime createdAt; - - @Builder - public ReferenceTrack(Member member, String audioName, String s3FileUrl, Integer durationSeconds) { - this.member = member; - this.audioName = audioName; - this.s3FileUrl = s3FileUrl; - this.durationSeconds = durationSeconds; - } -} diff --git a/src/main/java/com/humix/api/domain/humming/repository/ReferenceTrackRepository.java b/src/main/java/com/humix/api/domain/humming/repository/ReferenceTrackRepository.java deleted file mode 100644 index b12af58..0000000 --- a/src/main/java/com/humix/api/domain/humming/repository/ReferenceTrackRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.humix.api.domain.humming.repository; - -import com.humix.api.domain.humming.entity.ReferenceTrack; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface ReferenceTrackRepository extends JpaRepository { -} diff --git a/src/main/java/com/humix/api/domain/musicGeneration/controller/GenerationControllerDocs.java b/src/main/java/com/humix/api/domain/musicGeneration/controller/GenerationControllerDocs.java index 0490fc1..110519b 100644 --- a/src/main/java/com/humix/api/domain/musicGeneration/controller/GenerationControllerDocs.java +++ b/src/main/java/com/humix/api/domain/musicGeneration/controller/GenerationControllerDocs.java @@ -22,8 +22,7 @@ public interface GenerationControllerDocs { "- `humming_id`: 벡터화가 완료된 허밍의 ID (필수)\n" + "- `title`: 생성할 곡 제목 (생략 시 기본값 '나의 허밍곡' 사용)\n" + "- `genre`: 원하는 장르 (예: pop, jazz, classical, hiphop)\n" + - "- `mood`: 원하는 분위기 (예: upbeat, calm, romantic, sad)\n" + - "- `reference_track_id`: 참조할 트랙 ID (선택사항, 없으면 null)") + "- `mood`: 원하는 분위기 (예: upbeat, calm, romantic, sad)") @RequestBody( required = true, content = @Content( @@ -35,8 +34,7 @@ public interface GenerationControllerDocs { " \"humming_id\": 1,\n" + " \"title\": \"나의 첫 번째 곡\",\n" + " \"genre\": \"pop\",\n" + - " \"mood\": \"upbeat\",\n" + - " \"reference_track_id\": 3\n" + + " \"mood\": \"upbeat\"\n" + "}" ) ) diff --git a/src/main/java/com/humix/api/domain/musicGeneration/dto/MusicGenerationDTO.java b/src/main/java/com/humix/api/domain/musicGeneration/dto/MusicGenerationDTO.java index 5977285..e728fea 100644 --- a/src/main/java/com/humix/api/domain/musicGeneration/dto/MusicGenerationDTO.java +++ b/src/main/java/com/humix/api/domain/musicGeneration/dto/MusicGenerationDTO.java @@ -22,10 +22,7 @@ public record SongCreateRequest( String genre, @Schema(description = "분위기 (예: upbeat, calm, romantic, sad 등)", example = "upbeat") - String mood, - - @Schema(description = "참조 트랙 ID (선택, 없으면 null)", example = "3", nullable = true) - @JsonProperty("reference_track_id") Long referenceTrackId + String mood ) { //DTO를 MusicGeneration 엔티티로 변환하는 매핑 메서드 public MusicGeneration from(Member member, MelodyScore melodyScore) { @@ -116,8 +113,7 @@ public record GenerationDetailResponse( @JsonProperty("humming_duration_seconds") double hummingDurationSeconds, @JsonProperty("melody_note_count") int melodyNoteCount, String genre, - String mood, - @JsonProperty("reference_track") Object referenceTrack + String mood ) { //엔티티 및 연관 데이터(Humming 등)를 조합하여 조회 응답 DTO로 변환하는 메서드 public static GenerationDetailResponse from(MusicGeneration musicGeneration, @@ -126,8 +122,7 @@ public static GenerationDetailResponse from(MusicGeneration musicGeneration, hummingDuration, //Humming 엔티티의 durationSeconds 등에서 조회 noteCount, //MelodyScore 내부 notes_data JSON의 배열 길이 등에서 파싱 musicGeneration.getGenre(), - musicGeneration.getAtmosphere(), //엔티티의 atmosphere를 mood 필드로 매핑 - null //기본값 null + musicGeneration.getAtmosphere() //엔티티의 atmosphere를 mood 필드로 매핑 ); } } diff --git a/src/main/java/com/humix/api/domain/musicGeneration/service/MusicGenerationService.java b/src/main/java/com/humix/api/domain/musicGeneration/service/MusicGenerationService.java index 2ea8648..d04b6a7 100644 --- a/src/main/java/com/humix/api/domain/musicGeneration/service/MusicGenerationService.java +++ b/src/main/java/com/humix/api/domain/musicGeneration/service/MusicGenerationService.java @@ -3,8 +3,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.humix.api.domain.humming.entity.ReferenceTrack; -import com.humix.api.domain.humming.repository.ReferenceTrackRepository; import com.humix.api.domain.melodyScore.dto.MelodyScoreDTO; import com.humix.api.domain.melodyScore.entity.MelodyScore; import com.humix.api.domain.melodyScore.repository.MelodyScoreRepository; @@ -43,7 +41,6 @@ public class MusicGenerationService { private final MusicGenerationRepository musicGenerationRepository; private final MelodyScoreRepository melodyScoreRepository; - private final ReferenceTrackRepository referenceTrackRepository; private final S3Presigner s3Presigner; private final WebClient.Builder webClientBuilder; private final ObjectMapper objectMapper; @@ -78,7 +75,6 @@ private record AiGenerationRequest( @JsonProperty("melody_vectors") List melodyVectors, String genre, String mood, - @JsonProperty("reference_track") String referenceTrack, @JsonProperty("callback_url") String callbackUrl, @JsonProperty("presigned_url") String presignedUrl ) {} @@ -106,32 +102,24 @@ public MusicGenerationDTO.TaskAcceptedResponse generateSong(CustomUserDetails us MelodyScore melodyScore = melodyScoreRepository.findByHummingId(request.hummingId()) .orElseThrow(() -> new IllegalArgumentException("해당 허밍의 멜로디 악보가 존재하지 않습니다. ID: " + request.hummingId())); - // 2. ReferenceTrack 로드 (옵션) - ReferenceTrack referenceTrack = null; - if (request.referenceTrackId() != null) { - referenceTrack = referenceTrackRepository.findById(request.referenceTrackId()) - .orElseThrow(() -> new IllegalArgumentException("해당 참조 곡이 존재하지 않습니다. ID: " + request.referenceTrackId())); - } - - // 3. Task ID 생성 + // 2. Task ID 생성 String taskId = "task_" + UUID.randomUUID().toString(); - // 4. S3 Presigned URL 생성 + // 3. S3 Presigned URL 생성 String uniqueFileName = UUID.randomUUID().toString() + "_variation.wav"; String fileKey = "audio/" + uniqueFileName; String presignedUrl = generatePresignedUrl(fileKey); - // 5. MusicGeneration 엔티티 생성 및 영속화 + // 4. MusicGeneration 엔티티 생성 및 영속화 MusicGeneration musicGeneration = request.from(userDetails.getMember(), melodyScore); musicGeneration.updateTaskId(taskId); musicGeneration.updateDuration(30); // Default 30s musicGenerationRepository.save(musicGeneration); - // 6. Melody Vectors 파싱 + // 5. Melody Vectors 파싱 List melodyVectors = parseMelodyVectors(melodyScore.getNotesData()); - // 7. AI 서버로 비동기 작곡 요청 - String refTrackName = referenceTrack != null ? referenceTrack.getAudioName() : null; + // 6. AI 서버로 비동기 작곡 요청 String callbackUrl = backendUrl + "/api/v1/internal/tasks/" + taskId + "/completion"; log.info("[MusicGeneration] Requesting song generation for taskId: {}, genre: {}, mood: {}, callback: {}", taskId, request.genre(), request.mood(), callbackUrl); @@ -142,7 +130,6 @@ public MusicGenerationDTO.TaskAcceptedResponse generateSong(CustomUserDetails us melodyVectors, request.genre(), request.mood(), - refTrackName, callbackUrl, presignedUrl ); diff --git a/src/main/java/com/humix/api/domain/upload/controller/UploadController.java b/src/main/java/com/humix/api/domain/upload/controller/UploadController.java index 7d65ccb..28fc552 100644 --- a/src/main/java/com/humix/api/domain/upload/controller/UploadController.java +++ b/src/main/java/com/humix/api/domain/upload/controller/UploadController.java @@ -35,10 +35,4 @@ public ApiResponse saveHummingInfo(@Authenticati return ApiResponse.onSuccess(GeneralSuccessCode.OK, result); } - - @PostMapping("/reference-tracks") - @Override - public ApiResponse saveReferenceTrackInfo(@RequestBody Object request) { - return ApiResponse.onSuccess(GeneralSuccessCode.OK, null); - } } \ No newline at end of file diff --git a/src/main/java/com/humix/api/domain/upload/controller/UploadControllerDocs.java b/src/main/java/com/humix/api/domain/upload/controller/UploadControllerDocs.java index 0592bd5..046cc51 100644 --- a/src/main/java/com/humix/api/domain/upload/controller/UploadControllerDocs.java +++ b/src/main/java/com/humix/api/domain/upload/controller/UploadControllerDocs.java @@ -35,11 +35,4 @@ public interface UploadControllerDocs { @PostMapping("/humming") ApiResponse saveHummingInfo(@AuthenticationPrincipal CustomUserDetails userDetails, @RequestBody HummingDTO.HummingSaveRequest request); - - @Operation(summary = "참조곡 오디오 메타데이터 저장 API", description = "S3 업로드 완료 후 사용자가 올린 참조곡의 메타데이터를 저장합니다.") - @ApiResponses({ - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "성공") - }) - @PostMapping("/reference-tracks") - ApiResponse saveReferenceTrackInfo(@RequestBody Object request); } \ No newline at end of file