From 9220b10dbdabee0f11bfc4cd25eb3ba5047e6624 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:27:56 +0900 Subject: [PATCH 001/167] =?UTF-8?q?[fix]=20proejct=20session,=20dto=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/controller/ProjectController.java | 31 ++++++++++--------- .../dto/request/ProjectTextRequest.java | 14 +++++++++ 2 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java index 8632c056..5079555a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java @@ -3,6 +3,7 @@ import com.google.api.Http; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; +import com.oreo.finalproject_5re5_be.project.dto.request.ProjectTextRequest; import com.oreo.finalproject_5re5_be.project.dto.response.ProjectResponse; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; @@ -43,11 +44,12 @@ public ProjectController(ProjectService projectService){ ) @GetMapping("/{memSeq}") public ResponseEntity>>> projectGet( -// HttpSession session) { - @PathVariable Long memSeq){//session memberSeq값 - List projectResponses = - projectService.projectFindAll(memSeq); -// List projectResponses = projectService.projectFindAll(userDetails.getMember().getSeq()); + HttpSession session) { +// @PathVariable Long memSeq){//session memberSeq값 +// List projectResponses = + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.projectFindAll(memberSeq); + List projectResponses = projectService.projectFindAll(memberSeq); log.info("[ProjectController] projectGet - projectResponses : {} ", projectResponses.toString()); Map> map = new HashMap<>();//맵 생성 @@ -62,9 +64,9 @@ public ResponseEntity>>> projectGet( ) @PostMapping("/{memSeq}") public ResponseEntity>> projectSave( - @PathVariable Long memSeq){//session memberSeq값 + HttpSession session){//session memberSeq값 //project 생성 - Long projectSeq = projectService.projectSave(memSeq); + Long projectSeq = projectService.projectSave((Long) session.getAttribute("memberSeq")); Map map = new HashMap<>(); map.put("projectSeq", projectSeq);//프로젝트seq 응답에 추가 map.put("msg", "프로젝트 생성 완료되었습니다.");//메시지 추가 @@ -78,14 +80,13 @@ public ResponseEntity>> projectSave( ) @PutMapping("/{memSeq}") public ResponseEntity> projectUpdate( - @PathVariable Long memSeq, - @Valid @RequestBody Long proSeq, - @Valid @RequestBody String projectName){ - projectService.projectCheck(memSeq, proSeq); //회원의 프로젝트인지 확인 - projectService.projectUpdate(proSeq, projectName);//프로젝트 수정 + HttpSession session, + @Valid @RequestBody ProjectTextRequest request){ + projectService.projectCheck((Long) session.getAttribute("memberSeq"), request.getProSeq()); //회원의 프로젝트인지 확인 + projectService.projectUpdate(request.getProSeq(), request.getProjectName());//프로젝트 수정 return ResponseEntity.ok() .body(new ResponseDto<>(HttpStatus.OK.value(), - "Project 이름 변경 완료되었습니다.")); //응답 + "Project 이름 변경 완료되었습니다.")); //응답 } @Operation( summary = "Project 삭제", @@ -94,8 +95,8 @@ public ResponseEntity> projectUpdate( @DeleteMapping("/{memSeq}") public ResponseEntity> projectDelete( @RequestParam List proSeq, - @PathVariable Long memSeq){ - projectService.projectCheck(memSeq, proSeq); //회원의 프로젝트인지 확인 + HttpSession session){ + projectService.projectCheck((Long) session.getAttribute("memberSeq"), proSeq); //회원의 프로젝트인지 확인 projectService.projectDelete(proSeq);//프로젝트 삭제 배열로 받음 return ResponseEntity.ok() .body(new ResponseDto<>(HttpStatus.OK.value(), diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java new file mode 100644 index 00000000..f8d3e81a --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java @@ -0,0 +1,14 @@ +package com.oreo.finalproject_5re5_be.project.dto.request; + +import lombok.*; + +@Getter +@Setter +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class ProjectTextRequest { + private Long proSeq; + private String projectName; +} From bb08112918e9539275bccbab1d601c5e2f22544d Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:35:35 +0900 Subject: [PATCH 002/167] =?UTF-8?q?[fix]=20dev1=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20project=20=EA=B2=BD=EB=A1=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/global/config/SwaggerConfig.java | 3 +-- .../member/config/LoginAuthenticationSuccessHandler.java | 1 + .../project/controller/ProjectController.java | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java index 859c630e..f839684f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java @@ -22,8 +22,7 @@ public class SwaggerConfig { public OpenAPI openAPI() { //swagger servers 지정 List server = new ArrayList<>(); - server.add(new Server().description("https Server").url("https://5re5park.site")); - server.add(new Server().description("http Server").url("http://5re5park.site:8080")); + server.add(new Server().description("https Server").url("https://dev1.5re5park.site")); server.add(new Server().description("localhost").url("http://localhost:8080")); OpenAPI info = new OpenAPI() diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java index 5875f346..47b66f33 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java @@ -118,6 +118,7 @@ private void handleCookie(HttpServletRequest request, HttpServletResponse respon // 쿠키 등록 response.addCookie(cookie); response.setHeader("Access-Control-Allow-Origin", "https://5re5park.site"); + response.setHeader("Access-Control-Allow-Origin", "https://dev1.5re5park.site"); response.setHeader("Access-Control-Allow-Credentials", "true"); } else { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java index 5079555a..dfbf209a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java @@ -42,7 +42,7 @@ public ProjectController(ProjectService projectService){ summary = "Project 정보 검색", description = "회원 Seq로 프로젝트 정보를 가지고옵니다." ) - @GetMapping("/{memSeq}") + @GetMapping("") public ResponseEntity>>> projectGet( HttpSession session) { // @PathVariable Long memSeq){//session memberSeq값 @@ -62,7 +62,7 @@ public ResponseEntity>>> projectGet( summary = "Project 생성", description = "회원 Seq로 프로젝트를 생성 합니다." ) - @PostMapping("/{memSeq}") + @PostMapping("") public ResponseEntity>> projectSave( HttpSession session){//session memberSeq값 //project 생성 @@ -78,7 +78,7 @@ public ResponseEntity>> projectSave( summary = "Project 이름 수정(저장)", description = "프로젝트 Seq와 변경할 이름을 받아 수정합니다." ) - @PutMapping("/{memSeq}") + @PutMapping("") public ResponseEntity> projectUpdate( HttpSession session, @Valid @RequestBody ProjectTextRequest request){ @@ -92,7 +92,7 @@ public ResponseEntity> projectUpdate( summary = "Project 삭제", description = "프로젝트 Seq를 받아 activate 상태를 'N'으로 변경합니다." ) - @DeleteMapping("/{memSeq}") + @DeleteMapping("") public ResponseEntity> projectDelete( @RequestParam List proSeq, HttpSession session){ From 6e7d426e900ac3517da21be0ea6b887e0190ff78 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 17:02:17 +0900 Subject: [PATCH 003/167] =?UTF-8?q?[ci]=20CICD=20=EB=B3=80=EA=B2=BD=20TTS?= =?UTF-8?q?=5FJSON=5FCONTENT,=20test=20=EB=8F=99=EC=9E=91=EB=90=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dockerdeploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dockerdeploy.yml b/.github/workflows/dockerdeploy.yml index 3614f514..272b40cb 100644 --- a/.github/workflows/dockerdeploy.yml +++ b/.github/workflows/dockerdeploy.yml @@ -53,13 +53,13 @@ jobs: # 5. JSON Config 파일 생성 - name: Create JSON Config File env: - TTS_JSON_CONTENT: ${{ secrets.TTS_JSON }} + TTS_JSON_CONTENT: ${{ secrets.TTS_JSON_CONTENT }} run: | echo "${TTS_JSON_CONTENT}" > src/main/resources/tts.json # 6. 빌드 및 테스트 실행 - name: Build and Test - run: ./gradlew build -x test + run: ./gradlew build - name: Docker Login uses: docker/login-action@v3 From 6a474c856f4beaccb9d33e8e7836b82cf3c8553a Mon Sep 17 00:00:00 2001 From: oowtl Date: Sat, 7 Dec 2024 17:22:15 +0900 Subject: [PATCH 004/167] =?UTF-8?q?[feat]=20session=20=EC=9D=84=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20=EA=B3=84=EC=A0=95=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tts/controller/TtsController.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java index 24bf59d4..33ddc1aa 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; @@ -135,8 +136,9 @@ public ResponseEntity constraintViolationExceptionHandler( public ResponseEntity> registerSentence( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody TtsSentenceRequest createRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + HttpSession session) { //회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 문장 생성 @@ -153,8 +155,9 @@ public ResponseEntity> updateSentence( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "TTS 문장 ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, @Parameter(description = "tts 문장 수정 요청 body") @Valid @RequestBody TtsSentenceRequest updateRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) @@ -174,12 +177,14 @@ public ResponseEntity> updateSentence( public ResponseEntity> batchSave( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody TtsSentenceBatchRequest batchRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) - ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, batchRequest.getSentenceList()); + ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, + batchRequest.getSentenceList()); // 문장 생성 및 수정 TtsSentenceListDto response = ttsSentenceService.batchSaveSentence(proSeq, @@ -222,9 +227,9 @@ public ResponseEntity> getSentenceList( public ResponseEntity> makeTts( @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq, @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, - @SessionAttribute(value = "memberSeq") Long memberSeq) { - + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) @@ -246,12 +251,11 @@ public ResponseEntity> makeTts( @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") @GetMapping("/sentence/{tsSeq}/maketts/multi") public ResponseEntity> makeTtsMuti( - @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq - ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq - , @SessionAttribute(value = "memberSeq") Long memberSeq - ) { - + @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq, + @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) @@ -261,13 +265,13 @@ public ResponseEntity> makeTtsMuti( TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); return ResponseEntity - .status(HttpStatus.CREATED) - .body( - new ResponseDto<>( - HttpStatus.CREATED.value(), - ttsMakeResult - ) - ); + .status(HttpStatus.CREATED) + .body( + new ResponseDto<>( + HttpStatus.CREATED.value(), + ttsMakeResult + ) + ); } @Operation(summary = "TTS 문장 삭제 요청") @@ -275,9 +279,9 @@ public ResponseEntity> makeTtsMuti( public ResponseEntity> deleteSentence( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "TTS 문장 ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, - @SessionAttribute(value = "memberSeq") Long memberSeq) { - + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 회원이 소유한 tts 문장인지 확인 From 7bfa5a39882742c825831485bbfbbb867afa5c9b Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:27:56 +0900 Subject: [PATCH 005/167] =?UTF-8?q?[fix]=20proejct=20session,=20dto=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/controller/ProjectController.java | 31 ++++++++++--------- .../dto/request/ProjectTextRequest.java | 14 +++++++++ 2 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java index 8632c056..5079555a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java @@ -3,6 +3,7 @@ import com.google.api.Http; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; +import com.oreo.finalproject_5re5_be.project.dto.request.ProjectTextRequest; import com.oreo.finalproject_5re5_be.project.dto.response.ProjectResponse; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; @@ -43,11 +44,12 @@ public ProjectController(ProjectService projectService){ ) @GetMapping("/{memSeq}") public ResponseEntity>>> projectGet( -// HttpSession session) { - @PathVariable Long memSeq){//session memberSeq값 - List projectResponses = - projectService.projectFindAll(memSeq); -// List projectResponses = projectService.projectFindAll(userDetails.getMember().getSeq()); + HttpSession session) { +// @PathVariable Long memSeq){//session memberSeq값 +// List projectResponses = + Long memberSeq = (Long) session.getAttribute("memberSeq"); + projectService.projectFindAll(memberSeq); + List projectResponses = projectService.projectFindAll(memberSeq); log.info("[ProjectController] projectGet - projectResponses : {} ", projectResponses.toString()); Map> map = new HashMap<>();//맵 생성 @@ -62,9 +64,9 @@ public ResponseEntity>>> projectGet( ) @PostMapping("/{memSeq}") public ResponseEntity>> projectSave( - @PathVariable Long memSeq){//session memberSeq값 + HttpSession session){//session memberSeq값 //project 생성 - Long projectSeq = projectService.projectSave(memSeq); + Long projectSeq = projectService.projectSave((Long) session.getAttribute("memberSeq")); Map map = new HashMap<>(); map.put("projectSeq", projectSeq);//프로젝트seq 응답에 추가 map.put("msg", "프로젝트 생성 완료되었습니다.");//메시지 추가 @@ -78,14 +80,13 @@ public ResponseEntity>> projectSave( ) @PutMapping("/{memSeq}") public ResponseEntity> projectUpdate( - @PathVariable Long memSeq, - @Valid @RequestBody Long proSeq, - @Valid @RequestBody String projectName){ - projectService.projectCheck(memSeq, proSeq); //회원의 프로젝트인지 확인 - projectService.projectUpdate(proSeq, projectName);//프로젝트 수정 + HttpSession session, + @Valid @RequestBody ProjectTextRequest request){ + projectService.projectCheck((Long) session.getAttribute("memberSeq"), request.getProSeq()); //회원의 프로젝트인지 확인 + projectService.projectUpdate(request.getProSeq(), request.getProjectName());//프로젝트 수정 return ResponseEntity.ok() .body(new ResponseDto<>(HttpStatus.OK.value(), - "Project 이름 변경 완료되었습니다.")); //응답 + "Project 이름 변경 완료되었습니다.")); //응답 } @Operation( summary = "Project 삭제", @@ -94,8 +95,8 @@ public ResponseEntity> projectUpdate( @DeleteMapping("/{memSeq}") public ResponseEntity> projectDelete( @RequestParam List proSeq, - @PathVariable Long memSeq){ - projectService.projectCheck(memSeq, proSeq); //회원의 프로젝트인지 확인 + HttpSession session){ + projectService.projectCheck((Long) session.getAttribute("memberSeq"), proSeq); //회원의 프로젝트인지 확인 projectService.projectDelete(proSeq);//프로젝트 삭제 배열로 받음 return ResponseEntity.ok() .body(new ResponseDto<>(HttpStatus.OK.value(), diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java new file mode 100644 index 00000000..f8d3e81a --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/request/ProjectTextRequest.java @@ -0,0 +1,14 @@ +package com.oreo.finalproject_5re5_be.project.dto.request; + +import lombok.*; + +@Getter +@Setter +@Builder +@ToString +@NoArgsConstructor +@AllArgsConstructor +public class ProjectTextRequest { + private Long proSeq; + private String projectName; +} From b6931aa8ec901185b79d5beed244753a51f572bd Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:35:35 +0900 Subject: [PATCH 006/167] =?UTF-8?q?[fix]=20dev1=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=8A=A4=ED=94=84=EB=A7=81=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20project=20=EA=B2=BD=EB=A1=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/global/config/SwaggerConfig.java | 3 +-- .../member/config/LoginAuthenticationSuccessHandler.java | 1 + .../project/controller/ProjectController.java | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java index 859c630e..f839684f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SwaggerConfig.java @@ -22,8 +22,7 @@ public class SwaggerConfig { public OpenAPI openAPI() { //swagger servers 지정 List server = new ArrayList<>(); - server.add(new Server().description("https Server").url("https://5re5park.site")); - server.add(new Server().description("http Server").url("http://5re5park.site:8080")); + server.add(new Server().description("https Server").url("https://dev1.5re5park.site")); server.add(new Server().description("localhost").url("http://localhost:8080")); OpenAPI info = new OpenAPI() diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java index 5875f346..47b66f33 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java @@ -118,6 +118,7 @@ private void handleCookie(HttpServletRequest request, HttpServletResponse respon // 쿠키 등록 response.addCookie(cookie); response.setHeader("Access-Control-Allow-Origin", "https://5re5park.site"); + response.setHeader("Access-Control-Allow-Origin", "https://dev1.5re5park.site"); response.setHeader("Access-Control-Allow-Credentials", "true"); } else { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java index 5079555a..dfbf209a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java @@ -42,7 +42,7 @@ public ProjectController(ProjectService projectService){ summary = "Project 정보 검색", description = "회원 Seq로 프로젝트 정보를 가지고옵니다." ) - @GetMapping("/{memSeq}") + @GetMapping("") public ResponseEntity>>> projectGet( HttpSession session) { // @PathVariable Long memSeq){//session memberSeq값 @@ -62,7 +62,7 @@ public ResponseEntity>>> projectGet( summary = "Project 생성", description = "회원 Seq로 프로젝트를 생성 합니다." ) - @PostMapping("/{memSeq}") + @PostMapping("") public ResponseEntity>> projectSave( HttpSession session){//session memberSeq값 //project 생성 @@ -78,7 +78,7 @@ public ResponseEntity>> projectSave( summary = "Project 이름 수정(저장)", description = "프로젝트 Seq와 변경할 이름을 받아 수정합니다." ) - @PutMapping("/{memSeq}") + @PutMapping("") public ResponseEntity> projectUpdate( HttpSession session, @Valid @RequestBody ProjectTextRequest request){ @@ -92,7 +92,7 @@ public ResponseEntity> projectUpdate( summary = "Project 삭제", description = "프로젝트 Seq를 받아 activate 상태를 'N'으로 변경합니다." ) - @DeleteMapping("/{memSeq}") + @DeleteMapping("") public ResponseEntity> projectDelete( @RequestParam List proSeq, HttpSession session){ From 0829ab223a701e6eaa83dd8e60f2928832982b8f Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 17:02:17 +0900 Subject: [PATCH 007/167] =?UTF-8?q?[ci]=20CICD=20=EB=B3=80=EA=B2=BD=20TTS?= =?UTF-8?q?=5FJSON=5FCONTENT,=20test=20=EB=8F=99=EC=9E=91=EB=90=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dockerdeploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dockerdeploy.yml b/.github/workflows/dockerdeploy.yml index 3614f514..272b40cb 100644 --- a/.github/workflows/dockerdeploy.yml +++ b/.github/workflows/dockerdeploy.yml @@ -53,13 +53,13 @@ jobs: # 5. JSON Config 파일 생성 - name: Create JSON Config File env: - TTS_JSON_CONTENT: ${{ secrets.TTS_JSON }} + TTS_JSON_CONTENT: ${{ secrets.TTS_JSON_CONTENT }} run: | echo "${TTS_JSON_CONTENT}" > src/main/resources/tts.json # 6. 빌드 및 테스트 실행 - name: Build and Test - run: ./gradlew build -x test + run: ./gradlew build - name: Docker Login uses: docker/login-action@v3 From d36de4b4c1534e1f08c0f60c379be0de18c0f55b Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 17:24:57 +0900 Subject: [PATCH 008/167] =?UTF-8?q?[fix]=20vc=20delete=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/vc/controller/VcController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java index ab608d64..e0c24fe7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java @@ -259,11 +259,11 @@ public ResponseEntity>> vc( @Operation( summary = "SRC 행 삭제", - description = "SRC 행을 비활성화 상태로 변경합니다. active = 'N' " + description = "srcSeq를 배열 형태로 넣어 SRC 행을 비활성화 상태로 변경합니다. active = 'N' " ) @DeleteMapping("/src") public ResponseEntity>>> deleteSrc( - @Valid @RequestBody List srcSeq, + @Valid @RequestBody @Parameter(description = "List srcSeq") List srcSeq, HttpSession session){ //회원의 정보인지 확인 vcService.srcCheck((Long) session.getAttribute("memberSeq"), srcSeq); From 819d0aad196dab83e99aa39cabc4f8b9f8d13b36 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 17:28:39 +0900 Subject: [PATCH 009/167] =?UTF-8?q?[fix]=20buildTest=EB=8F=84=20TTS=5FJSON?= =?UTF-8?q?=5FCONTENT=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/buildTest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/buildTest.yml b/.github/workflows/buildTest.yml index 45ec2019..70e6dd19 100644 --- a/.github/workflows/buildTest.yml +++ b/.github/workflows/buildTest.yml @@ -75,7 +75,7 @@ jobs: shell: bash - name: Create JSON Config File env: - TTS_JSON_CONTENT: ${{ secrets.TTS_JSON }} + TTS_JSON_CONTENT: ${{ secrets.TTS_JSON_CONTENT }} run: | echo "${TTS_JSON_CONTENT}" > src/main/resources/tts.json echo $TTS_JSON_CONTENT From 9912ac513f27c354951be2b5107f8fd78708788e Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 17:24:57 +0900 Subject: [PATCH 010/167] =?UTF-8?q?[fix]=20vc=20delete=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/vc/controller/VcController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java index ab608d64..e0c24fe7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java @@ -259,11 +259,11 @@ public ResponseEntity>> vc( @Operation( summary = "SRC 행 삭제", - description = "SRC 행을 비활성화 상태로 변경합니다. active = 'N' " + description = "srcSeq를 배열 형태로 넣어 SRC 행을 비활성화 상태로 변경합니다. active = 'N' " ) @DeleteMapping("/src") public ResponseEntity>>> deleteSrc( - @Valid @RequestBody List srcSeq, + @Valid @RequestBody @Parameter(description = "List srcSeq") List srcSeq, HttpSession session){ //회원의 정보인지 확인 vcService.srcCheck((Long) session.getAttribute("memberSeq"), srcSeq); From ea040a6d87555c081fc8e65cd83dcf7dcf7c06ff Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 17:28:39 +0900 Subject: [PATCH 011/167] =?UTF-8?q?[fix]=20buildTest=EB=8F=84=20TTS=5FJSON?= =?UTF-8?q?=5FCONTENT=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/buildTest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/buildTest.yml b/.github/workflows/buildTest.yml index 45ec2019..70e6dd19 100644 --- a/.github/workflows/buildTest.yml +++ b/.github/workflows/buildTest.yml @@ -75,7 +75,7 @@ jobs: shell: bash - name: Create JSON Config File env: - TTS_JSON_CONTENT: ${{ secrets.TTS_JSON }} + TTS_JSON_CONTENT: ${{ secrets.TTS_JSON_CONTENT }} run: | echo "${TTS_JSON_CONTENT}" > src/main/resources/tts.json echo $TTS_JSON_CONTENT From 1b503b23b6b9721fe3b8bb3d753a2fa8ae3b85a4 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 18:03:55 +0900 Subject: [PATCH 012/167] =?UTF-8?q?[fix]=20RequestBody=20->=20RequestParam?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/vc/controller/VcController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java index e0c24fe7..756045c6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java @@ -3,7 +3,6 @@ import com.oreo.finalproject_5re5_be.global.component.AudioInfo; import com.oreo.finalproject_5re5_be.global.component.S3Service; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; -import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import com.oreo.finalproject_5re5_be.vc.dto.request.VcRowRequest; import com.oreo.finalproject_5re5_be.vc.dto.request.VcTextRequest; @@ -21,7 +20,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -263,7 +261,7 @@ public ResponseEntity>> vc( ) @DeleteMapping("/src") public ResponseEntity>>> deleteSrc( - @Valid @RequestBody @Parameter(description = "List srcSeq") List srcSeq, + @Valid @RequestParam @Parameter(description = "List srcSeq") List srcSeq, HttpSession session){ //회원의 정보인지 확인 vcService.srcCheck((Long) session.getAttribute("memberSeq"), srcSeq); From 7c57667445b57312661af4142b62c6dbab8abfca Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 7 Dec 2024 18:03:55 +0900 Subject: [PATCH 013/167] =?UTF-8?q?[fix]=20RequestBody=20->=20RequestParam?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/vc/controller/VcController.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java index e0c24fe7..756045c6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/vc/controller/VcController.java @@ -3,7 +3,6 @@ import com.oreo.finalproject_5re5_be.global.component.AudioInfo; import com.oreo.finalproject_5re5_be.global.component.S3Service; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; -import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import com.oreo.finalproject_5re5_be.vc.dto.request.VcRowRequest; import com.oreo.finalproject_5re5_be.vc.dto.request.VcTextRequest; @@ -21,7 +20,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -263,7 +261,7 @@ public ResponseEntity>> vc( ) @DeleteMapping("/src") public ResponseEntity>>> deleteSrc( - @Valid @RequestBody @Parameter(description = "List srcSeq") List srcSeq, + @Valid @RequestParam @Parameter(description = "List srcSeq") List srcSeq, HttpSession session){ //회원의 정보인지 확인 vcService.srcCheck((Long) session.getAttribute("memberSeq"), srcSeq); From 7fef05c0db1d6bf3628b2df52821f2f4985ca124 Mon Sep 17 00:00:00 2001 From: oowtl Date: Sat, 7 Dec 2024 19:00:27 +0900 Subject: [PATCH 014/167] =?UTF-8?q?[feat]=20=EC=97=90=EB=9F=AC=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ErrorCode.java | 11 +++++- .../exception/ProjectNotFoundException.java | 19 +++++++++ .../exception/ProjectMismatchException.java | 3 +- .../tts/exception/TtsSentenceNotFound.java | 19 +++++++++ .../tts/exception/VoiceEntityNotFound.java | 20 ++++++++++ .../tts/service/TtsSentenceServiceImpl.java | 39 ++++++++++--------- .../ttsSentenceService/TestAddSentence.java | 9 +++-- 7 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java index 7ceda041..d9fe1b03 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java @@ -35,7 +35,16 @@ public enum ErrorCode { ENTITY_NOT_FOUND(400, " Entity Not Found"), INTERNAL_SERVER_ERROR(500, "Server Error"), INVALID_TYPE_VALUE(400, " Invalid Type Value"), - HANDLE_ACCESS_DENIED(403, "Access is Denied"); + HANDLE_ACCESS_DENIED(403, "Access is Denied"), + + // 프로젝트 ERROR 처리 + PROJECT_NOT_FOUND_ERROR(404, "해당 프로젝트를 찾을 수 없습니다."), + + // TTS ERROR 처리 + PROJECT_MISMATCH_ERROR(400, "요청하신 프로젝트를 소유하고 있지 않습니다."), + VOICE_ENTITY_NOT_FOUND_ERROR(404, "해당 음성을 찾을 수 없습니다."), + TTS_SENTENCE_NOT_FOUND_ERROR(404, "해당 문장을 찾을 수 없습니다."); + private final String message; private final int status; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java new file mode 100644 index 00000000..0df640ed --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java @@ -0,0 +1,19 @@ +package com.oreo.finalproject_5re5_be.project.exception; + +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class ProjectNotFoundException extends EntityNotFoundException { + + public ProjectNotFoundException() { + super(ErrorCode.PROJECT_NOT_FOUND_ERROR.getMessage(), ErrorCode.PROJECT_NOT_FOUND_ERROR); + } + + public ProjectNotFoundException(String message) { + super(message, ErrorCode.PROJECT_NOT_FOUND_ERROR); + } + + public ProjectNotFoundException(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java index d7190ec9..9daf63bc 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java @@ -1,11 +1,12 @@ package com.oreo.finalproject_5re5_be.tts.exception; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; import com.oreo.finalproject_5re5_be.global.exception.InValidValueException; public class ProjectMismatchException extends InValidValueException { public ProjectMismatchException() { - super(); + super(ErrorCode.PROJECT_MISMATCH_ERROR.getMessage(), ErrorCode.PROJECT_MISMATCH_ERROR); } public ProjectMismatchException(String message) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java new file mode 100644 index 00000000..16956046 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java @@ -0,0 +1,19 @@ +package com.oreo.finalproject_5re5_be.tts.exception; + +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class TtsSentenceNotFound extends EntityNotFoundException { + + public TtsSentenceNotFound() { + super(ErrorCode.TTS_SENTENCE_NOT_FOUND_ERROR.getMessage(), ErrorCode.TTS_SENTENCE_NOT_FOUND_ERROR); + } + + public TtsSentenceNotFound(String message) { + super(message, ErrorCode.TTS_SENTENCE_NOT_FOUND_ERROR); + } + + public TtsSentenceNotFound(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java new file mode 100644 index 00000000..869aba88 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java @@ -0,0 +1,20 @@ +package com.oreo.finalproject_5re5_be.tts.exception; + +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class VoiceEntityNotFound extends EntityNotFoundException { + + public VoiceEntityNotFound() { + super(ErrorCode.VOICE_ENTITY_NOT_FOUND_ERROR.getMessage(), + ErrorCode.VOICE_ENTITY_NOT_FOUND_ERROR); + } + + public VoiceEntityNotFound(String message) { + super(message, ErrorCode.VOICE_ENTITY_NOT_FOUND_ERROR); + } + + public VoiceEntityNotFound(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java index 060040f0..3c7514b4 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java @@ -3,6 +3,7 @@ import com.oreo.finalproject_5re5_be.global.constant.BatchProcessType; import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; import com.oreo.finalproject_5re5_be.project.entity.Project; +import com.oreo.finalproject_5re5_be.project.exception.ProjectNotFoundException; import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import com.oreo.finalproject_5re5_be.tts.dto.request.TtsAttributeInfo; @@ -16,13 +17,17 @@ import com.oreo.finalproject_5re5_be.tts.entity.TtsProgressStatusCode; import com.oreo.finalproject_5re5_be.tts.entity.TtsSentence; import com.oreo.finalproject_5re5_be.tts.entity.Voice; +import com.oreo.finalproject_5re5_be.tts.exception.InValidRequestException; import com.oreo.finalproject_5re5_be.tts.exception.ProjectMismatchException; import com.oreo.finalproject_5re5_be.tts.exception.TtsSentenceInValidInput; +import com.oreo.finalproject_5re5_be.tts.exception.TtsSentenceNotFound; +import com.oreo.finalproject_5re5_be.tts.exception.VoiceEntityNotFound; import com.oreo.finalproject_5re5_be.tts.repository.TtsProgressStatusRepository; import com.oreo.finalproject_5re5_be.tts.repository.TtsSentenceRepository; import com.oreo.finalproject_5re5_be.tts.repository.VoiceRepository; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import java.util.ArrayList; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -60,13 +65,12 @@ public TtsSentenceDto addSentence(@Valid @NotNull Long projectSeq, // 2.1 projectSeq 유효성 검증 : not null => @NotNull // 2.2. projectSeq : 조회 가능한 projectSeq (존재 여부) 검증 및 할당 Project project = projectRepository.findById(projectSeq) - .orElseThrow(() -> new IllegalArgumentException("projectSeq is invalid")); + .orElseThrow(ProjectNotFoundException::new); // 3.1 TtsSentenceRequest.voiceSeq 유효성 검증 : not null => @NotNull // 3.2 voiceSeq : 조회 가능한 voiceSeq (존재 여부) 검증 및 할당 Voice voice = voiceRepository.findById(createRequest.getVoiceSeq()) - .orElseThrow(() -> new IllegalArgumentException("voiceSeq is invalid")); - + .orElseThrow(VoiceEntityNotFound::new); // 4. TtsSentenceRequest -> TtsSentence 변환 TtsAttributeInfo attribute = createRequest.getAttribute(); @@ -114,26 +118,22 @@ public TtsSentenceDto updateSentence(@Valid @NotNull Long projectSeq, @Valid @NotNull Long tsSeq, @Valid TtsSentenceRequest updateRequest) { // 1. TtsSentenceRequest 유효성 검증 if (updateRequest == null) { - throw new IllegalArgumentException("Update request cannot be null"); + throw new InValidRequestException(); } // 2. DB 유효성 검증 // 2.1 projectSeq 조회 가능한 projectSeq (존재 여부) 검증 및 할당 Project project = projectRepository.findById(projectSeq) - .orElseThrow( - () -> new EntityNotFoundException("Project not found with id: " + projectSeq)); + .orElseThrow(ProjectNotFoundException::new); // 2.2 voiceSeq 조회 가능한 voiceSeq (존재 여부) 검증 및 할당 Voice voice = voiceRepository.findById(updateRequest.getVoiceSeq()) - .orElseThrow(() -> new EntityNotFoundException( - "Voice not found with id: " + updateRequest.getVoiceSeq())); - + .orElseThrow(VoiceEntityNotFound::new); // 3. TtsSentenceRequest -> TtsSentence 변환 // 3.1 TtsSentence 엔티티 조회 TtsSentence sentence = ttsSentenceRepository.findById(tsSeq) - .orElseThrow( - () -> new EntityNotFoundException("TtsSentence not found with id: " + tsSeq)); + .orElseThrow(TtsSentenceNotFound::new); // 3.2 TtsSentence 엔티티 수정 TtsSentence updateSentence = sentence.toBuilder() @@ -167,13 +167,11 @@ public TtsSentenceListDto batchSaveSentence(@Valid @NotNull Long projectSeq, @Valid TtsSentenceBatchRequest batchRequest) { // 10개의 TTSSentence 가 있다고 가정했을 때 5개의 TTSSentence 를 수정하고 전체 정렬을 했을 때, 순서를 보장하기 위해서는? - // 1. DELETE 를 먼저 삭제한다. (삭제할 것들은 삭제 후에 정렬) batchRequest.getSentenceList().stream() .filter(sentence -> sentence.getBatchProcessType() == BatchProcessType.DELETE) .forEach(sentence -> deleteSentence(projectSeq, sentence.getSentence().getTsSeq())); - List alivedList = batchRequest.getSentenceList().stream() .filter(sentence -> sentence.getBatchProcessType() != BatchProcessType.DELETE) .toList(); @@ -187,10 +185,14 @@ public TtsSentenceListDto batchSaveSentence(@Valid @NotNull Long projectSeq, List batchList = alivedRequest.sortSentenceList(); // 4. TtsSentenceDto List 변환 - List batchedList = batchList.stream() - .map(batchInfo -> toSentenceDto(projectSeq, batchInfo)) - .filter(Objects::nonNull) // not null - .toList(); + // not null + List batchedList = new ArrayList<>(); + for (TtsSentenceBatchInfo batchInfo : batchList) { + TtsSentenceDto sentenceDto = toSentenceDto(projectSeq, batchInfo); + if (sentenceDto != null) { + batchedList.add(sentenceDto); + } + } return getSentenceList(projectSeq); } @@ -257,7 +259,8 @@ public TtsSentenceListDto getSentenceList(Long projectSeq) { () -> new EntityNotFoundException("Project not found with id: " + projectSeq)); // 2. Project 에 연관된 TtsSentence 리스트 조회 - List ttsSentenceList = ttsSentenceRepository.findAllByProjectOrderBySortOrder(project); + List ttsSentenceList = ttsSentenceRepository.findAllByProjectOrderBySortOrder( + project); // 3. TtsSentenceDto 리스트 변환 및 반환 return TtsSentenceListDto.of(ttsSentenceList); diff --git a/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java b/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java index ceca821e..0d65fb3c 100644 --- a/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java +++ b/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java @@ -1,6 +1,8 @@ package com.oreo.finalproject_5re5_be.tts.service.ttsSentenceService; +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; import com.oreo.finalproject_5re5_be.project.entity.Project; +import com.oreo.finalproject_5re5_be.project.exception.ProjectNotFoundException; import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import com.oreo.finalproject_5re5_be.tts.dto.request.TtsAttributeInfo; import com.oreo.finalproject_5re5_be.tts.dto.request.TtsSentenceRequest; @@ -9,6 +11,7 @@ import com.oreo.finalproject_5re5_be.tts.entity.TtsProgressStatusCode; import com.oreo.finalproject_5re5_be.tts.entity.TtsSentence; import com.oreo.finalproject_5re5_be.tts.entity.Voice; +import com.oreo.finalproject_5re5_be.tts.exception.VoiceEntityNotFound; import com.oreo.finalproject_5re5_be.tts.repository.TtsProgressStatusRepository; import com.oreo.finalproject_5re5_be.tts.repository.TtsSentenceRepository; import com.oreo.finalproject_5re5_be.tts.repository.VoiceRepository; @@ -138,7 +141,7 @@ void validateProjectSeqExist() { // when, then // 3. IllegalArgumentException 발생 - assertThrows(IllegalArgumentException.class, + assertThrows(ProjectNotFoundException.class, () -> ttsSentenceService.addSentence(projectSeq, ttsSentenceRequest)); } @@ -159,7 +162,7 @@ void validateVoiceSeqNotNull() { // when, then // 3. ConstraintViolationException 발생 - assertThrows(IllegalArgumentException.class, + assertThrows(ProjectNotFoundException.class, () -> ttsSentenceService.addSentence(projectSeq, nullVoiceSeqCreateRequest)); } @@ -187,7 +190,7 @@ void validateVoiceSeqExist() { // when, then // 3. IllegalArgumentException 발생 - assertThrows(IllegalArgumentException.class, + assertThrows(VoiceEntityNotFound.class, () -> ttsSentenceService.addSentence(projectSeq, ttsSentenceRequest)); } From fbab6d9414fd124063e43b14df16bee1db0c2012 Mon Sep 17 00:00:00 2001 From: oowtl Date: Sat, 7 Dec 2024 20:23:58 +0900 Subject: [PATCH 015/167] =?UTF-8?q?[feat]=20=ED=98=84=EC=9E=AC=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 현재 상태 저장 시 프론트의 입력에 따라서 정렬 --- .../tts/service/TtsSentenceServiceImpl.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java index 3c7514b4..68c934c1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java @@ -182,16 +182,11 @@ public TtsSentenceListDto batchSaveSentence(@Valid @NotNull Long projectSeq, // 2. TtsSentenceBatchRequest.sentenceList -> TtsSentenceDto List 변환 // 3. 정렬 및 정렬 순서 수정 - List batchList = alivedRequest.sortSentenceList(); - - // 4. TtsSentenceDto List 변환 - // not null - List batchedList = new ArrayList<>(); - for (TtsSentenceBatchInfo batchInfo : batchList) { - TtsSentenceDto sentenceDto = toSentenceDto(projectSeq, batchInfo); - if (sentenceDto != null) { - batchedList.add(sentenceDto); - } +// List batchList = alivedRequest.sortSentenceList(); + + // 4. 하나씩 처리 + for (TtsSentenceBatchInfo batchInfo : alivedRequest.getSentenceList()) { + toSentenceDto(projectSeq, batchInfo); } return getSentenceList(projectSeq); From 7a23358358f1c5b06a06edeedb7df06539c88144 Mon Sep 17 00:00:00 2001 From: oowtl Date: Sat, 7 Dec 2024 17:22:15 +0900 Subject: [PATCH 016/167] =?UTF-8?q?[feat]=20session=20=EC=9D=84=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=98=EC=97=AC=20=EA=B3=84=EC=A0=95=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=ED=99=95=EC=9D=B8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tts/controller/TtsController.java | 44 ++++++++++--------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java index 24bf59d4..33ddc1aa 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java @@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; @@ -135,8 +136,9 @@ public ResponseEntity constraintViolationExceptionHandler( public ResponseEntity> registerSentence( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody TtsSentenceRequest createRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + HttpSession session) { //회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 문장 생성 @@ -153,8 +155,9 @@ public ResponseEntity> updateSentence( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "TTS 문장 ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, @Parameter(description = "tts 문장 수정 요청 body") @Valid @RequestBody TtsSentenceRequest updateRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) @@ -174,12 +177,14 @@ public ResponseEntity> updateSentence( public ResponseEntity> batchSave( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody TtsSentenceBatchRequest batchRequest, - @SessionAttribute(value = "memberSeq") Long memberSeq) { + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) - ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, batchRequest.getSentenceList()); + ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, + batchRequest.getSentenceList()); // 문장 생성 및 수정 TtsSentenceListDto response = ttsSentenceService.batchSaveSentence(proSeq, @@ -222,9 +227,9 @@ public ResponseEntity> getSentenceList( public ResponseEntity> makeTts( @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq, @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, - @SessionAttribute(value = "memberSeq") Long memberSeq) { - + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) @@ -246,12 +251,11 @@ public ResponseEntity> makeTts( @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") @GetMapping("/sentence/{tsSeq}/maketts/multi") public ResponseEntity> makeTtsMuti( - @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq - ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq - , @SessionAttribute(value = "memberSeq") Long memberSeq - ) { - + @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq, + @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) @@ -261,13 +265,13 @@ public ResponseEntity> makeTtsMuti( TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); return ResponseEntity - .status(HttpStatus.CREATED) - .body( - new ResponseDto<>( - HttpStatus.CREATED.value(), - ttsMakeResult - ) - ); + .status(HttpStatus.CREATED) + .body( + new ResponseDto<>( + HttpStatus.CREATED.value(), + ttsMakeResult + ) + ); } @Operation(summary = "TTS 문장 삭제 요청") @@ -275,9 +279,9 @@ public ResponseEntity> makeTtsMuti( public ResponseEntity> deleteSentence( @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, @Parameter(description = "TTS 문장 ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, - @SessionAttribute(value = "memberSeq") Long memberSeq) { - + HttpSession session) { // 회원의 정보인지 확인 + Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 회원이 소유한 tts 문장인지 확인 From 5941cdc2135993daf46dfd9c3156ee3d5c3fe683 Mon Sep 17 00:00:00 2001 From: oowtl Date: Sat, 7 Dec 2024 19:00:27 +0900 Subject: [PATCH 017/167] =?UTF-8?q?[feat]=20=EC=97=90=EB=9F=AC=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ErrorCode.java | 11 +++++- .../exception/ProjectNotFoundException.java | 19 +++++++++ .../exception/ProjectMismatchException.java | 3 +- .../tts/exception/TtsSentenceNotFound.java | 19 +++++++++ .../tts/exception/VoiceEntityNotFound.java | 20 ++++++++++ .../tts/service/TtsSentenceServiceImpl.java | 39 ++++++++++--------- .../ttsSentenceService/TestAddSentence.java | 9 +++-- 7 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java index 7ceda041..d9fe1b03 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java @@ -35,7 +35,16 @@ public enum ErrorCode { ENTITY_NOT_FOUND(400, " Entity Not Found"), INTERNAL_SERVER_ERROR(500, "Server Error"), INVALID_TYPE_VALUE(400, " Invalid Type Value"), - HANDLE_ACCESS_DENIED(403, "Access is Denied"); + HANDLE_ACCESS_DENIED(403, "Access is Denied"), + + // 프로젝트 ERROR 처리 + PROJECT_NOT_FOUND_ERROR(404, "해당 프로젝트를 찾을 수 없습니다."), + + // TTS ERROR 처리 + PROJECT_MISMATCH_ERROR(400, "요청하신 프로젝트를 소유하고 있지 않습니다."), + VOICE_ENTITY_NOT_FOUND_ERROR(404, "해당 음성을 찾을 수 없습니다."), + TTS_SENTENCE_NOT_FOUND_ERROR(404, "해당 문장을 찾을 수 없습니다."); + private final String message; private final int status; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java new file mode 100644 index 00000000..0df640ed --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectNotFoundException.java @@ -0,0 +1,19 @@ +package com.oreo.finalproject_5re5_be.project.exception; + +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class ProjectNotFoundException extends EntityNotFoundException { + + public ProjectNotFoundException() { + super(ErrorCode.PROJECT_NOT_FOUND_ERROR.getMessage(), ErrorCode.PROJECT_NOT_FOUND_ERROR); + } + + public ProjectNotFoundException(String message) { + super(message, ErrorCode.PROJECT_NOT_FOUND_ERROR); + } + + public ProjectNotFoundException(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java index d7190ec9..9daf63bc 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/ProjectMismatchException.java @@ -1,11 +1,12 @@ package com.oreo.finalproject_5re5_be.tts.exception; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; import com.oreo.finalproject_5re5_be.global.exception.InValidValueException; public class ProjectMismatchException extends InValidValueException { public ProjectMismatchException() { - super(); + super(ErrorCode.PROJECT_MISMATCH_ERROR.getMessage(), ErrorCode.PROJECT_MISMATCH_ERROR); } public ProjectMismatchException(String message) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java new file mode 100644 index 00000000..16956046 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsSentenceNotFound.java @@ -0,0 +1,19 @@ +package com.oreo.finalproject_5re5_be.tts.exception; + +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class TtsSentenceNotFound extends EntityNotFoundException { + + public TtsSentenceNotFound() { + super(ErrorCode.TTS_SENTENCE_NOT_FOUND_ERROR.getMessage(), ErrorCode.TTS_SENTENCE_NOT_FOUND_ERROR); + } + + public TtsSentenceNotFound(String message) { + super(message, ErrorCode.TTS_SENTENCE_NOT_FOUND_ERROR); + } + + public TtsSentenceNotFound(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java new file mode 100644 index 00000000..869aba88 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/VoiceEntityNotFound.java @@ -0,0 +1,20 @@ +package com.oreo.finalproject_5re5_be.tts.exception; + +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class VoiceEntityNotFound extends EntityNotFoundException { + + public VoiceEntityNotFound() { + super(ErrorCode.VOICE_ENTITY_NOT_FOUND_ERROR.getMessage(), + ErrorCode.VOICE_ENTITY_NOT_FOUND_ERROR); + } + + public VoiceEntityNotFound(String message) { + super(message, ErrorCode.VOICE_ENTITY_NOT_FOUND_ERROR); + } + + public VoiceEntityNotFound(String message, ErrorCode errorCode) { + super(message, errorCode); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java index 060040f0..3c7514b4 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java @@ -3,6 +3,7 @@ import com.oreo.finalproject_5re5_be.global.constant.BatchProcessType; import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; import com.oreo.finalproject_5re5_be.project.entity.Project; +import com.oreo.finalproject_5re5_be.project.exception.ProjectNotFoundException; import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import com.oreo.finalproject_5re5_be.project.service.ProjectService; import com.oreo.finalproject_5re5_be.tts.dto.request.TtsAttributeInfo; @@ -16,13 +17,17 @@ import com.oreo.finalproject_5re5_be.tts.entity.TtsProgressStatusCode; import com.oreo.finalproject_5re5_be.tts.entity.TtsSentence; import com.oreo.finalproject_5re5_be.tts.entity.Voice; +import com.oreo.finalproject_5re5_be.tts.exception.InValidRequestException; import com.oreo.finalproject_5re5_be.tts.exception.ProjectMismatchException; import com.oreo.finalproject_5re5_be.tts.exception.TtsSentenceInValidInput; +import com.oreo.finalproject_5re5_be.tts.exception.TtsSentenceNotFound; +import com.oreo.finalproject_5re5_be.tts.exception.VoiceEntityNotFound; import com.oreo.finalproject_5re5_be.tts.repository.TtsProgressStatusRepository; import com.oreo.finalproject_5re5_be.tts.repository.TtsSentenceRepository; import com.oreo.finalproject_5re5_be.tts.repository.VoiceRepository; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import java.util.ArrayList; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -60,13 +65,12 @@ public TtsSentenceDto addSentence(@Valid @NotNull Long projectSeq, // 2.1 projectSeq 유효성 검증 : not null => @NotNull // 2.2. projectSeq : 조회 가능한 projectSeq (존재 여부) 검증 및 할당 Project project = projectRepository.findById(projectSeq) - .orElseThrow(() -> new IllegalArgumentException("projectSeq is invalid")); + .orElseThrow(ProjectNotFoundException::new); // 3.1 TtsSentenceRequest.voiceSeq 유효성 검증 : not null => @NotNull // 3.2 voiceSeq : 조회 가능한 voiceSeq (존재 여부) 검증 및 할당 Voice voice = voiceRepository.findById(createRequest.getVoiceSeq()) - .orElseThrow(() -> new IllegalArgumentException("voiceSeq is invalid")); - + .orElseThrow(VoiceEntityNotFound::new); // 4. TtsSentenceRequest -> TtsSentence 변환 TtsAttributeInfo attribute = createRequest.getAttribute(); @@ -114,26 +118,22 @@ public TtsSentenceDto updateSentence(@Valid @NotNull Long projectSeq, @Valid @NotNull Long tsSeq, @Valid TtsSentenceRequest updateRequest) { // 1. TtsSentenceRequest 유효성 검증 if (updateRequest == null) { - throw new IllegalArgumentException("Update request cannot be null"); + throw new InValidRequestException(); } // 2. DB 유효성 검증 // 2.1 projectSeq 조회 가능한 projectSeq (존재 여부) 검증 및 할당 Project project = projectRepository.findById(projectSeq) - .orElseThrow( - () -> new EntityNotFoundException("Project not found with id: " + projectSeq)); + .orElseThrow(ProjectNotFoundException::new); // 2.2 voiceSeq 조회 가능한 voiceSeq (존재 여부) 검증 및 할당 Voice voice = voiceRepository.findById(updateRequest.getVoiceSeq()) - .orElseThrow(() -> new EntityNotFoundException( - "Voice not found with id: " + updateRequest.getVoiceSeq())); - + .orElseThrow(VoiceEntityNotFound::new); // 3. TtsSentenceRequest -> TtsSentence 변환 // 3.1 TtsSentence 엔티티 조회 TtsSentence sentence = ttsSentenceRepository.findById(tsSeq) - .orElseThrow( - () -> new EntityNotFoundException("TtsSentence not found with id: " + tsSeq)); + .orElseThrow(TtsSentenceNotFound::new); // 3.2 TtsSentence 엔티티 수정 TtsSentence updateSentence = sentence.toBuilder() @@ -167,13 +167,11 @@ public TtsSentenceListDto batchSaveSentence(@Valid @NotNull Long projectSeq, @Valid TtsSentenceBatchRequest batchRequest) { // 10개의 TTSSentence 가 있다고 가정했을 때 5개의 TTSSentence 를 수정하고 전체 정렬을 했을 때, 순서를 보장하기 위해서는? - // 1. DELETE 를 먼저 삭제한다. (삭제할 것들은 삭제 후에 정렬) batchRequest.getSentenceList().stream() .filter(sentence -> sentence.getBatchProcessType() == BatchProcessType.DELETE) .forEach(sentence -> deleteSentence(projectSeq, sentence.getSentence().getTsSeq())); - List alivedList = batchRequest.getSentenceList().stream() .filter(sentence -> sentence.getBatchProcessType() != BatchProcessType.DELETE) .toList(); @@ -187,10 +185,14 @@ public TtsSentenceListDto batchSaveSentence(@Valid @NotNull Long projectSeq, List batchList = alivedRequest.sortSentenceList(); // 4. TtsSentenceDto List 변환 - List batchedList = batchList.stream() - .map(batchInfo -> toSentenceDto(projectSeq, batchInfo)) - .filter(Objects::nonNull) // not null - .toList(); + // not null + List batchedList = new ArrayList<>(); + for (TtsSentenceBatchInfo batchInfo : batchList) { + TtsSentenceDto sentenceDto = toSentenceDto(projectSeq, batchInfo); + if (sentenceDto != null) { + batchedList.add(sentenceDto); + } + } return getSentenceList(projectSeq); } @@ -257,7 +259,8 @@ public TtsSentenceListDto getSentenceList(Long projectSeq) { () -> new EntityNotFoundException("Project not found with id: " + projectSeq)); // 2. Project 에 연관된 TtsSentence 리스트 조회 - List ttsSentenceList = ttsSentenceRepository.findAllByProjectOrderBySortOrder(project); + List ttsSentenceList = ttsSentenceRepository.findAllByProjectOrderBySortOrder( + project); // 3. TtsSentenceDto 리스트 변환 및 반환 return TtsSentenceListDto.of(ttsSentenceList); diff --git a/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java b/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java index ceca821e..0d65fb3c 100644 --- a/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java +++ b/src/test/java/com/oreo/finalproject_5re5_be/tts/service/ttsSentenceService/TestAddSentence.java @@ -1,6 +1,8 @@ package com.oreo.finalproject_5re5_be.tts.service.ttsSentenceService; +import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; import com.oreo.finalproject_5re5_be.project.entity.Project; +import com.oreo.finalproject_5re5_be.project.exception.ProjectNotFoundException; import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import com.oreo.finalproject_5re5_be.tts.dto.request.TtsAttributeInfo; import com.oreo.finalproject_5re5_be.tts.dto.request.TtsSentenceRequest; @@ -9,6 +11,7 @@ import com.oreo.finalproject_5re5_be.tts.entity.TtsProgressStatusCode; import com.oreo.finalproject_5re5_be.tts.entity.TtsSentence; import com.oreo.finalproject_5re5_be.tts.entity.Voice; +import com.oreo.finalproject_5re5_be.tts.exception.VoiceEntityNotFound; import com.oreo.finalproject_5re5_be.tts.repository.TtsProgressStatusRepository; import com.oreo.finalproject_5re5_be.tts.repository.TtsSentenceRepository; import com.oreo.finalproject_5re5_be.tts.repository.VoiceRepository; @@ -138,7 +141,7 @@ void validateProjectSeqExist() { // when, then // 3. IllegalArgumentException 발생 - assertThrows(IllegalArgumentException.class, + assertThrows(ProjectNotFoundException.class, () -> ttsSentenceService.addSentence(projectSeq, ttsSentenceRequest)); } @@ -159,7 +162,7 @@ void validateVoiceSeqNotNull() { // when, then // 3. ConstraintViolationException 발생 - assertThrows(IllegalArgumentException.class, + assertThrows(ProjectNotFoundException.class, () -> ttsSentenceService.addSentence(projectSeq, nullVoiceSeqCreateRequest)); } @@ -187,7 +190,7 @@ void validateVoiceSeqExist() { // when, then // 3. IllegalArgumentException 발생 - assertThrows(IllegalArgumentException.class, + assertThrows(VoiceEntityNotFound.class, () -> ttsSentenceService.addSentence(projectSeq, ttsSentenceRequest)); } From 64852823bfb0d83ff08310456e29fad2bff68959 Mon Sep 17 00:00:00 2001 From: oowtl Date: Sat, 7 Dec 2024 20:23:58 +0900 Subject: [PATCH 018/167] =?UTF-8?q?[feat]=20=ED=98=84=EC=9E=AC=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 현재 상태 저장 시 프론트의 입력에 따라서 정렬 --- .../tts/service/TtsSentenceServiceImpl.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java index 3c7514b4..68c934c1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java @@ -182,16 +182,11 @@ public TtsSentenceListDto batchSaveSentence(@Valid @NotNull Long projectSeq, // 2. TtsSentenceBatchRequest.sentenceList -> TtsSentenceDto List 변환 // 3. 정렬 및 정렬 순서 수정 - List batchList = alivedRequest.sortSentenceList(); - - // 4. TtsSentenceDto List 변환 - // not null - List batchedList = new ArrayList<>(); - for (TtsSentenceBatchInfo batchInfo : batchList) { - TtsSentenceDto sentenceDto = toSentenceDto(projectSeq, batchInfo); - if (sentenceDto != null) { - batchedList.add(sentenceDto); - } +// List batchList = alivedRequest.sortSentenceList(); + + // 4. 하나씩 처리 + for (TtsSentenceBatchInfo batchInfo : alivedRequest.getSentenceList()) { + toSentenceDto(projectSeq, batchInfo); } return getSentenceList(projectSeq); From 8b7d3833f4ae022c44f3dc09aa21a8e561ba66c7 Mon Sep 17 00:00:00 2001 From: K-KY Date: Sat, 7 Dec 2024 21:32:49 +0900 Subject: [PATCH 019/167] =?UTF-8?q?[Fix]=20:=20@AuthenticationPrincipal=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/LoginAuthenticationSuccessHandler.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java index 47b66f33..6ab04076 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.member.entity.Member; -import jakarta.servlet.ServletException; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -25,8 +24,9 @@ public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) throws IOException, ServletException { - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - request : {} -> {} -> {}", request.toString(), response.toString(), authentication.toString()); + Authentication authentication) throws IOException { + log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - request : {} -> {} -> {}", + request.toString(), response.toString(), authentication.toString()); // 로그인 성공시 유저 정보 반환 // 사용자 정보 추출 Object principal = authentication.getPrincipal(); @@ -66,8 +66,6 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo log.info("memberSeq = {}", memberSeq); log.info("memberId = {}", memberId); - // 기존 세션 삭제 - request.getSession().invalidate(); // 세션 조회 HttpSession session = request.getSession(true); @@ -86,14 +84,14 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // JSON으로 응답 response.setContentType("application/json;charset=UTF-8"); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - response : {} ", response.toString()); + log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - response : {} ", response); new ObjectMapper().writeValue(response.getWriter(), memberInfo); } // 쿠키 등록 // 만약 쿠키 체크가 rememberMe로 되어 있다고 가정. 이 부분 추후에 프론트랑 얘기해야함 private void handleCookie(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) throws IOException { + Authentication authentication) { log.info("[LoginAuthenticationSuccessHandler] handleCookie - request : {} -> {} -> {}", request.toString(), response.toString(), authentication.toString()); // Authentication에서 회원 아이디 조회 String memberId = authentication.getName(); @@ -113,7 +111,7 @@ private void handleCookie(HttpServletRequest request, HttpServletResponse respon response.setHeader("Set-Cookie", String.format("%s=%s; Path=/; HttpOnly; Secure; SameSite=None", cookie.getName(), cookie.getValue())); // 1일 간 유지 - cookie.setMaxAge(60 * 60 * 24 * 1); + cookie.setMaxAge(60 * 60 * 24); log.info("[LoginAuthenticationSuccessHandler] handleCookie - cookie2 : {} ", cookie); // 쿠키 등록 response.addCookie(cookie); From e4721b7c6d1b8d2598209a43b27e6090dc79b027 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Sat, 7 Dec 2024 23:05:04 +0900 Subject: [PATCH 020/167] =?UTF-8?q?[feat]=20concatRowTabController?= =?UTF-8?q?=EC=97=90=20=EC=93=B0=EC=9D=B4=EB=8A=94=20=EC=83=88=EB=A1=9C?= =?UTF-8?q?=EC=9A=B4=20Service=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/ConcatRowTabService.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java new file mode 100644 index 00000000..0faf0e05 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java @@ -0,0 +1,39 @@ +package com.oreo.finalproject_5re5_be.concat.service; + +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatUpdateRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.TabRowUpdateRequestDto; +import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ConcatRowTabService { + + private final ConcatTabService concatTabService; + private final ConcatRowService concatRowService; + private final BgmFileService bgmFileService; + private final BgmFileRepository bgmFileRepository; + + @Transactional + public boolean saveTabAndRows(TabRowUpdateRequestDto dto, Long memberSeq) { + // 1. ConcatTab 업데이트 + ConcatUpdateRequestDto concatTabs = dto.getConcatTab(); + boolean updateConcatTab = concatTabService.updateConcatTab(concatTabs, memberSeq); + + // 2. ConcatRow 업데이트 + ConcatRowSaveRequestDto concatRows = dto.getConcatRows(); + boolean updateConcatRows = concatRowService.updateConcatRows(concatRows); + + // 3. BgmFile 저장 + List bgmFiles = bgmFileService.getBgmFilesByTabSeq(concatTabs.getTabId()); + bgmFileRepository.saveAll(bgmFiles); + + return updateConcatTab && updateConcatRows; + } +} From feb5500fd0462ae48bcf19a7a8e942f98cd94a5f Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Sat, 7 Dec 2024 23:05:58 +0900 Subject: [PATCH 021/167] =?UTF-8?q?[feat]=20bgmFile=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EC=A0=80=EC=9E=A5=20=EB=AA=BB=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/concat/service/ConcatTabService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index 48fedf0d..57f57d2c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -124,7 +124,6 @@ public boolean updateConcatTab(ConcatUpdateRequestDto concatUpdateRequestDto, Lo .project(existingTab.getProject()) // 기존 값 유지 .frontSilence(concatUpdateRequestDto.getFrontSilence()) // 업데이트된 값 .status(concatUpdateRequestDto.getStatus()) // 업데이트된 값 - .bgmFiles(bgmFiles) // 새로운 BgmFile 리스트 .build(); concatTabRepository.save(updatedTab); From b58577c0b4bea8341dae4f5bbd33b185a06381b9 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Sat, 7 Dec 2024 23:06:44 +0900 Subject: [PATCH 022/167] =?UTF-8?q?[feat]=20ConcatTab=EA=B3=BC=20ConcatRow?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=98=EA=B3=A0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=A0=20=EB=95=8C=20bgmFile=EC=9D=80=20=EB=94=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatRowTabController.java | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java index f0951ae7..79e81b3a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java @@ -4,9 +4,8 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.*; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.dto.response.TabRowResponseDto; -import com.oreo.finalproject_5re5_be.concat.service.AudioFileService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatRowService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatTabService; +import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import com.oreo.finalproject_5re5_be.concat.service.*; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import io.swagger.v3.oas.annotations.Operation; @@ -28,6 +27,8 @@ public class ConcatRowTabController { private final ConcatRowService concatRowService; private final ConcatTabService concatTabService; private final AudioFileService audioFileService; + private final BgmFileService bgmFileservice; + private final ConcatRowTabService concatRowTabService; //탭 로우 조회 //탭 로우 저장 @@ -40,36 +41,14 @@ public class ConcatRowTabController { public ResponseEntity> saveRowAndTab( @RequestBody TabRowUpdateRequestDto dto, @AuthenticationPrincipal CustomUserDetails customUserDetails) { - ConcatRowSaveRequestDto concatRows = dto.getConcatRows(); - ConcatUpdateRequestDto concatTabs = dto.getConcatTab(); - boolean updateConcatTab = concatTabService.updateConcatTab(concatTabs, customUserDetails.getMember().getSeq()); - boolean updateConcatRows = concatRowService.updateConcatRows(concatRows); - return new ResponseDto<>(HttpStatus.OK.value(), updateConcatTab && updateConcatRows).toResponseEntity(); - + try { + boolean result = concatRowTabService.saveTabAndRows(dto, customUserDetails.getMember().getSeq()); + return new ResponseDto<>(HttpStatus.OK.value(), result).toResponseEntity(); + } catch (Exception e) { + return new ResponseDto<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), false).toResponseEntity(); + } } -// @Operation( -// summary = "ConcatRow, ConcatTab을 저장합니다.", -// description = "" -// ) -// @PostMapping("save") -// public ResponseEntity> saveRowAndTab( -// @RequestBody TabRowUpdateRequestDto dto, -// @AuthenticationPrincipal CustomUserDetails customUserDetails) { -// ConcatUpdateRequestDto concatUpdateRequestDto = dto.getConcatTab(); -// Long memberSeq = customUserDetails.getMember().getSeq(); -// List rowAudioFiles = dto.getAudioFiles(); -// boolean updateTab = false; -// boolean updateRow = false; -// if (concatUpdateRequestDto != null) { -// updateTab = concatTabService.updateConcatTab(concatUpdateRequestDto, -// memberSeq); -// updateRow = concatRowService.updateConcatRows(rowAudioFiles, concatUpdateRequestDto.getTabId()); -// } -// -// return new ResponseDto<>(HttpStatus.OK.value(), updateTab && updateRow).toResponseEntity(); -// } -// @Operation( summary = "ConcatRow, ConcatTab을 조회합니다.", @@ -79,12 +58,38 @@ public ResponseEntity> saveRowAndTab( public ResponseEntity> readRowAndTab( @RequestParam Long projectSeq, @AuthenticationPrincipal CustomUserDetails customUserDetails) { + + // Tab setting ConcatTabResponseDto concatTabResponseDto = concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq()); + // Tabseq로 bgmFile 리스트 불러오기 + List bgmFiles = bgmFileservice.getBgmFilesByTabSeq(concatTabResponseDto.getTabId()); + + // BgmFile 리스트를 OriginAudioRequest 형태로 변환 + List bgmFileList = bgmFiles.stream() + .map(bgm -> OriginAudioRequest.builder() + .seq(bgm.getBgmFileSeq()) + .audioUrl(bgm.getAudioUrl()) + .fileName(bgm.getFileName()) + .fileSize(bgm.getFileSize()) + .fileLength(bgm.getFileLength()) + .extension(bgm.getExtension()) + .build()) + .toList(); + + // ConcatTabResponseDto에 bgmFileList 추가 + concatTabResponseDto = ConcatTabResponseDto.builder() + .tabId(concatTabResponseDto.getTabId()) + .frontSilence(concatTabResponseDto.getFrontSilence()) + .status(concatTabResponseDto.getStatus()) + .bgmFileList(bgmFileList) // BgmFile 리스트 추가 + .build(); + + // Row setting + // ConcatRow와 AudioFile 리스트 조회 List audioFiles = audioFileService.getAudioFilesByProjectAndStatusTrue(projectSeq); - List concatRowRequests = audioFiles.stream().map(x -> ConcatRowRequest.builder() .originAudioRequest(OriginAudioRequest.builder() .seq(x.getAudioFileSeq()) @@ -108,4 +113,3 @@ public ResponseEntity> readRowAndTab( } } - From e29e511879fee44c69251de282fb24731db8239f Mon Sep 17 00:00:00 2001 From: oowtl Date: Sun, 8 Dec 2024 00:09:56 +0900 Subject: [PATCH 023/167] =?UTF-8?q?[fix]=20tts=20make=20=EB=B2=94=EC=9C=84?= =?UTF-8?q?=20=EA=B0=92=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ErrorCode.java | 18 ++++++++++++++- .../tts/client/AudioConfigGenerator.java | 23 +++++++++++++++---- .../tts/exception/TtsMakeException.java | 8 +++++++ .../TtsMakeInvalidParamException.java | 22 ++++++++++++++++++ 4 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java index 7ceda041..c0d71d27 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java @@ -35,7 +35,23 @@ public enum ErrorCode { ENTITY_NOT_FOUND(400, " Entity Not Found"), INTERNAL_SERVER_ERROR(500, "Server Error"), INVALID_TYPE_VALUE(400, " Invalid Type Value"), - HANDLE_ACCESS_DENIED(403, "Access is Denied"); + HANDLE_ACCESS_DENIED(403, "Access is Denied"), + + // 프로젝트 ERROR 처리 + PROJECT_NOT_FOUND_ERROR(404, "해당 프로젝트를 찾을 수 없습니다."), + + // TTS ERROR 처리 + PROJECT_MISMATCH_ERROR(400, "요청하신 프로젝트를 소유하고 있지 않습니다."), + VOICE_ENTITY_NOT_FOUND_ERROR(404, "해당 음성을 찾을 수 없습니다."), + TTS_SENTENCE_NOT_FOUND_ERROR(404, "해당 문장을 찾을 수 없습니다."), + + // TTS 생성 ERROR 처리 + TTS_MAKE_FAILED_ERROR(500, "TTS 생성에 실패했습니다."), + TTS_MAKE_INVALID_INPUT_VALUE_ERROR(400, "TTS 생성 입력값이 올바르지 않습니다."), + TTS_MAKE_INVALID_SPEED(400, "허용되지 않는 TTS 속도입니다."), + TTS_MAKE_INVALID_PITCH(400, "허용되지 않는 TTS 음높이입니다."), + TTS_MAKE_INVALID_VOLUME(400, "허용되지 않는 TTS 음량입니다."); + private final String message; private final int status; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java index ebed83df..01cc2625 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java @@ -2,6 +2,8 @@ import com.google.cloud.texttospeech.v1.AudioConfig; import com.google.cloud.texttospeech.v1.AudioEncoding; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; +import com.oreo.finalproject_5re5_be.tts.exception.TtsMakeInvalidParamException; public class AudioConfigGenerator { // Google TTS AudioConfig 정책 @@ -24,9 +26,7 @@ public static AudioConfig generate() { public static AudioConfig generate(double speed, double pitch, double volume) { // 1. 검증 통과 못하면 예외 던지기 - if( !vaildSpeed(speed) || !validPitch(pitch) || !validVolume(volume) ) { - throw new IllegalArgumentException("잘못된 파라미터 값 입니다."); - } + checkParams(speed, pitch, volume); // 2. 객체 생성 return AudioConfig.newBuilder() @@ -40,12 +40,12 @@ public static AudioConfig generate(double speed, double pitch, double volume) { // 음성 속도 값 검증 private static boolean vaildSpeed(double speed) { - return speed > MIN_SPEED && speed < MAX_SPEED; + return speed >= MIN_SPEED && speed <= MAX_SPEED; } // 피치 값 검증 private static boolean validPitch(double pitch) { - return pitch > MIN_PITCH && pitch < MAX_PITCH; + return pitch >= MIN_PITCH && pitch <= MAX_PITCH; } // 볼륨 값 검증 @@ -53,4 +53,17 @@ private static boolean validVolume(double volume) { return volume > MIN_VOLUME && volume < MAX_VOLUME ; } + + private static void checkParams(double speed, double pitch, double volume) { + if( !vaildSpeed(speed)) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_SPEED); + } + + if( !validPitch(pitch)) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_FAILED_ERROR); + } + if(!validVolume(volume) ) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_VOLUME); + } + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java index c99a9f67..cec7e0d0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java @@ -12,4 +12,12 @@ public TtsMakeException() { public TtsMakeException(String message) { super(message, ErrorCode.INTERNAL_SERVER_ERROR); } + + public TtsMakeException(String message, ErrorCode errorCode) { + super(message, errorCode); + } + + public TtsMakeException(ErrorCode errorCode) { + super(errorCode.getMessage(), errorCode); + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java new file mode 100644 index 00000000..9f67a116 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java @@ -0,0 +1,22 @@ +package com.oreo.finalproject_5re5_be.tts.exception; + +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class TtsMakeInvalidParamException extends TtsMakeException { + + public TtsMakeInvalidParamException() { + super(ErrorCode.TTS_MAKE_INVALID_INPUT_VALUE_ERROR.getMessage(), ErrorCode.TTS_MAKE_INVALID_INPUT_VALUE_ERROR); + } + + public TtsMakeInvalidParamException(String message) { + super(message, ErrorCode.TTS_MAKE_INVALID_INPUT_VALUE_ERROR); + } + + public TtsMakeInvalidParamException(String message, ErrorCode errorCode) { + super(message, errorCode); + } + + public TtsMakeInvalidParamException(ErrorCode errorCode) { + super(errorCode); + } +} From d40a668775130b05dfe4199eb15315899e1aa13e Mon Sep 17 00:00:00 2001 From: oowtl Date: Sun, 8 Dec 2024 00:09:56 +0900 Subject: [PATCH 024/167] =?UTF-8?q?[fix]=20tts=20make=20=EB=B2=94=EC=9C=84?= =?UTF-8?q?=20=EA=B0=92=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/ErrorCode.java | 9 +++++++- .../tts/client/AudioConfigGenerator.java | 23 +++++++++++++++---- .../tts/exception/TtsMakeException.java | 8 +++++++ .../TtsMakeInvalidParamException.java | 22 ++++++++++++++++++ 4 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java index d9fe1b03..c0d71d27 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java @@ -43,7 +43,14 @@ public enum ErrorCode { // TTS ERROR 처리 PROJECT_MISMATCH_ERROR(400, "요청하신 프로젝트를 소유하고 있지 않습니다."), VOICE_ENTITY_NOT_FOUND_ERROR(404, "해당 음성을 찾을 수 없습니다."), - TTS_SENTENCE_NOT_FOUND_ERROR(404, "해당 문장을 찾을 수 없습니다."); + TTS_SENTENCE_NOT_FOUND_ERROR(404, "해당 문장을 찾을 수 없습니다."), + + // TTS 생성 ERROR 처리 + TTS_MAKE_FAILED_ERROR(500, "TTS 생성에 실패했습니다."), + TTS_MAKE_INVALID_INPUT_VALUE_ERROR(400, "TTS 생성 입력값이 올바르지 않습니다."), + TTS_MAKE_INVALID_SPEED(400, "허용되지 않는 TTS 속도입니다."), + TTS_MAKE_INVALID_PITCH(400, "허용되지 않는 TTS 음높이입니다."), + TTS_MAKE_INVALID_VOLUME(400, "허용되지 않는 TTS 음량입니다."); private final String message; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java index ebed83df..01cc2625 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java @@ -2,6 +2,8 @@ import com.google.cloud.texttospeech.v1.AudioConfig; import com.google.cloud.texttospeech.v1.AudioEncoding; +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; +import com.oreo.finalproject_5re5_be.tts.exception.TtsMakeInvalidParamException; public class AudioConfigGenerator { // Google TTS AudioConfig 정책 @@ -24,9 +26,7 @@ public static AudioConfig generate() { public static AudioConfig generate(double speed, double pitch, double volume) { // 1. 검증 통과 못하면 예외 던지기 - if( !vaildSpeed(speed) || !validPitch(pitch) || !validVolume(volume) ) { - throw new IllegalArgumentException("잘못된 파라미터 값 입니다."); - } + checkParams(speed, pitch, volume); // 2. 객체 생성 return AudioConfig.newBuilder() @@ -40,12 +40,12 @@ public static AudioConfig generate(double speed, double pitch, double volume) { // 음성 속도 값 검증 private static boolean vaildSpeed(double speed) { - return speed > MIN_SPEED && speed < MAX_SPEED; + return speed >= MIN_SPEED && speed <= MAX_SPEED; } // 피치 값 검증 private static boolean validPitch(double pitch) { - return pitch > MIN_PITCH && pitch < MAX_PITCH; + return pitch >= MIN_PITCH && pitch <= MAX_PITCH; } // 볼륨 값 검증 @@ -53,4 +53,17 @@ private static boolean validVolume(double volume) { return volume > MIN_VOLUME && volume < MAX_VOLUME ; } + + private static void checkParams(double speed, double pitch, double volume) { + if( !vaildSpeed(speed)) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_SPEED); + } + + if( !validPitch(pitch)) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_FAILED_ERROR); + } + if(!validVolume(volume) ) { + throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_VOLUME); + } + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java index c99a9f67..cec7e0d0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeException.java @@ -12,4 +12,12 @@ public TtsMakeException() { public TtsMakeException(String message) { super(message, ErrorCode.INTERNAL_SERVER_ERROR); } + + public TtsMakeException(String message, ErrorCode errorCode) { + super(message, errorCode); + } + + public TtsMakeException(ErrorCode errorCode) { + super(errorCode.getMessage(), errorCode); + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java new file mode 100644 index 00000000..9f67a116 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/exception/TtsMakeInvalidParamException.java @@ -0,0 +1,22 @@ +package com.oreo.finalproject_5re5_be.tts.exception; + +import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; + +public class TtsMakeInvalidParamException extends TtsMakeException { + + public TtsMakeInvalidParamException() { + super(ErrorCode.TTS_MAKE_INVALID_INPUT_VALUE_ERROR.getMessage(), ErrorCode.TTS_MAKE_INVALID_INPUT_VALUE_ERROR); + } + + public TtsMakeInvalidParamException(String message) { + super(message, ErrorCode.TTS_MAKE_INVALID_INPUT_VALUE_ERROR); + } + + public TtsMakeInvalidParamException(String message, ErrorCode errorCode) { + super(message, errorCode); + } + + public TtsMakeInvalidParamException(ErrorCode errorCode) { + super(errorCode); + } +} From e5fa42807cddda2347f8245492c40065f715d9e0 Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 16:38:11 +0900 Subject: [PATCH 025/167] =?UTF-8?q?[Fix]=20:=20@AuthenticationPrincipal=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/config/LoginAuthenticationSuccessHandler.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java index 47b66f33..d947da09 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java @@ -66,9 +66,6 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo log.info("memberSeq = {}", memberSeq); log.info("memberId = {}", memberId); - // 기존 세션 삭제 - request.getSession().invalidate(); - // 세션 조회 HttpSession session = request.getSession(true); log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session = : {} ", session.toString()); From 51e1c2fde155357fa86b23e9166b44a9e9c4f751 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Sun, 8 Dec 2024 18:24:21 +0900 Subject: [PATCH 026/167] =?UTF-8?q?[fix]=20bgmfile=20null=EB=95=8C?= =?UTF-8?q?=EB=AC=B8=EC=97=90=20=EB=B2=84=EA=B7=B8=20=EB=82=9C=EA=B1=B0=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatRowTabController.java | 1 + .../concat/service/ConcatRowTabService.java | 20 ++++++++++++++++--- .../concat/service/ConcatTabService.java | 15 +++++++------- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java index 79e81b3a..9aee4f65 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java @@ -45,6 +45,7 @@ public ResponseEntity> saveRowAndTab( boolean result = concatRowTabService.saveTabAndRows(dto, customUserDetails.getMember().getSeq()); return new ResponseDto<>(HttpStatus.OK.value(), result).toResponseEntity(); } catch (Exception e) { + e.printStackTrace(); return new ResponseDto<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), false).toResponseEntity(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java index 0faf0e05..49cb58ad 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java @@ -4,6 +4,7 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatUpdateRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.request.TabRowUpdateRequestDto; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -26,13 +27,26 @@ public boolean saveTabAndRows(TabRowUpdateRequestDto dto, Long memberSeq) { ConcatUpdateRequestDto concatTabs = dto.getConcatTab(); boolean updateConcatTab = concatTabService.updateConcatTab(concatTabs, memberSeq); - // 2. ConcatRow 업데이트 + // 2. ConcatRow 업데이트 (말만 업데이트고 사실 생성임) ConcatRowSaveRequestDto concatRows = dto.getConcatRows(); boolean updateConcatRows = concatRowService.updateConcatRows(concatRows); // 3. BgmFile 저장 - List bgmFiles = bgmFileService.getBgmFilesByTabSeq(concatTabs.getTabId()); - bgmFileRepository.saveAll(bgmFiles); + ConcatTab concatTab = concatTabService.getConcatTabBySeq(concatTabs.getTabId()); // ConcatTab 조회 + + List bgmFiles = concatTabs.getBgmFileList().stream() + .map(bgmRequest -> BgmFile.builder() + .concatTab(concatTab) + .audioUrl(bgmRequest.getAudioUrl()) + .fileName(bgmRequest.getFileName()) + .fileSize(bgmRequest.getFileSize()) + .fileLength(bgmRequest.getFileLength()) + .extension(bgmRequest.getExtension()) + .build()) + .toList(); + + bgmFileRepository.saveAll(bgmFiles); // DB에 저장 + return updateConcatTab && updateConcatRows; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index 57f57d2c..31b896c9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -112,12 +112,6 @@ public boolean updateConcatTab(ConcatUpdateRequestDto concatUpdateRequestDto, Lo Project project = projectRepository.findById(concatUpdateRequestDto.getTabId()) .orElseThrow(() -> new NoSuchElementException("수정할 프로젝트가 없습니다.")); - // Dto의 originAudioRequests를 통해 bgmFiles 리스트 생성 - List bgmFiles = concatUpdateRequestDto.getBgmFileList().stream() - .map(request -> bgmFileRepository.findById(request.getSeq()) - .orElseThrow(() -> new NoSuchElementException("BgmFile not found with ID: " + request.getSeq()))) - .toList(); - // Builder로 새로운 ConcatTab 생성 ConcatTab updatedTab = ConcatTab.builder() .projectId(existingTab.getProjectId()) // 기존 값 유지 @@ -156,4 +150,11 @@ public boolean updateBgmAudioFiles(Long tabSeq, List bgmFileSeqs) { concatTabRepository.save(concatTab); return true; } -} + + // + @Transactional + public ConcatTab getConcatTabBySeq(Long tabSeq) { + return concatTabRepository.findById(tabSeq) + .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + tabSeq)); + } +} \ No newline at end of file From f11a64c70b403fe9fa7833764d69dff7f8f93e6d Mon Sep 17 00:00:00 2001 From: oowtl Date: Sun, 8 Dec 2024 20:08:49 +0900 Subject: [PATCH 027/167] =?UTF-8?q?[fix]=20=EB=B3=91=ED=95=A9=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/config/LoginAuthenticationSuccessHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java index 6ab04076..2198dd8c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java @@ -66,7 +66,6 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo log.info("memberSeq = {}", memberSeq); log.info("memberId = {}", memberId); - // 세션 조회 HttpSession session = request.getSession(true); log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session = : {} ", session.toString()); From 0c9723436fd5c80f8eed0777759a6dae0fc6e1ef Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sun, 8 Dec 2024 20:31:43 +0900 Subject: [PATCH 028/167] =?UTF-8?q?[fix]=20prometheus=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++++ src/main/resources/application.properties | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/build.gradle b/build.gradle index 40403242..618c42c3 100644 --- a/build.gradle +++ b/build.gradle @@ -73,6 +73,8 @@ dependencies { // MONITORING implementation 'org.springframework.boot:spring-boot-starter-actuator' + // Prometheus + implementation 'io.micrometer:micrometer-registry-prometheus' // LOGGER // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic @@ -106,6 +108,8 @@ dependencies { // https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 implementation 'org.apache.httpcomponents.client5:httpclient5:5.4.1' implementation 'org.apache.httpcomponents:httpmime:4.5.13' + + } test { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8ceda086..ef7d4158 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -39,3 +39,16 @@ server.servlet.session.cookie.secure=true server.servlet.session.cookie.path=/ server.servlet.session.tracking-modes=cookie + +# Actuator ?? ?? +management.server.port=9200 + +# Actuator health endpoint ???? +management.endpoint.health.enabled=false + +# Actuator ?? ?? +management.endpoints.web.exposure.include=* +management.endpoints.web.exposure.exclude=env,beans,info,configprops + +# Tomcat MBean ????? ??? +server.tomcat.mbeanregistry.enabled=true \ No newline at end of file From adbe8568b6cfdaff81a1541a11bd739283b04230 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sun, 8 Dec 2024 21:15:24 +0900 Subject: [PATCH 029/167] =?UTF-8?q?[fix]=20actuator=20=EC=84=9C=EB=B2=84?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=20=EC=A0=91=EC=86=8D=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=20=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ef7d4158..168967ae 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -42,6 +42,7 @@ server.servlet.session.tracking-modes=cookie # Actuator ?? ?? management.server.port=9200 +management.server.address=0.0.0.0 # Actuator health endpoint ???? management.endpoint.health.enabled=false From f8fa01e945b88d979171ffbb78462a962c242da3 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sun, 8 Dec 2024 21:51:45 +0900 Subject: [PATCH 030/167] =?UTF-8?q?[fix]=20membertest=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=9D=98=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B2=84=EC=A0=84=20=EC=97=85=EA=B7=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +- .../service/MemberServiceImplTestByMock.java | 46 ++++++------------- 2 files changed, 15 insertions(+), 36 deletions(-) diff --git a/build.gradle b/build.gradle index 618c42c3..c63d6384 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.5' + id 'org.springframework.boot' version '3.3.6' id 'io.spring.dependency-management' version '1.1.6' } @@ -24,6 +24,7 @@ repositories { } dependencies { + implementation 'org.springframework:spring-context:6.1.15' implementation 'org.springframework.boot:spring-boot-starter-web' // DEVELOP @@ -115,5 +116,3 @@ dependencies { test { useJUnitPlatform() } - - diff --git a/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java b/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java index bf5a73ec..5575096e 100644 --- a/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java +++ b/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java @@ -1,47 +1,18 @@ package com.oreo.finalproject_5re5_be.member.service; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - +import com.oreo.finalproject_5re5_be.code.entity.Code; +import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRegisterRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRemoveRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermCheckOrNotRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberUpdateRequest; import com.oreo.finalproject_5re5_be.member.dto.response.MemberReadResponse; -import com.oreo.finalproject_5re5_be.code.entity.Code; -import com.oreo.finalproject_5re5_be.member.entity.Member; -import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; -import com.oreo.finalproject_5re5_be.member.entity.MemberConnectionHistory; -import com.oreo.finalproject_5re5_be.member.entity.MemberDelete; -import com.oreo.finalproject_5re5_be.member.entity.MemberState; -import com.oreo.finalproject_5re5_be.member.entity.MemberTermsHistory; +import com.oreo.finalproject_5re5_be.member.entity.*; import com.oreo.finalproject_5re5_be.member.exception.MemberDuplicatedEmailException; import com.oreo.finalproject_5re5_be.member.exception.MemberDuplicatedIdException; import com.oreo.finalproject_5re5_be.member.exception.MemberNotFoundException; import com.oreo.finalproject_5re5_be.member.exception.MemberWrongCountTermCondition; -import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberChangeHistoryRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberConnectionHistoryRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberDeleteRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberStateRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberTermsHistoryRepository; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Optional; +import com.oreo.finalproject_5re5_be.member.repository.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -55,6 +26,15 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.*; + @ExtendWith(MockitoExtension.class) class MemberServiceImplTestByMock { From 93555e804566ba0b811a24ab1fe2f9823c6a960c Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sun, 8 Dec 2024 21:15:24 +0900 Subject: [PATCH 031/167] =?UTF-8?q?[fix]=20actuator=20=EC=84=9C=EB=B2=84?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=20=EC=A0=91=EC=86=8D=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=20=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ef7d4158..168967ae 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -42,6 +42,7 @@ server.servlet.session.tracking-modes=cookie # Actuator ?? ?? management.server.port=9200 +management.server.address=0.0.0.0 # Actuator health endpoint ???? management.endpoint.health.enabled=false From 8ca5100fa415fa857c526b74b1a88aaacee5aef7 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sun, 8 Dec 2024 21:51:45 +0900 Subject: [PATCH 032/167] =?UTF-8?q?[fix]=20membertest=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=9D=98=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EB=AC=B8=EC=A0=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B2=84=EC=A0=84=20=EC=97=85=EA=B7=B8=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +- .../service/MemberServiceImplTestByMock.java | 46 ++++++------------- 2 files changed, 15 insertions(+), 36 deletions(-) diff --git a/build.gradle b/build.gradle index 618c42c3..c63d6384 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.5' + id 'org.springframework.boot' version '3.3.6' id 'io.spring.dependency-management' version '1.1.6' } @@ -24,6 +24,7 @@ repositories { } dependencies { + implementation 'org.springframework:spring-context:6.1.15' implementation 'org.springframework.boot:spring-boot-starter-web' // DEVELOP @@ -115,5 +116,3 @@ dependencies { test { useJUnitPlatform() } - - diff --git a/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java b/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java index bf5a73ec..5575096e 100644 --- a/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java +++ b/src/test/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImplTestByMock.java @@ -1,47 +1,18 @@ package com.oreo.finalproject_5re5_be.member.service; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.anyList; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.when; - +import com.oreo.finalproject_5re5_be.code.entity.Code; +import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRegisterRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRemoveRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermCheckOrNotRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberUpdateRequest; import com.oreo.finalproject_5re5_be.member.dto.response.MemberReadResponse; -import com.oreo.finalproject_5re5_be.code.entity.Code; -import com.oreo.finalproject_5re5_be.member.entity.Member; -import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; -import com.oreo.finalproject_5re5_be.member.entity.MemberConnectionHistory; -import com.oreo.finalproject_5re5_be.member.entity.MemberDelete; -import com.oreo.finalproject_5re5_be.member.entity.MemberState; -import com.oreo.finalproject_5re5_be.member.entity.MemberTermsHistory; +import com.oreo.finalproject_5re5_be.member.entity.*; import com.oreo.finalproject_5re5_be.member.exception.MemberDuplicatedEmailException; import com.oreo.finalproject_5re5_be.member.exception.MemberDuplicatedIdException; import com.oreo.finalproject_5re5_be.member.exception.MemberNotFoundException; import com.oreo.finalproject_5re5_be.member.exception.MemberWrongCountTermCondition; -import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberChangeHistoryRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberConnectionHistoryRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberDeleteRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberStateRepository; -import com.oreo.finalproject_5re5_be.member.repository.MemberTermsHistoryRepository; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Optional; +import com.oreo.finalproject_5re5_be.member.repository.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -55,6 +26,15 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.Mockito.*; + @ExtendWith(MockitoExtension.class) class MemberServiceImplTestByMock { From cc494227f02a2b328137bc6cc246b3bd02bbaa5d Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:42:15 +0900 Subject: [PATCH 033/167] =?UTF-8?q?[Refactor]=20:=20ConcatTab=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20private=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java index 042b95e9..30c029b9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java @@ -11,7 +11,7 @@ @Getter @Builder @NoArgsConstructor -@AllArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) @Entity(name = "concat_tab") public class ConcatTab extends BaseEntity { @Id From 6f809b1b7f1753a597ab8fd1a360a4df43dad809 Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:42:32 +0900 Subject: [PATCH 034/167] =?UTF-8?q?[Refactor]=20:=20ConcatTab=EC=9D=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=95=A0=20=EB=95=8C=20builder=EB=A5=BC?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/ConcatTabService.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index 31b896c9..fae2bcbd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -60,7 +60,15 @@ public boolean createConcatTab(Project project) { if (concatTabRepository.existsById(project.getProSeq())) { return false; } - ConcatTab concatTab = new ConcatTab(project.getProSeq(), project, 'Y', 0.0f, null); + + ConcatTab concatTab = ConcatTab.builder() + .project(project) // Hibernate가 projectId를 자동으로 동기화 + .status('Y') + .frontSilence(0.0f) + .bgmFiles(null)//create라서 처음엔 null + .build(); + + System.out.println("concatTab = " + concatTab); concatTabRepository.save(concatTab); return true; } From d8d4af48e4be31066b6d57166b692a9e94d13b91 Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:42:48 +0900 Subject: [PATCH 035/167] =?UTF-8?q?[Fix]=20:=20BgmFile=EC=9D=B4=20null?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=20=ED=95=A0=20=EB=95=8C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EB=A5=BC=20=EB=B0=9C=EC=83=9D=EC=8B=9C?= =?UTF-8?q?=ED=82=A4=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/helper/ConcatTabHelper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java index 5e9be3c1..15a44b4b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java @@ -6,8 +6,10 @@ import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; /** @@ -22,7 +24,8 @@ public ConcatTabResponseDto prepareConcatTab(ConcatTab concatTab, Long memberSeq // 사용자 검증 if (validateMemberCurrent(concatTab, memberSeq)) { // bgmFile객체들을 그대로 프론트에게 줄 수 없으니 bgmFiles를 OriginAudioRequest(DTO)로 변환 - List bgmList = concatTab.getBgmFiles().stream() + List bgmList = Optional.ofNullable(concatTab.getBgmFiles()) + .orElse(new ArrayList<>()).stream() .map(this::convertToOriginAudioRequest) .toList(); From 9fa361b23b61cac0537ce831a89b91f135ed0e2f Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:43:30 +0900 Subject: [PATCH 036/167] =?UTF-8?q?[Refactor]=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B8=EC=A6=9D=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20?= =?UTF-8?q?@AuthenticationPrincipal=EB=A1=9C=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatTabController.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java index 9ae9699d..b0dc23e9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java @@ -32,10 +32,12 @@ public class ConcatTabController { description = "생성이 성공했다면 True를 반환합니다." ) @PostMapping("create") - public ResponseEntity> create(@RequestBody ConcatCreateRequestDto createRequestDto) { - projectService.projectCheck(createRequestDto.getMemberSequence(), createRequestDto.getProjectSequence()); + public ResponseEntity> create(@AuthenticationPrincipal CustomUserDetails customUserDetails, + @RequestParam Long projectSeq) { + projectService.projectCheck(customUserDetails.getMember().getSeq(), projectSeq); //사용자 예외처리 - return new ResponseDto<>(HttpStatus.OK.value(), concatTabService.createConcatTab(createRequestDto)) + return new ResponseDto<>(HttpStatus.OK.value(), concatTabService + .createConcatTab(new ConcatCreateRequestDto(projectSeq, customUserDetails.getMember().getSeq()))) .toResponseEntity(); } From 48c03484fe59037177e8cd061e5412ee32c60c7c Mon Sep 17 00:00:00 2001 From: K-KY Date: Mon, 9 Dec 2024 05:01:36 +0900 Subject: [PATCH 037/167] =?UTF-8?q?[Test]=20:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/ConcatTabServiceTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java b/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java index a53842c5..c5eaef10 100644 --- a/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java +++ b/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java @@ -122,7 +122,12 @@ void readConcatTab_Success() { List bgmFiles = List.of(bgmFile1, bgmFile2); // ConcatTab 객체 생성 - ConcatTab concatTab = new ConcatTab(1L, project, 'Y', 0.5f, bgmFiles); + ConcatTab concatTab = ConcatTab.builder() + .project(project) + .status('Y') + .frontSilence(0.0f) + .bgmFiles(bgmFiles) + .build(); // BgmFile -> OriginAudioRequest 변환 List bgmAudioRequests = bgmFiles.stream() @@ -182,7 +187,12 @@ void readConcatTab_CreateConcatTabAndReturn() { List bgmFiles = List.of(bgmFile1, bgmFile2); // ConcatTab 객체 생성 - ConcatTab concatTab = new ConcatTab(1L, project, 'Y', 0.5f, bgmFiles); + ConcatTab concatTab = ConcatTab.builder() + .project(project) + .status('Y') + .frontSilence(0.0f) + .bgmFiles(bgmFiles) + .build(); // BgmFile -> OriginAudioRequest 변환 List bgmAudioRequests = bgmFiles.stream() From b41d850bbcf639bec136d2a28f7adf006d42ad1a Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:47:48 +0900 Subject: [PATCH 038/167] =?UTF-8?q?[fix]=20actuator=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EA=B2=BD=EB=A1=9C=EB=8A=94=20/5re5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 168967ae..a04cf484 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -28,11 +28,8 @@ spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.enabled=true spring.servlet.multipart.file-size-threshold=100MB - -management.endpoints.web.base-path=/5re5 - -logging.level.org.apache.catalina=DEBUG -logging.level.org.springframework.security=DEBUG +#logging.level.org.apache.catalina=DEBUG +#logging.level.org.springframework.security=DEBUG server.servlet.session.cookie.same-site=None server.servlet.session.cookie.secure=true @@ -40,16 +37,8 @@ server.servlet.session.cookie.secure=true server.servlet.session.cookie.path=/ server.servlet.session.tracking-modes=cookie -# Actuator ?? ?? -management.server.port=9200 -management.server.address=0.0.0.0 - -# Actuator health endpoint ???? +management.endpoints.web.base-path=/5re5 management.endpoint.health.enabled=false - -# Actuator ?? ?? management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env,beans,info,configprops - -# Tomcat MBean ????? ??? server.tomcat.mbeanregistry.enabled=true \ No newline at end of file From a3b22d1e2c7ba47bb0043d9c4c6bc3eb8f9e05b3 Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:42:15 +0900 Subject: [PATCH 039/167] =?UTF-8?q?[Refactor]=20:=20ConcatTab=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20private=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java index 042b95e9..30c029b9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java @@ -11,7 +11,7 @@ @Getter @Builder @NoArgsConstructor -@AllArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) @Entity(name = "concat_tab") public class ConcatTab extends BaseEntity { @Id From 90d61ab96775d37300000c536aedd4ab5a154cc1 Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:42:32 +0900 Subject: [PATCH 040/167] =?UTF-8?q?[Refactor]=20:=20ConcatTab=EC=9D=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=95=A0=20=EB=95=8C=20builder=EB=A5=BC?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/ConcatTabService.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index 31b896c9..fae2bcbd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -60,7 +60,15 @@ public boolean createConcatTab(Project project) { if (concatTabRepository.existsById(project.getProSeq())) { return false; } - ConcatTab concatTab = new ConcatTab(project.getProSeq(), project, 'Y', 0.0f, null); + + ConcatTab concatTab = ConcatTab.builder() + .project(project) // Hibernate가 projectId를 자동으로 동기화 + .status('Y') + .frontSilence(0.0f) + .bgmFiles(null)//create라서 처음엔 null + .build(); + + System.out.println("concatTab = " + concatTab); concatTabRepository.save(concatTab); return true; } From b735df5b88dfa44e62b14cc6252efa90937b09b1 Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:42:48 +0900 Subject: [PATCH 041/167] =?UTF-8?q?[Fix]=20:=20BgmFile=EC=9D=B4=20null?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=ED=99=98=20=ED=95=A0=20=EB=95=8C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EB=A5=BC=20=EB=B0=9C=EC=83=9D=EC=8B=9C?= =?UTF-8?q?=ED=82=A4=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/helper/ConcatTabHelper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java index 5e9be3c1..15a44b4b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java @@ -6,8 +6,10 @@ import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; /** @@ -22,7 +24,8 @@ public ConcatTabResponseDto prepareConcatTab(ConcatTab concatTab, Long memberSeq // 사용자 검증 if (validateMemberCurrent(concatTab, memberSeq)) { // bgmFile객체들을 그대로 프론트에게 줄 수 없으니 bgmFiles를 OriginAudioRequest(DTO)로 변환 - List bgmList = concatTab.getBgmFiles().stream() + List bgmList = Optional.ofNullable(concatTab.getBgmFiles()) + .orElse(new ArrayList<>()).stream() .map(this::convertToOriginAudioRequest) .toList(); From 96e68cbedc20f8ae2769aedd2d5ce65298dea50f Mon Sep 17 00:00:00 2001 From: K-KY Date: Sun, 8 Dec 2024 23:43:30 +0900 Subject: [PATCH 042/167] =?UTF-8?q?[Refactor]=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=9D=B8=EC=A6=9D=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20?= =?UTF-8?q?@AuthenticationPrincipal=EB=A1=9C=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatTabController.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java index 9ae9699d..b0dc23e9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java @@ -32,10 +32,12 @@ public class ConcatTabController { description = "생성이 성공했다면 True를 반환합니다." ) @PostMapping("create") - public ResponseEntity> create(@RequestBody ConcatCreateRequestDto createRequestDto) { - projectService.projectCheck(createRequestDto.getMemberSequence(), createRequestDto.getProjectSequence()); + public ResponseEntity> create(@AuthenticationPrincipal CustomUserDetails customUserDetails, + @RequestParam Long projectSeq) { + projectService.projectCheck(customUserDetails.getMember().getSeq(), projectSeq); //사용자 예외처리 - return new ResponseDto<>(HttpStatus.OK.value(), concatTabService.createConcatTab(createRequestDto)) + return new ResponseDto<>(HttpStatus.OK.value(), concatTabService + .createConcatTab(new ConcatCreateRequestDto(projectSeq, customUserDetails.getMember().getSeq()))) .toResponseEntity(); } From e8e3aaa1b486ed51afec0564d8a2223865c0f54b Mon Sep 17 00:00:00 2001 From: K-KY Date: Mon, 9 Dec 2024 05:01:36 +0900 Subject: [PATCH 043/167] =?UTF-8?q?[Test]=20:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/ConcatTabServiceTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java b/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java index a53842c5..c5eaef10 100644 --- a/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java +++ b/src/test/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabServiceTest.java @@ -122,7 +122,12 @@ void readConcatTab_Success() { List bgmFiles = List.of(bgmFile1, bgmFile2); // ConcatTab 객체 생성 - ConcatTab concatTab = new ConcatTab(1L, project, 'Y', 0.5f, bgmFiles); + ConcatTab concatTab = ConcatTab.builder() + .project(project) + .status('Y') + .frontSilence(0.0f) + .bgmFiles(bgmFiles) + .build(); // BgmFile -> OriginAudioRequest 변환 List bgmAudioRequests = bgmFiles.stream() @@ -182,7 +187,12 @@ void readConcatTab_CreateConcatTabAndReturn() { List bgmFiles = List.of(bgmFile1, bgmFile2); // ConcatTab 객체 생성 - ConcatTab concatTab = new ConcatTab(1L, project, 'Y', 0.5f, bgmFiles); + ConcatTab concatTab = ConcatTab.builder() + .project(project) + .status('Y') + .frontSilence(0.0f) + .bgmFiles(bgmFiles) + .build(); // BgmFile -> OriginAudioRequest 변환 List bgmAudioRequests = bgmFiles.stream() From f22a35bba58652066844caf1320d5800abdb748a Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:47:48 +0900 Subject: [PATCH 044/167] =?UTF-8?q?[fix]=20actuator=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EA=B2=BD=EB=A1=9C=EB=8A=94=20/5re5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 168967ae..a04cf484 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -28,11 +28,8 @@ spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.enabled=true spring.servlet.multipart.file-size-threshold=100MB - -management.endpoints.web.base-path=/5re5 - -logging.level.org.apache.catalina=DEBUG -logging.level.org.springframework.security=DEBUG +#logging.level.org.apache.catalina=DEBUG +#logging.level.org.springframework.security=DEBUG server.servlet.session.cookie.same-site=None server.servlet.session.cookie.secure=true @@ -40,16 +37,8 @@ server.servlet.session.cookie.secure=true server.servlet.session.cookie.path=/ server.servlet.session.tracking-modes=cookie -# Actuator ?? ?? -management.server.port=9200 -management.server.address=0.0.0.0 - -# Actuator health endpoint ???? +management.endpoints.web.base-path=/5re5 management.endpoint.health.enabled=false - -# Actuator ?? ?? management.endpoints.web.exposure.include=* management.endpoints.web.exposure.exclude=env,beans,info,configprops - -# Tomcat MBean ????? ??? server.tomcat.mbeanregistry.enabled=true \ No newline at end of file From a5a881dc3f50560d93dae06209006c0460a1b8ef Mon Sep 17 00:00:00 2001 From: jongheonleee Date: Mon, 9 Dec 2024 11:28:13 +0900 Subject: [PATCH 045/167] =?UTF-8?q?=EB=A6=AC=EB=93=9C=EB=AF=B8=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EC=9E=A1=EC=95=84=20=EB=86=93=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a92456fc..805055f9 100644 --- a/README.md +++ b/README.md @@ -1 +1,108 @@ -# README.md +# 5RE5 PARK + +
+ + +
+ +## 프로젝트 소개 + + +
+ +### :runner: 프로젝트 기간 (54 days) +> **전체 개발 기간: ( Weeks | %)**
+> - 기능 구현 기간: ( Weeks | %) +> - 리팩토링 및 발표 준비 기간: + +
+ +### :computer: 코드수 +

+Java         :  
+
+ +
+ +### 👫 프로젝트 팀원 + +#### 팀명: 5RE5 + + +#### 팀원 구성 + +
+ + +## 기술 스택 + +### 🧑🏻‍💻 Enviroment +|IntelliJ|VS Code|Git|Github| Gradle | +|:---:|:---:|:---:|:---:|:------:| + +
+ +### 🛠️ Tool + + +#### Backend +|Java| Spring Framework | Spring Security | JPA | Lombok | jUnit | +|:---:|:----------------:|:---------------:|:---:|:------:|:-----:| + +#### Database +|MySQL| +|:---:| + + +#### Web Server +|Apache Tomcat| +|:---:| + +
+ +### 👀 Communication +|Zoom| Notion | Google Sheets | Google Slides | +|:---:|:------:|:-------------:|:-------------:| + +
+ +## ERD + + + +
+
+ +## Commit Message Convention +### 📋 규칙 +
- 제목 행 명령문 사용
+- 제목과 본문을 빈 행으로 분리
+- 제목 행 글자 수 50자 이하
+- 제목 행 끝에 마침표 없음
+ +### 📝 유형 + +

+[feat]        :     새로운 기능 추가
+[test]        :     테스트 코드 완료 
+[refactor]    :     리팩토링, 코드 개선
+[fix]         :     버그 수정
+[docs]        :     문서 추가 또는 수정 (ex. README 변경)
+[style]       :     코드 스타일 변경 (포맷팅, 세미콜론 누락 등 코드 변경이 없는 경우)
+[chore]       :     패키지 매니저(ex. gitignore 수정), 빌드 업무 수정
+[comment]     :     주석 추가 및 수정
+[rename]      :     파일 또는 폴더명을 수정하거나 이동하는 작업만 수행한 경우
+[remove]      :     파일을 삭제하는 작업만 수행한 경우
+[conflict]    :     합병 시 발생한 충돌 수정
+
+ + +## 🏭 디렉토리 구조 +

+
+
+ +
+ +## ✨ 주요 기능 + From 72cd3c2fdfcecb28e110188b1466596879991758 Mon Sep 17 00:00:00 2001 From: oowtl Date: Mon, 9 Dec 2024 12:08:51 +0900 Subject: [PATCH 046/167] =?UTF-8?q?[fix]=20=EC=9D=B4=EC=8A=88=20=EB=8C=80?= =?UTF-8?q?=EC=9D=91=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=8A=B8=EB=9E=9C?= =?UTF-8?q?=EC=9E=AD=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. deleteSentence 에 트랜잭션 추가 2. addSentence 에 트랜잭션 추가 --- .../tts/service/TtsSentenceServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java index 68c934c1..8f810d34 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsSentenceServiceImpl.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; @@ -58,6 +59,7 @@ public TtsSentenceServiceImpl(TtsSentenceRepository ttsSentenceRepository, } @Override + @Transactional public TtsSentenceDto addSentence(@Valid @NotNull Long projectSeq, @Valid TtsSentenceRequest createRequest) { // 1. TtsSentenceRequest 유효성 검증 : Text (not blank) => @NotBlank @@ -262,6 +264,7 @@ public TtsSentenceListDto getSentenceList(Long projectSeq) { } @Override + @Transactional public boolean deleteSentence(Long projectSeq, Long tsSeq) { // 1. TtsSentence 엔티티 조회 TtsSentence ttsSentence = ttsSentenceRepository.findById(tsSeq) From ce2a3cfd1c64f1e3482ce0daeef7e654553202a9 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Mon, 9 Dec 2024 15:43:25 +0900 Subject: [PATCH 047/167] =?UTF-8?q?[fix]=20uploeadText=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=A5=BC=20batchInsert=20=EC=93=B0=EB=8A=94?= =?UTF-8?q?=20=EA=B2=83=EC=9D=84=20saveAll=20=EC=93=B0=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/ConcatRowService.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java index b9330d83..bba04e32 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java @@ -9,6 +9,7 @@ import com.oreo.finalproject_5re5_be.concat.repository.ConcatRowRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatTabRepository; import com.oreo.finalproject_5re5_be.concat.service.helper.ConcatRowHelper; +import com.oreo.finalproject_5re5_be.project.entity.Project; import jakarta.transaction.Transactional; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -152,18 +153,36 @@ private AudioFile mapToAudioFile(OriginAudioRequest originAudioRequest, ConcatRo .build(); } - public boolean uploadText(List concatRowSaveRequestDto) { - boolean check = concatRowSaveRequestDto.stream() + public boolean uploadText(ConcatRowSaveRequestDto concatRowSaveRequestDto) { + + // 1. 요청 데이터의 유효성 검사 + boolean check = concatRowSaveRequestDto.getConcatRowRequests().stream() .anyMatch(rowRequest -> rowRequest.getStatus() == 'N' || rowRequest.getSeq() == null); if (check) { return false; } - List list = concatRowSaveRequestDto.stream().map(cr -> ConcatRow - .builder() - .concatRowSeq(cr.getSeq()) - .rowText(cr.getRowText()).build()).toList(); - concatRowHelper.batchInsert(list); + // 2. ConcatTab 조회 + Long concatTabId = concatRowSaveRequestDto.getConcatTabId(); + ConcatTab concatTab = concatTabRepository.findById(concatTabId) + .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + concatTabId)); + + // 3. ConcatRow 리스트 생성 + List concatRows = concatRowSaveRequestDto.getConcatRowRequests().stream() + .map(request -> ConcatRow.builder() + .concatRowSeq(request.getSeq()) + .rowIndex(request.getRowIndex()) + .selected(request.getSelected()) + .silence(request.getRowSilence()) + .status(request.getStatus()) + .concatTab(concatTab) // 조회한 concatTab 설정 + .rowText(request.getRowText()) + .build()) + .toList(); + + // 4. ConcatRow 저장 + concatRowRepository.saveAll(concatRows); + return true; } From 02bd8b9b3926cfea657ea08203ae439f420b8e91 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Mon, 9 Dec 2024 15:44:08 +0900 Subject: [PATCH 048/167] =?UTF-8?q?[fix]=20read=ED=95=B4=EC=98=AC=20?= =?UTF-8?q?=EB=95=8C=20selected=EB=8F=84=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatRowTabController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java index 9aee4f65..03fb850c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java @@ -101,6 +101,7 @@ public ResponseEntity> readRowAndTab( .extension(x.getExtension()).build() ) .rowText(x.getConcatRow().getRowText()) + .selected(x.getConcatRow().getSelected()) .rowIndex(x.getConcatRow().getRowIndex()) .rowSilence(x.getConcatRow().getSilence()) .status(x.getConcatRow().getStatus()) From f654120f0a5c1820b5a6be67f80a199d53eba55e Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Mon, 9 Dec 2024 15:44:49 +0900 Subject: [PATCH 049/167] =?UTF-8?q?[fix]=20uploadText=EA=B0=80=20=EB=B0=94?= =?UTF-8?q?=EB=80=9C=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=EB=8F=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatRowController.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java index 68db82a3..1c89c784 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java @@ -1,6 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.controller; import com.oreo.finalproject_5re5_be.concat.dto.ConcatRowDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; import com.oreo.finalproject_5re5_be.concat.service.ConcatRowService; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; @@ -107,10 +108,15 @@ public ResponseEntity> update(@RequestBody ConcatRowSaveReq public ResponseEntity> uploadText( @AuthenticationPrincipal CustomUserDetails customUserDetails, @RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto) { - boolean uploadText = concatRowService.uploadText(concatRowSaveRequestDto.getConcatRowRequests()); + + // 서비스 호출 + boolean uploadText = concatRowService.uploadText(concatRowSaveRequestDto); + + // 결과 응답 생성 if (uploadText) { return new ResponseDto<>(HttpStatus.OK.value(), uploadText).toResponseEntity(); + } else { + return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), uploadText).toResponseEntity(); } - return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), uploadText).toResponseEntity(); } } From 196e0bb865c45d740fead754af40ba776bebfb95 Mon Sep 17 00:00:00 2001 From: K-KY Date: Mon, 9 Dec 2024 17:14:36 +0900 Subject: [PATCH 050/167] =?UTF-8?q?[Fix]=20:=20=EB=B3=B4=EC=95=88=EC=83=81?= =?UTF-8?q?=20=EC=B7=A8=EC=95=BD=EC=A0=90=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/helper/ConcatTabHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java index 15a44b4b..796441f7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java @@ -36,8 +36,7 @@ public ConcatTabResponseDto prepareConcatTab(ConcatTab concatTab, Long memberSeq .bgmFileList(bgmList) .build(); } - throw new IllegalArgumentException("사용자가 소유한 프로젝트가 아닙니다. 소유한 사용자 : " - + concatTab.getProject().getMember()); + throw new IllegalArgumentException("사용자가 소유한 프로젝트가 아닙니다."); } From f6ac0d71e373c75476766104c5aed39f576d0c1e Mon Sep 17 00:00:00 2001 From: K-KY Date: Mon, 9 Dec 2024 17:15:17 +0900 Subject: [PATCH 051/167] =?UTF-8?q?[Feat]=20:=20bgmFiles=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/entity/ConcatTab.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java index 30c029b9..a832df57 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java @@ -30,11 +30,23 @@ public class ConcatTab extends BaseEntity { // 하나의 ConcatTab에 여러 bgmFile들 매칭 @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.EAGER) - @Column(nullable = true) - @Setter private List bgmFiles; + public void addBgmFile(BgmFile bgmFile) { + bgmFiles.add(BgmFile.builder() + .concatTab(this) + .audioUrl(bgmFile.getAudioUrl()) + .fileName(bgmFile.getFileName()) + .fileLength(bgmFile.getFileLength()) + .extension(bgmFile.getExtension()).build()); + } + + public void addBgmFile(List bgmFiles) { + bgmFiles.forEach(this::addBgmFile); + } + + } From a76b23395f2bd9232166c0150f007b5d826cc9ef Mon Sep 17 00:00:00 2001 From: K-KY Date: Mon, 9 Dec 2024 17:17:45 +0900 Subject: [PATCH 052/167] =?UTF-8?q?[Feat]=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EA=B0=84=EC=86=8C=ED=9A=8C=20=EB=B0=8F=20bgmFile=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/ConcatRowTabService.java | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java index 49cb58ad..18c38b79 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java @@ -5,7 +5,6 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.TabRowUpdateRequestDto; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; -import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,18 +17,13 @@ public class ConcatRowTabService { private final ConcatTabService concatTabService; private final ConcatRowService concatRowService; - private final BgmFileService bgmFileService; - private final BgmFileRepository bgmFileRepository; - @Transactional + @Transactional//트랜잭션이 완료되기 전까지 엔티티 변경내용 적용 안됨 public boolean saveTabAndRows(TabRowUpdateRequestDto dto, Long memberSeq) { // 1. ConcatTab 업데이트 ConcatUpdateRequestDto concatTabs = dto.getConcatTab(); - boolean updateConcatTab = concatTabService.updateConcatTab(concatTabs, memberSeq); - // 2. ConcatRow 업데이트 (말만 업데이트고 사실 생성임) ConcatRowSaveRequestDto concatRows = dto.getConcatRows(); - boolean updateConcatRows = concatRowService.updateConcatRows(concatRows); // 3. BgmFile 저장 ConcatTab concatTab = concatTabService.getConcatTabBySeq(concatTabs.getTabId()); // ConcatTab 조회 @@ -44,10 +38,9 @@ public boolean saveTabAndRows(TabRowUpdateRequestDto dto, Long memberSeq) { .extension(bgmRequest.getExtension()) .build()) .toList(); + concatTab.addBgmFile(bgmFiles); - bgmFileRepository.saveAll(bgmFiles); // DB에 저장 - - - return updateConcatTab && updateConcatRows; + return concatTabService.updateConcatTab(concatTabs, memberSeq) + && concatRowService.updateConcatRows(concatRows); } } From 3d8cd5849e0fb6e6592fd17f41bff8394d288714 Mon Sep 17 00:00:00 2001 From: K-KY Date: Mon, 9 Dec 2024 17:19:35 +0900 Subject: [PATCH 053/167] =?UTF-8?q?[Feat]=20:=20bgmFile=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatRowTabController.java | 27 +++---------------- 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java index 03fb850c..2a47ed67 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java @@ -4,7 +4,6 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.*; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.dto.response.TabRowResponseDto; -import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.service.*; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; @@ -24,18 +23,15 @@ @RequiredArgsConstructor @RequestMapping("api/v2/concat") public class ConcatRowTabController { - private final ConcatRowService concatRowService; private final ConcatTabService concatTabService; private final AudioFileService audioFileService; - private final BgmFileService bgmFileservice; private final ConcatRowTabService concatRowTabService; //탭 로우 조회 //탭 로우 저장 @Operation( - summary = "ConcatRow, ConcatTab을 저장합니다.", - description = "" + summary = "ConcatRow, ConcatTab을 저장합니다." ) @PostMapping("save") public ResponseEntity> saveRowAndTab( @@ -52,9 +48,7 @@ public ResponseEntity> saveRowAndTab( @Operation( - summary = "ConcatRow, ConcatTab을 조회합니다.", - description = "" - ) + summary = "ConcatRow, ConcatTab을 조회합니다.") @GetMapping("read") public ResponseEntity> readRowAndTab( @RequestParam Long projectSeq, @@ -64,27 +58,12 @@ public ResponseEntity> readRowAndTab( ConcatTabResponseDto concatTabResponseDto = concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq()); - // Tabseq로 bgmFile 리스트 불러오기 - List bgmFiles = bgmFileservice.getBgmFilesByTabSeq(concatTabResponseDto.getTabId()); - - // BgmFile 리스트를 OriginAudioRequest 형태로 변환 - List bgmFileList = bgmFiles.stream() - .map(bgm -> OriginAudioRequest.builder() - .seq(bgm.getBgmFileSeq()) - .audioUrl(bgm.getAudioUrl()) - .fileName(bgm.getFileName()) - .fileSize(bgm.getFileSize()) - .fileLength(bgm.getFileLength()) - .extension(bgm.getExtension()) - .build()) - .toList(); - // ConcatTabResponseDto에 bgmFileList 추가 concatTabResponseDto = ConcatTabResponseDto.builder() .tabId(concatTabResponseDto.getTabId()) .frontSilence(concatTabResponseDto.getFrontSilence()) .status(concatTabResponseDto.getStatus()) - .bgmFileList(bgmFileList) // BgmFile 리스트 추가 + .bgmFileList(concatTabResponseDto.getBgmFileList()) // BgmFile 리스트 추가 .build(); // Row setting From cb8fe4527eb2339975533a4a1769704f94050802 Mon Sep 17 00:00:00 2001 From: K-KY Date: Mon, 9 Dec 2024 17:42:47 +0900 Subject: [PATCH 054/167] =?UTF-8?q?[Refactor]=20:=20ConcatResult=20BgmFile?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/entity/ConcatResult.java | 12 ++++++++++++ .../concat/service/ConcatTabService.java | 6 ++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java index d34d8d5c..f8f0fffc 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java @@ -42,4 +42,16 @@ public class ConcatResult extends BaseEntity { @Column(name = "file_size") private Long fileSize; + public void addBgmFile(BgmFile bgmFile) { + this.bgmFiles.add(BgmFile.builder() + .concatResult(this) + .audioUrl(bgmFile.getAudioUrl()) + .fileName(bgmFile.getFileName()) + .fileLength(bgmFile.getFileLength()) + .extension(bgmFile.getExtension()).build()); + } + + public void addBgmFiles(List bgmFiles) { + bgmFiles.forEach(this::addBgmFile); + } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index fae2bcbd..2c5e427b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -5,7 +5,6 @@ import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; -import com.oreo.finalproject_5re5_be.concat.repository.AudioFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatTabRepository; import com.oreo.finalproject_5re5_be.concat.service.helper.ConcatTabHelper; @@ -28,7 +27,6 @@ public class ConcatTabService { private ProjectRepository projectRepository; private MemberServiceImpl memberService; private ConcatTabHelper concatTabHelper; - private AudioFileRepository audioFileRepository; private BgmFileRepository bgmFileRepository; /** @@ -142,7 +140,7 @@ public boolean updateBgmAudioFiles(Long tabSeq, List bgmFileSeqs) { if (bgmFileSeqs == null || bgmFileSeqs.isEmpty()) { // bgmFileSeqs가 비어있으면 기존 bgmFiles 제거 - concatTab.setBgmFiles(null); + concatTab.addBgmFile(new BgmFile()); } else { // bgmFileSeqs를 통해 BgmFile 리스트 생성 List bgmFiles = bgmFileSeqs.stream() @@ -151,7 +149,7 @@ public boolean updateBgmAudioFiles(Long tabSeq, List bgmFileSeqs) { .toList(); // ConcatTab에 새로운 BgmFile 리스트 설정 - concatTab.setBgmFiles(bgmFiles); + concatTab.addBgmFile(bgmFiles); } // 업데이트된 ConcatTab 저장 From b20c03dc99028f418c0c5ef813d9c2adb852d8ed Mon Sep 17 00:00:00 2001 From: oowtl Date: Mon, 9 Dec 2024 20:17:22 +0900 Subject: [PATCH 055/167] =?UTF-8?q?[fix]=20sqs=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatWithBgmController.java | 4 +- .../global/component/SqsService.java | 124 +++++++++--------- .../tts/controller/TtsController.java | 52 ++++---- .../tts/service/TtsMakeService.java | 82 ++++++------ 4 files changed, 131 insertions(+), 131 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index f208eee4..c90b40b9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -15,7 +15,7 @@ import com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator; import com.oreo.finalproject_5re5_be.concat.service.concatenator.StereoIntervalConcatenator; import com.oreo.finalproject_5re5_be.global.component.S3Service; -import com.oreo.finalproject_5re5_be.global.component.SqsService; +//import com.oreo.finalproject_5re5_be.global.component.SqsService; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; @@ -49,7 +49,7 @@ public class ConcatWithBgmController { private final S3Service s3Service; private final MaterialAudioService materialAudioService; private final ConcatResultService concatResultService; - private final SqsService sqsService; +// private final SqsService sqsService; private final AudioFileService audioFileService; private final AudioStreamService audioStreamService; // 추가된 서비스 private final AudioResample audioResample = new AudioResample(); // 리샘플링 유틸. Bean이 아니라 new로 생성 diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java index 03b0906d..8c47e9ca 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java @@ -1,62 +1,62 @@ -package com.oreo.finalproject_5re5_be.global.component; - -import com.amazonaws.services.sqs.AmazonSQSRequester; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.oreo.finalproject_5re5_be.global.constant.MessageType; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import software.amazon.awssdk.services.sqs.SqsClient; -import software.amazon.awssdk.services.sqs.model.Message; -import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; -import software.amazon.awssdk.services.sqs.model.SendMessageRequest; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -@Component -public class SqsService { - private final SqsClient sqsClient; - private final AmazonSQSRequester amazonSQSRequester; - - @Value("${AWS_SQS_QUEUE_URL}") - private String sqsQueueUrl; - - @Value("${AWS_SQS_VIRTUAL_QUEUE_NAME}") - private String virtualQueueName; - - public SqsService(SqsClient sqsClient, AmazonSQSRequester amazonSQSRequester) { - this.sqsClient = sqsClient; - this.amazonSQSRequester = amazonSQSRequester; - } - - public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, JsonProcessingException { - // 변수 설정 - // 가상 대기열 사용 - String requestQueueUrl = sqsQueueUrl + virtualQueueName; - - // DTO를 JSON으로 변환 - ObjectMapper objectMapper = new ObjectMapper(); - String messageBody = objectMapper.writeValueAsString(dto); - - // 메시지 속성 설정 - Map messageAttributes = new HashMap<>(); - messageAttributes.put("messageType", - MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); - - // sqs에 메세지 보내기 - SendMessageRequest sendRequest = SendMessageRequest.builder() - .queueUrl(requestQueueUrl) - .messageBody(messageBody) - .messageAttributes(messageAttributes) - .messageGroupId("messageGroup1") - .build(); - - Message response = amazonSQSRequester.sendMessageAndGetResponse(sendRequest, 50, - TimeUnit.SECONDS); - - return response; - } -} +//package com.oreo.finalproject_5re5_be.global.component; +// +//import com.amazonaws.services.sqs.AmazonSQSRequester; +//import com.fasterxml.jackson.core.JsonProcessingException; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.oreo.finalproject_5re5_be.global.constant.MessageType; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +//import software.amazon.awssdk.services.sqs.SqsClient; +//import software.amazon.awssdk.services.sqs.model.Message; +//import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; +//import software.amazon.awssdk.services.sqs.model.SendMessageRequest; +// +//import java.util.HashMap; +//import java.util.Map; +//import java.util.concurrent.TimeUnit; +//import java.util.concurrent.TimeoutException; +// +//@Component +//public class SqsService { +// private final SqsClient sqsClient; +// private final AmazonSQSRequester amazonSQSRequester; +// +// @Value("${AWS_SQS_QUEUE_URL}") +// private String sqsQueueUrl; +// +// @Value("${AWS_SQS_VIRTUAL_QUEUE_NAME}") +// private String virtualQueueName; +// +// public SqsService(SqsClient sqsClient, AmazonSQSRequester amazonSQSRequester) { +// this.sqsClient = sqsClient; +// this.amazonSQSRequester = amazonSQSRequester; +// } +// +// public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, JsonProcessingException { +// // 변수 설정 +// // 가상 대기열 사용 +// String requestQueueUrl = sqsQueueUrl + virtualQueueName; +// +// // DTO를 JSON으로 변환 +// ObjectMapper objectMapper = new ObjectMapper(); +// String messageBody = objectMapper.writeValueAsString(dto); +// +// // 메시지 속성 설정 +// Map messageAttributes = new HashMap<>(); +// messageAttributes.put("messageType", +// MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); +// +// // sqs에 메세지 보내기 +// SendMessageRequest sendRequest = SendMessageRequest.builder() +// .queueUrl(requestQueueUrl) +// .messageBody(messageBody) +// .messageAttributes(messageAttributes) +// .messageGroupId("messageGroup1") +// .build(); +// +// Message response = amazonSQSRequester.sendMessageAndGetResponse(sendRequest, 50, +// TimeUnit.SECONDS); +// +// return response; +// } +//} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java index 24bf59d4..3cf0ca68 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java @@ -243,32 +243,32 @@ public ResponseEntity> makeTts( ); } - @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") - @GetMapping("/sentence/{tsSeq}/maketts/multi") - public ResponseEntity> makeTtsMuti( - @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq - ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq - , @SessionAttribute(value = "memberSeq") Long memberSeq - ) { - - // 회원의 정보인지 확인 - projectService.projectCheck(memberSeq, proSeq); - - // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) - ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); - - // tts 생성 - TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); - - return ResponseEntity - .status(HttpStatus.CREATED) - .body( - new ResponseDto<>( - HttpStatus.CREATED.value(), - ttsMakeResult - ) - ); - } +// @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") +// @GetMapping("/sentence/{tsSeq}/maketts/multi") +// public ResponseEntity> makeTtsMuti( +// @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq +// ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq +// , @SessionAttribute(value = "memberSeq") Long memberSeq +// ) { +// +// // 회원의 정보인지 확인 +// projectService.projectCheck(memberSeq, proSeq); +// +// // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) +// ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); +// +// // tts 생성 +// TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); +// +// return ResponseEntity +// .status(HttpStatus.CREATED) +// .body( +// new ResponseDto<>( +// HttpStatus.CREATED.value(), +// ttsMakeResult +// ) +// ); +// } @Operation(summary = "TTS 문장 삭제 요청") @DeleteMapping("/sentence/{tsSeq}") diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java index bd7e54af..d5bada19 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.oreo.finalproject_5re5_be.global.component.S3Service; -import com.oreo.finalproject_5re5_be.global.component.SqsService; +//import com.oreo.finalproject_5re5_be.global.component.SqsService; import com.oreo.finalproject_5re5_be.global.constant.MessageType; import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; import com.oreo.finalproject_5re5_be.tts.client.AudioConfigGenerator; @@ -39,7 +39,7 @@ public class TtsMakeService { private final GoogleTTSService googleTTSService; private final S3Service s3Service; private final SaveTtsMakeResultService saveTtsMakeResultService; - private final SqsService sqsService; +// private final SqsService sqsService; private final ObjectMapper objectMapper = new ObjectMapper(); public TtsMakeService( @@ -48,8 +48,8 @@ public TtsMakeService( S3Service s3Service, SaveTtsMakeResultService saveTtsMakeResultService, VoiceRepository voiceRepository, - TtsProgressStatusRepository ttsProgressStatusRepository, - SqsService sqsService + TtsProgressStatusRepository ttsProgressStatusRepository +// SqsService sqsService ) { this.ttsSentenceRepository = ttsSentenceRepository; this.googleTTSService = googleTTSService; @@ -57,7 +57,7 @@ public TtsMakeService( this.saveTtsMakeResultService = saveTtsMakeResultService; this.voiceRepository = voiceRepository; this.ttsProgressStatusRepository = ttsProgressStatusRepository; - this.sqsService = sqsService; +// this.sqsService = sqsService; } // TTS 생성 서비스 @@ -89,42 +89,42 @@ public TtsSentenceDto makeTts(@NotNull Long sentenceSeq) { } } - public TtsSentenceDto makeTtsMulti(@NotNull Long sentenceSeq) { - - // 0. sentenceSeq 로 행 정보 조회 - TtsSentence ttsSentence = ttsSentenceRepository.findById(sentenceSeq) - .orElseThrow(() -> new EntityNotFoundException("존재하지 않는 TTS 행입니다. id:" + sentenceSeq)); - try { - // 1. TTS 문장 '진행중' 상태 저장 - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.IN_PROGRESS); - - // 2. TTS 생성 및 s3 업로드 요청 - Message message = sqsService.sendMessage( - TtsMakeRequest.of(ttsSentence, makeFilename(ttsSentence)), - MessageType.TTS_MAKE - ); - TtsMakeResponse ttsMakeResponse = objectMapper.readValue(message.body(), TtsMakeResponse.class); - - // 3. TTS 결과 저장 - TtsSentenceDto ttsSentenceDto = saveTtsMakeResultService.saveTtsMakeResult(ttsMakeResponse, ttsSentence); - - // 4. TTS 문장 '완료' 상태 저장 - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FINISHED); - - return ttsSentenceDto; - - } catch (RuntimeException e) { - // 예외 발생 시 TTS 문장 '실패' 상태 저장 - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); - throw new TtsMakeException("TTS 생성 중 예외 발생"); - } catch (JsonProcessingException e) { - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); - throw new TtsMakeException("tts 생성 응답 메세지 body 값을 TtsMakeResponse 객체로 변환 중 에러 발생"); - } catch (TimeoutException e) { - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); - throw new TtsMakeException("tts make sqs request timeout..."); - } - } +// public TtsSentenceDto makeTtsMulti(@NotNull Long sentenceSeq) { +// +// // 0. sentenceSeq 로 행 정보 조회 +// TtsSentence ttsSentence = ttsSentenceRepository.findById(sentenceSeq) +// .orElseThrow(() -> new EntityNotFoundException("존재하지 않는 TTS 행입니다. id:" + sentenceSeq)); +// try { +// // 1. TTS 문장 '진행중' 상태 저장 +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.IN_PROGRESS); +// +// // 2. TTS 생성 및 s3 업로드 요청 +// Message message = sqsService.sendMessage( +// TtsMakeRequest.of(ttsSentence, makeFilename(ttsSentence)), +// MessageType.TTS_MAKE +// ); +// TtsMakeResponse ttsMakeResponse = objectMapper.readValue(message.body(), TtsMakeResponse.class); +// +// // 3. TTS 결과 저장 +// TtsSentenceDto ttsSentenceDto = saveTtsMakeResultService.saveTtsMakeResult(ttsMakeResponse, ttsSentence); +// +// // 4. TTS 문장 '완료' 상태 저장 +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FINISHED); +// +// return ttsSentenceDto; +// +// } catch (RuntimeException e) { +// // 예외 발생 시 TTS 문장 '실패' 상태 저장 +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); +// throw new TtsMakeException("TTS 생성 중 예외 발생"); +// } catch (JsonProcessingException e) { +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); +// throw new TtsMakeException("tts 생성 응답 메세지 body 값을 TtsMakeResponse 객체로 변환 중 에러 발생"); +// } catch (TimeoutException e) { +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); +// throw new TtsMakeException("tts make sqs request timeout..."); +// } +// } // TTS 생성 private MultipartFile makeTtsAudioFile(@NotNull TtsSentence ttsSentence) { From 066685f5179fbc4c444c6d0f169171b3857fc6a8 Mon Sep 17 00:00:00 2001 From: oowtl Date: Mon, 9 Dec 2024 20:17:22 +0900 Subject: [PATCH 056/167] =?UTF-8?q?[fix]=20sqs=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatWithBgmController.java | 4 +- .../global/component/SqsService.java | 124 +++++++++--------- .../tts/controller/TtsController.java | 51 +++---- .../tts/service/TtsMakeService.java | 82 ++++++------ 4 files changed, 131 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index f208eee4..c90b40b9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -15,7 +15,7 @@ import com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator; import com.oreo.finalproject_5re5_be.concat.service.concatenator.StereoIntervalConcatenator; import com.oreo.finalproject_5re5_be.global.component.S3Service; -import com.oreo.finalproject_5re5_be.global.component.SqsService; +//import com.oreo.finalproject_5re5_be.global.component.SqsService; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; @@ -49,7 +49,7 @@ public class ConcatWithBgmController { private final S3Service s3Service; private final MaterialAudioService materialAudioService; private final ConcatResultService concatResultService; - private final SqsService sqsService; +// private final SqsService sqsService; private final AudioFileService audioFileService; private final AudioStreamService audioStreamService; // 추가된 서비스 private final AudioResample audioResample = new AudioResample(); // 리샘플링 유틸. Bean이 아니라 new로 생성 diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java index 03b0906d..8c47e9ca 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java @@ -1,62 +1,62 @@ -package com.oreo.finalproject_5re5_be.global.component; - -import com.amazonaws.services.sqs.AmazonSQSRequester; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.oreo.finalproject_5re5_be.global.constant.MessageType; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import software.amazon.awssdk.services.sqs.SqsClient; -import software.amazon.awssdk.services.sqs.model.Message; -import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; -import software.amazon.awssdk.services.sqs.model.SendMessageRequest; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -@Component -public class SqsService { - private final SqsClient sqsClient; - private final AmazonSQSRequester amazonSQSRequester; - - @Value("${AWS_SQS_QUEUE_URL}") - private String sqsQueueUrl; - - @Value("${AWS_SQS_VIRTUAL_QUEUE_NAME}") - private String virtualQueueName; - - public SqsService(SqsClient sqsClient, AmazonSQSRequester amazonSQSRequester) { - this.sqsClient = sqsClient; - this.amazonSQSRequester = amazonSQSRequester; - } - - public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, JsonProcessingException { - // 변수 설정 - // 가상 대기열 사용 - String requestQueueUrl = sqsQueueUrl + virtualQueueName; - - // DTO를 JSON으로 변환 - ObjectMapper objectMapper = new ObjectMapper(); - String messageBody = objectMapper.writeValueAsString(dto); - - // 메시지 속성 설정 - Map messageAttributes = new HashMap<>(); - messageAttributes.put("messageType", - MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); - - // sqs에 메세지 보내기 - SendMessageRequest sendRequest = SendMessageRequest.builder() - .queueUrl(requestQueueUrl) - .messageBody(messageBody) - .messageAttributes(messageAttributes) - .messageGroupId("messageGroup1") - .build(); - - Message response = amazonSQSRequester.sendMessageAndGetResponse(sendRequest, 50, - TimeUnit.SECONDS); - - return response; - } -} +//package com.oreo.finalproject_5re5_be.global.component; +// +//import com.amazonaws.services.sqs.AmazonSQSRequester; +//import com.fasterxml.jackson.core.JsonProcessingException; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import com.oreo.finalproject_5re5_be.global.constant.MessageType; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +//import software.amazon.awssdk.services.sqs.SqsClient; +//import software.amazon.awssdk.services.sqs.model.Message; +//import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; +//import software.amazon.awssdk.services.sqs.model.SendMessageRequest; +// +//import java.util.HashMap; +//import java.util.Map; +//import java.util.concurrent.TimeUnit; +//import java.util.concurrent.TimeoutException; +// +//@Component +//public class SqsService { +// private final SqsClient sqsClient; +// private final AmazonSQSRequester amazonSQSRequester; +// +// @Value("${AWS_SQS_QUEUE_URL}") +// private String sqsQueueUrl; +// +// @Value("${AWS_SQS_VIRTUAL_QUEUE_NAME}") +// private String virtualQueueName; +// +// public SqsService(SqsClient sqsClient, AmazonSQSRequester amazonSQSRequester) { +// this.sqsClient = sqsClient; +// this.amazonSQSRequester = amazonSQSRequester; +// } +// +// public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, JsonProcessingException { +// // 변수 설정 +// // 가상 대기열 사용 +// String requestQueueUrl = sqsQueueUrl + virtualQueueName; +// +// // DTO를 JSON으로 변환 +// ObjectMapper objectMapper = new ObjectMapper(); +// String messageBody = objectMapper.writeValueAsString(dto); +// +// // 메시지 속성 설정 +// Map messageAttributes = new HashMap<>(); +// messageAttributes.put("messageType", +// MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); +// +// // sqs에 메세지 보내기 +// SendMessageRequest sendRequest = SendMessageRequest.builder() +// .queueUrl(requestQueueUrl) +// .messageBody(messageBody) +// .messageAttributes(messageAttributes) +// .messageGroupId("messageGroup1") +// .build(); +// +// Message response = amazonSQSRequester.sendMessageAndGetResponse(sendRequest, 50, +// TimeUnit.SECONDS); +// +// return response; +// } +//} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java index 33ddc1aa..e575d4b5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java @@ -248,31 +248,32 @@ public ResponseEntity> makeTts( ); } - @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") - @GetMapping("/sentence/{tsSeq}/maketts/multi") - public ResponseEntity> makeTtsMuti( - @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq, - @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, - HttpSession session) { - // 회원의 정보인지 확인 - Long memberSeq = (Long) session.getAttribute("memberSeq"); - projectService.projectCheck(memberSeq, proSeq); - - // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) - ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); - - // tts 생성 - TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); - - return ResponseEntity - .status(HttpStatus.CREATED) - .body( - new ResponseDto<>( - HttpStatus.CREATED.value(), - ttsMakeResult - ) - ); - } +// @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") +// @GetMapping("/sentence/{tsSeq}/maketts/multi") +// public ResponseEntity> makeTtsMuti( +// @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq +// ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq +// , @SessionAttribute(value = "memberSeq") Long memberSeq +// ) { +// +// // 회원의 정보인지 확인 +// projectService.projectCheck(memberSeq, proSeq); +// +// // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) +// ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); +// +// // tts 생성 +// TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); +// +// return ResponseEntity +// .status(HttpStatus.CREATED) +// .body( +// new ResponseDto<>( +// HttpStatus.CREATED.value(), +// ttsMakeResult +// ) +// ); +// } @Operation(summary = "TTS 문장 삭제 요청") @DeleteMapping("/sentence/{tsSeq}") diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java index bd7e54af..d5bada19 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.oreo.finalproject_5re5_be.global.component.S3Service; -import com.oreo.finalproject_5re5_be.global.component.SqsService; +//import com.oreo.finalproject_5re5_be.global.component.SqsService; import com.oreo.finalproject_5re5_be.global.constant.MessageType; import com.oreo.finalproject_5re5_be.global.exception.EntityNotFoundException; import com.oreo.finalproject_5re5_be.tts.client.AudioConfigGenerator; @@ -39,7 +39,7 @@ public class TtsMakeService { private final GoogleTTSService googleTTSService; private final S3Service s3Service; private final SaveTtsMakeResultService saveTtsMakeResultService; - private final SqsService sqsService; +// private final SqsService sqsService; private final ObjectMapper objectMapper = new ObjectMapper(); public TtsMakeService( @@ -48,8 +48,8 @@ public TtsMakeService( S3Service s3Service, SaveTtsMakeResultService saveTtsMakeResultService, VoiceRepository voiceRepository, - TtsProgressStatusRepository ttsProgressStatusRepository, - SqsService sqsService + TtsProgressStatusRepository ttsProgressStatusRepository +// SqsService sqsService ) { this.ttsSentenceRepository = ttsSentenceRepository; this.googleTTSService = googleTTSService; @@ -57,7 +57,7 @@ public TtsMakeService( this.saveTtsMakeResultService = saveTtsMakeResultService; this.voiceRepository = voiceRepository; this.ttsProgressStatusRepository = ttsProgressStatusRepository; - this.sqsService = sqsService; +// this.sqsService = sqsService; } // TTS 생성 서비스 @@ -89,42 +89,42 @@ public TtsSentenceDto makeTts(@NotNull Long sentenceSeq) { } } - public TtsSentenceDto makeTtsMulti(@NotNull Long sentenceSeq) { - - // 0. sentenceSeq 로 행 정보 조회 - TtsSentence ttsSentence = ttsSentenceRepository.findById(sentenceSeq) - .orElseThrow(() -> new EntityNotFoundException("존재하지 않는 TTS 행입니다. id:" + sentenceSeq)); - try { - // 1. TTS 문장 '진행중' 상태 저장 - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.IN_PROGRESS); - - // 2. TTS 생성 및 s3 업로드 요청 - Message message = sqsService.sendMessage( - TtsMakeRequest.of(ttsSentence, makeFilename(ttsSentence)), - MessageType.TTS_MAKE - ); - TtsMakeResponse ttsMakeResponse = objectMapper.readValue(message.body(), TtsMakeResponse.class); - - // 3. TTS 결과 저장 - TtsSentenceDto ttsSentenceDto = saveTtsMakeResultService.saveTtsMakeResult(ttsMakeResponse, ttsSentence); - - // 4. TTS 문장 '완료' 상태 저장 - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FINISHED); - - return ttsSentenceDto; - - } catch (RuntimeException e) { - // 예외 발생 시 TTS 문장 '실패' 상태 저장 - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); - throw new TtsMakeException("TTS 생성 중 예외 발생"); - } catch (JsonProcessingException e) { - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); - throw new TtsMakeException("tts 생성 응답 메세지 body 값을 TtsMakeResponse 객체로 변환 중 에러 발생"); - } catch (TimeoutException e) { - saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); - throw new TtsMakeException("tts make sqs request timeout..."); - } - } +// public TtsSentenceDto makeTtsMulti(@NotNull Long sentenceSeq) { +// +// // 0. sentenceSeq 로 행 정보 조회 +// TtsSentence ttsSentence = ttsSentenceRepository.findById(sentenceSeq) +// .orElseThrow(() -> new EntityNotFoundException("존재하지 않는 TTS 행입니다. id:" + sentenceSeq)); +// try { +// // 1. TTS 문장 '진행중' 상태 저장 +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.IN_PROGRESS); +// +// // 2. TTS 생성 및 s3 업로드 요청 +// Message message = sqsService.sendMessage( +// TtsMakeRequest.of(ttsSentence, makeFilename(ttsSentence)), +// MessageType.TTS_MAKE +// ); +// TtsMakeResponse ttsMakeResponse = objectMapper.readValue(message.body(), TtsMakeResponse.class); +// +// // 3. TTS 결과 저장 +// TtsSentenceDto ttsSentenceDto = saveTtsMakeResultService.saveTtsMakeResult(ttsMakeResponse, ttsSentence); +// +// // 4. TTS 문장 '완료' 상태 저장 +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FINISHED); +// +// return ttsSentenceDto; +// +// } catch (RuntimeException e) { +// // 예외 발생 시 TTS 문장 '실패' 상태 저장 +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); +// throw new TtsMakeException("TTS 생성 중 예외 발생"); +// } catch (JsonProcessingException e) { +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); +// throw new TtsMakeException("tts 생성 응답 메세지 body 값을 TtsMakeResponse 객체로 변환 중 에러 발생"); +// } catch (TimeoutException e) { +// saveTtsProgressStatus(ttsSentence, TtsProgressStatusCode.FAILED); +// throw new TtsMakeException("tts make sqs request timeout..."); +// } +// } // TTS 생성 private MultipartFile makeTtsAudioFile(@NotNull TtsSentence ttsSentence) { From b3413126abfd3a47f0d98c409a4a98bab9fbc1c5 Mon Sep 17 00:00:00 2001 From: oowtl Date: Mon, 9 Dec 2024 21:24:23 +0900 Subject: [PATCH 057/167] =?UTF-8?q?[fix]=20sqs=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 8 +- .../global/config/SqsConfig.java | 82 +++++++++---------- .../tts/service/TtsMakeService.java | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index c63d6384..03fc11ea 100644 --- a/build.gradle +++ b/build.gradle @@ -95,14 +95,14 @@ dependencies { implementation platform('com.amazonaws:aws-java-sdk-bom:1.12.529') implementation 'com.amazonaws:aws-java-sdk-s3' - // https://mvnrepository.com/artifact/software.amazon.awssdk/sqs - implementation group: 'software.amazon.awssdk', name: 'sqs', version: '2.21.46' +// // https://mvnrepository.com/artifact/software.amazon.awssdk/sqs +// implementation group: 'software.amazon.awssdk', name: 'sqs', version: '2.21.46' // https://mvnrepository.com/artifact/software.amazon.awssdk/auth implementation group: 'software.amazon.awssdk', name: 'auth', version: '2.21.46' - // https://mvnrepository.com/artifact/com.amazonaws/amazon-sqs-java-temporary-queues-client - implementation group: 'com.amazonaws', name: 'amazon-sqs-java-temporary-queues-client', version: '2.0.1' +// // https://mvnrepository.com/artifact/com.amazonaws/amazon-sqs-java-temporary-queues-client +// implementation group: 'com.amazonaws', name: 'amazon-sqs-java-temporary-queues-client', version: '2.0.1' //http request diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java index 3ec66377..5d07fd9a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java @@ -1,41 +1,41 @@ -package com.oreo.finalproject_5re5_be.global.config; - -import com.amazonaws.services.sqs.AmazonSQSRequester; -import com.amazonaws.services.sqs.AmazonSQSRequesterClientBuilder; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.sqs.SqsClient; - -@Configuration -public class SqsConfig { - - @Value("${AWS_SQS_ACCESS_KEY_ID}") - private String sqsAccessKey; - - @Value("${AWS_SQS_SECRET_ACCESS_KEY}") - private String sqsSecretKey; - - @Bean - public SqsClient sqsClient() { - // 임시 자격 증명 사용 - StaticCredentialsProvider staticCredentialsProvider = StaticCredentialsProvider.create( - software.amazon.awssdk.auth.credentials.AwsBasicCredentials.create(sqsAccessKey, - sqsSecretKey) - ); - - return SqsClient.builder() - .region(Region.AP_NORTHEAST_2) - .credentialsProvider(staticCredentialsProvider) - .build(); - } - - @Bean - public AmazonSQSRequester amazonSQSRequester(SqsClient sqsClient) { - return AmazonSQSRequesterClientBuilder.standard() - .withAmazonSQS(sqsClient) - .build(); - } -} +//package com.oreo.finalproject_5re5_be.global.config; +// +//import com.amazonaws.services.sqs.AmazonSQSRequester; +//import com.amazonaws.services.sqs.AmazonSQSRequesterClientBuilder; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +//import software.amazon.awssdk.regions.Region; +//import software.amazon.awssdk.services.sqs.SqsClient; +// +//@Configuration +//public class SqsConfig { +// +// @Value("${AWS_SQS_ACCESS_KEY_ID}") +// private String sqsAccessKey; +// +// @Value("${AWS_SQS_SECRET_ACCESS_KEY}") +// private String sqsSecretKey; +// +// @Bean +// public SqsClient sqsClient() { +// // 임시 자격 증명 사용 +// StaticCredentialsProvider staticCredentialsProvider = StaticCredentialsProvider.create( +// software.amazon.awssdk.auth.credentials.AwsBasicCredentials.create(sqsAccessKey, +// sqsSecretKey) +// ); +// +// return SqsClient.builder() +// .region(Region.AP_NORTHEAST_2) +// .credentialsProvider(staticCredentialsProvider) +// .build(); +// } +// +// @Bean +// public AmazonSQSRequester amazonSQSRequester(SqsClient sqsClient) { +// return AmazonSQSRequesterClientBuilder.standard() +// .withAmazonSQS(sqsClient) +// .build(); +// } +//} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java index d5bada19..86a4d5ae 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java @@ -25,7 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.web.multipart.MultipartFile; -import software.amazon.awssdk.services.sqs.model.Message; +//import software.amazon.awssdk.services.sqs.model.Message; import java.util.concurrent.TimeoutException; From beab0f5bb2b279bf74d2a88913d65af244e3f5da Mon Sep 17 00:00:00 2001 From: oowtl Date: Mon, 9 Dec 2024 21:24:23 +0900 Subject: [PATCH 058/167] =?UTF-8?q?[fix]=20sqs=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EB=B0=8F=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 8 +- .../global/config/SqsConfig.java | 82 +++++++++---------- .../tts/service/TtsMakeService.java | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/build.gradle b/build.gradle index c63d6384..03fc11ea 100644 --- a/build.gradle +++ b/build.gradle @@ -95,14 +95,14 @@ dependencies { implementation platform('com.amazonaws:aws-java-sdk-bom:1.12.529') implementation 'com.amazonaws:aws-java-sdk-s3' - // https://mvnrepository.com/artifact/software.amazon.awssdk/sqs - implementation group: 'software.amazon.awssdk', name: 'sqs', version: '2.21.46' +// // https://mvnrepository.com/artifact/software.amazon.awssdk/sqs +// implementation group: 'software.amazon.awssdk', name: 'sqs', version: '2.21.46' // https://mvnrepository.com/artifact/software.amazon.awssdk/auth implementation group: 'software.amazon.awssdk', name: 'auth', version: '2.21.46' - // https://mvnrepository.com/artifact/com.amazonaws/amazon-sqs-java-temporary-queues-client - implementation group: 'com.amazonaws', name: 'amazon-sqs-java-temporary-queues-client', version: '2.0.1' +// // https://mvnrepository.com/artifact/com.amazonaws/amazon-sqs-java-temporary-queues-client +// implementation group: 'com.amazonaws', name: 'amazon-sqs-java-temporary-queues-client', version: '2.0.1' //http request diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java index 3ec66377..5d07fd9a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/SqsConfig.java @@ -1,41 +1,41 @@ -package com.oreo.finalproject_5re5_be.global.config; - -import com.amazonaws.services.sqs.AmazonSQSRequester; -import com.amazonaws.services.sqs.AmazonSQSRequesterClientBuilder; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; -import software.amazon.awssdk.regions.Region; -import software.amazon.awssdk.services.sqs.SqsClient; - -@Configuration -public class SqsConfig { - - @Value("${AWS_SQS_ACCESS_KEY_ID}") - private String sqsAccessKey; - - @Value("${AWS_SQS_SECRET_ACCESS_KEY}") - private String sqsSecretKey; - - @Bean - public SqsClient sqsClient() { - // 임시 자격 증명 사용 - StaticCredentialsProvider staticCredentialsProvider = StaticCredentialsProvider.create( - software.amazon.awssdk.auth.credentials.AwsBasicCredentials.create(sqsAccessKey, - sqsSecretKey) - ); - - return SqsClient.builder() - .region(Region.AP_NORTHEAST_2) - .credentialsProvider(staticCredentialsProvider) - .build(); - } - - @Bean - public AmazonSQSRequester amazonSQSRequester(SqsClient sqsClient) { - return AmazonSQSRequesterClientBuilder.standard() - .withAmazonSQS(sqsClient) - .build(); - } -} +//package com.oreo.finalproject_5re5_be.global.config; +// +//import com.amazonaws.services.sqs.AmazonSQSRequester; +//import com.amazonaws.services.sqs.AmazonSQSRequesterClientBuilder; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +//import software.amazon.awssdk.regions.Region; +//import software.amazon.awssdk.services.sqs.SqsClient; +// +//@Configuration +//public class SqsConfig { +// +// @Value("${AWS_SQS_ACCESS_KEY_ID}") +// private String sqsAccessKey; +// +// @Value("${AWS_SQS_SECRET_ACCESS_KEY}") +// private String sqsSecretKey; +// +// @Bean +// public SqsClient sqsClient() { +// // 임시 자격 증명 사용 +// StaticCredentialsProvider staticCredentialsProvider = StaticCredentialsProvider.create( +// software.amazon.awssdk.auth.credentials.AwsBasicCredentials.create(sqsAccessKey, +// sqsSecretKey) +// ); +// +// return SqsClient.builder() +// .region(Region.AP_NORTHEAST_2) +// .credentialsProvider(staticCredentialsProvider) +// .build(); +// } +// +// @Bean +// public AmazonSQSRequester amazonSQSRequester(SqsClient sqsClient) { +// return AmazonSQSRequesterClientBuilder.standard() +// .withAmazonSQS(sqsClient) +// .build(); +// } +//} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java index d5bada19..86a4d5ae 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/service/TtsMakeService.java @@ -25,7 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.web.multipart.MultipartFile; -import software.amazon.awssdk.services.sqs.model.Message; +//import software.amazon.awssdk.services.sqs.model.Message; import java.util.concurrent.TimeoutException; From bc3a2f2370c6ca6c9e91439375ca1e53f4aa9bcd Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:45:21 +0900 Subject: [PATCH 059/167] =?UTF-8?q?[Feat]=20:=20=EA=B8=80=EB=A1=9C?= =?UTF-8?q?=EB=B2=8C=20=EC=98=88=EC=99=B8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/RestGlobalExceptionHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java index 64b5a68e..575bf326 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java @@ -5,6 +5,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.multipart.MultipartException; @RestControllerAdvice public class RestGlobalExceptionHandler { @@ -12,4 +13,10 @@ public class RestGlobalExceptionHandler { public ResponseEntity> handleDataNotFoundException(DataNotFoundException ex) { return new ResponseDto<>(HttpStatus.NOT_FOUND.value(), ex.getMessage()).toResponseEntity(); } + + + @ExceptionHandler(MultipartException.class) + public ResponseEntity> handleMultipartException(MultipartException ex) { + return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), ex.getMessage()).toResponseEntity(); + } } \ No newline at end of file From 8b8a37be8875124d3efd1237ef4aa1311d107857 Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:45:56 +0900 Subject: [PATCH 060/167] =?UTF-8?q?[Chore]=20:=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=9A=A9=EB=9F=89=2050MB=EB=A1=9C=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a04cf484..e1de9ae6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -24,9 +24,10 @@ spring.jpa.properties.hibernate.jdbc.batch_size=20 spring.jpa.properties.hibernate.order_inserts=true spring.jpa.properties.hibernate.order_updates=true -spring.servlet.multipart.max-file-size=10MB -spring.servlet.multipart.enabled=true +spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.file-size-threshold=100MB +spring.servlet.multipart.max-request-size=50MB +spring.servlet.multipart.enabled=true #logging.level.org.apache.catalina=DEBUG #logging.level.org.springframework.security=DEBUG From 644ed499b3def34da3de9ca80da4302f84a4b198 Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:46:36 +0900 Subject: [PATCH 061/167] =?UTF-8?q?[Refactor]=20:=20Concat=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EC=8B=9C=20=20@AuthenticationPrincipal=20=EC=9D=84?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java index 4dc040fa..8c758a29 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java @@ -38,11 +38,11 @@ public class ConcatController { ) @PostMapping("") public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, - @RequestParam Long memberSeq) throws IOException { - projectService.projectCheck(memberSeq, audioRequests.getConcatTabId()); + @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { + projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); ConcatTabResponseDto concatTabResponseDto - = concatTabService.readConcatTab(audioRequests.getConcatTabId(), memberSeq); + = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); } From dad194795b98e34f9bc414b1dc731b8e723688ac Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:50:04 +0900 Subject: [PATCH 062/167] =?UTF-8?q?[Refactor]=20:=20=EC=9E=AC=EB=A3=8C?= =?UTF-8?q?=EC=98=A4=EB=94=94=EC=98=A4=20=EC=A0=80=EC=9E=A5=EC=A4=91=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=8B=9C=20=EC=98=88=EC=99=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EB=8F=84=20=EA=B0=99=EC=9D=B4=20=EB=B3=B4=EB=82=B4?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/MaterialAudioService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java index 0255e31b..d3a82385 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java @@ -144,7 +144,7 @@ public boolean saveMaterialAudio(List materialAudios) { materialAudioRepository.saveAll(materialAudios); return true; } catch (Exception e) { - throw new IllegalArgumentException("재료 오디오 저장 실패"); + throw new IllegalArgumentException("재료 오디오 저장 실패", e); } } From f73ed47bd24b0d07924f24bd632a978edbc219da Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 02:15:48 +0900 Subject: [PATCH 063/167] =?UTF-8?q?[Fix]=20:=20=EC=9E=AC=EB=A3=8C=20?= =?UTF-8?q?=EC=98=A4=EB=94=94=EC=98=A4=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=98=A4=EB=94=94=EC=98=A4=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EB=94=94=EA=B0=80=20=EC=95=84=EB=8B=88?= =?UTF-8?q?=EB=9D=BC=20=ED=96=89=EC=9D=98=20=EC=95=84=EC=9D=B4=EB=94=94?= =?UTF-8?q?=EB=A5=BC=20=EC=B0=B8=EC=A1=B0=ED=95=98=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/concat/service/ConcatService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java index 52d01927..ca751d0f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java @@ -129,7 +129,7 @@ public List prepareMaterialAudio(List audios, C return audios.stream().map(aud -> MaterialAudio.builder() .concatResult(concatResult) .method("Normal") - .audioFile(AudioFile.builder().audioFileSeq(aud.getSeq()).build()) + .audioFile(AudioFile.builder().audioFileSeq(aud.getOriginAudioRequest().getSeq()).build()) .build()).toList(); } From 94c5280d578e604420b797d27843cc339493a48e Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:45:21 +0900 Subject: [PATCH 064/167] =?UTF-8?q?[Feat]=20:=20=EA=B8=80=EB=A1=9C?= =?UTF-8?q?=EB=B2=8C=20=EC=98=88=EC=99=B8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/RestGlobalExceptionHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java index 64b5a68e..575bf326 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java @@ -5,6 +5,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.multipart.MultipartException; @RestControllerAdvice public class RestGlobalExceptionHandler { @@ -12,4 +13,10 @@ public class RestGlobalExceptionHandler { public ResponseEntity> handleDataNotFoundException(DataNotFoundException ex) { return new ResponseDto<>(HttpStatus.NOT_FOUND.value(), ex.getMessage()).toResponseEntity(); } + + + @ExceptionHandler(MultipartException.class) + public ResponseEntity> handleMultipartException(MultipartException ex) { + return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), ex.getMessage()).toResponseEntity(); + } } \ No newline at end of file From def120b84c1046c9fbae9e6f12b7835aae3a226c Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:45:56 +0900 Subject: [PATCH 065/167] =?UTF-8?q?[Chore]=20:=20=EC=B5=9C=EB=8C=80=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=9A=A9=EB=9F=89=2050MB=EB=A1=9C=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.properties | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a04cf484..e1de9ae6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -24,9 +24,10 @@ spring.jpa.properties.hibernate.jdbc.batch_size=20 spring.jpa.properties.hibernate.order_inserts=true spring.jpa.properties.hibernate.order_updates=true -spring.servlet.multipart.max-file-size=10MB -spring.servlet.multipart.enabled=true +spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.file-size-threshold=100MB +spring.servlet.multipart.max-request-size=50MB +spring.servlet.multipart.enabled=true #logging.level.org.apache.catalina=DEBUG #logging.level.org.springframework.security=DEBUG From 68d121368e98d026e3a612faa2a7055da043a4fc Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:46:36 +0900 Subject: [PATCH 066/167] =?UTF-8?q?[Refactor]=20:=20Concat=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EC=8B=9C=20=20@AuthenticationPrincipal=20=EC=9D=84?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java index 4dc040fa..8c758a29 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java @@ -38,11 +38,11 @@ public class ConcatController { ) @PostMapping("") public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, - @RequestParam Long memberSeq) throws IOException { - projectService.projectCheck(memberSeq, audioRequests.getConcatTabId()); + @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { + projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); ConcatTabResponseDto concatTabResponseDto - = concatTabService.readConcatTab(audioRequests.getConcatTabId(), memberSeq); + = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); } From e5ab97a771b8522969f728dc9b6363b812644d08 Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 01:50:04 +0900 Subject: [PATCH 067/167] =?UTF-8?q?[Refactor]=20:=20=EC=9E=AC=EB=A3=8C?= =?UTF-8?q?=EC=98=A4=EB=94=94=EC=98=A4=20=EC=A0=80=EC=9E=A5=EC=A4=91=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=8B=9C=20=EC=98=88=EC=99=B8=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EB=8F=84=20=EA=B0=99=EC=9D=B4=20=EB=B3=B4=EB=82=B4?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/MaterialAudioService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java index 0255e31b..d3a82385 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java @@ -144,7 +144,7 @@ public boolean saveMaterialAudio(List materialAudios) { materialAudioRepository.saveAll(materialAudios); return true; } catch (Exception e) { - throw new IllegalArgumentException("재료 오디오 저장 실패"); + throw new IllegalArgumentException("재료 오디오 저장 실패", e); } } From 9a7a134865b45a42acd7e3c4ede24338a1519782 Mon Sep 17 00:00:00 2001 From: K-KY Date: Tue, 10 Dec 2024 02:15:48 +0900 Subject: [PATCH 068/167] =?UTF-8?q?[Fix]=20:=20=EC=9E=AC=EB=A3=8C=20?= =?UTF-8?q?=EC=98=A4=EB=94=94=EC=98=A4=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=98=A4=EB=94=94=EC=98=A4=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EB=94=94=EA=B0=80=20=EC=95=84=EB=8B=88?= =?UTF-8?q?=EB=9D=BC=20=ED=96=89=EC=9D=98=20=EC=95=84=EC=9D=B4=EB=94=94?= =?UTF-8?q?=EB=A5=BC=20=EC=B0=B8=EC=A1=B0=ED=95=98=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/concat/service/ConcatService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java index 52d01927..ca751d0f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java @@ -129,7 +129,7 @@ public List prepareMaterialAudio(List audios, C return audios.stream().map(aud -> MaterialAudio.builder() .concatResult(concatResult) .method("Normal") - .audioFile(AudioFile.builder().audioFileSeq(aud.getSeq()).build()) + .audioFile(AudioFile.builder().audioFileSeq(aud.getOriginAudioRequest().getSeq()).build()) .build()).toList(); } From 4aa2ab43f57cbc938f210caf4682db10d4f2699d Mon Sep 17 00:00:00 2001 From: jongheonleee Date: Tue, 10 Dec 2024 12:31:14 +0900 Subject: [PATCH 069/167] =?UTF-8?q?[chore]=20=EB=A6=AC=EB=93=9C=EB=AF=B8?= =?UTF-8?q?=201=EC=B0=A8=20=EC=B4=88=EC=95=88=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/Compose.png | Bin 0 -> 35090 bytes images/RDS.png | Bin 0 -> 3949 bytes images/google-sheet.png | Bin 0 -> 9880 bytes images/google-slides.png | Bin 0 -> 8026 bytes images/img.png | Bin 0 -> 89318 bytes images/img_1.png | Bin 0 -> 119721 bytes images/img_2.png | Bin 0 -> 73483 bytes images/img_3.png | Bin 0 -> 48639 bytes images/img_4.png | Bin 0 -> 142745 bytes images/img_5.png | Bin 0 -> 101069 bytes images/img_6.png | Bin 0 -> 75433 bytes images/img_7.png | Bin 0 -> 1719 bytes images/lombok.png | Bin 0 -> 31076 bytes images/spring-data-jpa.png | Bin 0 -> 22190 bytes images/spring-security.png | Bin 0 -> 18268 bytes images/spring.png | Bin 0 -> 13454 bytes images/zoom.png | Bin 0 -> 26864 bytes 17 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/Compose.png create mode 100644 images/RDS.png create mode 100644 images/google-sheet.png create mode 100644 images/google-slides.png create mode 100644 images/img.png create mode 100644 images/img_1.png create mode 100644 images/img_2.png create mode 100644 images/img_3.png create mode 100644 images/img_4.png create mode 100644 images/img_5.png create mode 100644 images/img_6.png create mode 100644 images/img_7.png create mode 100644 images/lombok.png create mode 100644 images/spring-data-jpa.png create mode 100644 images/spring-security.png create mode 100644 images/spring.png create mode 100644 images/zoom.png diff --git a/images/Compose.png b/images/Compose.png new file mode 100644 index 0000000000000000000000000000000000000000..2adee09b04cf924e2e47ad2f43215b7d4fce85f4 GIT binary patch literal 35090 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 AD*ylh literal 0 HcmV?d00001 diff --git a/images/RDS.png b/images/RDS.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c34b0e40e508c05540c5d5cb492d050dc5edba GIT binary patch literal 3949 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 literal 0 HcmV?d00001 diff --git a/images/google-sheet.png b/images/google-sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b68b83b2b0a821a06b83b2e050cc804cefb4dd GIT binary patch literal 9880 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 H`OE(RLv#pZ literal 0 HcmV?d00001 diff --git a/images/img.png b/images/img.png new file mode 100644 index 0000000000000000000000000000000000000000..bf05a64747a4ef8a38b56ab8cf6e187b80b95561 GIT binary patch literal 89318 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%0DlP0K0FiVushQ+qqfRo=Vwi`GmEFb9MvY?3l2{f+ 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�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 KMNUMnLSTYPWWdJ& literal 0 HcmV?d00001 diff --git a/images/img_2.png b/images/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3384c3c7a20a8008e341635a20462809d6300ead GIT binary patch literal 73483 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

cZncoQ(VTAN}*T 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 literal 0 HcmV?d00001 diff --git a/images/img_3.png b/images/img_3.png new file mode 100644 index 0000000000000000000000000000000000000000..85179eb2edc8f42aca6316b14b343f187b38b4f5 GIT binary patch literal 48639 zcmeGEXIPWz+BOX1IEspZ9i(NHu_8^Xw5W`tBH*Zi5+O2CdX*LkB;zQcLJ}LjL_|Qv zfV5DP2uPwJgc>?AiAW~|2nnRU7c=8p|TS<%2){@%s;le=1FtDUJPcTdD31 zO(BV+x@XTr^xGeQSTidf;(toZjP%%l?1{zLjYuoT)XFuzGy~7J^N*thyfk4QY?e~l zSU2ovB_lI^dcn9(-H9X$fB5s+$KiPqpAdTt6|-xna56G)&38lgoqhb&rWH0d`#9#g zoQzC`hhNgqXD@2(hOCh}XaOq(-ZTH9Z0)r_ApS2845ue?Ejw#LLL+$S!dNUKRP}laq|hCR*R&vyWd`+`6eHBNOZS zzw=AV2Wft;Z}sms>0YkS-?Ga{WPr?myiT4>5R7gjcF%Ejqz5{G<}duxA(bMxgUHa(CZ4)w7LwkyR-x$Vk)kZDLTHi*)Y%}iWJY}mbkh&TAkllN?! z0kvgX{*-Ctd%-m1>%*Y0i|))f-kK_jn>_6z4`&)h`k5kFg7w=QuWsKTUq-Q$_e@ON z6_8%B_tRCW$CWMM-h@3CR+Gy?l;zyUS7VqB42y^x8TS6|JOr%aX771

  • =zMRl^( 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 FzW^MfuuT8} literal 0 HcmV?d00001 diff --git a/images/img_4.png b/images/img_4.png new file mode 100644 index 0000000000000000000000000000000000000000..89a1ee7e9395e67a18328f6d852e8653582afaa4 GIT binary patch literal 142745 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
    XrQ7X?z{+TuCXC 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 KRit4X_P+piFkemp literal 0 HcmV?d00001 diff --git a/images/img_5.png b/images/img_5.png new file mode 100644 index 0000000000000000000000000000000000000000..fed0445e6d87424dc90d0c221e32e96bfd2a7760 GIT binary patch literal 101069 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
    s<-@&&e@~^(QMeQb`$_>1J{s1pX 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 LNkvXXu0mjfpQxkw literal 0 HcmV?d00001 diff --git a/images/img_7.png b/images/img_7.png new file mode 100644 index 0000000000000000000000000000000000000000..8e58c9b20b14314aa4ca7ff1487c6640962fd6f8 GIT binary patch literal 1719 zcmeAS@N?(olHy`uVBq!ia0vp^7l8O02OE%F@Rui(fq|{g)5S5QBJSd1>eikd^1dUf82L5`{$1t z&mZmFc>VQ7%g>+JJWu-;w|3c6-*eL^-(O?(`Ddi1b@S~^yZLL+e@%VM(!V@9c#s6J)WOFtJe1M4Nr#U{AoX@#WQS=t-rT^7x(dZ4ZkjJ zi}y>Xw*D|J@}U#%l8K zQN`b5{Pq%?Pyc>g^e6T1hxOj_0s9YMjI~~K@xP!=Rm65@##mFvrRobjn7sTQCbCSK z*Pz6yVaw<$6i~&~rLy1)i-@PgOHPeR4VQ!iR7Mq27Cf=F4&Qe_++Q8=?Y{Kp(|h$6 zxR)N@ulKrPm#p26b)_rr4cpO2N6Kfj+|^)P<= z(buwd8SSROivRv7yvtY4c4hXyIa5#8FAJIFnjEvEo98w&#L|0f%YO2JiOP_nMCLyN`qIp*_&H87dJ^6Cx%smT^ z(LHtL%vgo`H#K%R40C6 zIxKMe-rY*<{hR0K&i}ehW5H^*p^~asa<8c0_w3Pg*O}$&?|e7>Ne$fhcXdM+r^byR z{{ny3eOXlVfBo!-8UI}?KfQeT>*xH#$*GeY7L|rCeAt}5`0Md4g>!OLVI>c|2%-_A z;3=bQOAp9lTd_TDv+G@dp`9s7cA_5 zUSp|QZNGlm)2mr(N-HkZCt1gzyY?}LrNmBqe@Wch^)8!x?XsWxDUoDaPVo*$HJS-_PO^ReWJX_Q&XB!nIQc(o!DZZu~f!$ zNp?~h{YK{|OMumQ=X5GuPJ$qu?)OS6Rug7NwF=!puW5Qdh^}H11|`ez?1{lfc~C+6uoO2TnW*pV+{g z>FH&`)%ErLW1ds$JKj+uN?zXHuDt>1H~unw1<@=aRe%5PbnUIEh{|cy>A8GG`d$gM z0;KQL`I!jV$j3p`m3`r@ywLp}t>Cb6BGrre+y(?fm+5P9MKH@e~t#ReX z^Xk)_{~1q=O8!nYIHJK5aq+pa_vN=r_w9lT02_P6rZ9-T4>FitG_3ue8*GVEfFA=33n{; zT+=_H0NC#3PK%vv{F6y|sXn0_+1lC7&m(lAd)PXhTI}?SlN6zP-8U~Z5Q_(G>8T#t z%CH(J>-)qyi$>HGPhu~u@Z)P z*x7Ba`8iE`LB@(<{wJNq&Fx$&E0;@7Q5rd?mT@fl@+eUpga);>-mRbVZOvB~J#)zYpK51oO6Ql(lxSvSXj^P@yAt{{2e8c(s&^ZWd`*riA|gtfS6b#_h( zqfebYX;ay(1)v_QQt{1iBfai+Ry0)*oPivjy9u`}>EzskPua zj#f4CDwaCtka#mQ=hDPumR^JOe|#(HlJP#+3UsHdzEgD+kiX^gU>#9BcD4Ay{a7Aw zy$w25khnsR^;lCClAEPAz~0^-W#_z5$6zegOVn$F_TrZVGsbFUX6wg(De7C#X;z}< zFc|~#^$PTtzNN44>jF?F9exdLC?ay#iIByekD6L7GJw8Q#r#}8Xy|>?6ub4WibhQM zz)}3o3EqfOHt(fMsT*}P8!x2$mUcQGTQxh4@!b2QRd!X8lclRf3bi2kNT1}?02pF9 zeoOG>$r98k8HB6CHfpB-5tK<0*RK@||06Fik#QOSyB;!l;O+4?=g43+I z*&RdU=LYbr8;EEHV(NE5Qe&5w=!26u^hu<4>lFc$!p}(qV*~}8&cOQe>~6nhZ8>9M z2b^=B((TNmJ~ak2@dm9Wb3;c9@*K`u9*H1h#DQ!rMiuJ?NuvF3$3`TmN((II>0=|YqgL<#?e4A`S7Gk; z7t#0KxKjIfF|^Y1`T_A9-nqr?uwOHaCnud!z_+XCYsV@AV*6HQSgi6smqegdk9?nj zM-kP4yicF>v9edn(o!h2OueB9z9VxT9B|FZkikUrb)GV=dW-d*T!r%_4g850?TXq> z)?FU7ZR8_~IjuU3S*`Vz0OOfiy@23~S=yW9oEa9+Dh#lTSrq9=BGtm)i(4E`2ax+K z)1Q!jiak8n=VGKOzhDJ{Vuu<#X{NYvM%FDB>q|bP=&q>uzd)rNh2M}Ardw3b*Ls~JPt?3^?A_Uu)Bk(|R}r^9_R?ssyay7=MhoCdI= zFfxX+qS>orT79E6fk5yr0oB`gNl!V7DlWLd!xTjn6A#-gXILomd{v}LuPL&8WhgHz z(*RYf)|Pd?_Zd+!TfNV+N!BKfzfBskFxo;qjFpJQQO2vkAM~yHMi$rdT&S4^N+CRy z55mXC4}87*q330AK;M@nc0+f5Tm)M<0b*krNkY=j=VuNO2Zy{r85frjB**mc8*}mk zAC=Nw==(RAIRWftsgPi|C zIJnWTwNoSvL{o>VM#6i;ypqUlb$BPKFUh>+4q#N`Ed?2K`tHXt57jUk$T;92XI|yT z>f9k2T{1LAJXrji2ZQR+MoJFckPb;0vLwPIvZ>5zO`@xMl98) z1jv6W#+wDuUU$YrKSld^6ew{UMydw-On$#)i%USl`xUfh6S7%upS^nTmcEL9yVCkYUoj%V#L*WzVn+(Cj_wF3a39=Z4Jnb^G8 zB(tWl%UL+$BJ^E^k$BeJkDbK2-Y1k|>3Jvu8Tl#gp)oNGPV#Bu2PUdD-&f~^SYh3K z(Zf&dK(ewoqBAxs0Pq?_t|0l}cKhr+QLc*`xPFyY>(9LV^MfO*zD`fvVQph{618V+ zdJWWR759NS2-(=!k9tLCQ&E>2Ve*@Tx!0gvjR;YaBr&R~*|MA?OE9L{$El(Cs?b_O z%$9`fEOqs0PDi8P=n*wtQf(B_TD1boOM2T*hOj(vO zd~&7R{i~ffxF+2DIeslJ6*+ZRDfdMS@F&8!vQB_zd#((y)+u)AY&~U6>`g`NcFMOQ zd6wf>Mkf;sdo5Yu+UGU$3@_r7Oxe|)AK?YgcO`xU*v9015m1e+NQAnXT;-b`IZze$ zU}L8(sIDO5PBpE*f)n!;>tlW6wcYA!A~49>H=aTmFF$`vum5PAYK=PMe>bqJ2V$so zr!{afT0pP2BnOrbLPcJ2{Kt6oW7N#;qfq8bf{fPBp7*tdVLBPK@4x26W~Gh9>1!hf zF=8eVzE?G2eZMZ8j2T~^^40n!cIbNndIS)s+f8s=Z3TA&t-N0Ic zD3cRc^ngk;KYi{MBK47GlPBqM-jelC_03xQlYNB*4WtxdyEqnXcP8x44K8tSB!x%3x;G8=dSlfW7B}>IBaLk~HP7Ays8l zg~hJ^(Ng!`QuMQpm2u0Zf$LC9_Kg>HHC2# zpE#I1Pz)NiyTZ@hW0!mvuftJL^%_1(t24Kf1?jFRSa=;UfNIFN_Mt7KBXm7S(h;fx zeOirWQig_kPc3{jFE$V;439T&sY8H5H+wv0$O%{pLuFH?eM!)#PSl2@L!mHk>~CaO z1JE-$&^L8C_XEos2|jY&?K2cL%sq0KZk|W~93ofSNlg95&xtUEdk69BAV-d<7$GX5 zx>i5MudlZx&<*B8o~%BoFEJw^!i`tLvP5&R+3mT=*7)+<7%vh5Djsl;scYt1TuVTX z{kKVn~ml$p4fnkG4nDv7D9*%Uf@GhVe|8&gC$obauz$w8N4^= zjA`E`hO2LKQ@V6sfdUrFDLvr6Fk zV!(?X$A;FQ^B&|J-5*=g0M-}4nC%r;7)tEy=3x<6x7VjVE%b7QB{%=gX7BIh4s>81 zYh6SDO4xIyCk;0GEV&ZIM>?69FfuXn9>his8D6$TPD&c;tj-1$I&v*6-J(ea2M5nL z8h>1PD%zA)SlNQbl)YmUia~&isO>2@Rw=u3TdhAQmK5w^PDixD2mtsw@J6~WHz2{A zjUgGp)A}4z@mj~bik1r{C*}0m!%(0Dh627PW1J`CUu25EtLZ&k{Kl-Q{Sv7&I(iTu zO9Fdj)mWzXG&T~c=6fLA=NO`Jpv3F#;=Y%!ZaTc>^&wbeWvk2prFiM+v(W@wmEff| zx{v2t>u5t`Ac8Jc7pe#Q0UFd6bl@~&%dkA0l97j;L}C%95k<2!V&KxlXq;rEe#&o! z!E)}rz!9nu1{oy}e#|G6;&3|o#FiX*qEy2|&Q4>fEvg1ut*goft&?$nkHIJJ5sF|b zF8>Z2>Go~#RTchkFRF8~iE)sW1}YRzyIqTn8h6vqpl1&|FjEPd@h>>6DC$Zlb(!srfe|OJuE~`1XG{<0$ zy-3qd6e0$N(vP<+g(nsx;JncxotER!wb)@2=?=#j`I16gR3GpoJ|ai3t5^^8LumQ% zfXbQ4!w%tjQEV!(ea%JKn`1dJutRC;&@cc--6#v85wbF?{qWdnJ z)))380^+lUd8YqE)fz!fh2`G;tweyn+(?~?M+T!SB z1-_%m!DqyaXlZGgTYeXonCfG^F#6459}UV1))GKuPh8k9`u!zeP24#RVRo*`jOjECcfx5&+?O!lmrrzvOYNu~X^$3u&HYeogU1>urD;aq; zRhUa&IhffJP#E}oys#SwaZJ`*$!ZI$(+p5PPBN{pdHQBGnfb~Up^UsjksafuiU!sf z#fYmukk6b-U6%vZ6#3S3!jF%Zrf9x$hm8tFH}gljt~c9-XX>VI9xB1?M;@u+Q6iTk zW_ELv@3XCWH54$6=UkN+?lrn!U;PUnR29z%U`7WJrza5tEApZVyKWTJJT+zC)6>#Q z4+ZDUjo%d2bSVj97Hi*p<^XhXK$s%dypk}oJiJ~(Q+3h93puPvdn^rTEV5tx->LO5 z-V;1X0|uc`xrrPmU-w`b5l?d_k;x>$z&5J>!e^IS6|vjQ&x^xxSP%$HHs_&)M*5Oy z>}Lw*N;fQJ6kWuBRQ4N6yeS$b0x1?vJo_5y>+)I7tg!MUQl$SgSf-4S^Jcp=fFme< zO!y|QP^!JglVD{?i74n1ctE@eJnrt$ zIHcmBBA!Ocz+cQjCLIR6K#PWwH!9FqWvNetAhGAqWnaeTb--u<^?VVpVv(WOB5nHaZmDuP9?%`Zr{9*?(bgAF#eu$|ok?1%y<0%~LaDvpkwG{A zOUU00O|U*c?$xncR3b8$CP_@|UkC&eZnR?gKQ2VGhh=1Fh!m0ciYGiyZ0Gea zoRJ?_Px^}-kh7W!LO6Og@N)Lvj5O<49x|_uw?)R>^0K_QcWX38)JR?m4AcTi8uKfFOY63B-Uu_s@FZ)&7{O3f5 zIjh{CAn?10|ALSwfd2=UVmt{CVDBW`3~chsLZlaEg1nbHAqR3HOM-a0fx*;_G=~C@ zwZ)rwvb5e-pXyCReU0qCYluvw@&5M;0s#M(Y%hmZJ9orc3@NgL#BL&%Do#vHcG*)5 zSfRlLPfv3xVW9d<39KhbdX*7DcWOzeCE<@Ef$vm2#}lbF3#TsmhhoO4Gk#`U;`Tn} z&H{1FWt`TW9P6l{4)KL|M{-EY9$GCt$@cI)1;$rfWgkE5V6IT*My6YQJ zwlY2Nn7z%deG(`C{H4Lo_Lmc~Jj9m#q{u=rrz>ZEegoT|xwFm0qUzs`h2Q(k?4+DI zw_Hr&SJjpLA_IhCzBE5^Ag35nQpPA#^c}REFa@lM54oK{y*|X4|Bo?|+0$~*VMxAQ z6RH*dCE9sAaCv-N`tkU7vEx?zmtdx)kdfPfR1l#N(J7yJe!)M{e9^i}^>BIor@K{e zji{<1vdlCZUhg#UH=2u`oiHduh0MIZ+nSGvaMb)V%A)?oS1dDKbpYck5x=99No4a$ zBXsRyy1z`b6qg(?cCH@|3F(m*L`U$TRv7VY^I^D2T|9F5&-UniPr&uoabfBCt?+HW z-j!ML-@ohY>qDmOs|yS7eEVQhvPv70jGfu5KTTdRAMo6M)XeLrFGH{xsYlZ2?$(5o zFQZeYf2DDlM)B}7fj#D%z8>*)qlGk!2NHU+#SM0Tz=HPAgh8#95S zX42$ZPk8EJjiOLLC#ZFG&9Hm0B!HamY4CLkcljB!Qs!&fv6h%p((y4e5|ZggtJ6NO zTblr@fTNQW??Dh#pw^4Hd_~h7pUN3`OK{B8Not zgB{BX8L7hd-q-H#z?0Do#`D&*Oeq!)L_?ei>O6`#KSG$^XL*Z{t{|;Jd~Pm2l-aIl z)0$A87ed3dDn__;lseIwJYoFu@^V?pR+ypW1u@M6e2717Y}9`0I(N7Pwi#Vem{!+^ z33Q}OJe-;@D>hwA2eIe|z9UmoO-u2-Fmn{XrVy~f3v@}8f2%QdjJq9@P!}W+4k((M zCoZq0{dZjDhAvH*pnMEW?}#W`ukIaOL|w%BWW*AyR-}^9ZrH?Pfkzdf?cR{xQrC! zz(VQ%iQMnBXzcSOR({NkbdBOQ94$WA-}S!=bz6%FOrguKlt~>b2AEa0p`wp3gPLxn z6P#$yD50Mbw&rNz!F%pb01P^2vtB(Csumx}cbT4>s&zK|!R-n7VBfzu`%ON$5&4Le zCya3O)0PXva%y8KchqxOva4Hbj7108qpgYFWnX7;H zsFOe4bFa9N#O00ZtbT1Aksy{N5J4@PVgRP=}Q4&IbDsSV$x>IG?F1A^g91OpW!#bBelGmd6pUqLs7<0xx?dGM;HBVtnkZ4 zkL{7`jHRm^T(B39si9dZTWWx@1AlcTMER8*r#=nMXX{3`xx?%C`bnFu>j#)8dQ5@93*Z<5laIFNV94?)%kfIC`xiVc^dn}%hq*AFreq`Py z6r|?KtyUz`v@1#^mMwu^ze@Jv2Tu*R5{-FltOUylVw?FCK9xDyDR|h37Wlsj!&8qM zGof>^oH7*JIVBJT5GJA~4QT$LN%xH^o=Av{;j-_M(YVBoU_+=+1zEJDah(|k&hH*Y z9sGKe4E<$7X^>~6u}2-2q}}ki#G%mMWwm{?s>*q0-&QoBL{8ZliH_(rl++bvxcKL! zsOY-+eGrT;t(=X}GF*L6FccJsPP^*TYcHa|jW_+S0gY7qMJz6sOwAJs7dMD@?5pjs zP%Olaq9`7&VSf;FP=IUejzfPPrg=#cp&Yx%b}<&zi~+P@(Uy&>SYGTlX-poj22glo z3~5$M!GA9G!5q$=XYs<87Y@pV6qu2y5@U!y)r?dqm>+qr$3G7j3UJft{hsW+>vRKj z1wa@BALoS;q(sRLNEXp9Yvx8Tc2ic*rFaakeJ{K)nKjHct_YLpEeYH7MR%o&sM+!W zC}hL6NO1v3*#2^RG{X>7@q-}}beMe_b~J#DaDD`9NDDz`Ro5{CRH!Btp0~0cyhd=K zAlC(cysmBqi%>-&s25DXasdQc@O~l5-fx@z7mL9V_0|HD0zHk0BXUlSvN*q{mFOE{ zFKukc=)|QKeV+@JQ8)PD`G^}qx}73qMh#IYOktsG_ZHUNJf;W{X#==pl)6D#k@yAJ zmfA;)#@W@tJ?|V`(!l{mn>@hfY7z>XNg;yHTycr!IJqA@<+QbDI~MmsD!ksKwl-AmclX(D95lt=6-n$O`i$c_podHfv}nNMEqpj5b|O z=&MjBqdw%S?;lk!?Vg71IaFgO+E4@8xc&}0Q+2~~pEOM6AV|@MJ!EV_Y?&i!Y9qxb z;rD2l=Xc2w_&Tyt74VavA~8E6AIT&%gSq;2^#nf#k?5C@?LjzRQgoq|N0XuxSZspD zxW*@D*tt;iOOXo`%~DfC1pIJIH#>oWfTXaUO1sAM?`f~HV(|e3sGP7H8r`GqiDezFpGW0enj1^&*!Qx9o>zqEL8l18W(biNn^n)(uCnk z>q5>sqY52YEF8rybfvh#lr9a97qO<7V(YQ^j4(Y-HOwhdb&VlQIb2RH%1pCCk3Fxu zqH%IAqvXbMTwrZ!iMgU=pD8ZH>BQHxe*P`x~Hm2fCxfUS{y?RwZgXpi?BF2g%q!x1^PUqSl+Y9k>U zu@G?J?;F#}qVGY&I*XdSuOZwN?g>CUGsVl7WO=t0h|e+NX)bqiBO=G?hO7O7?#mZx zZs*mANxKfuso^AYkGZy=Kq=ju#~^hxYOWOz8G!+}A%5Vq5loJms+d2_2*LX(Nb&n- zm?}dVRGu!U2BmiDiC{eJOWU~VyI*$*--)}(oaodiBa%tR75lLkdlafB09oyIEA70D zXqEXe(k%+b4tOcmJRpP|^v;h7`1Cha7RamUV)xEYD0ui&aXM)v#gU%5nU(tImAdgT zY$!(|Tc&=Z;nq8r1D+>ai-1`434$#qx|ROi!co|DFu7UVJFGZ`P$w+Je4 zjrH6nNM-v(yhqjy`uJ6mMY#vMw8k|v zAQ|d>!oqakwW9?obvCQIjiFPik!gSs+XFyU-Pa}xh2NIw;}iGv6smkL-vz{qiyr`1 zk&@_bG?vlgN6(7T-X!>^dQ89kmSd7kEPt z6Ic>Rq6XFS*vaC}lYqFDI$C+c1f9jD+x!#|Bx71>T`Dm=E6bG03xqjS>M(rHlqye5 z`HrCaklHb3!+5+(8vhT;?R_9y1ot3|`UNfm@~~1@DS6#3Mubt@yz7|ZiZ5TI7v?_- zW-crbtPb6roLuM#{>{X=v1NPyzb&?a>$sCDK;4(%WvC*RL>AG~KEKOX~VR z5Tk+~Fy&J|GLYrdX(-m(t1k8UZf_d%(dm+$<45~H-lp|c8~EK${NL$V_}N?DhIl+< zBo(Mp22S0r=(fO8)d2D(s(}gNfuURXY=QT?yi!NjFZ9A#lGaBh<)+8=Kx5;y#JJ$R zsC;bcvoqgOxCXHS-5Y&t=^T@dtiVgulL(a!<~YVPlerk8aAL;(S`CU*t!~*hUkAW>C~>f={U!8bjNc zl%xx!6ebi}2rsf;HT4B+&1f$!>~RCc@?Ng#Nn9V?Mnf~Fuaz(B9^;19Dg)Hup?Db+#$sK{F>4lr`=riioJ9wWhP zP!oP#Q~>eE8D3NAV7sW{*HKIr$t-{n+M&?y;EifPJP;+!uGPrRlk51RttyWNNkx!|p)F*#rqYk^%0kpO9?*YjP7Iv7ocOqViik(7Sd$ z3B&kus=y z6o7=maC*ljx8f8u1She%`%9m8q>dB4m4x$7nv08b=+swU6e zh4<^farJ(_koT-S+}Bra z=boI0N3lkt7T1j`uqfiLIA-J7>POKhunU(ba(sfL(B<4os!g=uq4zXY66y2_I3NfZOpdkxT-Ph*I)` zV&I;6#PKWt_?k(eI@$eg&x7v%JkYkr?)Y{-UyvU&8SIZ?Febv|2`kQ!!g^s?8svDI zeWqGQc;bK*Xzi#snE9c2olHkaF)3s+AA^QYb4%s|5E6w)%=7@mwZ@^3s}Y+ITVsBuOJuB(D5R@-d2Dz#YA;lz@OX#}@kDS3Gao>ghcLck31dc|nss{k05mAuGmt=o;zy4s$NKmgKfa|CxgZ8$*3$Ao z+ZkKG&(PCxHSB0f6>9YAW+5=+vKeChwAIG-g1*r{C@^e7fv*fC>M+c%>Ok?$DIE}? zKt&v-OSBO1mLE5wC^l^e$XGB2-rY7Vv*UVU^Q@A?e0e)m$c`vX*0>bc&W!Gj3emrI zh7jQ8g;_)g$ns57xsYxs%@xGtl7r z!QA4zkXC`L2bSwr2Oyc4;(n0>T;e*4X|R;o(@I&fxI@$W-G}J`t3CJBfSmk<$?V*@ z?1l`(kBwn=!a}O9t+*j$)3Vd)r>pYZSzYb|asD!qv>?y2=UR(~-gOSLE=2s4{)|`5 z;sUBEqzK1`X4Bfr{!i{4>=g8FV_b*IEpmW+KStB$7DyE(U)h&AsbW+o=UH1vKma9j zCa`{Zb9QMwjuQ|%_HlUs^GDH^WxlzAlkv24G9)Y3?H>bl-&fkp6Rh_Gc`pFtD22QND~N+*HHGj!7G(ksC7s64izFvc z^S6T^E=A0u#KazgAEy*~OqB&X8{78r5EX#}9;}Q0?wU=l`%zdOLWR<`w)aed59@^* zrsu3$OZHpz8cLjBmwF2<5d&65v4flMLJ1LNc3DYfwhhyryGU&x z&=fn;VnN0JXk~NaWT(G0ueHvi+IzOAbGSuM^hQI(jDn$rVV{J(od4T&135s zBazpW^&8q&}p7n-sC!iwPL`Z)`O`tzP!n)5k`bR)a+VrDK!VA1>I{^oF;6APesxH zg#P9l&HC?v2~t|t6jxdncoA9>B_Xg>wNY(hFV;b*wuqr^@S_HY@@ zq4e0HECBKZ)~69VPCjZgcop_%2bn6g|5jxO20V9(azD&oq5n{et1&H;q2B1hcZD)z zFG~!p?yF_G{xUb5nH)W>5qoKWhlr@(B|ovAlsA;$fIDp`Y-`eocD&&3#%9BtV}}XS zj|!^&v8bAG01cLC@AAeP_7zj<9AN~;SS!qRG-kA>eI4gFzB+5z5+wOIyM#~*sIete z*B3SW9?Wo$qEIw9sGcrJh^lZv(=nY#)wa21(q5OBVNt|4m_o0J(#P%`!sug~c2@@z z$mcg8Rv1J8!KAG&4G7h{yurB>(ztg%l8&@L8iMBC4JRfDl{Su7eiqpbde4vSk2=EK z_&id~v%;AO`1U1VJ!vbVSKgt1^shge@GF7XbicvZ3X3Z)KE_I1Bro}X-Z`)2^0+Yg^Yyn>|Cuq>P^(vVGAfx{dW%bc_dmA~{zJ&cPeY?!TnK&QHj68^)Kw!t z!LbzvfUDd^TIDyB;mm6Mm9Hj@CQxSQ&S$jBOFhbFiZERi^x=tKM9pGR!W1eu8X=-6 zR_kxx*osEiBq@$P&~ft9L$)lGZI6T>UH*ZV#0>7b-(K-G&v?no?{TYW^t!Agn9nZ6 z2@0vZwG zHrsi$_|PxK8wLlcU*q%+WE3((>N#wfIcp}MkY+I$^~WdvBT&rifYG_=hs8s@W23d% zPD@Tn%~0HL{kS<-JcmUY&@(8fBc8?V7MwF!D=oB3M019B?iAG)fpz+{MJa&H* zS#q1*o?1FINv(+RA`b$~>)r_UC<<@&iPNB{iwI$4r8C>K|C?&C7#;FiURx7B+(=_| z@P#QkCX44ux-wZmw#FELW)D2Puo`O(Co|p-OBe)u_BH{s-Zes=*Lv*)XTCE$YPsJ~ zO8e3ZUNHj;RA)QwfJAOxfnjCwrmU?G_-IHa9y#B*Vx6|?Zv159YgHT++>8Leg1*{FJ7XiF#~fxigdkKc?qB6hD9$Vdxcc8d=c}C&b5-X$1*m>yaSdKul7nk?-2$iBB#r1CWi>X^MquxtEB>fIE zQJUum(<1G*AWU?0GRI&R)hS!&68it0EkWhdUp0og@$cN)K2*7urtwanc}i5g8&rXB zzpp(`*0gEX^$o|^q&(Q#TE>XWl@~5-4cw__$}BMe!b}(X_2^x-7HH=GMH;Sd>XJv7 z!ZdVwssZzGVsDj>$`3q(2~XqaM&e`_!lyJ^p3j^f7`OopE9*~R9~3+>`z0C!GiJ;P zsNH?8HB#g>F8J~K_`HY=`rV!tsTdg<_n%WUnadb4^cy1=@1);Tt(2xwM?l9kh9KQ{ z`n@h?tNjokKKs1ifTy;L{?iu@p|kJ@nJh$T=Iux65IGxRFQl7JXAA2`I zRw34?ob7v%#sOtwDNLsgVA|(+$|k4I{o*QKg5YsH^NQw~lY26jdN<1liZD9C<+Q`r z=dswPftbr~qX(F2@FiwL%qk)5_sAm%Ups`-(!*MpI8N5uv9i*5=QGoyRL`wUz~4E;)7ce`uTe7t*b1cf3};K#;Dt^uqTK(Hl~DGaO~bIoK@6`qq|e%7D^F48t-ZLI z8UA$393Tem8vI7JLUH=e2Cv&OhsegrAN9cdg+Axo1G!fv@OffLZ)i$1M)2iX0(wB~ z=$O~W(MeLRyn~ycQ$2ddBNTbZmcQ~43@6s;l)sQbTbDq$->3U$hU{3{ z?uf~wR($0!TboSThk(D`>ev8`-k)uo(dBSMvsACC{hsu-#r`4);8FaIOk6cTi5R>U z84bkOI3P+Cw{~8&IDo{4fGJuqWy+0&attkQ8uSn(epAJu_)`&M@@_KbksVVgOTtPe z8JtMYDdwV={<9?hh9LA)n{9)ekZ(BHqMaoZMi5E?s#RPOJeN=C)Wow-VY~Or&s5TGG#pJ(@??Fuh409CSu_`%!GH zqg0H2;#u9bbA64Ud@i*k+i*^`#6OJoVlz3e_b!{o?;7ob-qhC}@{I-EDNr8Y3`H}Y z&##J|x)+@^yeG02YbDK z_)~ZDBFjcSjxt={Dl(dSi*@A>7IZrVnCBYJ_`t6aZ_%o0+equ+KpBei&6NlH%ioye zCibTo>em8JfX>R{k^eA#+P+z&#=ltpz{kC)VV{+)jqsIw0a#Pw4;Z8!4*NG8e#p8v zjJ+K4HX~9_ars*i0FWq4do42J#*R!ROemPKKHA^E&wmu)m+kk7q&bw?@gR2}ioi4& z1O@bQt5n@iQ;q97mOB;;g!lQ&ih$*xhV&vJ1qM2fI#*N`x7ODirNX$UzMwT4LPxCg<#keq3y z3!S#{HiDGqO(*IJ?w^!R6aD!y2^v&}Rjq;xTq? z`GN+PdYmDjzBl|%_doNU4uZYLZSa)(qOO@BDnXxpa}%}Aqq`xs##G8v{m1)o`BleX zA9NWFL&h?0mut;RCJNZk{YuIOXz-$@w&dNVtY46JFOu5lcF?yO8!CHnj?okv!;c#qDjL53(pF`F&ZTif1-PL?jxszYDb)4}2(Fua0Ol!Kjh}=u=t-`7 zPgLG$L!VIzz1RKCx>`_MKXuUVEK#4wi#Lo6;A|W)oBa@9yb*YP6ZCZR9bkuR&D2GZ zDo?CktxFM1FoW9=6?MJehkWZ*)^DsWKMw)go}SA)_y|66w!xaglVZA+5a}7aTQKVv zmT|hq>?s)7KN1PU_k8=f?8M=#PiGMYcfFvXwmqZZaBpqM^tj&SYg2)lr>-_kTgXk| z9|-`SiI<|BqbIeanDsSDdUyKn|A}^EVQdqW6vFLkNkB5h5fSbB8$Q3b9rc#UdE4w& zRF}m?EPnf}=Kr3TlC$_*1<~;XMZXREO6h)vr0EW#y7_UtK0(q!_0>po%NU9RBu!;gOv7;77I-t8pE)!*ix+SG51EWU$t=Ju${ZpBYh z0-Ws~5oCkzeyMgRd{We_glp(BX@$Vx?HZWMwf=4{DsIa%K*WDuLmNTXf%k-r)HFf{ z)nn>I$|-dMTVaZjEoJm9br4l$+RDDnlXY{Mv#iQ5-DXRd0pzg8wC9uxXE}14=`xs1 z;DawgAxViU76!{v4)NK~&>umoKyN>k=b;y9iH zCZt*OJ3*vDe4PPYrEv<1J65|;KmOZW`R0Xlqas-LvWbL_Xv7lVEcamycxJe^EGQ&I zQW$vuRSb3?t&?9Y!qM@>wYF3~sL|(Pkc$C;PU!?rX2dMT=MrWhTQ){xX+wv4$9|jP z`lPDMN$kWbI#C}OY0OgdZuq?^|{X9J+xFv8LZ1X4>`8;b%QU8Y!sJrg*lr71o zGcUBSs{4)`ZyCGzF?Z6Ipkw5~D!@l`*2c^wc8JwN1MCklDg3J|wJ;;9IFCxC6X+Nr zg1W>iDJFsf5NkZ5G%^=Y>WclN_R*G7<6mgrH8k70dr7e9b7wSU9OLBj3jSeTVp5;y z_F1qXfG`ss@e7-$Sy^Qg@}Hy9k{UzHN!O$J|CVVoe+`t$M`d-29nXMQRfXYlK5=!& z^D5YZ+%Z~xNWvuc=a@K0Oc(0dYM6^|S&?6mK+dB3e14Zvd-+bSGJcPuD8~K1%nDKS z_fK*8pHpl-nOCQRH z611Vd7k_P%vkK$tB>ou&t~d;gO1UkEGr9i2GiWR34*L5u>-x_h{9wuO$D>@A*yo>^ zr2797BO%FkFAF-x9!dAF&kuu}n})Ymd+jV?`-9p$@0U7<_sRkg-hnpV?8e z0_Wkr{6OP6bR7Bnf$Y?;W>b5$mn%hk`-20HnH*H`_eS=BJDA!%9C+%j=*iq$`NPp9sk8@FTJB(T0 ziCj!3VJx!e9d%S;&E3|3w~~Tivlf(I)KFg!y9hvWG?h(1k-Y79OqufBVLMO9b2M9+ zB>C^}tnc~vwrki;;Qb6eqyC`3hc4kd*1&qch z>G?`D@C8)miFl#UZat9r$`V4p!hgtE|KfBW`(c(vyJNI?(-1N;S}^hxG6@(0BWYEeATw50qO$Ha!dhr94-43VeV95DyZGH>QTM_cHSL*U5B2;I!jXW=8t zCto}6r3I(RyrlD$@8mDW;6}o9ubxg$0ApJ`M=`;}d(JH%)x!SCVOh`KqsVq5f9012 zW&r7Z=p&meoj@1z{-4o8*?;TWro5vNgKGO8|v_Ks!+g3+ZgK}%p!1K8Od@U%^`^< zzKpjjDX7&jNA^klUt;Kfv7aPPWa{=JkbF^5L|yaOCfw<2rXQ*o{#tSog>e zJd;yWHDicqdw?J&;nN&%a|maL|K`)4(?8b>y7Lx?2+`QEgPY|)ebPSmC?bMRgt^c> z)$zgM=I`y@pT9+8ZH$wBe!8f09b%Wcb>FKYH6A+kO)Dr! ze0d4PB@Vt@)_c5NR3A3AQ+pia{0b8fyrjqQ-(ltx;Qx-Nk7MS4i~M+U>L~rz?NzT8 zUxaV61)NAw+h#?Cinjoo~BA!D%OZ1|}MjYEIK%{oZL zKkNI5b6Cx$W{;7#nJEDoMc6PE-g91$Yy6%^<@4adm~!ME1|ovEB^gzNE5YRjM5TJx zjh3tAPb9a!Pg=1#kRSd<4+W96qgK@WqJ4t#M;Y)$N%AjkFSOpAr=+cfz~mMrrikkJH;8 z5is#WZFxsdh~0@AOSgee+!%2W59<^hk#^v^X!s+e|DHl^P0_T?hlT3SGqj^atG%du zI{PaWX#}1AL_YE=l_rB}iKjD7bYwZtvbyfGSuI_rCr@VI}tz12t(q|6hBAWT~U%DgBzm^s()19xi zs=aoKlbU&{qxFyGhg#lH{}amKpr_}C&+zC+wPiAI@b>&+MNB!44q)9u`=I%1+O%n% zme`4HfX{YmcI`V$^x;qEl&VRREn*-)C3V@6#wM0die0}$YG3B?X)R96b6vX+57ac(7ZJ?qa zhQ#ht%v*xsOHWVlk|vTyRYj5f*nA*?Rn__wXH@Z+DVj!-Ci;4@pb&QX8Cb#| zuI9UIYHIK#C_}8xBIZZ@l()IRwIc~!^?!6g*l)x$yDsjk`%+E0j>o-1|ZDn4qVIY<{8DWN=uN4qsjwfG8J0*R?87NI zEctb zQ+fvo$CmCktst@9}H3p*f7I1w`ACx*DRYU4Z`{~<-sW-Otq z_Up#XCkrzj14trQRcL5xumU5O?51@e@f- zDTB`K{~t%i#L0PJA%33g_4h*O;Tg(K^;O>>4 zo>Kh${#oa5Z~;H-iFB3t+M#&UM zk3je`^Y4^jEKon%J=93%cQ&gAArO(pO?I-dKdK~Wnsdo6gvi~ZEXkTu{g0s<1IEg0nWB^MHIFzMaI`6m1O$cr}~- zsD3E)JKQdlNm~EgRR9R@Jq>IJ+wrhfcU}!5b_0SIxpEaI(F~TSl5>0m#bJEe|ETc2 zeYN*ghJOSX&^+)79$~~A)OJMT#Obz^_*>!zcYpV9>LOjbK#vxSB|Yf?6!%gRy>#rd zZ1Urz+Si!$E+$8j4u*R+{|6$$Y3pI`9Rehx;HnbY)B4CnUbHkf5A6)bNp^T|20X;P zJhBo*T|>)c^X9WzjB%3AL#ZsT|HhAW)}Hm5UtW(Wt4Y z3H#i#IhDH0@2o|{5sT@!lH|w1`lHE{lz+Di{S>9eFUP*(C99n{GfxwqbF^4-u5%t) zCK_swI0a*Uh=CG?pGqZ1*!`tSYZ2{JLejTfHSRG3j#jQJ4zHKVF@yq*^Vm>^+EdYU6{J!UD!m!r2}jLNkrj{AjYB58)R}`*zd*aK^s>Kr9*pw z(>YUPM{0PgndNuwZPUqQ{!&8M>p@aj;aMUT3f~vt>arUt%Y_bjb4>13rT0y~YUGa5 zEvcXB;)nEo%%Gl-3EA*M3}a@fmCA1sD&OJcJ9ZLp8kl*tquAbYd;#yGD0~t*aT%6> zu9WcNgQ+3{%l)If_Gdg6iiL@Sgx2v~pdJb}J19H+zO2o030NwqQ@S=0)^Po^q`>;v z$+MjukN0az+`bQpPd4XETkZVPtnu*YtI{2FE4!Y3r7n(*yKnuVC7q>O=N?5jVvcS> zl+1eeONV!DV4X<9vWc$qhyK7ofek9@N7A{*$!@Ps7>l5dRQ{=*8wG57kEmP@e zrS1n$lS2WHgz^-Q){P?!YR~Rj#jYK#_N|svvbThQCzY_eMs5^5VJBS@+dCjX&qIJ{> z3}yDiib3-!zE5oW%U<|EF%8A{h5T7lw}qNYX#q1k%IdmVxOV!dW?6zIE#P|!)A!&! zgQBZ?r0wuTN!26bGzr1C{Ltbu(Jd@oV&N+& zU$wcJR#wDvZu^1Hg5#{}$3#J9k?TYNP2HVjsZtsZRIMwbnwAj{OiaXU@i}P`U3WMM zqel`dJFp`R-N{MwAC^eJQoK?%+2s!djBNc~74cfz3R{eCl{=EqBc2dctNai;hT9{T z2;zJ?3m6Y1)gH(_c-TSJp7;H+OVZVeu_ChCJoOO$poF!xPIDg={>bPzwr{I2fBXQ^ z>h0u<`7~}64@=Bw73V_Uqf5%*hQ0(!aC)Q^kVlt{PlDCJ;m*2+i%tHjActWy5YYKd_d>_8aHa`BHR!Lg&b+frw@);o`5= zjz3jvnNPd(fzpi%XNo^E#|pRo>tnDMy8$#f$KH(ucB}Z49=L1y`pESEua$+ zI7V}OiH_ep?;{cSMh#vNbb|AZW^n!C1~+EVKlqkgrTcHp4?Qw^5udUH05kXtkPA6r zh-Cq#*_y{aM(D31s;v2gvgZ1mXgVFzLg4n}kOv3e>8L}qnv;N<;)TIzDxhnY=LkCt z_g<*3bLTs7SA|i1adArwP<3=kCGP$3pKt*milA^SsuJ{*^%; zZ3qLw{5q8_RzEBIU#VH^Bl>z){;xB;N4goY8Fx>QE(%O5^`5_yj0IX~;5By3ja%q2 z+TpY}W@EVhXkCm&Ae7N@m@Anj`dX~uzI`Wv6z3IY`Y^JN%7Uhvn+O)c$9}=xs zN76wK@ta_mJ@uhUAb-_ozT5h{bA|ol>@Su~*n;w%9n`VlSy=4bJz(G-@>q4@9m+1o z!6qaNa!RLGVsJrxS5B*tGW9#<5GdjZLlgz3SsMP+R?&(YKl{j8{LjeaPep~rInJdZ zw_rWgKSvkm--iwP-j_CG_e$w$gxFA-XsHcOP@}t@-FpHzQ2N$UbQT?f1y4xNf1Lnw z&x-!td~zI#e3{wb7>r_eA13>_sEJwSR*vxLSN>hJloqUqs>nNSH7-XpI-kW9;3J13x=P`5)AsQ37L+` z@1Mf;>MmIpcJzFH_&<+hExzUZ2-dwMBW(wTe2NeB$NcT{W-`5sE&15o@ah2=6ns!; zc8+Z9vYoqnjappvqM|y0G#lx@RjOAJPVH1yNuIfC;Kl++U~IBTlanQ-A;L>F9hyEC zH82QBa*(#(f;I}Ax~{;%e+tr!TMzGi4ZT{c+b zJF4a(8O6QYiOAcn-hvnY_T3+%{%oIDo-DhV3wc5Af9yr7cUQGGL+N5rGUe7~ znjtuyl1a*H zJiMXE#e<;=gdfQGtTauA(WeWoj^$r(u)QiKc2zmOW@_<*SN9I}RI`48iY33Skk!(z z79FA0?n|Gdf7z8k&K}`l{9(>G$l)e56fQwh!mYE9wFeod9|e2fiE_jn3h4*eUcA(L zgYHoVlw2I1icNY&={(*3hZmpNQ=?Z67J z-XlV`ay=M=@aLjqzO@R$v7L&V8cA&lFrOR}Jc>je*y^V#E)j?BOtP?k>6_M|_GRy& z8R+n5=H+r)CP+)+ED7}Zp(^r9u{ zw-QGg6H6{cP8H4SgwbKmIk@V&gdPtSsX?+~guI?$)EbmOe_`(&7)?LCXA|occ6sa$ zm)eg^1Nb?&@5p-;_fi7$jxuiCKb>256RcSzxe!%Rr(adtiR?ouse54*Of4q%W_)$s zGu^j4qs)QkWL^-3X~?>C-D&6Syfeqc<3Qy(ogWvZ=tE?rSO7htAL@afG|Xnklri)p zTlf>!DM=SLRvfWH0g7Ji2>it}C#$Hj*r6#Wubr8jlo+mRFJIZSwq!4Wnj5T6?7Dwj zANx|z{3qCt$Oot3Y`LZuGXlBKcQq~F$8)p=9U}g(N=q^?7Yu&k zm&OZ$E8>ecL~*((TYr{(M>u3eu~3Gg0*N6rk5QUx1=`**YyOp3K%w0ZIuDBlo=`p? za=YbZKOohpX9E}U>KwVn%;L&QLheQ~hp5gkdYI_VN8aP+Kp8lk%DpBCs0kU4()2Lzpe^W-#q}cZ5V9!VvO#VA z01)-wpRF!5eG2S-xF8QQW!~mUPSX^~dlSO*2-*}^5pm~#!*xcjPgD5!eL2F{s#DD! zVqNJe!haE)*c;}@9w(&&X-yHsP%j#DjV$OFoe<{uA2t;WMv)t6v$~I%!{CVVtJYxW zVS0#xr{AU@W=bZzb#W?$W*QBQS*SYbmZz|>>@{)>%awl)FF3;H7%<-kQwblEw7ZzkQSEg2k5M0E|C&b@dao7jIZFboFoFuQn zK;aB?O=A~xIy}=qbyPa0;+lui{9v-)&}<%h-PD`;jsfJ^<>SY#lX+bAay`40iAskm zMyYor`>&Rid)rpCqb#uXRmClH;tXcNnb=IYya@D%j1tpbZ^kZ7%4xF+k)p0t$#1YJ&EVql+DR6 z1pHC+3~nL3n=5UUyvn_`VKwB|H^}q6Pr@GRib~&V!t{3sv zc(&!Z{JCuX+!}VRBMiI9!t6r>H?o8*WHE39M)NB&$ZJ6t!!tNJQ*t6=N-h0=7g_(i?9~)E5 zLIAS>bfR2mVi+rIQd#{c(aMj82l?jT9tu?}WOBdsP!Xxt=FN|sRZ`L`A|X*2Rj|$v zlb)Y_?*eb9Wu6KkNhLQ;Zt;h6*zA|;4Ef-d9-r-sm!*a!b|2vXX`3(&tyG(26&Md6 zf5$Gq`DbG)RW-vI1b^Qtfc;Y55#Ar{=;2ZsO=*3+rGieRX@3bJVdIqo?b zE7%)OQ>&(@i?H4ORVJ4PF`F{%dcPN)0^2))u%Qa-7kltK`u2`H3~K@ZuzK6R8wK(U z)%GSyk9Newbjb$QM}o2O=2WM5`>uk(eUB4shbvBpv=6P_;HofONa1(qo4dK}-#Ud7 zJx_LrfA&aC<8X(2P#zxoF~h`M)ZEFaO00HwW^gz+LR@@)B~ibwBZJS|PShD{{g9rm zieIOLl|M+Rb>VUukFYRH+m^}SAm*Vt#vSj~)ac6a*k^5P2V7$sZ2yddPHF+OoOhT6 zxva!~Mn9t-J|5%0xWT`B-X&dyQSEFnJ1UBKli*W;zi zbx*Qawfr!r_oLZum?3pJD_fGE7zOq;{ItL!P7Q4|WTDGkpVPaeaVA zP%-i%UXWi8arA#qLb<98C(`o2V3T-}lv$gQuTRP_D8H`OXz{(p8}O6^1 zyV7+rEO|$od>W;K+JR=F3hz7m&o9J^reur}qIQj)d}IjIWfr>$^EWdDM)5yGD!d&g zJa`@l)KBxcAOV@`W-oH=E=T)1k1xN^#ovd078Jhp#Y!?zTZb7AYH#6E}o@1K~y z*vhD4h5$@Wu<$5?Zn~o47|N!Qk{8b#sNpQ4R~=^=7DDohwsUa1nb9rAVOI_FebSUf zq@!oq-CusZeaqu%eyLiKw$SjUcgV$Ve`o*rx8sWSUVC%F|IQpZ-TDj&a+EQ49?mKIXqW% z$C^RWoTW>#3!S9osJ;H%NSDEL9FhO~C^nAEK4$$AgnA7n|HePnJxORYTOe}W9Nny; z`}YG0ZP0{aVnDYKT2%S;P>4@l-ER8wk$xS{OMYIWgPGHSEr`Kx=Vpc|FYbOO#0#KD zerBC8uA(q%jsTQtGAli@O(pc$A>$l9xGn=>I8nzyqfGU@X4%V+)(n8vQ~A^qZauYX z+sLx6?}FQ7t&pVQ5(XvHi!suL>C=SXAI;uW=?k0O8r}JDZe45D7!%wC{M=xEF}?D; z|I0Nn3uxGX@Yxi8+=Arb-~htU7E2|l>TC=3F=DYDO+&jAi89#Ftc?*rhi~66xeMS~ z^>egl(5uo9loCfa?;$MzLR7*2nUGGZS&h^H#A+!sZ*8&3u9cm${MBK@Fuan*Ca{+t z?$6y;1abLGMAEDxiDyQ5b5!VXbdUe5n4r{*aBe=MMm+$Myqz`hrMw(dO}8Tmifjat zjz6e=E!+jZBFmn>kIs)03$V<>O-J~F^B^a(rbcBaRKN$B=cet~M!-+}oQJpGnHDBf zgZU))cI}t<4`j^Z-yNM>@vP*@e6nFnjo2~gXn#iws z-&Q;`Nf}LmP4#v3@11$hH+us(=_x;oEopq8n@R5Cy1F_inxy=+-Isd=8i^*PB^cP8= zyql(GuH^|nb4VuzW|hX=I0g%_FezjNQD7&gJera3V=)K>x?n$Ad=5ej$2jLobc_vz z6h3+qvv|3*NRrj)?mGJ*owdbonMWszhYW2De)0Et*H_Oz{%X&SW#SX6@BLzY`qCeF zl;4HwN2&RG)N1o+y29Zu#1DO8=tqtwiJ3Q3#>q{Yr|p z8fDxC4jo@k_%YPW&g;!C02zb=`XwZQsn93^@0s4ahihi%`gJ8mS|oiFMcqnQrgJvm zTFXVD!5i|1aoL+<$)yWi-b26 z=@e?HggDJuWSZ$C^x<~Ocu=%mZ8zSoQybCW^+z-PyIs)ZtVZVcvEA?9!OTR_{klRH zs})oNba-y!A%_*JEju`jI5aqvurJe{Ue+kPyh>qX*OeQx%nm^1I(s5oqH~(dt0Cu) zFY({-!n?H_K-xlcswqM_1LD%7njH;mBzl8(zzm-3$u;ByF_%L`6=qPNnK#x7ImJ{Q zofzh{5jp~hl2mC;0a25xte8oG!Bp%!7xGxYnRso_!vLX0P?fJzVSRoF^5a$0?)>sz z%+A_}de;rfJiGncPr?Qtq>R5cdQm&42vCpL`m@0#LChu3K1K39-cA0UVAJrO#EL|& zVyU&38t%3Dq;kbx?3+Wgi;1Tre-|MZGx+y_xd7leVFem@)78$mA@k_LQ3*dw_-tNs zaYtWv*aZsn%I+pr5glfJI`*8Y&*Nqr85^z#$Z{}AT&$W(jy1yq!z7XspnuEoO2q`} zC6Ò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 literal 0 HcmV?d00001 diff --git a/images/spring-security.png b/images/spring-security.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1e8bd37f9f9d82ed019399df2dabd251b2a778 GIT binary patch literal 18268 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 literal 0 HcmV?d00001 diff --git a/images/spring.png b/images/spring.png new file mode 100644 index 0000000000000000000000000000000000000000..336f594419f5f6c1b8f7af01d9210f736f616b9a GIT binary patch literal 13454 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 S2>hSXGkIxcsY(gc(EkDj0iXZ? literal 0 HcmV?d00001 diff --git a/images/zoom.png b/images/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..8934f6966c206591cea0ed039a4625ec785e23e7 GIT binary patch literal 26864 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 literal 0 HcmV?d00001 From 741b961bada49a20db8bfa1aeef11418b818633c Mon Sep 17 00:00:00 2001 From: jongheonleee Date: Tue, 10 Dec 2024 12:33:17 +0900 Subject: [PATCH 070/167] =?UTF-8?q?[chore]=20=EB=A6=AC=EB=93=9C=EB=AF=B8?= =?UTF-8?q?=201=EC=B0=A8=20=EC=B4=88=EC=95=88=20=EC=9E=91=EC=84=B1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 533 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 516 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 805055f9..19fea89c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@
    +![img_3.png](images/img_3.png) +![img_4.png](images/img_4.png)
    @@ -10,16 +12,16 @@
    -### :runner: 프로젝트 기간 (54 days) -> **전체 개발 기간: ( Weeks | %)**
    -> - 기능 구현 기간: ( Weeks | %) -> - 리팩토링 및 발표 준비 기간: +### 🏃🏻 프로젝트 기간 (54 days) +> **전체 개발 기간: ( 8 Weeks | 45 %)**
    +> - 기능 구현 기간: ( 5 Weeks | 60 %) +> - 발표 준비 기간: 3 days
    -### :computer: 코드수 +### 💻 코드수

    
    -Java         :  
    +Java : 33,731

    @@ -31,42 +33,50 @@ Java :
    #### 팀원 구성 +| Backend
    박준홍 \| 팀장 | Backend
    이종헌 | Backend
    유민우 | Backend
    최윤서 | Backend
    김규영 | Backend
    류은기 | +|:--------------------------------------------------:|:--------------------------------------------------:|:--------------------------------------------------:|:------------------------------:|:-------------------------------:|:------------------------------:| +| ![img.png](images/img.png) | ![img_1.png](images/img_1.png) | ![img_2.png](images/img_2.png) | ![img_5.png](images/img_5.png) | ![img_6.png](images/img_6.png) | ![img_7.png](images/img_7.png) | + +
    ## 기술 스택 ### 🧑🏻‍💻 Enviroment -|IntelliJ|VS Code|Git|Github| Gradle | -|:---:|:---:|:---:|:---:|:------:| +|IntelliJ|VS Code|Git|Github|Gradle| +|:---:|:---:|:---:|:---:|:---:| +|IntelliJ|VS Code|Git|GitHub|Gradle|
    ### 🛠️ Tool - #### Backend -|Java| Spring Framework | Spring Security | JPA | Lombok | jUnit | -|:---:|:----------------:|:---------------:|:---:|:------:|:-----:| +|Java| Spring Framework | Spring Security | JPA | Lombok |jUnit| +|:---:|:------------------------------------------------------:|:------------------------------------------------------------------------------------:|:------------------------------------------------------------------------:|:------------------------------------------------------:|:---:| +|Java| Spring | Spring Security | JPA | Lombok |jUnit| #### Database |MySQL| |:---:| - +|MySQL| #### Web Server -|Apache Tomcat| -|:---:| +|Apache Tomcat| AWS | RDS |Prometheus|Grafana|Docker| Compose |GitHub Action| +|:---:|:--------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------------------:|:---:|:---:|:---:|:--------------------------------------------------------:|:---:| +|Apache Tomcat| AWS | RDS |Prometheus|Grafana|Docker| Compose |GitHub Action|
    ### 👀 Communication -|Zoom| Notion | Google Sheets | Google Slides | -|:---:|:------:|:-------------:|:-------------:| +| Zoom |Notion| Google Sheets | Google Slides | +|:--------------------------------------------------:|:---:|:-------------------------------------------------------------------:|:--------------------------------------------------------------------:| +| Zoom |Notion| Google Sheets | Google Slides |
    -## ERD + @@ -99,6 +109,495 @@ Java :
    ## 🏭 디렉토리 구조
    
    +src
    +├── main
    +│   ├── java
    +│   │   └── com
    +│   │       └── oreo
    +│   │           └── finalproject_5re5_be
    +│   │               ├── FinalProject5Re5BeApplication.java
    +│   │               ├── code
    +│   │               │   ├── controller
    +│   │               │   │   ├── CodeController.java
    +│   │               │   │   └── advice
    +│   │               │   │       └── CodeExceptionHandler.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── CodeRequest.java
    +│   │               │   │   │   └── CodeUpdateRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── CodeResponse.java
    +│   │               │   │       └── CodeResponses.java
    +│   │               │   ├── entity
    +│   │               │   │   └── Code.java
    +│   │               │   ├── exeption
    +│   │               │   │   ├── CodeDuplicatedException.java
    +│   │               │   │   └── CodeNotFoundException.java
    +│   │               │   ├── repository
    +│   │               │   │   └── CodeRepository.java
    +│   │               │   └── service
    +│   │               │       └── CodeServiceImpl.java
    +│   │               ├── concat
    +│   │               │   ├── config
    +│   │               │   │   └── README.md
    +│   │               │   ├── controller
    +│   │               │   │   ├── AudioFileController.java
    +│   │               │   │   ├── BgmFileController.java
    +│   │               │   │   ├── ConcatController.java
    +│   │               │   │   ├── ConcatMaterialController.java
    +│   │               │   │   ├── ConcatRowController.java
    +│   │               │   │   ├── ConcatRowTabController.java
    +│   │               │   │   ├── ConcatTabController.java
    +│   │               │   │   └── ConcatWithBgmController.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── ConcatResponseDto.java
    +│   │               │   │   ├── ConcatResultDto.java
    +│   │               │   │   ├── ConcatRowDto.java
    +│   │               │   │   ├── ConcatRowListDto.java
    +│   │               │   │   ├── RowAudioFileDto.java
    +│   │               │   │   ├── RowInfoDto.java
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── AudioFileDto.java
    +│   │               │   │   │   ├── AudioFileRequestDto.java
    +│   │               │   │   │   ├── AudioFormatRequest.java
    +│   │               │   │   │   ├── BgmFunctionRequestDto.java
    +│   │               │   │   │   ├── ConcatCreateRequestDto.java
    +│   │               │   │   │   ├── ConcatResultRequest.java
    +│   │               │   │   │   ├── ConcatRowRequest.java
    +│   │               │   │   │   ├── ConcatRowRequestDto.java
    +│   │               │   │   │   ├── ConcatRowSaveRequestDto.java
    +│   │               │   │   │   ├── ConcatTabRequest.java
    +│   │               │   │   │   ├── ConcatUpdateRequestDto.java
    +│   │               │   │   │   ├── OriginAudioRequest.java
    +│   │               │   │   │   ├── README.md
    +│   │               │   │   │   ├── SelectedConcatRowRequest.java
    +│   │               │   │   │   └── TabRowUpdateRequestDto.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── ConcatResultDetailsResponse.java
    +│   │               │   │       ├── ConcatResultResponse.java
    +│   │               │   │       ├── ConcatRowTabResponseDto.java
    +│   │               │   │       ├── ConcatTabResponseDto.java
    +│   │               │   │       ├── ConcatUrlResponse.java
    +│   │               │   │       ├── README.md
    +│   │               │   │       └── TabRowResponseDto.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── AudioFile.java
    +│   │               │   │   ├── BgmFile.java
    +│   │               │   │   ├── ConcatResult.java
    +│   │               │   │   ├── ConcatRow.java
    +│   │               │   │   ├── ConcatRowLog.java
    +│   │               │   │   ├── ConcatTab.java
    +│   │               │   │   ├── ConcatTabLog.java
    +│   │               │   │   └── MaterialAudio.java
    +│   │               │   ├── exception
    +│   │               │   │   └── README.md
    +│   │               │   ├── repository
    +│   │               │   │   ├── AudioFileRepository.java
    +│   │               │   │   ├── BgmFileRepository.java
    +│   │               │   │   ├── ConcatResultRepository.java
    +│   │               │   │   ├── ConcatRowLogRepository.java
    +│   │               │   │   ├── ConcatRowRepository.java
    +│   │               │   │   ├── ConcatTabLogRepository.java
    +│   │               │   │   ├── ConcatTabRepository.java
    +│   │               │   │   └── MaterialAudioRepository.java
    +│   │               │   └── service
    +│   │               │       ├── AudioFileService.java
    +│   │               │       ├── AudioMultipartFile.java
    +│   │               │       ├── AudioStreamService.java
    +│   │               │       ├── BgmFileService.java
    +│   │               │       ├── ConcatResultService.java
    +│   │               │       ├── ConcatRowService.java
    +│   │               │       ├── ConcatRowTabService.java
    +│   │               │       ├── ConcatService.java
    +│   │               │       ├── ConcatTabService.java
    +│   │               │       ├── MaterialAudioService.java
    +│   │               │       ├── README.md
    +│   │               │       ├── bgm
    +│   │               │       │   └── BgmProcessor.java
    +│   │               │       ├── concatenator
    +│   │               │       │   ├── AudioProperties.java
    +│   │               │       │   ├── Concatenator.java
    +│   │               │       │   ├── IntervalConcatenator.java
    +│   │               │       │   ├── MonoConcatenator.java
    +│   │               │       │   ├── MonoIntervalConcatenator.java
    +│   │               │       │   ├── StereoConcatenator.java
    +│   │               │       │   └── StereoIntervalConcatenator.java
    +│   │               │       └── helper
    +│   │               │           ├── AudioFileHelper.java
    +│   │               │           ├── ConcatRowHelper.java
    +│   │               │           └── ConcatTabHelper.java
    +│   │               ├── global
    +│   │               │   ├── component
    +│   │               │   │   ├── AudioInfo.java
    +│   │               │   │   ├── ByteArrayMultipartFile.java
    +│   │               │   │   ├── S3Service.java
    +│   │               │   │   ├── SqsService.java
    +│   │               │   │   └── audio
    +│   │               │   │       ├── AudioChannels.java
    +│   │               │   │       ├── AudioExtensionChecker.java
    +│   │               │   │       ├── AudioExtensionConverter.java
    +│   │               │   │       ├── AudioExtensions.java
    +│   │               │   │       ├── AudioFileTypeConverter.java
    +│   │               │   │       ├── AudioFormats.java
    +│   │               │   │       ├── AudioResample.java
    +│   │               │   │       ├── BeepMaker.java
    +│   │               │   │       └── SoundPlayer.java
    +│   │               │   ├── config
    +│   │               │   │   ├── AuditorAwareImpl.java
    +│   │               │   │   ├── JpaAuditingConfig.java
    +│   │               │   │   ├── MultipartFileAccepter.java
    +│   │               │   │   ├── S3Config.java
    +│   │               │   │   ├── SqsConfig.java
    +│   │               │   │   └── SwaggerConfig.java
    +│   │               │   ├── constant
    +│   │               │   │   ├── BatchProcessType.java
    +│   │               │   │   └── MessageType.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── request
    +│   │               │   │   │   └── SqsRequestDto.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── AudioFileInfo.java
    +│   │               │   │       ├── ErrorResponseDto.java
    +│   │               │   │       └── ResponseDto.java
    +│   │               │   ├── entity
    +│   │               │   │   └── BaseEntity.java
    +│   │               │   ├── error
    +│   │               │   │   └── README.md
    +│   │               │   └── exception
    +│   │               │       ├── BusinessException.java
    +│   │               │       ├── DataNotFoundException.java
    +│   │               │       ├── EntityNotFoundException.java
    +│   │               │       ├── ErrorCode.java
    +│   │               │       ├── GlobalExceptionHandler.java
    +│   │               │       ├── InValidValueException.java
    +│   │               │       ├── README.md
    +│   │               │       └── RestGlobalExceptionHandler.java
    +│   │               ├── member
    +│   │               │   ├── config
    +│   │               │   │   ├── LoginAuthenticationFailureHandler.java
    +│   │               │   │   ├── LoginAuthenticationSuccessHandler.java
    +│   │               │   │   ├── MemberConfig.java
    +│   │               │   │   └── MemberSecurityConfig.java
    +│   │               │   ├── controller
    +│   │               │   │   ├── MemberController.java
    +│   │               │   │   ├── MemberTermConditionController.java
    +│   │               │   │   ├── MemberTermsController.java
    +│   │               │   │   ├── TestController.java
    +│   │               │   │   └── advice
    +│   │               │   │       └── MemberExceptionHandler.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── CustomUserDetails.java
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── MemberChangePasswordRequest.java
    +│   │               │   │   │   ├── MemberRegisterRequest.java
    +│   │               │   │   │   ├── MemberRemoveRequest.java
    +│   │               │   │   │   ├── MemberTermCheckOrNotRequest.java
    +│   │               │   │   │   ├── MemberTermConditionRequest.java
    +│   │               │   │   │   ├── MemberTermConditionUpdateRequest.java
    +│   │               │   │   │   ├── MemberTermRequest.java
    +│   │               │   │   │   ├── MemberTermUpdateRequest.java
    +│   │               │   │   │   └── MemberUpdateRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── ErrorResponse.java
    +│   │               │   │       ├── MemberReadResponse.java
    +│   │               │   │       ├── MemberRegisterResponse.java
    +│   │               │   │       ├── MemberResponse.java
    +│   │               │   │       ├── MemberTermConditionResponse.java
    +│   │               │   │       ├── MemberTermConditionResponses.java
    +│   │               │   │       ├── MemberTermResponse.java
    +│   │               │   │       ├── MemberTermResponses.java
    +│   │               │   │       └── MemberTermsDetailResponse.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── Member.java
    +│   │               │   │   ├── MemberCategory.java
    +│   │               │   │   ├── MemberChangeHistory.java
    +│   │               │   │   ├── MemberConnectionHistory.java
    +│   │               │   │   ├── MemberDelete.java
    +│   │               │   │   ├── MemberRoles.java
    +│   │               │   │   ├── MemberRolesCategory.java
    +│   │               │   │   ├── MemberState.java
    +│   │               │   │   ├── MemberTerms.java
    +│   │               │   │   ├── MemberTermsCondition.java
    +│   │               │   │   └── MemberTermsHistory.java
    +│   │               │   ├── exception
    +│   │               │   │   ├── DeletedMemberException.java
    +│   │               │   │   ├── HumanMemberException.java
    +│   │               │   │   ├── MemberDuplicatedEmailException.java
    +│   │               │   │   ├── MemberDuplicatedIdException.java
    +│   │               │   │   ├── MemberDuplicatedPasswordException.java
    +│   │               │   │   ├── MemberInvalidTermConditionException.java
    +│   │               │   │   ├── MemberMandatoryTermNotAgreedException.java
    +│   │               │   │   ├── MemberNotFoundEmailException.java
    +│   │               │   │   ├── MemberNotFoundException.java
    +│   │               │   │   ├── MemberTermInvalidException.java
    +│   │               │   │   ├── MemberTermsConditionNotFoundException.java
    +│   │               │   │   ├── MemberTermsNotFoundException.java
    +│   │               │   │   ├── MemberWrongCountTermCondition.java
    +│   │               │   │   ├── RestrictedMemberException.java
    +│   │               │   │   └── RetryFailedException.java
    +│   │               │   ├── repository
    +│   │               │   │   ├── MemberCategoryRepository.java
    +│   │               │   │   ├── MemberChangeHistoryRepository.java
    +│   │               │   │   ├── MemberConnectionHistoryRepository.java
    +│   │               │   │   ├── MemberDeleteRepository.java
    +│   │               │   │   ├── MemberRepository.java
    +│   │               │   │   ├── MemberStateRepository.java
    +│   │               │   │   ├── MemberTermConditionRepository.java
    +│   │               │   │   ├── MemberTermsHistoryRepository.java
    +│   │               │   │   └── MemberTermsRepository.java
    +│   │               │   └── service
    +│   │               │       ├── MemberServiceImpl.java
    +│   │               │       ├── MemberTermsConditionServiceImpl.java
    +│   │               │       └── MemberTermsServiceImpl.java
    +│   │               ├── project
    +│   │               │   ├── config
    +│   │               │   │   └── README.md
    +│   │               │   ├── controller
    +│   │               │   │   └── ProjectController.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── request
    +│   │               │   │   │   └── ProjectTextRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       └── ProjectResponse.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── Project.java
    +│   │               │   │   └── ProjectStatus.java
    +│   │               │   ├── exception
    +│   │               │   │   ├── InvalidProjectNameException.java
    +│   │               │   │   ├── ProjectExceptionHandler.java
    +│   │               │   │   ├── ProjectNotFoundException.java
    +│   │               │   │   └── projectNotMemberException.java
    +│   │               │   ├── repository
    +│   │               │   │   └── ProjectRepository.java
    +│   │               │   └── service
    +│   │               │       ├── ProjectService.java
    +│   │               │       └── ProjectServiceImpl.java
    +│   │               ├── tts
    +│   │               │   ├── client
    +│   │               │   │   ├── AudioConfigGenerator.java
    +│   │               │   │   ├── GoogleTTSConfig.java
    +│   │               │   │   ├── GoogleTTSService.java
    +│   │               │   │   ├── SynthesisInputGenerator.java
    +│   │               │   │   └── VoiceParamsGenerator.java
    +│   │               │   ├── config
    +│   │               │   │   └── README.md
    +│   │               │   ├── controller
    +│   │               │   │   ├── LanguageController.java
    +│   │               │   │   ├── StyleController.java
    +│   │               │   │   ├── TtsController.java
    +│   │               │   │   └── VoiceController.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── external
    +│   │               │   │   │   ├── TtsMakeRequest.java
    +│   │               │   │   │   ├── TtsMakeResponse.java
    +│   │               │   │   │   └── common
    +│   │               │   │   │       ├── AudioOptionDto.java
    +│   │               │   │   │       ├── TtsSentenceDto.java
    +│   │               │   │   │       └── VoiceDto.java
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── TtsAttributeInfo.java
    +│   │               │   │   │   ├── TtsAudioFileInfo.java
    +│   │               │   │   │   ├── TtsSentenceBatchInfo.java
    +│   │               │   │   │   ├── TtsSentenceBatchRequest.java
    +│   │               │   │   │   └── TtsSentenceRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── LanguageDto.java
    +│   │               │   │       ├── LanguageListDto.java
    +│   │               │   │       ├── SentenceInfo.java
    +│   │               │   │       ├── StyleDto.java
    +│   │               │   │       ├── StyleListDto.java
    +│   │               │   │       ├── TtsProgressStatusDto.java
    +│   │               │   │       ├── TtsSentenceDto.java
    +│   │               │   │       ├── TtsSentenceListDto.java
    +│   │               │   │       ├── VoiceDto.java
    +│   │               │   │       └── VoiceListDto.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── Language.java
    +│   │               │   │   ├── SampleAudio.java
    +│   │               │   │   ├── ServerCode.java
    +│   │               │   │   ├── Style.java
    +│   │               │   │   ├── TtsAudioFile.java
    +│   │               │   │   ├── TtsProcessHistory.java
    +│   │               │   │   ├── TtsProgressStatus.java
    +│   │               │   │   ├── TtsProgressStatusCode.java
    +│   │               │   │   ├── TtsSentence.java
    +│   │               │   │   └── Voice.java
    +│   │               │   ├── exception
    +│   │               │   │   ├── DuplicatedSentenceException.java
    +│   │               │   │   ├── InValidRequestException.java
    +│   │               │   │   ├── InvalidTTSParamException.java
    +│   │               │   │   ├── ProjectMismatchException.java
    +│   │               │   │   ├── SaveTtsMakeResultException.java
    +│   │               │   │   ├── TtsMakeException.java
    +│   │               │   │   ├── TtsMakeInvalidParamException.java
    +│   │               │   │   ├── TtsSentenceInValidInput.java
    +│   │               │   │   ├── TtsSentenceNotFound.java
    +│   │               │   │   └── VoiceEntityNotFound.java
    +│   │               │   ├── repository
    +│   │               │   │   ├── LanguageRepository.java
    +│   │               │   │   ├── SampleAudioRepository.java
    +│   │               │   │   ├── StyleRepository.java
    +│   │               │   │   ├── TtsAudioFileRepository.java
    +│   │               │   │   ├── TtsProcessHistoryRepository.java
    +│   │               │   │   ├── TtsProgressStatusRepository.java
    +│   │               │   │   ├── TtsSentenceRepository.java
    +│   │               │   │   └── VoiceRepository.java
    +│   │               │   ├── service
    +│   │               │   │   ├── LanguageService.java
    +│   │               │   │   ├── SaveTtsMakeResultService.java
    +│   │               │   │   ├── StyleService.java
    +│   │               │   │   ├── TtsMakeService.java
    +│   │               │   │   ├── TtsSentenceService.java
    +│   │               │   │   ├── TtsSentenceServiceImpl.java
    +│   │               │   │   └── VoiceService.java
    +│   │               │   └── util
    +│   │               │       └── TtsSentenceComparator.java
    +│   │               └── vc
    +│   │                   ├── config
    +│   │                   │   └── README.md
    +│   │                   ├── controller
    +│   │                   │   └── VcController.java
    +│   │                   ├── dto
    +│   │                   │   ├── request
    +│   │                   │   │   ├── VcAudioRequest.java
    +│   │                   │   │   ├── VcRequestHistoryRequest.java
    +│   │                   │   │   ├── VcResultHistoryRequest.java
    +│   │                   │   │   ├── VcResultsRequest.java
    +│   │                   │   │   ├── VcRowRequest.java
    +│   │                   │   │   ├── VcSrcRequest.java
    +│   │                   │   │   ├── VcSrcsRequest.java
    +│   │                   │   │   ├── VcTextRequest.java
    +│   │                   │   │   └── VcUrlRequest.java
    +│   │                   │   └── response
    +│   │                   │       ├── VcActivateResponse.java
    +│   │                   │       ├── VcResponse.java
    +│   │                   │       ├── VcRowResponse.java
    +│   │                   │       ├── VcTextResponse.java
    +│   │                   │       └── VcUrlResponse.java
    +│   │                   ├── entity
    +│   │                   │   ├── Vc.java
    +│   │                   │   ├── VcRequestHistory.java
    +│   │                   │   ├── VcResultFile.java
    +│   │                   │   ├── VcResultHistory.java
    +│   │                   │   ├── VcSrcFile.java
    +│   │                   │   ├── VcText.java
    +│   │                   │   └── VcTrgFile.java
    +│   │                   ├── exception
    +│   │                   │   ├── VcAPIFilesIsEmptyException.java
    +│   │                   │   ├── VcExceptionHandler.java
    +│   │                   │   └── VcNotMemberException.java
    +│   │                   ├── repository
    +│   │                   │   ├── VcRepository.java
    +│   │                   │   ├── VcRequestHistoryRepository.java
    +│   │                   │   ├── VcResultFileRepository.java
    +│   │                   │   ├── VcResultHistoryRepository.java
    +│   │                   │   ├── VcSrcFileRepository.java
    +│   │                   │   ├── VcTextRepository.java
    +│   │                   │   └── VcTrgFileRepository.java
    +│   │                   └── service
    +│   │                       ├── VcApiService.java
    +│   │                       ├── VcApiServiceImpl.java
    +│   │                       ├── VcHistoryService.java
    +│   │                       ├── VcHistoryServiceImpl.java
    +│   │                       ├── VcService.java
    +│   │                       └── VcServiceImpl.java
    +│   └── resources
    +│       ├── application-ndb-test.properties
    +│       ├── application-test.properties
    +│       ├── application.properties
    +│       └── tts.json
    +└── test
    +    └── java
    +        └── com
    +            └── oreo
    +                └── finalproject_5re5_be
    +                    ├── FinalProject5Re5BeApplicationTests.java
    +                    ├── audio
    +                    │   ├── AudioExtensionCheckerTest.java
    +                    │   ├── AudioExtensionConverterTest.java
    +                    │   ├── AudioExtensionsTest.java
    +                    │   ├── AudioResampleTest.java
    +                    │   ├── BeepMakerTest.java
    +                    │   ├── MonoConcatenatorTest.java
    +                    │   ├── MonoIntervalConcatenatorTest.java
    +                    │   ├── SoundPlayerTest.java
    +                    │   ├── StereoConcatenatorTest.java
    +                    │   ├── StereoIntervalConcatenatorTest.java
    +                    │   └── service
    +                    │       └── AudioInfoTest.java
    +                    ├── concat
    +                    │   ├── repository
    +                    │   │   └── MaterialAudioRepositoryTest.java
    +                    │   └── service
    +                    │       └── ConcatTabServiceTest.java
    +                    ├── member
    +                    │   ├── config
    +                    │   │   ├── LoginAuthenticationSuccessHandlerTest.java
    +                    │   │   └── MemberSecurityConfigTest.java
    +                    │   ├── controller
    +                    │   │   ├── CodeControllerTest.java
    +                    │   │   ├── MemberControllerTest.java
    +                    │   │   ├── MemberTermConditionControllerTest.java
    +                    │   │   └── MemberTermsControllerTest.java
    +                    │   ├── repository
    +                    │   │   ├── CodeRepositoryTest.java
    +                    │   │   ├── MemberChangeHistoryRepositoryTest.java
    +                    │   │   ├── MemberRepositoryTest.java
    +                    │   │   ├── MemberTermConditionRepositoryTest.java
    +                    │   │   └── MemberTermsRepositoryTest.java
    +                    │   └── service
    +                    │       ├── CodeServiceImplTest.java
    +                    │       ├── MemberServiceImplTest.java
    +                    │       ├── MemberServiceImplTestByMock.java
    +                    │       ├── MemberTermsConditionServiceImplTest.java
    +                    │       └── MemberTermsServiceImplTest.java
    +                    ├── project
    +                    │   └── service
    +                    │       └── ProjectServiceImplTest.java
    +                    ├── tts
    +                    │   ├── client
    +                    │   │   └── GoogleTTSServiceTest.java
    +                    │   ├── controller
    +                    │   │   ├── LanguageControllerTest.java
    +                    │   │   ├── StyleControllerTest.java
    +                    │   │   ├── VoiceControllerTest.java
    +                    │   │   └── ttsController
    +                    │   │       ├── TestGetSentence.java
    +                    │   │       ├── TestGetSentenceList.java
    +                    │   │       ├── TestMakeTts.java
    +                    │   │       ├── TestRegisterSentence.java
    +                    │   │       └── TestUpdateSentence.java
    +                    │   ├── repository
    +                    │   │   ├── LanguageRepositoryTest.java
    +                    │   │   ├── SampleAudioRepositoryTest.java
    +                    │   │   ├── StyleRepositoryTest.java
    +                    │   │   ├── TtsAudioFileRepositoryTest.java
    +                    │   │   ├── TtsProcessHistoryRepositoryTest.java
    +                    │   │   ├── TtsProgressStatusRepositoryTest.java
    +                    │   │   ├── TtsSentenceRepositoryTest.java
    +                    │   │   ├── VoiceRepositoryFindTest.java
    +                    │   │   └── VoiceRepositoryTest.java
    +                    │   └── service
    +                    │       ├── LanguageServiceTest.java
    +                    │       ├── SaveTtsMakeResultTest.java
    +                    │       ├── StyleServiceTest.java
    +                    │       ├── TtsMakeServiceTest.java
    +                    │       ├── VoiceServiceTest.java
    +                    │       └── ttsSentenceService
    +                    │           ├── TestAddSentence.java
    +                    │           ├── TestBatchSave.java
    +                    │           ├── TestGetSentence.java
    +                    │           ├── TestGetSentenceList.java
    +                    │           ├── TestPatchSentenceOrder.java
    +                    │           └── TestUpdateSentence.java
    +                    └── vc
    +                        ├── controller
    +                        │   └── VcControllerTest.java
    +                        ├── repository
    +                        │   └── VcSrcFileRepositoryTest.java
    +                        └── service
    +                            ├── VcApiServiceImplTest.java
    +                            └── VcServiceImplTest.java
     
     
    From 79a507b6eda49d06bd1100831190dbf8f280a0f3 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Wed, 11 Dec 2024 15:14:26 +0900 Subject: [PATCH 071/167] =?UTF-8?q?[fix]=20ConcatWithBgm=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EA=B3=A0=EC=B9=98=EA=B8=B0=20=EC=9C=84=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20resample=20=EC=84=A4=EC=A0=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/component/audio/AudioResample.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java index b549dac7..b5d0320c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java @@ -62,9 +62,9 @@ public AudioResample() { audioFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, 44100, // 44.1kHz로 변환 - 32, // 32비트 + 16, // 16비트 2, // 스테레오 - 8, // 2 bytes/frame + 4, // 2 bytes/frame 44100, // frame rate와 샘플링 레이트 일치 false // 리틀 엔디안 ); From 7f5eb2086a7a30b52c8eea1114d58a3aade179e7 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Wed, 11 Dec 2024 15:14:42 +0900 Subject: [PATCH 072/167] =?UTF-8?q?[fix]=20ConcatWithBgm=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EA=B3=A0=EC=B9=98=EA=B8=B0=20=EC=9C=84=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20log=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatWithBgmController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index f208eee4..ede205b0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -28,6 +28,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -42,6 +43,7 @@ @Tag(name = "Concat", description = "Concat 관련 API") @RestController +@Log4j2 @RequestMapping("/api/concat") @RequiredArgsConstructor public class ConcatWithBgmController { @@ -94,31 +96,49 @@ public ResponseEntity> executeConcatWithBgm( // //SQS로 메세지 보내기. 각각 messageBody와 messageAttribute로 들어갈 내용 // Message message = sqsService.sendMessage(bgmFunctionRequestDto, MessageType.CONCAT_BGM_MAKE); + log.info("Request Parameters: concatTabSeq={}, bgmFileUrl={}, concatResultFileName={}", + concatTabSeq, bgmFileUrl, concatResultFileName); + log.info("Selected Rows: {}", selectedRows); + IntervalConcatenator intervalConcatenator = new StereoIntervalConcatenator(defaultAudioFormat); + log.info("IntervalConcatenator 초기화 성공"); + // Concat 작업: 1. Row 오디오 파일 로드 및 무음 처리 List audioProperties = audioStreamService.loadAudioFiles(selectedRows); + log.info("AudioProperties 로드 성공: {}", audioProperties); + // 2. 병합된 오디오 생성 ByteArrayOutputStream concatenatedAudioBuffer = intervalConcatenator.intervalConcatenate(audioProperties, selectedRows.getInitialSilence()); + log.info("병합된 오디오 버퍼 생성 성공"); + // Bgm 작업: 1. 병합된 오디오를 AudioInputStream으로 변환 AudioInputStream concatenatedAudioStream = audioStreamService.createAudioInputStream(concatenatedAudioBuffer, defaultAudioFormat); // 2. BGM 스트림 로드 및 버퍼링 AudioInputStream bufferedBgmStream = s3Service.loadAsBufferedStream(bgmFileUrl); + log.info("BGM 파일 로드 성공"); + // 3. BGM 길이 조정 long targetFrames = audioStreamService.getValidFrameLength(concatenatedAudioStream); long bgmFrames = audioStreamService.getValidFrameLength(bufferedBgmStream); bufferedBgmStream = BgmProcessor.adjustBgmLength(bufferedBgmStream, targetFrames, bgmFrames); + log.info("BGM 길이 조정 성공"); + // 4. 믹싱 AudioInputStream mixedAudioStream = BgmProcessor.mixAudio(concatenatedAudioStream, bufferedBgmStream); + log.info("오디오 믹싱 성공"); + // 결과파일 S3 업로드 String resultAudioUrl = s3Service.uploadAudioStream(mixedAudioStream, "concat/result", concatResultFileName); + log.info("S3 업로드 성공: {}", resultAudioUrl); + // String audioUrl = ""; // String concatResultFileName = ""; // AudioInputStream mixedAudioStream = null; @@ -126,9 +146,14 @@ public ResponseEntity> executeConcatWithBgm( // DB ConcatResult테이블에 결과 저장 ConcatUrlResponse concatResultResponse = concatResultService.saveConcatResult(concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); + + log.info("ConcatResult 저장 성공: {}", concatResultResponse); + // Material 데이터 저장 (재료 파일, 결과파일 저장되어 있는 상태로 교차테이블에 데이터 저장) materialAudioService.saveMaterialsForSelectedRows(selectedRows, concatResultResponse); + log.info("Material 데이터 저장 성공"); + // Concat 재료 파일 정보 생성 List concatRowFiles = selectedRows.getRows().stream() .map(row -> audioFileService.getAudioFileByUrl(row.getAudioUrl())) @@ -155,6 +180,7 @@ public ResponseEntity> executeConcatWithBgm( return new ResponseDto<>(HttpStatus.OK.value(), responseDto).toResponseEntity(); } catch (Exception e) { + log.error("ConcatWithBgmController execute 실패", e); // 실패 응답 생성 return createErrorResponse(); } From cda08b1066ef8e48c7737332b3a51e7bfbb4075e Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 06:08:10 +0900 Subject: [PATCH 073/167] =?UTF-8?q?[fix]=20Query=20did=20not=20return=20a?= =?UTF-8?q?=20unique=20result:=202=20results=20were=20returned=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EA=B0=80=20=EB=96=A0=EC=84=9C=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/repository/AudioFileRepository.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java index 9e9f9fa7..f2667e58 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java @@ -15,7 +15,7 @@ @Repository public interface AudioFileRepository extends JpaRepository { - Optional findByAudioUrl(String audioUrl); +// Optional findByAudioUrl(String audioUrl); Optional findByFileName(String filename); @@ -63,4 +63,8 @@ public interface AudioFileRepository extends JpaRepository { " WHERE ct.projectId = :proSeq" + " AND cr.status = 'Y'") List findAudioFileByProjectSeq(@Param("proSeq") Long projectSeq); + + @Query(value = "SELECT * FROM audio_file WHERE audio_url = :audioUrl ORDER BY audio_file_seq ASC LIMIT 1", nativeQuery = true) + Optional findFirstByAudioUrlNative(String audioUrl); + } From aabeb39c3e22701274569eec4e5d5dd4235499f2 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 06:10:27 +0900 Subject: [PATCH 074/167] =?UTF-8?q?[fix]=20BgmFileRepo=EC=97=90=20Url?= =?UTF-8?q?=EB=A1=9C=20BgmFile=20=EC=B0=BE=EB=8A=94=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/repository/BgmFileRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java index b4ea174b..c0b65e55 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface BgmFileRepository extends JpaRepository { @@ -18,4 +19,6 @@ public interface BgmFileRepository extends JpaRepository { @Query("SELECT b FROM bgm_file b WHERE b.concatResult.concatResultSequence = :resultSeq") List findByConcatResultSeq(@Param("resultSeq") Long concatResultSeq); + Optional findByAudioUrl(String audioUrl); + } From 447a97f1647a3d0b0d41c06f10092ec87a86d439 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 06:12:57 +0900 Subject: [PATCH 075/167] =?UTF-8?q?[fix]=20=EB=AC=B8=EC=A0=9C=EC=A0=90=20?= =?UTF-8?q?=ED=8C=8C=EC=95=85=EC=9D=84=20=EC=9C=84=ED=95=B4=20log=20?= =?UTF-8?q?=EB=8C=80=EA=B1=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatWithBgmController.java | 99 +++++++++++-------- .../concatenator/IntervalConcatenator.java | 25 ++++- .../StereoIntervalConcatenator.java | 13 +++ .../global/component/audio/AudioResample.java | 19 +++- 4 files changed, 112 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index 63e10a39..cda65456 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -5,11 +5,9 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; +import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; -import com.oreo.finalproject_5re5_be.concat.service.AudioFileService; -import com.oreo.finalproject_5re5_be.concat.service.AudioStreamService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; -import com.oreo.finalproject_5re5_be.concat.service.MaterialAudioService; +import com.oreo.finalproject_5re5_be.concat.service.*; import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; import com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator; @@ -36,7 +34,9 @@ import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -51,13 +51,12 @@ public class ConcatWithBgmController { private final S3Service s3Service; private final MaterialAudioService materialAudioService; private final ConcatResultService concatResultService; -// private final SqsService sqsService; private final AudioFileService audioFileService; private final AudioStreamService audioStreamService; // 추가된 서비스 private final AudioResample audioResample = new AudioResample(); // 리샘플링 유틸. Bean이 아니라 new로 생성 - private final AudioFormat defaultAudioFormat = AudioFormats.STEREO_FORMAT_SR441_B32; // 기본 포맷 + private final AudioFormat defaultAudioFormat = AudioFormats.STEREO_FORMAT_SR441_B16; // 기본 포맷 private final ProjectService projectService; - private final BgmFileRepository bgmFileRepository; + private final BgmFileService bgmFileService; @Operation( summary = "Row 오디오와 BGM 파일 병합", @@ -86,45 +85,41 @@ public ResponseEntity> executeConcatWithBgm( @Parameter(description = "결과물이 나온 concatTab", required = true) @RequestParam Long concatTabSeq, @Parameter(description = "bgm으로 쓸 오디오파일의 url", required = true) @RequestParam String bgmFileUrl, @Parameter(description = "저장할 결과파일 이름", required = true) @RequestParam String concatResultFileName, -// @RequestBody BgmFunctionRequestDto bgmFunctionRequestDto, @RequestBody SelectedConcatRowRequest selectedRows, @AuthenticationPrincipal CustomUserDetails customUserDetails) { projectService.projectCheck(customUserDetails.getMember().getSeq(), concatTabSeq); try { -// //SQS로 메세지 보내기. 각각 messageBody와 messageAttribute로 들어갈 내용 -// Message message = sqsService.sendMessage(bgmFunctionRequestDto, MessageType.CONCAT_BGM_MAKE); - - log.info("Request Parameters: concatTabSeq={}, bgmFileUrl={}, concatResultFileName={}", - concatTabSeq, bgmFileUrl, concatResultFileName); - log.info("Selected Rows: {}", selectedRows); - IntervalConcatenator intervalConcatenator = new StereoIntervalConcatenator(defaultAudioFormat); - log.info("IntervalConcatenator 초기화 성공"); - // Concat 작업: 1. Row 오디오 파일 로드 및 무음 처리 List audioProperties = audioStreamService.loadAudioFiles(selectedRows); - log.info("AudioProperties 로드 성공: {}", audioProperties); + log.info("[BGM] Row Concat 작업 1: AudioProperties 로드 성공: {}", audioProperties); // 2. 병합된 오디오 생성 ByteArrayOutputStream concatenatedAudioBuffer = intervalConcatenator.intervalConcatenate(audioProperties, selectedRows.getInitialSilence()); - log.info("병합된 오디오 버퍼 생성 성공"); + log.info("[BGM] Row Concat 작업 2: AudioProperties와 initialSilence로 IntervalConcatenate 성공. ByteArrayOutputStream Buffer 사이즈: {}", concatenatedAudioBuffer.size()); - // Bgm 작업: 1. 병합된 오디오를 AudioInputStream으로 변환 AudioInputStream concatenatedAudioStream = audioStreamService.createAudioInputStream(concatenatedAudioBuffer, defaultAudioFormat); - // 2. BGM 스트림 로드 및 버퍼링 - AudioInputStream bufferedBgmStream = s3Service.loadAsBufferedStream(bgmFileUrl); + log.info("[BGM] Row Concat 작업 3: buffer로 AudioInputStream 변환 성공. Frame Length: {}", concatenatedAudioStream.getFrameLength()); + + // BGM 작업 1: BGM 스트림 로드 및 버퍼링 + AudioInputStream bufferedBgmStream = audioStreamService.loadAsBufferedStream(bgmFileUrl); - log.info("BGM 파일 로드 성공"); + log.info("[BGM] BGM 파일 loadASBufferedStream 성공. Frame Length: {}", bufferedBgmStream.getFrameLength()); // 3. BGM 길이 조정 long targetFrames = audioStreamService.getValidFrameLength(concatenatedAudioStream); long bgmFrames = audioStreamService.getValidFrameLength(bufferedBgmStream); + + // 로그 추가: 프레임 길이 확인 + log.info("[BGM] Concatenated Audio Frames: {}", targetFrames); + log.info("[BGM] Original BGM Frames: {}", bgmFrames); + bufferedBgmStream = BgmProcessor.adjustBgmLength(bufferedBgmStream, targetFrames, bgmFrames); log.info("BGM 길이 조정 성공"); @@ -139,31 +134,21 @@ public ResponseEntity> executeConcatWithBgm( log.info("S3 업로드 성공: {}", resultAudioUrl); -// String audioUrl = ""; -// String concatResultFileName = ""; -// AudioInputStream mixedAudioStream = null; -// SelectedConcatRowRequest selectedRows = null; + log.info("Saving ConcatResult to database with tabSeq: {}, result URL: {}, file name: {}", concatTabSeq, resultAudioUrl, concatResultFileName); // DB ConcatResult테이블에 결과 저장 ConcatUrlResponse concatResultResponse = concatResultService.saveConcatResult(concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); log.info("ConcatResult 저장 성공: {}", concatResultResponse); - // Material 데이터 저장 (재료 파일, 결과파일 저장되어 있는 상태로 교차테이블에 데이터 저장) - materialAudioService.saveMaterialsForSelectedRows(selectedRows, concatResultResponse); + log.info("Fetching BGM AudioFile for URL: {}", bgmFileUrl); - log.info("Material 데이터 저장 성공"); + // BGM 파일 테이블에 저장 + BgmFile bgmAudioFile = bgmFileService.getBgmFileByUrl(bgmFileUrl); // URL로 BGM 파일 조회 + log.info("Fetched BGM AudioFile: {}", bgmAudioFile); - // Concat 재료 파일 정보 생성 - List concatRowFiles = selectedRows.getRows().stream() - .map(row -> audioFileService.getAudioFileByUrl(row.getAudioUrl())) - .map(this::convertToOriginAudioRequest) - .toList(); - - // BGM 파일 정보 생성 - AudioFile bgmAudioFile = audioFileService.getAudioFileByUrl(bgmFileUrl); // URL로 AudioFile 조회 OriginAudioRequest bgmFile = OriginAudioRequest.builder() - .seq(bgmAudioFile.getAudioFileSeq()) // AudioFile의 식별 ID + .seq(bgmAudioFile.getBgmFileSeq()) // BGM 파일의 식별 ID .audioUrl(bgmAudioFile.getAudioUrl()) // BGM 파일 URL .extension(bgmAudioFile.getExtension()) // BGM 파일 확장자 .fileSize(bgmAudioFile.getFileSize()) // 파일 크기 @@ -171,6 +156,35 @@ public ResponseEntity> executeConcatWithBgm( .fileName(bgmAudioFile.getFileName()) // 파일 이름 .build(); + log.info("BGM file converted to OriginAudioRequest: {}", bgmFile); + + + log.info("Saving Material data for selected rows: {}", selectedRows); + + // Material 데이터 저장 (재료 파일, 결과파일 저장되어 있는 상태로 교차테이블에 데이터 저장) + materialAudioService.saveMaterialsForSelectedRows(selectedRows, concatResultResponse); + + log.info("Material data saved successfully"); + + log.info("Fetching AudioFile for each row in selectedRows"); + + // Concat 재료 파일 정보 생성 + List concatRowFiles = selectedRows.getRows().stream() + .map(row -> { + log.info("Fetching AudioFile for URL: {}", row.getAudioUrl()); + AudioFile audioFile = audioFileService.getAudioFileByUrl(row.getAudioUrl()); + log.info("Fetched AudioFile: {}", audioFile); + return audioFile; + }) + .map(this::convertToOriginAudioRequest) + .peek(originAudioRequest -> log.info("Converted to OriginAudioRequest: {}", originAudioRequest)) + .toList(); + + log.info("Generated ConcatRowFiles: {}", concatRowFiles); + + log.info("Creating final response with result URL: {}, BGM file: {}, ConcatRow files: {}", + resultAudioUrl, bgmFile, concatRowFiles); + // 응답 생성 ConcatResponseDto responseDto = ConcatResponseDto.builder() .audioUrl(resultAudioUrl) @@ -178,10 +192,13 @@ public ResponseEntity> executeConcatWithBgm( .concatRowFiles(concatRowFiles) .build(); + log.info("Created final response: {}", responseDto); + return new ResponseDto<>(HttpStatus.OK.value(), responseDto).toResponseEntity(); } catch (Exception e) { - log.error("ConcatWithBgmController execute 실패", e); - // 실패 응답 생성 + log.error("ConcatWithBgmController execute 실패. concatTabSeq: {}, bgmFileUrl: {}, concatResultFileName: {}, selectedRows: {}", + concatTabSeq, bgmFileUrl, concatResultFileName, selectedRows, e); + return createErrorResponse(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java index aaed32bf..f59f9607 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java @@ -1,6 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; +import lombok.extern.log4j.Log4j2; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; @@ -14,15 +15,35 @@ * @apiNote 음성간 간격이 있는 오디오를 위함 병합 클래스의 인터페이스 입니다.
    * */ + + public interface IntervalConcatenator extends Concatenator { ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException; //공통 IntervalConcatenator에 필요한 로직을 분리 static List prepareAudioStreams(List audioStreams, AudioFormat audioFormat) { List result = new ArrayList<>(); + int index = 1; // 로그를 위한 인덱스 관리 + for (AudioProperties audioProperties : audioStreams) { - result.add(audioProperties.audioInputStream());//오디오 파일 넣기 - result.add(BeepMaker.makeSound(audioProperties.silence() * 1000, audioFormat));// 무음구간 오디오 만들어서 넣기 + AudioInputStream audioStream = audioProperties.audioInputStream(); // AudioProperties에서 AudioStream 추출 + + // row audio 관련 log + System.out.printf("[prepareAudioStreams] 오디오 스트림 추가: index=%d, frameLength=%d, format=%s%n", + index, audioStream.getFrameLength(), audioStream.getFormat()); + + result.add(audioProperties.audioInputStream());//오디오 스트림 추가 + + // 무음 구간 생성 및 추가 + AudioInputStream silenceStream = BeepMaker.makeSound(audioProperties.silence() * 1000, audioFormat); + + // row 무음구간 관련 log + System.out.printf("[prepareAudioStreams] 무음 구간 추가: index=%d, duration=%dms, frameLength=%d%n", + index, (int) (audioProperties.silence() * 1000), silenceStream.getFrameLength()); + + result.add(silenceStream); + + index++; // 인덱스 증가 } return result; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java index 953cb71a..aaabab0f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java @@ -3,6 +3,7 @@ import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; +import lombok.extern.log4j.Log4j2; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; @@ -20,6 +21,8 @@ * @see AudioExtensionConverter * */ + +@Log4j2 public class StereoIntervalConcatenator extends StereoConcatenator implements IntervalConcatenator { private final AudioFormat AUDIO_FORMAT; @@ -38,7 +41,17 @@ public StereoIntervalConcatenator(AudioFormat audioFormat) { @Override public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException { List list = prepareAudioStreams(audioStreams, AUDIO_FORMAT); + + AudioInputStream initialSilenceStream = BeepMaker.makeSound(start * 1000, AUDIO_FORMAT); + + // 로그 추가: 무음 구간 (맨앞) 생성 + log.info("[intervalConcatenate] 맨앞 무음 구간 추가: duration={}ms, frameLength={}", + (int) (start * 1000), initialSilenceStream.getFrameLength()); + + list.add(0, BeepMaker.makeSound(start * 1000, AUDIO_FORMAT)); + + return super.concatenate(list); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java index b5d0320c..52c33643 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java @@ -1,6 +1,7 @@ package com.oreo.finalproject_5re5_be.global.component.audio; import com.oreo.finalproject_5re5_be.concat.service.concatenator.Concatenator; +import lombok.extern.log4j.Log4j2; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; @@ -15,6 +16,8 @@ * @apiNote 병합 되거나 병합되기 이전의 오디오 형식을 일치 시키기 위한 클래스 * @see Concatenator */ + +@Log4j2 public class AudioResample { private final AudioFormat audioFormat; @@ -97,9 +100,23 @@ public AudioInputStream resample(ByteArrayOutputStream byteArrayOutputStream) { //리샘플링 포맷 일치화 public AudioInputStream formatting(AudioInputStream audioInputStream) { + log.info("[formatting] 현재 오디오 포맷과 타겟 오디오 포맷이 일치하는지 확인 중..."); + log.info("[formatting] 현재 오디오 포맷: {}", audioInputStream.getFormat()); + log.info("[formatting] 타겟 오디오 포맷: {}", audioFormat); + if (audioInputStream.getFormat().matches(audioFormat)) { + log.info("[formatting] 타겟 오디오 포맷과 이미 일치하여, 리샘플링이 필요없습니다."); return audioInputStream; } - return AudioSystem.getAudioInputStream(audioFormat, audioInputStream); + + log.info("[formatting] 타겟 오디오 포맷과 일치하지 않아서 리샘플링 중..."); + try { + AudioInputStream resampledStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream); + log.info("[formatting] 리샘플링된 포맷: {}", resampledStream.getFormat()); + return resampledStream; + } catch (Exception e) { + log.error("Failed to resample audio format", e); + throw new IllegalArgumentException("Resampling failed"); + } } } From 1c90670c71cb983dfefcdf625f9c9194c004348e Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 06:13:50 +0900 Subject: [PATCH 076/167] =?UTF-8?q?[fix]=20findByAudioUrl=EC=97=90?= =?UTF-8?q?=EC=84=9C=20findFiistByAudioUrlNative=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD=ED=95=B4=EC=84=9C=20=EC=93=B0?= =?UTF-8?q?=EC=9D=B4=EB=8A=94=20=EA=B3=B3=EB=93=A4=EB=8F=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/concat/service/AudioFileService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java index 8cf2fae7..78a0ce8b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java @@ -55,7 +55,7 @@ public List getAudioFilesByProjectAndStatusTrue(Long projectSeq // audioFile Url로 audioFile 정보 조회 (1개) public AudioFile getAudioFileByUrl(String audioUrl) { - return audioFileRepository.findByAudioUrl(audioUrl) + return audioFileRepository.findFirstByAudioUrlNative(audioUrl) .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioUrl)); } From f418494bb63315bf5e0d964cae1d8e3f92a72e09 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 06:14:24 +0900 Subject: [PATCH 077/167] =?UTF-8?q?[fix]=20S3Service=EC=97=90=20=EC=9E=88?= =?UTF-8?q?=EB=8D=98=20loadAsBufferedStream=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20AudioStreamService=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/AudioStreamService.java | 80 +++++++++++++++++-- .../global/component/S3Service.java | 41 +++------- 2 files changed, 83 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java index 37f86022..3a4cd9ba 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java @@ -4,24 +4,28 @@ import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; import com.oreo.finalproject_5re5_be.global.component.S3Service; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; -import javax.sound.sampled.AudioFileFormat; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.util.ArrayList; import java.util.List; @RequiredArgsConstructor +@Log4j2 @Service public class AudioStreamService { + private final AudioFormat defaultAudioFormat = AudioFormats.STEREO_FORMAT_SR441_B16; // 기본 포맷 private final AudioResample audioResample = new AudioResample(); public AudioInputStream createAudioInputStream(ByteArrayOutputStream buffer, AudioFormat format) { @@ -44,11 +48,73 @@ public long getValidFrameLength(AudioInputStream audioStream) throws IOException public List loadAudioFiles(SelectedConcatRowRequest selectedRows) { List audioPropertiesList = new ArrayList<>(); for (SelectedConcatRowRequest.Row row : selectedRows.getRows()) { - AudioInputStream audioStream = S3Service.load(row.getAudioUrl()); - audioStream = audioResample.formatting(audioStream); // 리샘플링 처리 - audioPropertiesList.add(new AudioProperties(audioStream, row.getSilenceInterval())); + log.info("[loadAudioFiles] SelectedConcatRowRequest의 Row에 박혀있는 URL: {}", row.getAudioUrl()); + try { + AudioInputStream audioStream = S3Service.load(row.getAudioUrl()); + log.info("[loadAudioFiles] load 완료: "); + + audioStream = audioResample.formatting(audioStream); // 리샘플링 처리 + + // 리샘플링 후 포맷 로그 + log.info("[loadAudioFiles] 리샘플링 완료하고 나온 포맷: {}", audioStream.getFormat()); + + AudioProperties audioProperties = new AudioProperties(audioStream, row.getSilenceInterval()); + log.info("[loadAudioFiles] 생성된 AudioProperties: silenceInterval={}, frameLength={}", + row.getSilenceInterval(), audioStream.getFrameLength()); + + audioPropertiesList.add(audioProperties); + } catch (Exception e) { + log.error("Failed to load or process audio file from URL: {}", row.getAudioUrl(), e); + } } return audioPropertiesList; } + public AudioInputStream loadAsBufferedStream(String s3Url) { + try { + URL url = new URL(s3Url); + + log.info("[loadAsBufferedStream] BGM으로 쓰일 S3 URL: {}", s3Url); + + AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); + log.info("[loadAsBufferedStream] AudioInputStream 가져오기 성공. Format: {}", audioInputStream.getFormat()); + + // mp3 -> WAV 변환 + byte[] wavData = AudioExtensionConverter.mp3ToWav(audioInputStream); + log.info("[loadAsBufferedStream] mp3ToWAV 변환 성공. Data Size: {} bytes", wavData.length); + + // Target Format으로 변환 (formatting) + AudioInputStream wavStream = new AudioInputStream(new ByteArrayInputStream(wavData), defaultAudioFormat, wavData.length / defaultAudioFormat.getFrameSize()); + AudioInputStream formattedStream = audioResample.formatting(wavStream); + log.info("[loadAsBufferedStream] formatting 변환 성공. Frame Length: {}", formattedStream.getFrameLength()); + + // 데이터를 메모리에 버퍼링 + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + AudioSystem.write(formattedStream, AudioFileFormat.Type.WAVE, buffer); + log.info("[loadASBufferedStream] AudioInputStream 데이터를 ByteArrayOutputStream으로 버퍼링 성공. 크기: {} bytes", buffer.size()); + + byte[] bufferedData = buffer.toByteArray(); + AudioFormat format = formattedStream.getFormat(); + log.info("[loadASBufferedStream] Buffered Data 생성 성공. 총 길이: {} bytes, FrameSize: {}", bufferedData.length, format.getFrameSize()); + + AudioInputStream bufferedStream = new AudioInputStream( + new ByteArrayInputStream(bufferedData), + format, + bufferedData.length / format.getFrameSize() + ); + + log.info("[loadAsBufferedStream] Buffered AudioInputStream 생성 성공. Frame Length: {}", bufferedStream.getFrameLength()); + + return bufferedStream; + + } catch (MalformedURLException e) { + throw new IllegalArgumentException("잘못된 S3 URL입니다.", e); + } catch (UnsupportedAudioFileException e) { + throw new IllegalArgumentException("지원되지 않는 오디오 파일 형식입니다.", e); + } catch (IOException e) { + log.error("Error processing S3 URL: {}", s3Url, e); + throw new IllegalArgumentException("오디오 처리 실패", e); + } + } + } \ No newline at end of file diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java index 43feff48..3e1c8ca3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java @@ -7,6 +7,7 @@ import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3ObjectInputStream; import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.vc.dto.request.VcUrlRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -252,14 +253,23 @@ public static AudioInputStream load(String s3Url) { try { URL url = new URL(s3Url); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); + log.info("[load] S3 저장소에서 URL audioInputStream 가져오기: {}", s3Url); + + // 원본 포맷 로그 + log.info("[load] MP3 to WAV 하기 전, 오리지널 포맷: {}", audioInputStream.getFormat()); + byte[] bytes = AudioExtensionConverter.mp3ToWav(audioInputStream); + log.info("[load] S3에서 꺼낸 URL MP3를 WAV로 변환. bytes.length: {} bytes", bytes.length); return AudioSystem.getAudioInputStream(new ByteArrayInputStream(bytes)); } catch (MalformedURLException e) { + log.error("Invalid S3 URL: {}", s3Url, e); throw new IllegalArgumentException("잘못된 URL입니다"); } catch (IOException e) { + log.error("Error reading audio file from S3 URL: {}", s3Url, e); throw new IllegalArgumentException("오디오 파일이 아닙니다."); } catch (UnsupportedAudioFileException e) { + log.error("Unsupported audio format at S3 URL: {}", s3Url, e); throw new IllegalArgumentException("지원하지 않는 오디오 형식입니다"); } } @@ -292,35 +302,4 @@ public String uploadAudioStream(AudioInputStream audioStream, String dirName, St return s3Client.getUrl(buketName, key).toString(); } - - /** - * S3에서 URL을 통해 AudioInputStream으로 읽기 (Buffered Stream) - * - * @param s3Url S3의 파일 URL - * @return AudioInputStream - * @throws IOException - */ - public AudioInputStream loadAsBufferedStream(String s3Url) throws IOException { - try { - URL url = new URL(s3Url); - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); - - // 데이터를 메모리에 버퍼링 - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, buffer); - - byte[] bufferedData = buffer.toByteArray(); - AudioFormat format = audioInputStream.getFormat(); - - return new AudioInputStream( - new ByteArrayInputStream(bufferedData), - format, - bufferedData.length / format.getFrameSize() - ); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("잘못된 S3 URL입니다.", e); - } catch (UnsupportedAudioFileException e) { - throw new IllegalArgumentException("지원되지 않는 오디오 파일 형식입니다.", e); - } - } } From 2647ea8150ccf47d77916abe2e45053008a270af Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 06:14:59 +0900 Subject: [PATCH 078/167] =?UTF-8?q?[fix]=20BgmFileService=EC=97=90=20getBg?= =?UTF-8?q?mFileByUrl=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/concat/service/BgmFileService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java index 0e4d863e..4f971e21 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java @@ -16,6 +16,12 @@ public class BgmFileService { public List getBgmFilesByTabSeq(Long tabSeq) { return bgmFileRepository.findByConcatTabSeq(tabSeq); + } + public BgmFile getBgmFileByUrl(String bgmFileUrl) { + return bgmFileRepository.findByAudioUrl(bgmFileUrl) + .orElseThrow(() -> new IllegalArgumentException("BGM File not found with URL: " + bgmFileUrl)); } + + } \ No newline at end of file From 230ac9cdbe5c3992004313afd7d64f1af9a4ef8c Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 06:16:11 +0900 Subject: [PATCH 079/167] =?UTF-8?q?[fix]=20findByAudioUrl=EC=97=90?= =?UTF-8?q?=EC=84=9C=20findFirstByAudioUrlNative=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD=ED=95=B4=EC=84=9C=20=EC=93=B0?= =?UTF-8?q?=EC=9D=B4=EB=8A=94=20=EA=B3=B3=EB=93=A4=EB=8F=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/MaterialAudioService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java index d3a82385..d66edfec 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java @@ -152,7 +152,7 @@ public boolean saveMaterialAudio(List materialAudios) { public void saveMaterialsForSelectedRows(SelectedConcatRowRequest selectedRows, ConcatUrlResponse concatResultResponse) { List usedAudioFileSeqs = selectedRows.getRows().stream() .map(SelectedConcatRowRequest.Row::getAudioUrl) // URL 추출 - .map(audioFileRepository::findByAudioUrl) // URL로 AudioFile 조회 + .map(audioFileRepository::findFirstByAudioUrlNative) // URL로 AudioFile 조회 .map(audioFile -> audioFile.orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioFile.get().getAudioUrl()))) .map(AudioFile::getAudioFileSeq) // Seq 추출 .toList(); From ccf476c888e1114882ec076dd87cf8f9fe65a435 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 13:40:00 +0900 Subject: [PATCH 080/167] =?UTF-8?q?[fix]=20=ED=94=84=EB=A1=A0=ED=8A=B8=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatWithBgmController.java | 78 ++++++++++--------- .../concat/service/AudioStreamService.java | 25 +++--- .../concat/service/BgmFileService.java | 4 + .../concat/service/MaterialAudioService.java | 7 +- 4 files changed, 63 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index cda65456..a25a3cee 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -1,19 +1,16 @@ package com.oreo.finalproject_5re5_be.concat.controller; import com.oreo.finalproject_5re5_be.concat.dto.ConcatResponseDto; -import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; -import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.request.*; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; -import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import com.oreo.finalproject_5re5_be.concat.service.*; import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; import com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator; import com.oreo.finalproject_5re5_be.concat.service.concatenator.StereoIntervalConcatenator; import com.oreo.finalproject_5re5_be.global.component.S3Service; -//import com.oreo.finalproject_5re5_be.global.component.SqsService; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; @@ -34,9 +31,7 @@ import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -82,24 +77,34 @@ public class ConcatWithBgmController { ) @PostMapping("/execute-with-bgm") public ResponseEntity> executeConcatWithBgm( - @Parameter(description = "결과물이 나온 concatTab", required = true) @RequestParam Long concatTabSeq, - @Parameter(description = "bgm으로 쓸 오디오파일의 url", required = true) @RequestParam String bgmFileUrl, @Parameter(description = "저장할 결과파일 이름", required = true) @RequestParam String concatResultFileName, - @RequestBody SelectedConcatRowRequest selectedRows, + @RequestBody TabRowUpdateRequestDto requestDto, @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), concatTabSeq); try { + // Extracting data from the new DTO + ConcatUpdateRequestDto concatTab = requestDto.getConcatTab(); + ConcatRowSaveRequestDto concatRows = requestDto.getConcatRows(); + + Long concatTabSeq = concatTab.getTabId(); + float frontSilence = concatTab.getFrontSilence(); + String bgmFileUrl = concatTab.getBgmFileList().get(0).getAudioUrl(); + + projectService.projectCheck(customUserDetails.getMember().getSeq(), requestDto.getConcatTab().getTabId()); + IntervalConcatenator intervalConcatenator = new StereoIntervalConcatenator(defaultAudioFormat); // Concat 작업: 1. Row 오디오 파일 로드 및 무음 처리 - List audioProperties = audioStreamService.loadAudioFiles(selectedRows); +// List audioProperties = audioStreamService.loadAudioFiles(selectedRows); + + List audioProperties = audioStreamService.loadAudioFiles(concatRows); + log.info("[BGM] Row Concat 작업 1: AudioProperties 로드 성공: {}", audioProperties); // 2. 병합된 오디오 생성 - ByteArrayOutputStream concatenatedAudioBuffer = intervalConcatenator.intervalConcatenate(audioProperties, selectedRows.getInitialSilence()); + ByteArrayOutputStream concatenatedAudioBuffer = intervalConcatenator.intervalConcatenate(audioProperties, frontSilence); log.info("[BGM] Row Concat 작업 2: AudioProperties와 initialSilence로 IntervalConcatenate 성공. ByteArrayOutputStream Buffer 사이즈: {}", concatenatedAudioBuffer.size()); @@ -136,43 +141,44 @@ public ResponseEntity> executeConcatWithBgm( log.info("Saving ConcatResult to database with tabSeq: {}, result URL: {}, file name: {}", concatTabSeq, resultAudioUrl, concatResultFileName); + // DB에 결과파일, bgm파일, row에 들어가는 audio파일, row, materials 에 정보들을 넣어야한다. // DB ConcatResult테이블에 결과 저장 ConcatUrlResponse concatResultResponse = concatResultService.saveConcatResult(concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); log.info("ConcatResult 저장 성공: {}", concatResultResponse); - log.info("Fetching BGM AudioFile for URL: {}", bgmFileUrl); - - // BGM 파일 테이블에 저장 - BgmFile bgmAudioFile = bgmFileService.getBgmFileByUrl(bgmFileUrl); // URL로 BGM 파일 조회 - log.info("Fetched BGM AudioFile: {}", bgmAudioFile); + log.info("Fetching BGM AudioFile information from requestDto"); + OriginAudioRequest bgmRequest = concatTab.getBgmFileList().get(0); + log.info("BGM information from requestDto: {}", bgmRequest); - OriginAudioRequest bgmFile = OriginAudioRequest.builder() - .seq(bgmAudioFile.getBgmFileSeq()) // BGM 파일의 식별 ID - .audioUrl(bgmAudioFile.getAudioUrl()) // BGM 파일 URL - .extension(bgmAudioFile.getExtension()) // BGM 파일 확장자 - .fileSize(bgmAudioFile.getFileSize()) // 파일 크기 - .fileLength(bgmAudioFile.getFileLength()) // 파일 길이 - .fileName(bgmAudioFile.getFileName()) // 파일 이름 - .build(); + // BGM 파일 정보를 DB에 저장 + BgmFile bgmAudioFile = bgmFileService.saveBgmFile( + BgmFile.builder() + .audioUrl(bgmRequest.getAudioUrl()) + .extension(bgmRequest.getExtension()) + .fileSize(bgmRequest.getFileSize()) + .fileLength(bgmRequest.getFileLength()) + .fileName(bgmRequest.getFileName()) + .build() + ); - log.info("BGM file converted to OriginAudioRequest: {}", bgmFile); + log.info("Saved BGM AudioFile in DB: {}", bgmAudioFile); + log.info("Saving Material data for provided rows and concat result"); - log.info("Saving Material data for selected rows: {}", selectedRows); // Material 데이터 저장 (재료 파일, 결과파일 저장되어 있는 상태로 교차테이블에 데이터 저장) - materialAudioService.saveMaterialsForSelectedRows(selectedRows, concatResultResponse); + materialAudioService.saveMaterialsForConcatRows(concatRows, concatResultResponse); log.info("Material data saved successfully"); - log.info("Fetching AudioFile for each row in selectedRows"); + log.info("Fetching AudioFile for each row in concatRows"); // Concat 재료 파일 정보 생성 - List concatRowFiles = selectedRows.getRows().stream() + List concatRowFiles = concatRows.getConcatRowRequests().stream() .map(row -> { - log.info("Fetching AudioFile for URL: {}", row.getAudioUrl()); - AudioFile audioFile = audioFileService.getAudioFileByUrl(row.getAudioUrl()); + log.info("Fetching AudioFile for URL: {}", row.getOriginAudioRequest()); + AudioFile audioFile = audioFileService.getAudioFileByUrl(row.getOriginAudioRequest().getAudioUrl()); log.info("Fetched AudioFile: {}", audioFile); return audioFile; }) @@ -183,12 +189,12 @@ public ResponseEntity> executeConcatWithBgm( log.info("Generated ConcatRowFiles: {}", concatRowFiles); log.info("Creating final response with result URL: {}, BGM file: {}, ConcatRow files: {}", - resultAudioUrl, bgmFile, concatRowFiles); + resultAudioUrl, bgmRequest.getAudioUrl(), concatRowFiles); // 응답 생성 ConcatResponseDto responseDto = ConcatResponseDto.builder() .audioUrl(resultAudioUrl) - .bgmFile(bgmFile) + .bgmFile(bgmRequest) .concatRowFiles(concatRowFiles) .build(); @@ -196,9 +202,7 @@ public ResponseEntity> executeConcatWithBgm( return new ResponseDto<>(HttpStatus.OK.value(), responseDto).toResponseEntity(); } catch (Exception e) { - log.error("ConcatWithBgmController execute 실패. concatTabSeq: {}, bgmFileUrl: {}, concatResultFileName: {}, selectedRows: {}", - concatTabSeq, bgmFileUrl, concatResultFileName, selectedRows, e); - + e.printStackTrace(); return createErrorResponse(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java index 3a4cd9ba..5862cc0a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java @@ -1,5 +1,8 @@ package com.oreo.finalproject_5re5_be.concat.service; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; @@ -45,26 +48,26 @@ public long getValidFrameLength(AudioInputStream audioStream) throws IOException return frameLength > 0 ? frameLength : BgmProcessor.calculateTargetFrames(audioStream); } - public List loadAudioFiles(SelectedConcatRowRequest selectedRows) { + public List loadAudioFiles(ConcatRowSaveRequestDto selectedRows) { List audioPropertiesList = new ArrayList<>(); - for (SelectedConcatRowRequest.Row row : selectedRows.getRows()) { - log.info("[loadAudioFiles] SelectedConcatRowRequest의 Row에 박혀있는 URL: {}", row.getAudioUrl()); + for (ConcatRowRequest row : selectedRows.getConcatRowRequests()) { + OriginAudioRequest originAudio = row.getOriginAudioRequest(); + log.info("[loadAudioFiles] SelectedConcatRowRequest의 Row에 박혀있는 URL: {}", originAudio.getAudioUrl()); try { - AudioInputStream audioStream = S3Service.load(row.getAudioUrl()); - log.info("[loadAudioFiles] load 완료: "); + AudioInputStream audioStream = S3Service.load(originAudio.getAudioUrl()); + log.info("[loadAudioFiles] S3에서 오디오 파일 load 완료: "); + // 리샘플링 처리 audioStream = audioResample.formatting(audioStream); // 리샘플링 처리 + log.info("[loadAudioFiles] 리샘플링 완료된 오디오 포맷: {}", audioStream.getFormat()); - // 리샘플링 후 포맷 로그 - log.info("[loadAudioFiles] 리샘플링 완료하고 나온 포맷: {}", audioStream.getFormat()); - - AudioProperties audioProperties = new AudioProperties(audioStream, row.getSilenceInterval()); + AudioProperties audioProperties = new AudioProperties(audioStream, row.getRowSilence()); log.info("[loadAudioFiles] 생성된 AudioProperties: silenceInterval={}, frameLength={}", - row.getSilenceInterval(), audioStream.getFrameLength()); + row.getRowSilence(), audioStream.getFrameLength()); audioPropertiesList.add(audioProperties); } catch (Exception e) { - log.error("Failed to load or process audio file from URL: {}", row.getAudioUrl(), e); + log.error("Failed to load or process audio file from URL: {}", originAudio.getAudioUrl(), e); } } return audioPropertiesList; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java index 4f971e21..1cf8935b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java @@ -23,5 +23,9 @@ public BgmFile getBgmFileByUrl(String bgmFileUrl) { .orElseThrow(() -> new IllegalArgumentException("BGM File not found with URL: " + bgmFileUrl)); } + public BgmFile saveBgmFile(BgmFile bgmFile) { + return bgmFileRepository.save(bgmFile); + } + } \ No newline at end of file diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java index d66edfec..62e46a43 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java @@ -1,6 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.service; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; @@ -149,9 +150,9 @@ public boolean saveMaterialAudio(List materialAudios) { } // 기존 기능 외 추가 메서드: SelectedConcatRowRequest 처리 - public void saveMaterialsForSelectedRows(SelectedConcatRowRequest selectedRows, ConcatUrlResponse concatResultResponse) { - List usedAudioFileSeqs = selectedRows.getRows().stream() - .map(SelectedConcatRowRequest.Row::getAudioUrl) // URL 추출 + public void saveMaterialsForConcatRows(ConcatRowSaveRequestDto concatRows, ConcatUrlResponse concatResultResponse) { + List usedAudioFileSeqs = concatRows.getConcatRowRequests().stream() + .map(row -> row.getOriginAudioRequest().getAudioUrl()) // URL 추출 .map(audioFileRepository::findFirstByAudioUrlNative) // URL로 AudioFile 조회 .map(audioFile -> audioFile.orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioFile.get().getAudioUrl()))) .map(AudioFile::getAudioFileSeq) // Seq 추출 From 9c6908747f4fb36d7c018278bc0d42b3e5749b3c Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:24:26 +0900 Subject: [PATCH 081/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A1=9C=20ToString=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/project/entity/Project.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java index e973fc9f..1c53d5e1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java @@ -18,7 +18,6 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(callSuper = false) -@ToString public class Project extends BaseEntity { @Id From 71e01fd08f7f1c0cc78a6499d2e7277f6c4fb09a Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:25:28 +0900 Subject: [PATCH 082/167] =?UTF-8?q?[Feat]=20:=20=EC=95=A4=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20FetchType=20LAZY=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/concat/entity/ConcatTab.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java index a832df57..7d104c49 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java @@ -7,7 +7,6 @@ import java.util.List; -@ToString @Getter @Builder @NoArgsConstructor @@ -18,7 +17,7 @@ public class ConcatTab extends BaseEntity { private Long projectId; @MapsId // Project 엔티티의 ID를 ConcatTab의 ID로 사용 - @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) + @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) @JoinColumn(name = "pro_seq") private Project project; @@ -28,8 +27,9 @@ public class ConcatTab extends BaseEntity { @Column(name = "front_silence") private Float frontSilence; + @ToString.Exclude // 하나의 ConcatTab에 여러 bgmFile들 매칭 - @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.EAGER) + @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.LAZY) private List bgmFiles; From 3e12cc5a204109dfcd5892a28799e0aefcc1f3e1 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:26:41 +0900 Subject: [PATCH 083/167] =?UTF-8?q?[Feat]=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=95=84=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/dto/request/ConcatRowRequestDto.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java index 82d6ce47..e7a34e7c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java @@ -14,8 +14,6 @@ public class ConcatRowRequestDto { @NotNull private Long concatTabId; @NotNull - private Long memberSeq; - @NotNull private String fileName; @NotNull private List concatRowRequests; From 8ce8949c666c12c717f95273e5c57a736488611e Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:27:07 +0900 Subject: [PATCH 084/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A1=9C=20ToString=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java index 4294bf39..5103defe 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java @@ -4,7 +4,6 @@ import jakarta.persistence.*; import lombok.*; -@ToString @Getter @Builder @AllArgsConstructor From 845ea5876c5b68b7edf74f9bf93a0711740dd697 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:28:47 +0900 Subject: [PATCH 085/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A5=BC=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=99=B8=EB=9E=98?= =?UTF-8?q?=ED=82=A4=20=EB=A7=A4=ED=95=91=20ToString=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/concat/entity/ConcatResult.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java index f8f0fffc..c69cde3b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java @@ -24,6 +24,7 @@ public class ConcatResult extends BaseEntity { @JoinColumn(name = "pro_seq") private ConcatTab concatTab; + @ToString.Exclude @OneToMany(mappedBy = "concatResult", cascade = CascadeType.ALL, orphanRemoval = true) private List bgmFiles = new ArrayList<>(); From 3b94f93f228f565712365fa182c176bdadafdb06 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:29:33 +0900 Subject: [PATCH 086/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A5=BC=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=99=B8=EB=9E=98?= =?UTF-8?q?=ED=82=A4=20=EB=A7=A4=ED=95=91=20ToString=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java index 01964ad5..a8c8466c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java @@ -8,7 +8,6 @@ import java.time.LocalDateTime; -@ToString @Getter @Builder @AllArgsConstructor @@ -21,10 +20,12 @@ public class BgmFile extends BaseEntity { @Column(name = "bgm_file_seq") private Long bgmFileSeq; + @ToString.Exclude @ManyToOne @JoinColumn(name = "concat_tab_seq") // 외래 키: concat_tab의 ID private ConcatTab concatTab; + @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "concat_result_seq", nullable = true) private ConcatResult concatResult; From 6fb0c5b3cee9e1e460a3ab770adce1704a1c967e Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:30:25 +0900 Subject: [PATCH 087/167] =?UTF-8?q?[Feat]=20:=20=EB=A0=88=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EB=B9=88=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/config/RestTemplateConfig.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java new file mode 100644 index 00000000..4ce37423 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.oreo.finalproject_5re5_be.concat.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} From 4f9fb92f810bc3b3a7dba5dabbfdc9980eff559a Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:34:04 +0900 Subject: [PATCH 088/167] =?UTF-8?q?[Feat]=20:=20=EB=9E=8C=EB=8B=A4=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=EC=9A=A9=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/dto/lambda/AudioFormatDto.java | 40 +++++++++++++ .../dto/lambda/LambdaConcatRequest.java | 59 +++++++++++++++++++ .../concat/dto/lambda/response/AudioInfo.java | 48 +++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java new file mode 100644 index 00000000..758af81c --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java @@ -0,0 +1,40 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda; + +import lombok.Getter; +import lombok.Setter; + +import javax.sound.sampled.AudioFormat; + +@Getter +@Setter +public class AudioFormatDto { + private Float sampleRate; + private Integer bitDepth; + private Integer channels; + private Integer frameSize; + private Float frameRate; + + public AudioFormatDto() { + } + + public AudioFormatDto(AudioFormat audioFormat) { + this.sampleRate = audioFormat.getSampleRate(); + this.bitDepth = audioFormat.getSampleSizeInBits(); + this.channels = audioFormat.getChannels(); + this.frameSize = audioFormat.getFrameSize(); + this.frameRate = audioFormat.getFrameRate(); + } + + public AudioFormatDto(Float sampleRate, Integer bitDepth, Integer channels, Integer frameSize, Float frameRate) { + this.sampleRate = sampleRate; + this.bitDepth = bitDepth; + this.channels = channels; + this.frameSize = frameSize; + this.frameRate = frameRate; + } + + public AudioFormat toAudioFormat() { + return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, + sampleRate, bitDepth, channels, frameSize, frameRate, false); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java new file mode 100644 index 00000000..c32521e3 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java @@ -0,0 +1,59 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda; + +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; +import lombok.Builder; + +import java.util.List; + +@Builder +public class LambdaConcatRequest { + private ConcatTabResponseDto concatTabResponseDto; + private AudioFormatDto audioFormatDto; + private List audios; + private String fileName; + + public LambdaConcatRequest() { + } + + public LambdaConcatRequest(ConcatTabResponseDto concatTabResponseDto, AudioFormatDto audioFormatDto, + List audios, String fileName) { + this.concatTabResponseDto = concatTabResponseDto; + this.audioFormatDto = audioFormatDto; + this.audios = audios; + this.fileName = fileName; + } + + public List getAudios() { + return audios; + } + + public void setAudios(List audios) { + this.audios = audios; + } + + public AudioFormatDto getAudioFormatDto() { + return audioFormatDto; + } + + public void setAudioFormatDto(AudioFormatDto audioFormatDto) { + this.audioFormatDto = audioFormatDto; + } + + public ConcatTabResponseDto getConcatTabResponseDto() { + return concatTabResponseDto; + } + + public void setConcatTabResponseDto(ConcatTabResponseDto concatTabResponseDto) { + this.concatTabResponseDto = concatTabResponseDto; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java new file mode 100644 index 00000000..8014b5c7 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java @@ -0,0 +1,48 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda.response; + + +import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.sound.sampled.AudioInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +@Getter +@Setter +@NoArgsConstructor +public class AudioInfo { + private byte[] audioData; + private String fileName; + private float contentLength; + private String contentType; + + public AudioInfo(AudioInputStream audioData, String fileName, float contentLength, String contentType) { + this.audioData = AudioExtensionConverter.mp3ToWav(audioData); + this.fileName = fileName; + this.contentLength = contentLength; + this.contentType = contentType; + } + + private byte[] getAudioBytes(AudioInputStream audioStream) { + + try { + return audioStream.readAllBytes(); + } catch (IOException e) { + throw new RuntimeException("오디오 변환 실패", e); + } + } + + public Long getContentSize() { + return (long) audioData.length; + } + + + + public InputStream toInputStream() { + return new ByteArrayInputStream(audioData); + } +} From f970f6a29a090a7e0d1de96d34558a7a505e4bf1 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:34:29 +0900 Subject: [PATCH 089/167] =?UTF-8?q?[Feat]=20:=20=EB=9E=8C=EB=8B=A4=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=EC=9A=A9=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/LambdaConcatResultDto.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java new file mode 100644 index 00000000..85c045f1 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java @@ -0,0 +1,48 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda.response; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class LambdaConcatResultDto { + private final AudioInfo info; + private final List processed; + private final String s3Url; + private final String contentType; + private final String processId; + private final int i; + + @JsonCreator + public LambdaConcatResultDto( + @JsonProperty("info") AudioInfo info, + @JsonProperty("processed") List processed, + @JsonProperty("s3Url") String s3Url, + @JsonProperty("contentType") String contentType, + @JsonProperty("processId") String processId, + @JsonProperty("i") int i + ) { + this.info = info; + this.processed = processed; + this.s3Url = s3Url; + this.contentType = contentType; + this.processId = processId; + this.i = i; + } + + @Override + public String toString() { + return "LambdaConcatResultDto{" + + ", processed=" + processed + + ", s3Url='" + s3Url + '\'' + + ", contentType='" + contentType + '\'' + + ", processId='" + processId + '\'' + + ", i=" + i + + '}'; + } +} From 23735b3fea7f01ad2abde5563df190e14cc20668 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:37:23 +0900 Subject: [PATCH 090/167] =?UTF-8?q?[Feat]=20:=20=EB=9E=8C=EB=8B=A4=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=84=9C=EB=B9=84=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/lambda/LambdaConcatService.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java new file mode 100644 index 00000000..7873d36a --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java @@ -0,0 +1,122 @@ +package com.oreo.finalproject_5re5_be.concat.service.lambda; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.oreo.finalproject_5re5_be.concat.dto.ConcatResultDto; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.AudioFormatDto; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.LambdaConcatRequest; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.response.LambdaConcatResultDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; +import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; +import com.oreo.finalproject_5re5_be.concat.entity.MaterialAudio; +import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; +import com.oreo.finalproject_5re5_be.concat.service.MaterialAudioService; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class LambdaConcatService { + + private final ConcatResultService concatResultService; + private final MaterialAudioService materialAudioService; + private final RestTemplate restTemplate; + + //S3 저장까지 완료된 상태 + //해야하는거 + //재료 오디오 DB 저장 + //결과 오디오 DB 저장 + //병합 결과 반환 + public List concatOnLambda(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto audioRequests) { + LambdaConcatRequest lambdaConcatRequest = LambdaConcatRequest.builder() + .concatTabResponseDto(concatTabResponseDto) + .audioFormatDto(new AudioFormatDto(AudioFormats.STEREO_FORMAT_SR441_B16)) + .audios(audioRequests.getConcatRowRequests()) + .fileName(audioRequests.getFileName()) + .build(); + + List list = lambdaConcatRequest(lambdaConcatRequest); + + List concatResults = getConcatResults(concatTabResponseDto, list); + + return getConcatResultDtos(concatResults); + } + + private static List getConcatResultDtos(List concatResults) { + return concatResults.stream().map(concatResult -> + ConcatResultDto.builder() + .concatResultSequence(concatResult.getConcatResultSequence()) + .audioUrl(concatResult.getAudioUrl()) + .fileName(concatResult.getFileName()) + .fileLength(concatResult.getFileLength()) + .fileSize(concatResult.getFileSize()) + .extension(concatResult.getExtension()) + .build()).toList(); + } + + private List lambdaConcatRequest(LambdaConcatRequest lambdaConcatRequest) { + Object response = restTemplate.postForObject( + "https://bewpsh81xa.execute-api.ap-northeast-2.amazonaws.com/default/Test", // Lambda URL + lambdaConcatRequest, + Object.class + ); + + if (response == null) { + throw new IllegalArgumentException("오디오 병합 실패 : 반환값이 없습니다."); + } + +// ObjectMapper를 사용해 JSON을 List로 변환 + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.convertValue(response, new TypeReference<>() { + }); + } + + private List getConcatResults(ConcatTabResponseDto concatTabResponseDto, List list) { + //재료 오디오와 결과 저장 + /* + * 결과가 여러개로 나눠져 올 가능성 있음 + * 결과 하나당 재료 오디오 여러개 + * List 하나는 나눠져 온 결과 오디오 하나를 변환 한 값 + * */ + List concatResults = new ArrayList<>(); + List> materials = list.stream().map(result -> { + ConcatResult concatResult = of(result, concatTabResponseDto); + concatResults.add(concatResult); + List processed = result.getProcessed(); + return processed.stream().map(process -> MaterialAudio.builder() + .concatResult(concatResult) + .audioFile(AudioFile.builder().audioFileSeq(process.getSeq()).build()) + .method("NORMAL").build()).toList(); + + }).toList(); + + materials.forEach(materialAudioService::saveMaterialAudio); + return concatResults; + } + + public ConcatResult of(LambdaConcatResultDto concatResult, ConcatTabResponseDto concatTabResponseDto) { + ConcatResult build = ConcatResult.builder() + .concatTab(ConcatTab + .builder() + .projectId(concatTabResponseDto.getTabId()) + .build()) + .fileName(concatResult.getInfo().getFileName()) + .extension(concatResult.getInfo().getContentType()) + .fileSize(concatResult.getInfo().getContentSize()) + .fileLength(concatResult.getInfo().getContentLength()) + .audioUrl(concatResult.getS3Url()) + .build(); + return concatResultService.saveConcatResult(build); + + } + +} From a540584ff6e25e2eba627d94b2bbb08aaa7803b7 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:38:04 +0900 Subject: [PATCH 091/167] =?UTF-8?q?[Refactor]=20:=20=EC=98=A4=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EB=B3=80=ED=99=98=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EB=8F=99=EC=9D=BC=ED=95=9C=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../audio/AudioExtensionConverter.java | 41 ++++++------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java index d49fb67d..f7cff57b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java @@ -8,44 +8,29 @@ public class AudioExtensionConverter { private static final int DEFAULT_BIT_DEPTH = 16; - public static byte[] mp3ToWav(File file) throws UnsupportedAudioFileException, IOException { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);// 파일을 AudioInputStream으로 읽기 - + public static byte[] mp3ToWav(AudioInputStream audioInputStream) { AudioFormat baseFormat = audioInputStream.getFormat();// WAV 포맷으로 변환할 대상 포맷 설정 AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); + try { + AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 - - return wavOutputStream.toByteArray();// 바이트 배열 반환 + ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray + AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 + return wavOutputStream.toByteArray();// 바이트 배열 반환 + } catch (IOException e) { + throw new RuntimeException("오디오 변환에 문제가 발생 했습니다." ,e); + } } - public static byte[] mp3ToWav(AudioInputStream audioInputStream) throws IOException { - AudioFormat baseFormat = audioInputStream.getFormat();// WAV 포맷으로 변환할 대상 포맷 설정 - AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 - - return wavOutputStream.toByteArray();// 바이트 배열 반환 - + public static byte[] mp3ToWav(File file) throws UnsupportedAudioFileException, IOException { + AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);// 파일을 AudioInputStream으로 읽기 + return mp3ToWav(audioInputStream); } public static byte[] mp3ToWav(InputStream inputStream) throws UnsupportedAudioFileException, IOException { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputStream);// 파일을 AudioInputStream으로 읽기 - - AudioFormat baseFormat = audioInputStream.getFormat();// WAV 포맷으로 변환할 대상 포맷 설정 - AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 - - return wavOutputStream.toByteArray();// 바이트 배열 반환 - + return mp3ToWav(audioInputStream); } private static AudioFormat getDecodedFormat(AudioFormat baseFormat) { From ad4de81152e248f0222e15f636750c53c133f4ff Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:38:24 +0900 Subject: [PATCH 092/167] =?UTF-8?q?[Feat]=20:=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=EA=B0=80=20=EB=9E=8C=EB=8B=A4=EB=A5=BC=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatController.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java index 8c758a29..4706a7f7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java @@ -5,8 +5,8 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatService; import com.oreo.finalproject_5re5_be.concat.service.ConcatTabService; +import com.oreo.finalproject_5re5_be.concat.service.lambda.LambdaConcatService; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.project.service.ProjectService; @@ -21,13 +21,14 @@ import java.io.IOException; import java.util.List; import java.util.NoSuchElementException; +import java.util.concurrent.ExecutionException; @Tag(name = "Concat", description = "Concat 관련 API") @RestController @RequiredArgsConstructor @RequestMapping("api/concat") public class ConcatController { - private final ConcatService concatService; + private final LambdaConcatService lambdaConcatService; private final ConcatTabService concatTabService; private final ConcatResultService concatResultService; private final ProjectService projectService; @@ -37,16 +38,31 @@ public class ConcatController { description = "병합이 성공 했다면 저장된 오디오 정보를 반환합니다." ) @PostMapping("") - public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, - @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { + public ResponseEntity>> concat(@RequestBody ConcatRowRequestDto audioRequests, + @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException, ExecutionException, InterruptedException { projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); ConcatTabResponseDto concatTabResponseDto = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); - ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); - return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); + + List concatResult = lambdaConcatService.concatOnLambda(concatTabResponseDto, audioRequests); + + return new ResponseDto<>(HttpStatus.OK.value(), concatResult).toResponseEntity(); } +// @PostMapping("") +// public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, +// @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { +// projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); +// +// ConcatTabResponseDto concatTabResponseDto +// = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); +// ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); +// return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); +// } + + + @Operation( summary = "오디오 결과 목록 불러오기", description = "프로젝트 번호에 해당하는 오디오 결과 목록을 반환합니다." From 14be9be1f87c88b8805e4d8758775cd3680aeb48 Mon Sep 17 00:00:00 2001 From: jongheonleee Date: Mon, 9 Dec 2024 11:28:13 +0900 Subject: [PATCH 093/167] =?UTF-8?q?=EB=A6=AC=EB=93=9C=EB=AF=B8=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EC=9E=A1=EC=95=84=20=EB=86=93=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a92456fc..805055f9 100644 --- a/README.md +++ b/README.md @@ -1 +1,108 @@ -# README.md +# 5RE5 PARK + +
    + + +
    + +## 프로젝트 소개 + + +
    + +### :runner: 프로젝트 기간 (54 days) +> **전체 개발 기간: ( Weeks | %)**
    +> - 기능 구현 기간: ( Weeks | %) +> - 리팩토링 및 발표 준비 기간: + +
    + +### :computer: 코드수 +
    
    +Java         :  
    +
    + +
    + +### 👫 프로젝트 팀원 + +#### 팀명: 5RE5 + + +#### 팀원 구성 + +
    + + +## 기술 스택 + +### 🧑🏻‍💻 Enviroment +|IntelliJ|VS Code|Git|Github| Gradle | +|:---:|:---:|:---:|:---:|:------:| + +
    + +### 🛠️ Tool + + +#### Backend +|Java| Spring Framework | Spring Security | JPA | Lombok | jUnit | +|:---:|:----------------:|:---------------:|:---:|:------:|:-----:| + +#### Database +|MySQL| +|:---:| + + +#### Web Server +|Apache Tomcat| +|:---:| + +
    + +### 👀 Communication +|Zoom| Notion | Google Sheets | Google Slides | +|:---:|:------:|:-------------:|:-------------:| + +
    + +## ERD + + + +
    +
    + +## Commit Message Convention +### 📋 규칙 +
    - 제목 행 명령문 사용
    +- 제목과 본문을 빈 행으로 분리
    +- 제목 행 글자 수 50자 이하
    +- 제목 행 끝에 마침표 없음
    + +### 📝 유형 + +
    
    +[feat]        :     새로운 기능 추가
    +[test]        :     테스트 코드 완료 
    +[refactor]    :     리팩토링, 코드 개선
    +[fix]         :     버그 수정
    +[docs]        :     문서 추가 또는 수정 (ex. README 변경)
    +[style]       :     코드 스타일 변경 (포맷팅, 세미콜론 누락 등 코드 변경이 없는 경우)
    +[chore]       :     패키지 매니저(ex. gitignore 수정), 빌드 업무 수정
    +[comment]     :     주석 추가 및 수정
    +[rename]      :     파일 또는 폴더명을 수정하거나 이동하는 작업만 수행한 경우
    +[remove]      :     파일을 삭제하는 작업만 수행한 경우
    +[conflict]    :     합병 시 발생한 충돌 수정
    +
    + + +## 🏭 디렉토리 구조 +
    
    +
    +
    + +
    + +## ✨ 주요 기능 + From 00a74023ba0fb5cf7c179be854789c8ceb13128a Mon Sep 17 00:00:00 2001 From: jongheonleee Date: Tue, 10 Dec 2024 12:31:14 +0900 Subject: [PATCH 094/167] =?UTF-8?q?[chore]=20=EB=A6=AC=EB=93=9C=EB=AF=B8?= =?UTF-8?q?=201=EC=B0=A8=20=EC=B4=88=EC=95=88=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/Compose.png | Bin 0 -> 35090 bytes images/RDS.png | Bin 0 -> 3949 bytes images/google-sheet.png | Bin 0 -> 9880 bytes images/google-slides.png | Bin 0 -> 8026 bytes images/img.png | Bin 0 -> 89318 bytes images/img_1.png | Bin 0 -> 119721 bytes images/img_2.png | Bin 0 -> 73483 bytes images/img_3.png | Bin 0 -> 48639 bytes images/img_4.png | Bin 0 -> 142745 bytes images/img_5.png | Bin 0 -> 101069 bytes images/img_6.png | Bin 0 -> 75433 bytes images/img_7.png | Bin 0 -> 1719 bytes images/lombok.png | Bin 0 -> 31076 bytes images/spring-data-jpa.png | Bin 0 -> 22190 bytes images/spring-security.png | Bin 0 -> 18268 bytes images/spring.png | Bin 0 -> 13454 bytes images/zoom.png | Bin 0 -> 26864 bytes 17 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/Compose.png create mode 100644 images/RDS.png create mode 100644 images/google-sheet.png create mode 100644 images/google-slides.png create mode 100644 images/img.png create mode 100644 images/img_1.png create mode 100644 images/img_2.png create mode 100644 images/img_3.png create mode 100644 images/img_4.png create mode 100644 images/img_5.png create mode 100644 images/img_6.png create mode 100644 images/img_7.png create mode 100644 images/lombok.png create mode 100644 images/spring-data-jpa.png create mode 100644 images/spring-security.png create mode 100644 images/spring.png create mode 100644 images/zoom.png diff --git a/images/Compose.png b/images/Compose.png new file mode 100644 index 0000000000000000000000000000000000000000..2adee09b04cf924e2e47ad2f43215b7d4fce85f4 GIT binary patch literal 35090 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 AD*ylh literal 0 HcmV?d00001 diff --git a/images/RDS.png b/images/RDS.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c34b0e40e508c05540c5d5cb492d050dc5edba GIT binary patch literal 3949 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 literal 0 HcmV?d00001 diff --git a/images/google-sheet.png b/images/google-sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b68b83b2b0a821a06b83b2e050cc804cefb4dd GIT binary patch literal 9880 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 H`OE(RLv#pZ literal 0 HcmV?d00001 diff --git a/images/img.png b/images/img.png new file mode 100644 index 0000000000000000000000000000000000000000..bf05a64747a4ef8a38b56ab8cf6e187b80b95561 GIT binary patch literal 89318 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%0DlP0K0FiVushQ+qqfRo=Vwi`GmEFb9MvY?3l2{f+ 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�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 KMNUMnLSTYPWWdJ& literal 0 HcmV?d00001 diff --git a/images/img_2.png b/images/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..3384c3c7a20a8008e341635a20462809d6300ead GIT binary patch literal 73483 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

    cZncoQ(VTAN}*T zzS6A_f($r(=qSpTsiZ&_9iFCSBDZU`$jr&I&_+KqqNC$geRd`S>q}V}?{N@DDlU?* zXh~tMg3Nn60hRq5Mc`Pp7+eHc&P9sCML_2EMll4sd!mf6SCgC^bg5MnBRjOm{DJ+k zcFZVj`(!c>EcgsZme0rW^(%0G`xp3m|8D$tMA%6HaYq1kU4V7#>?zzke+CcEp27Vy zr{#DWk1m|Sqwi1S;rZ`y|C|8t+;KcSBj7o8Omzh$IX*sf0#DDM!easDBl(`k=g;Bs zxwG8;lYVP3$7Y8TU3oAJ|&|@f! zRlEco1Ym9@OTf>*6bvPbNiPmd>C%YvHK2AdJR zHFq`+E?(=1A&)4JZj&1n)*kN21U|l`+9j>1_g&XJ2;O@nXxPSSQ9KXlCbLVj9 z^eNnt*B)Fri$@pF;o`-E#E)NW!sV@-aY_2g)vIt|{(S78 zHy3;5Z}?{ROzfQT2{ug{hlNA>V$tCDuyS}mEFSb8#=Y4NbyLOe_4XAeGs2A-9|AZp zgI1G~i&trLSw&6;nFEErf>jMie0z z0*k#pQmi&qii<&hX0q5@A*huYkN2B5!_rZsuy*_;tQs=`ONNcatbv0td+=Z^9z7Dv zCyd962@|nt<}7Squoz!2T#OT2x8dyWJvhI6FD~vsgi8kw;mWrn56^#(`xkx?V4cJL zvuB0fPU5!o2f}0zrQbV8fSts>vzm;&e_EasXacgw!hVkgSPD=C8QJi{d11b@@?EEK zPu@cbdiT3yxPAOvvH3(k9u~WA-yU4sy%U$d+=2_6HsQqTHP}0Up-c|5v315QterFk zOGl5zf)OJyZ|G1=?cE#WyLH9r&K)tLT}zB>-wL1geg|^~^hc-a)e$Gx&qgK_R&w*! z*o@^GxTS7@uL(g06C(VB5H0`~r2ERvC7b#2rj~Yq&Dj+-Q&Q15DH&ZWRYXGpP^I8NI+40c|mB>{GpAQP|&13oxM z$te<47?a?-E#G_N@Im~tXE(0w+KDq8H(>wbML4)@1-8$bhjmjw#bTK(rt}$r@x9*1 z#6ANtvfI0OzilTB?c5bT8a2h6b@I`(X;buU)DS)E=A&6P z-T1?Yj#Hb52MEYm%RMY44klBG+5p`m^2Nu_5ea^N7~ADdeB7}O7QWjZ^Luy0q>e2y zy<11D8P*>=CXd7ZPbOjC%xO5hWIj%;S&nTpKfw%h@xF}QUn^lR1* zeOk0bzxJIlxJwTV>+uc-ckYgX?cc(rK7%mf-2s@WdVkCsJQ7RCd?c(f7iTtqiA&pe z;fF7`3kY`N`k}o7x`SeC9m695)`OFWludQ-!~wCdzQse@W2cVdk;uTu(jSR!_LyBB z(@xWXctRLVY(4?l%_E0!{osE5vTFxU3%Cw0Uxw{-=U~CeQJDPR`_Hp<}(~XkD`rI@NEErj={S<9xKM(*P~1)kO1ZHPF6xKDsw(tagTZSAa&4y;-{s zVoVn0%J-wqE8qzX0|$%{3BqD6%q$2}b^rWDGWvLACJ{zM`8O%AK<_z zW3lhkao9O+H1^M$fMW|j#@S^osWuxIRxQMd<%_X)+-S`1-w%`C=_$Z!haL@@$N+1A zuJxLsqYTVOxz*65QcdLNRYAS-RpfDXG%S;cre!OjL1rErmaT}E6|13j_Yxr;s>--kF3RqfH zt%b&wYN0`;+NhIPQ;zwlnOzmtGAp7^xoW7ERUY*!R7dN&jnKGiZRD4)j0VzMR;`XV zYu3iw`T6LPUmy8p$|A-Z1d|6-t;~qF1t34C4BA%BMXx4x@P4bN=$u~{v1S`gVy|&E zv{5?cBAF~GFbwbZ?1QIIxKQ(-cl6b6g$QK4GkWk6_;~WCYQ?j~7z&$o)~JtSksKP| zmOz-r{_0RZ2YY8u!ND0H;@I4YIJI~hPA#8-lPnIpYBnyen~(EyJUnj(woIOgWg~`T zYR`8>8n#C7hK(_xRa*=YuyxIEgtpc5(Mse_LjhO)yh>lV>fqgGO);olI}DQVo7Sf{zMeH5r`E5;xy`F_W%m}`WH!g)UAT92 zuYlvw?UKdVJ?k^E9fx6P zrw(XetA>Cg3zbDCS4vJr#pE>P#3iGw^qjaefM@rcLA;j2W6w>fmYGK~og$3zUg$rec1Z2D^^hRmfAAGiH)rZ^iq#!0HL&?Ut;0Pp{4H(wEF20@h5suB8h|`Ov;rkUV3_1sArE~T1xpj+i zWYJ6k*aWN|GX~Rp^}>X=-onT>GGLlD!$7f71~hJrf%3R}y?neS1Fl`Qs%TTCiZE6M zw60PKttyedDx#hY*ea=IQ6oJY^~>g=kcdO3F?04mTxA*SA-2=PjxC>Xd zZ^eZTYlVSD9!{HvMFR%m!;T%%Reoces+G{8W_7%kUq>c~ssebCfi#d|H&@iw)PV4Mw*U zhVIb;v-`Y>IX&B8R+r|O-L*BwcWQ|mneniCxx>JnU&KE1HwMFBWPI}`ZE*S0FKRV3 zS5_3JR_H*cW#t23Z{MSKh77O>gM}m^A*KxC1Y|K0Nk|HfM6IL*%+Mwa|{HZv% zbcTRTz_n_gu-ANCSi2Bs*DS=ISyQlj^l&U0K1_jZ#(TXn^__P_HolKlV@6};XaUHO z!I(3!KjsY{gk>L$z@{mav2xTXEEzHct494l?7eqzq}O@oTXk>UTetS^tyazN*6y1O|-`=XajxJ>h*BfAJp2_$TCp6YzZPH3S`h8=>#N z1MgQ~fgk@rmynsGV_}YsLSrUD*A`>Ktif`9B{o{9S{*G|Yjt3)$qkgiwcbSdTJ6{& zcyeEBti_7G8fye?p~ixNvO=_^C!;MR6_(Iogi@IvzG^N9QC6yi^uLgLxeNWFL-$>+}^ z=Hv-PeE2@%`Mpd}4`g1xgscmvkk0ou^~_tyIr|p!KYj!0$6rO%JFnt}?|)N4_NV`q z@z{U63!i7a{Q1AQ7jOLfZ5$ljIOTo^vj2eBCy?FvfZAHS@a!|MsDWj zgao28E(SJPLt?Y1r^1n$h9-9Art}oFWu;??@y}>^DMm|*F;ZBFf!sWFW@W;WmW1lq za9CqPcn?EWR5*+wLD2XG!W0^gn#5RC#f8I>8i#?B94yzEvFVWgiFT~FH1IC!B@4;2 zU$LI5MgR$zEG{qEtXL#m^OZVGFt&5$rlUPG8I1`sFa>cixO5(ww4?=|=b;JkVxw{f z_`n$IkLtJxIB1DG_&Z%P!9z9e%FaZ4MmpM3Q_+%=0!Km;YQiI7jfj9bDiS)rA7z35 zRCqtyP!FUrR?WP40eSp7_tH7!Ts(>FOYb4?(mN4iL5;s+uD;8np?bsE!Y3 zi$;A)Jespp(NUO#?veuZX^PRWEk(bs1VfCYCfLEJD&@?V5err$=FK|Ho3xnHlwgV$ zaI82Bg9O(lnWu7-`L{ALRFsF_++4J$vs34!qd6^}>J!iJrSSL5uv%xvYP}p|5j$9g zb;fDyj%sYkv6e=DUyiu2E!9=WS$r8#W57%j`kxK;*?VhooQqOTwqeT8{&@!p=B zh31SDG^8Y=it48g@Fl>PP;mJoiaal%(CaJ;yicOY>jM;>dmH&Dk0Jf!yEyaWGkEaN zKBw~P-}SjK;-0%7!aZMn1Oa{_>XVdsO!BtePS=7UX?TQiJ^b)f_{yW- zz=QWZjxYYn=kcw39zgQhQyitEX%!lNehjh6ZlWbU)67~G2EPM?Fe!^UiaRXmF2bEF6H&B|7?)*$Nr^ds^ z$G1=w^;Afm-({5gUZl-F!}|%8dAyI3v&WHh>V0_s>LomR_uVRAMVI_~_41VrS>5PBrLda}}nen+nuhmWN?O5hf}$m?k{xn7_?}#iP^6 z0@i%J8FK_})@H5ELWSbQe(n$t-Gz-1T=xqf)#knsq zFggfS2Vv_>l4C28=t>pfB(Z5Y`m<=2^9WgioQzJzNO>lP^#tEs$k$qmNwx{I+{-b| zL1mJI%M@Xol!1n}bg-1l#sR1$Js!2Rz!l*Es0bl!fnKze=TUOS4O!WF$+iCh0)PDq zzIE^Y?gA5kc`paP$MD=UFTLvJIEv^yLOa^vAMAWPdxc;JoJ?( z@s+Q9UBzSfGT8pf<6lFWzYn_7W6+-wp&%P6bVD}8jy6=1iT;udHSsY}o{K?EK1PfJ zSQ+Ld8CV;sZFClPz9;11ZcOwbYrI}cu6r5X=sN1-Pr1RZe%EXI%bKy=aaO6yLJfQzrWGc5}3RJ!iWSoG&4stKPlzTWY& zOpH;<#yA+L{Q5>Ju(1rYrgF?%__{0fnBmt`d>;h5F%xaFHXl93nM(2PRLGjRP*g<( z!4!N2x{yoI1f7A_`y=QseuTnPA0qP2H}Jg&AI9hZ`{xy8GVp~5$6;%IPeFD~Ey3Ke zi~j*H_ZpcSGKtCDc5!%U65si|r*YpykK>_7zJ{+n_$2QA)6e7QPkjT1U_V-_DD z(_Y2VuCZg6q+_f+n-JuvG}t3rs+Rz!Excl*QX(+_cqFgVp9LEZ9v{0a{IMCI*WWXc=Qw@|v;yL`)W?VS*iXtb}%w zU{5k8oG75W5dI1NY*t4#qf)I1WC9nJbG6>BVDnaXdRn_t{@zf2JO828j#yuG z#RsU?86N~!VhDPvV(sY>aI$q#?Zg@nQMIS}I+v(ci)^#H0`>ose7v!OG(Nv{KA$Yi zY6`JvlDs2~J^5aYn`s#d_Mkw|aGdSd1zNc(2rrrggmU?tAh255JE(jB zRLj6$Y?qE5O<#;@wn9 zRXl92#9^xi2W>`dG#6sFGM*MN6oV-~m`n@86aillwJMZ4V}!aapP*+mZp$ECjMpTK zRB@7e{2AKK6}Yf+2EZBZO% z%GRqm%xV*`XiOtu#aQRRTeRviVkkj3J7W_SqmeeQRVt}uMo^(*(3i|kn;3}RB!5g5 z#;asDqnZMO%6O<)YKo;{w2-l431c(b%L!w?vZbrdl9r$j%gr@da8#-1Gh@idlstdN zm!e{AQC?_`^g>&VFJm%)#$Q2%EF2vvw2WC{=#zMmDm6~PrcGM(7UrQUIue!9VQ5H; zL6=xn#*VX$&sOx=m@iGEtqy}D)>9RGA0kkqxFbdB=;v$eW$UEswq?f>;wUsQ-m^vf zqbkG$RzgDEJpDJ{#rN)i z3{NrG|G}3Zz_0)ITSz+n9yESu(URn+RARg+o>n!F9iNb~gG=_PiSjg6%x~I|!{<<_ z(!Omv>#^14z-C7SR$6K?S7%U=iM{Mg4pD$fYmr9C+7pA}N|mJw#$Z&LzVvwB6JZMU zN7Bcq@ap$}fFFPDDg6A0e~0gW{j2!)7w^VD-g__J{@!;Ge(ZImoO~bF5GtW;`AUjG zOPD`eqXPJxqcI?5oTN^5PApsmtc!z(GcyX!{CoDeAXJBWqAKVDtU>3Yzj6izmp(@N znGf;u-+dQf{@h)-=g;oOrH@WycWDj%jZN@<`xv}_{Y#{rJ%Q4o5R5gq;rhW$4bSyfQ!=Ghr^m5Mz{9j zfB6y`<77J(M|O4)neh*M9ILoPGKyC^~Tp zwO*cR48Dw(NFVg@{Ts-NMo$I-&SHE^YuQD`ZcC3uBQ0ZXgcqtqE}<&;B8-0LP~>q6 zndd&jv44CT_Yks&KmR4X{!c$g=*K5<;g`RF@2{Rk&Y5>m8R!99I8`+x6Pr`hH$#FO zT-|}}cY4Viy@#=`MsyUWVU9L$og=;^?wnwp;wsEQZDK6^-gzJ2c=RbX!}!R(55nt> zSJA|H%$XEI$YL;*&v;7GplPx&X=dzHt--v_fCZZobJcpKVzU-We3OGI+P6t|rs4E3 zj_TgXe*0JW@UNf1zkK~0c|AdGB@(cK@d+*1GzjzjBpZysEUU>%DAHD{w_er>-ec_6bYBsdtt`0@m zr+4PxiOGJ)*LCcpv(^lQ?KywlyOAKD6rDLZcb;^)i#FV`tA-anndn6nYZ;P<{CW z#QfqP@y=rp;HCTS!wXM-2WMY=2gcMAbXK(@+%p7^-gO`D{lm}Up5Ol?eCZGV5P$Le ze~d@(eFWe6>+hr9(#Ve94pU@0LSJ|bNw2@Hrq36wQp~TM)=;mivn*7V@O!k1)x}t~ zo2g`tgscPC20N%|Em&`=!aQLdp6#1nY+kq6-Q!*3$}jTcbmbB1xBKb0&>ZLl8T-|NedM^{cf+EOFohzo!% z!dt1C(f1t6e9j~H(rKK1>3KZ<`MdGMuRH?pS6@c-F*(oo8mb6b7uBzaHq+s826e%{ zn07WP$c~)i(RFLBrQQ0FUB8Atdo6UA&cpcjYpA>MKCNE@=4#5YRBOUYl^JyjG5F_i ze-{rw@ED$a_%XzuJ%uJh=1L1ef1VV>OQr>+Eh9+tHRV`rG-0X9g2m=af>xn+Z%mj9 zFI?At(GTGBlV=e4;#$vp(c@ADq^whRN zpO}GI+S^Od{uCel?NbQ+*$8y#VnVfXk5b*JBfJ;VzO z-K`Ly7$(Jvvn8B41N{bVzAd^Mk8Ob{+b-kJ`SZTFlxvh$zQ7IVrOjVX+pfDNE zI6w3y1Y(LozbiHZrpul%dtQOvFPJ||MPHc_L$$4#>6wH!&w!`D`_K5hum2A`_oIKt z_a6HOeBL_`m$4D!)lLlSt*}N$pv?O$W07NsJN7(AX;~%nudJ;}s_j(*zgjQ(?2E8Q zC6jYw2fb}nGpB-VOA?^c-j37qcBcelASWE-B?*|;WMH0y#)i!dXIdgY{LbGX_Vw4H z^YTSYS}vyR+ps(^1y@5S-hb@_yzrA3@%)dU!?*8$9G72z2OSzKdUQ5)7FtjflY-() z7m@bC8%TZkSI9a3I?R{Pz!pM)0zJ_b8;ri3MD)|L_Z6nX#rU!#GX`yp*&3p+peD=% z=70+*@j8oq&vUr)#;@^>FWrrozx_>QoNo8|T)mDZ& zAyXf__!MNaPIGkH;#RnB3&^gntzodV7^YJnLVNtz$U62Cx-t{6+v31NMFplSO$a@8 z0$+dN0sN4bC*Ri_P4N*_vT*e0L}FMLgv&B%FAK0(r^9L!J9mp@^R2~7TOAf0)tIc( zV_27uF>NkZD$1}{si9irqcfG@CDJ0rFcyiALzhfH8!Itd)rh&)KD26UQ5czll86LY zQ{=3e5yNFB3>1`Mq@WNz=}EL(vFOc-Qzx=VXj#`=tFhT`!x}-`prUR!8nA8Spixh| z*lfdoS2GTJoH%f`Vz1SPty+UxYwJsnv@jc8#TVfjOLPJp<;Defg%c!Ix zRry~)Q;bZiMDgcgXiMVzn3v4Q&89uiLN8(K%#KHEN;n#0d{ImLR}tuea_{pf@;nd! zH($fw-hUt7|H+S0PMhBt>xa&i0JMZ(g!$APFu(UQD&Kt(t#SU?oE~IA;8rsC@CGV^q>hlz$-dVe37&%Ou!M{lDs$QP64<(RQpFlVbmZqOBc|Ir6jwy7d- zFEqzRv6DoiKRXJ;MM;>{W?_z)H+P^nknunqMY>X7>TW6q>R$<3w$3|-vwg~)=-H2_*XPY%f>@?P3-|4_XCjskd z#vY;Dp)H;(%ESO;%!#aUweB{pO?OY8R7iGUz7HlH=8QTHB;{(|Pqs(RShSereY(Pc zaak|ppfRo^e5D0^PjVPzaZt!gMt3>~k)$YeCPbivK((jJDe`!=p<1?N4M;Bkl5{mY zDht#D1g(?GCWQ##8voK%OI22^)YlW5dQ4iXFwQol z)hfs)wPlzpDb%d6`W1xn zULPF{2d!eW)T<6Xi~4iNV0ryH=#D+d$H~C8-3>zKp7@Xr1_Ifw6_MQzkg5M%$M)1H zoVjVJ3hl$;YAf_eV=y^busSRGuVE=(5#% z*lL4?DpswEKCE{-urA4Iy4$cNdFk65vEJ^$7CZQcvk@yzbyP`Ou4>w_Y6C$r(ryyI zYIgcM#&dT5yuKFGwbhudwz9*UF{P(^l$BznD4%fW^6!?YvtXi}E6Sc$Q^o2TlUZmL z&DfxQ-LRHn(^Ag((u{5X&E57U>~ywZoA+%h*>-&;76b$;^FT@vCiCOej*(f}B_h>0 ztMynWp!1a+5S03sU_{bzb6}W~?^(_2`OZ~WVwzt|o2rz_9xaB|krt{`DF=n}JX*;@ zj9Cb-wHy)Gr zxQSOkSX;&bJCHpt1icvvSkM<^qO=h0NwIKc#G|_;8)skmIbQgyufY%$pzNZYtCHOc zgT=}0?73>{e6_Jsb@(->9qR;ZLvqS@w`0TAuI`&I$p+PqEw*)9wiRbHR$3dd)WD8j zXU04so2GqRuv6_C2^W<|+Dr{QF%@pUvXTlx1*GE5QZ<(4ASQv9ggNVyovN#mDprg2 zCKER7I;^u3Z&a3Jt5S!pdMmbD?AYy+f)Z_v+nUu0=}kg5uPwxg?5aA0sVbZmMB*c=Cdc@6|KY|{j7(n^b4VZx|chf%88cm*M{ z%DFkh$JaJ(qdm1(Vy2!0irwNq+C!T?#pgOgRU0bHMNhsPvX;bP*rR-JLZDzxRn5t>$ZSQ zEF&0~&9T$9=ciL4ve?0jF{3TQXkI$H62jriO+l9DIehr^-@_E-Pm2=f-i4n_$k-vp z_RL9#RFKsX9y`{$TCmS(L#;&Ym?| z`S%%H610WdO5Pb`@_8)TZ5$-(X;&Mt&|t?rpW_1Ce1o)F4i+_h{(K!xwU~2o(BSi) z;d7a1Tjc-G@iFJ>%?h+JQ=x*)m7A>WVlyFYi1LFq*c%344`_TYBlY}A1RQ$>6~R7e z3G+jh$4Nr=E^2*F!%n-eWlY^tkdCVxtAy-`E%&Dlh1)Gg*)0#5oS~JCz}K%HV105J zT^iaM0yd>9#H_Xe>jqkw^cV)1@JgM-x?&){mBSx1Dz?+9u<$&H8d|)|O(UrW|WE`kN}YM+H0N z-;=Dt8=|W67*xt7s`zA41_m=?Fp?FA$$}KjGiF*a7AecPY@?brR;c_SlFdrBMk;6{ z2ZknE-)0A2H{;Ld7OY8Y;qzx(=J%Fc`7;gx%WO-G1LvEYu+Z9srPfBJ;!=1}iWaJq z;1*h8O&+?bWX?}3*%4&r-j|W%aR%`xkD=1v1CD^p=!%kaZvkjy{MHs50DEKr#`*r^ zV4qE5ZZ}u%DUUml{mw6b1~@#L+TB}OKrdsADXU(cdm1fF$7n_@y27u(>~jt!J{REg z%U?jt(NvVo$x*+Dko8HyJK1$F=fb2^Y%4n-6+-~q>~|@!q*}_3wBaG_jt*mUWC$B0 zgIFIKU?XsYz1URgv8i_aoz1?kqinvSf*n}t>%8sK2{5DXbYcTixcauZCGn1 zY)%dg93WQtd{;VJvD7A+iJj{E8&0vTb}ZSbj#UOso687UK6(n$)LL0f(r-iNfdV>; zgb!bX_Rr^um^h5!_l4@sb(adjOW%D#;IVmhDTfQIR>ylG=%+;5$uhPU}t;;+iaU-Ls%ajByd-;QCkv1Q6K5Hi+aDyD7)f;LeH~Ec=unB^X{wAy!Seq7=O9a zBG6Tk2xo30`uG_8dmC*I+CI>kez~of=rB*(=JvJGLFbA1a*z7 zvDwi=wP~Z3b76mA2#3QXxH>wDt7D@$oE*pA)Ht>$MzAqDKvnC*<}d*p>QRvGNX@VT z0gaH|EEFN7j3l<}B4Coco>sJviq<1pf19w=%9zVhfi1fznTCK#=~B+Qv_8@EZS(Oc1H^yN+s=VqwBu zqE40f6(pmBHoYk}1a*wND*68F{k>4;=YcXhiiFpHiNxps3D%F^MQ4aN`e`k@38qWb z*lNV#-mY>e3a;N?6uX50lk1j;OkBDg?Yn+$ABQV*n3GY}VZ&OTjP54PYc-h8%S0QY zGG0Clz1KOEGbX4B^+RhyBziKE(3h8vp^{uoNiK^T3sxk}n#|gDxJ$(Dba!FDe*lL= z!?;Q%I~*OsKGke*ViY@UTjN968tun6LEDnTeM9bQD*~AUO{%aQO`J$^J_Q+VI6&KQh%}Kkfb0RrJ_ybCt<2o(ih}l-duo{+H$Pd8wnXfCKQ{DrNruO@Noq)$x^)5;hQ}0*n3Hv>q8ybD&6SnJfILlYR5b_tz>yGv&a`;+eyZ6ZE#n~eXc6~l6?evmX&VP`0=7j3leQy}eHt`nAA6Ou zNm-UAAr7#a$}dE@P#gVJY5s1lXsVsvS1qt|j&x zkjX-~EN)W`HXM~ynNO5#t&Vn4c7V_>ijr-~P7gvRc5#z`PhzrlM+25+0hzB$?BXyL zWH2)ZqeqZUs1pWhn9*lrv9cJevbfF1+@LL$V=})9nOMNae+?N2fel%gqdiri$^X0D z6=kGY{2CQemImgkjTko+VW1=fuAF#67NsDoj|f0jh%bzRge<@lng9>A&B}QC1C+h~ z3T)>-LTjiGdKo|W(RK8f7Ghy|NKJgGk5=thJi2bNcucO_12VOca)9l*3Ct0&4JweN zwqC5OW}IcF4b)-WsKI=#1rwDTXc&YSUpa@Gm_Rfqg{wo215~(C2J8~J&&$M#jd7i$ zMsj=LPTOJ>3u|vo<#SRj(4Lg;FfJsay_HMaOl$Fn=$vwNcBNlO_*Bt{guG^65_bLk^D|M%I zqeUEKd^405h0#pLW&)bTX1XjwR-_(t&1Rqtl^rDl87-siZXv)MPIo-E+DZG^)pQfG zjV@8KHU*gb-lE>)4gQWO>?*CI+UZiM$GE--L#0{hrjj{RBGDWdsvxr-*+osD7eTv> z%203EscHqkdI5%a-#``P9xmC#3r2r3VWV}NE=$LPxd6+2+*O-KLAKdU$XW$5 z8!dK&vVQASvCVFI4_n>uqm^MRe<%TT$2(mzL=vC5FFPOu;(8j^ee(|)LVbs3=7OK21pgl4iJ*lba)N9nbC$7o% z-~%;vuO=DqK*7dvN&ohNol4kf z!z$y*MRPIcN;6bE)+>inX@|Sx2pXZAEJ?+JsQ^oaY^AQ8s%cWY{5NkxWy{bNc5HXM*Y{*XNR~KO8r{`o7HGp~WiO<@1S2Im=*>?-S5~Y$CW~`V;aA8M zet;JtqmmJ_3c83+4g^gEtCEmuj=u@x*^_Vt`0@MkaF&-~XJHyR+~H>|C(7h?6z~W$>a#FYE^Zx*|v*uB3;3zRQK$X|8G&t8QXHiMy#b28?3LwlE7`1 z1gj;O(n&7=bhW_Wkr9bDJ_meF1t}7<)_rI#R<`u?c}}QuZ;LC4r6By?ec(QrRkZ zN3^SsD6z_BFG1^PT-4v;p6DP{YBJ;oV4rI8{k^e41>Mf5O!xO-Q+|(1u}d}Er(N5# z8?b6FQU@?sG)3677-mp=QmwJb57 z1ejd6K4h|c6o(w`*ktF&{w|jKy0OYQ2NF9u>KT+*W46kQwFVp395xK=N(k8{6ndRg zQ~5O!SJb(uZpINKv|E!@GAZCN$Ii1TXR#zb_K})x2xtu__BYv($`kcE?|1 zBiNmp#^L-N4(4Xmj+3o{KCHD9z~)x0tF=KBX89OHISJ@eIq-wv2=hi~VkoA{vI$xF z{}yBlFo|lP}aU^!Q^129A@wW384kQxjD~ zCR}8VO;l`#fXyC3HaU*XfquqIJp_bSvV}1fJN_~|y%eqJO$ozLW;8(yMKjfGtSFrj z{@Y5nORFeN6@ou10Kd(j$%6T2t6eShuh&~uIj03$#W`BV8Cu1OvUCjQ%UV|)Iy0lt zmMp2ggHab5pdd2|V37na+z&Y)yaulyd=nu*{sBs87b`EEMUDRzbmydE+-kt#+KLJV z#41Xa9;rEZ^ST4s@Ai`S`)J#!`@KKh$NtJPEXj#5hX-S*tdJJ5T%Dbouc<&=b}C0y zU$yff_tM9-jAvmDx`al?2<@~t19?dpFU`V?p$Ll=8fAx6JutD1vZf>p)XFx}G74l= zGZmX1L3RVQ0|IrU-GJc@5tZmY^ObLz-kR4wV7Cs(ez=1K+A4_b(bSGgm6{Pe93wlA)PlCtCCBj zQmrOC29t%!=t+%KuWjDMSWhWgg@SCGvF0{yus|mH^+mCE`P$UlpltOLg_GASJ5pqs zp~(`rOC{D3CF|zj?97ZnOHv5xqXJMJ=Ie%x@t83x2wK03$a&{q zQ1a0+v{2ppQsU7XAB~!raK>x?=&mqwu#_ZlN1v+NTXpn7e{#EJu3H|m8*l!N&%iyM ze~6v=X$)1HG0E0Si`bMFuWC7OHrueo7^^uW4tX9Ysbr^N^f`n2Fi*78R`q7asX}}T zGE*5=s4i=@QbM+Z%0l}_HIv+jGRvrD27B7nMqk<6xJwA+zE1!SWuN0vKdy>`$r{?A z8#Gx%+f%zkT>SSPDwV*#>};>AW~VhV2BR%)pu$KI_9i)!LZxYu6VU=eivmh*Z|afO zqIPCT(x2tVDlF0}O5&TT@?4A;reLxlnJp31MJX7{j#s5@r?k0h!FxwiepAJE)na>t zQYqQ&D+9=mlZrU;LCwe8zHkA)ead|MyWJYRmSOOJm$)dR&~&t z6M_kuKkfJxcT5)M2Q8aq60YQXZV&cEM?wTz<04QQ%%27M!4MUOdA`Q$*Kg#gx&zt2 z|8+ycjy?y8&8{Ep(r&C_*42t>cGx}!(rsDEn5xvOGh>pdRLayA@q;e%{1^s;W(&Ct zXF@3YkaOm>zlG}ra)^}2QIheOc()^o%V7U$fU^@ zECK8$WP?ZBv1F2@Uyi#_0XzBojHMQ=Cae?W?MB9t4k`>|z!j*j$`OH*KP;Bp<{2GWWqkDKSg?H(5~z zL%27xF1`;fL96k!NM>hR-QO#V~>lfH0?vmyP?qHx_O<-&f$R0+QIx+d-g*V zpE?Gk#|hL(1(!&F7()mk)vQ%lj%%CixO!a>JK9WjN6G$UUSb>f_IA-xUxyAYEsabj zG}NelcFXl{g{VsjL#D_3(0QLl72|{^j=J3p)(06=Oq8S&vI2JCaxAcOFVwkC5#acIwy@=4)ni4USm z`N9%@1zN&ZO4v#Ryik1hB+5=4gZ|8M*!(V_A;Jf`z{@C$3BfSmNB6SKt%lP7`nqi) zJ3PFqRBeWFkjtdOBx8sm2!2oAg4012L2c6G3RQR5UJ&wlC8@vZ;#f8mw;KaZGSKEpvH9OF4sATR=^ ziy!g-Bh^~mx{dKEE#sz>kU1sY0`D@ZBh&e6rwr9g4zF@hlKZL*PJI8CYb&s5wP4O- zp!$|$Qd2~$DA|+KFp!&|s=K%g0fwO|RuY@~p@NoB$LFtOY^L$`g6`58n9sfs5LN=#W+=!0=BhiczKyQi5;9r5R0X~{81AhvV}O7RR_ZZbYf*MXfHx+G1 zPEkvYreKrB+*Xx=N_KQ?OAZg($lV_I$>^UXxVqvpev5RS1-+B(KC zhLi6g_2p;b|M!0juOEI3`R~7mW~#wpRvboY%SPA+7-#j<-gYO3!cHa5d*@Yn@ZX;Q z&esv~+>cT8!D}iL)F}Ur&F3`AK6)KpiD6X4TrAgU2#(<&6*CmpeQWG)X+oPUz3`j}?7p^gOJM8LY z?4^M%&=YMO^#`d+gK=RPNs7W~YAls41kNab)CJJehWikdP%2WG+R@P!695}kxW@A| zYP`>&%JURzsmu-hx9$A5ErFMy{pbxOzxXr^jDuXsVQOc_LS>06#kA2P$6cx!XI80# zg0fdrr6!Qq$k!~}%B0Dn{6du;bCp^SJOoVgJZkbWQj&$?LYcZxMqjo-7Kzr3a5$2K z37J2wpc^u6kT*=BjJ>XS!{T)TwS2!DLcP(F5Q&DA1hkeEV|Q^0*RLL>=?;QM{R&7q2cog_C;TO6ee@iFq)l$AzHq6g4Gyt1-78eXrKZ#2798) z>kLd6PQdDU2Gvw!oBu^L1bU#3;F&Ibfc$q}LCVWNL;kTBsdi^ot!H^%a}`p9T1T+V zY*cmvCbOEGvgqEx|CeN_a+a+|7RU8i6w7SY@b^m9zRpQQAyq6JLyQ%r=)_Qdin5D6 zwBT(S5pX00tI98O%E1!sO{?ewV>p#8;0mgOe9*w3wWYC5A#Ef-(~18 zP=!6uqAuhLzvs)lH);Yd!RT=kNLyCxcMi>Ao)}1r#6+>gb&`v*5DV2MSgALt z3Z9bpW1DbEd8T!n32U-+P%FhVw5lxR!_GWr=C z_GHGYNe@S2AY(0m*a(@4idsr5u8j^vMNBB_lA_Tp8HS7V&}GzNp|?-%Q~fFzQE<$D$H9d%tUIBOHd`IuT(lN5#wx|KBu}l=V?!oF2-kY8 zEWXRZQJp##vsfuCt#X{KyD^eM=mFJ_M@$npA^X}pza3CirWa&jF?QaxDx_wal3_!*~lI`$l zlvI1*4i0c_XImAiSQ#INQ=5xoj`pTd57b99=1FI#%#Bxj@g`-nFyoJD#v=mRg3Ubv zveMwTkM4ABvdLB;lWkY-w%tzHI%P|g6ph8i; zS39=a+pyN`pgpbQ->P*NfvBs&v{Z*7;FGmR4C{;GqQXgWzk$LW43y@hwkn4u5D?J)cnOTevP&x1=9@9|Cv?*a| z=VQ+IJF&Moh3mT;s(yhw$|AYnAXv$eDCq`d3jg*ojki5ya{cz0=!VU`!&^SgwV5Gk zVgjKL^kmFKyOUbszJ6W!9Pd%1$M}#dXp+nA)twMbWi2WY~xXk z)*+K2?zY>}NR@Kj+!MIh)uM9R%f?@oZmx%bxjM1Y-Hvrv8&*48RL=Ri7CYve>oLpw zOsg~-W(f5dW61$+vC8T+X4GKBti^DJ4#UPW3~356SXPLk@$>ODMP6$`Zr&x zS4B1E)Y_j0OSKxtTIE!14HE@=YVyroE$Vwy2<(4iVmP!(km zlC4w&c?o>KWcof1ogAQAWYQxp0Cf_Ng;K#H!coJxYin_iY9;9ej@H4{BJ;ocbdK8X zbA2Wt`|V48j55tH{{Q+_9BwbckQxJBpf_y6e&|e!K%asvixw+itp&-H^}HPGU?-iI z4r()Cxlt0KR;yhRH>UD$#Ar7bs#Tn(Hr+O=?MrH3piK97%6Tnmt=M)ssd63an7>qN zQ5k!sEEDh2mO7iU#NS!%YF33XW@;-jZqZ}HtjBD11*U5(n5e73M2!iPRR&B{XfYwV z@!6yr=rr&1RVD%@rJYP{vbb*GU_o`JYAs3%Z&9`CVwIb5&cEmM_M>ql7i3}8-Qx6m?<;}hUi$hs%vq5e;)_e4k%o= z*A)G~b$uowyK$)?TaHrfZ=j|q6XpJ1s0q3PXF?b|OuVvLlT@+^s)AAj3j_ZO#wHx? zrMC34UGg(l-ki?A0ojd7ksD2cC%{qFq{((H$zd-|(qgZ7v?{B()7eJ5*y7#@OvqLx zHMT$}@G+K?9sldC4Jr+}WZs&sW{lV%rHkBk(54%#n6eW#TFP-*@gt7Kf}jfwytm5{R| zBO3h$scJXFIAfkE#zE5tv5kdPg<>q#X;kUkWxJFk5;dzPWU^yI_BP7wqcoZ3XKRsD z)dE_BIsm!W)__&ozg5Zj)Gp<6sa)-?*dT11w2|vwM-@~UzpeH#M(gXq`ambPdYo8p zsmCN?8Lu{BrrwIB)_N?kEfU^&{*BqDDoofd7^Py3RTH!t1EvVwRIM3vRJ&QJFD*q1 z1v0kzS^<#iTvdj-%3{V{Zom{+M{s=_uo+#BY7=FQ$qJK|RlEUNcV@JzC*7Pts~9aR z<_leT2n@-oSRNf$7F}{=ezp+10~y@r@c@e>{m`;QR0R2=Ato5DX_4s3OTtKTCOeeG zWrgf)a#~s-<7iLN7Hh>ex({^9V(z9o04aML8K*T#s_##lQZ+)h)<(Dp#R~7sRJ3Jh z6PDYX2}!d`XSdwjhUGpd7JJAYQ0J~uo1+w1kSOu6&7&((e)TBpkr2A-#J~j$<#Uw&IYIOtow^SmJ$&a4ZqBC92sXL7VSr#!PoJ=6YJNC~y&~RRXp~ zn!#bHZFiTYO{*MX?B$SVMtK?gE(DL|NLnVHH&@Mw{r$h(bH#vDTzu zG{yy>D#910s9=~RS*gQ;>j#IpdexoQ?T(Ut1}}HPimT|Ytbi`i4^@#taHK|{iydgB zBwb~Hl7o0u;agpR~os3M|sfEz(vlwA8ZM z2n%f>dIH8)VBY1Td)uaZrEKN*XrLcM##t7M@ zSVMv9NVNp28%-2U02?h%{lqG&tyEEJR?(Rfrs6S~^sowK(V;M>r(j`ZM2%)w?u9WWfzw_Tiy2-s++wIOEpzkvJe!F0gFZD zn9nc4Tww_oHCk+#%-FP4U|q+*l~;_J#B@xBCt^I3&o?0%W9b=~E}-&iWa?f+kc^m= zvPP~E0%BXjg>@#>twN5!vy)icfLt-=xgseU} z5}jE|7%q?)BoE_Mvq{=0Ibt$x6eVL^W-V3w`c~?USga>#4QACA8%$WV8;_cNOuArKz zHekF;hf%9+FDu7rMJYy1g%~!!?G^Jc@3wE<= z(*$jTAWqb1F-B`9C7fijc&H=~{RFu$D-GST@#qSt_3{rvpMMzoya)~f8usDWmjcmu zJ^+IkLontWg;~PZ&!2Uk^@8iPCx*^l!N>&ycGepM=Y9BZeb9613c7s!(GeViuIMNX zNyU`nEcDa*4p6cBjRhDm7h=#{fI-^CK@K1zRIyL1mb4rHuNIzZ6MG9&(UTXC?rbTd z7>4fj5OkzT8LAL8#QLKq$`6*qfwzTXHWN<@vRqX;fz+`Vb z$_ZEnTWdxVgZpfZ5`;0Wy9sCl*|e#cYF0)y)6m-K6=VX}a+4J+Yy#K~$mR*yj7?_x zbOfvv-9;G$I05ZRacGZ=Mss*58vFy$;N=U4r!QKmMxCNcmjW>05riSn5cFRPLhm_0 z^so&Px{-h=bX>fG#*^pK!q$7ihe{?t_eL)Pa}mCdbDn59=K=c#57;hyqA@rKO>t8E zJXUSJYR^wacWDNC%L$$w0M+ods+mJKU=n+Mx=9??Uy!I~UAuE);mV3qo2gwHp=c*y zQiQ!;COu+;V4_uYGB!Ni*;VTG31rvZ?f+-*t>f#uuC)LDGruV&j+2-fBwJ=oVkZql z+q6v~ohgO6O&U%ca$;sNS!AItw8*k#Tg=Ri7R!<>vKXGk~QrhVUcrj1TM zE9cy+t1DUee9!Z&wb$O~YqZTk#!c=`EJ?XQHqdnym(H9WaOg@AQu#?m4ZE`ryZDCKej7AsA@fhalW$&=g;X|}xTpCDKV4kPK) zeMtC-Abh+Z8G8;Rch6De{^cMFK0HiVju4>ZD3SQ^5X$&mITfpP&k^K*v=8a;euT{T zKBA(1j$(m}&lfX_sBA@_97g`9hmgVdP5O8*;s{&J!2?J*c@(MkR!DOpa9)ngJqb<# zFDSAeh!J3-TzXUo7zUpGoYY-3b;ydntW`sGw%bXhJDVfH@gy%$mbk>fU28?D@`&=M zoy6+v=N4xmlTBS|)dhA;-FU7rDHfp)mPl~1N8uTFo_s!EP_mXw!8byd7^RwqyEC-O zkJ>i%z4Ur66bi>sb#BU4->3?`;g3&Kl4Mv^_TrfC0I%C?nT-=j6Z#b zls|r=_IZCkg1irpqWHZ7D0_E53f}k>=`X*Bl$YN|_8Wge_FEq!myzc0M zsae$xmqPe`XHga8hD@G_F((hg_uV((_RO;ge&tVyc=0VnJogr1_z1Co_!xICI|<2z=~G1V8?31pfRP zgg*T`EPGdNf^2e3Osa_j7*(vmQ>uy<$Z;iLPA8GzY>CT`*0^xm1$9LQv<;drb*(3jR3sfIQGge;LZF^+j`l!G;5g96dlMHL$xffPAzu!@qL%|P}w+zcQ3~rAvTl=EZ!W-QL^%|e=aP&v3 zqaUiR-BD`Je9F=hklCqROd!j1w?ww< zNu)WQK;kJ2HS773vps4H3NR+Cg^kfFs!5nef8ZI&zOI}0smtfD&Vli940d%O(cc@< zygFxj^5pV!Ma4N!LgI}&S&l9IEb7nuqAAiJ%~Z9vdU z!Wrg)rc3^4iXl|d;ix(1k7^%ZR5^L0nkrLg>5fJ#FSJp;uG;(InoBTxeJ)@)G!X;g zN$3twL{AtaCb=?INSLo zt)e;NovjhcJT@aZ5JO$v>P{@OpwXxTZTeO0>$S~5rcMEAtQuE?(o)VJky+Fu!>G+o zM>uUzvb!DfeVCgCxuYWFG-|@#37RJ%^F-r$Z>@n=mMMq~P%Hg*#Dt(DHdKX7-@ke} zm;lmZUOdD6j5aVXm;i>MAv6G0-kzv*azm8^)xyew*3bnlHtuLPcSk#wsM{?ZT|O7l zO9kr>jzM2g6gsGUZEgYRJRO7{&tUXtIJ))a2!8cgOsimFfT5HUpUfGMVEfkSWjvGUgM5?ahes zaYC%CEpmKZQ6z(~L9VC_bwh2~X)2RD>cc#>&h#)Jsucl>63_zG)O`h;9LRsdRJ z0?^E3S^c;5VhFAT`J&p}3)OC?QEl&pT5IM|)^2FCJdJkdWF3x#$t?_BRIMH#?!EXv zu6}5D_CpszyXG2zE*F3FaDScAOWWCQ>&e`X`IrR(IcAN5!za`Lcd4}vicgCgIV!mH z_NWS9nW`ei4?6{!fF*#bJdKYf6ktAL6A71_Eec$%k>g~EG)Hs9+RL0VOC*N{VYr96 zn7Se33}pH?1DWzKVrjGvaWyb4jjTgMByIpTImw7}vPQbMEAsu_Q6k;v!L(DsE~p7{ zLtTiwAv_43Cvz`vG^zeZKQ%W?CPB7G%Zy{@R&fH_If52M&_d7}8_s-A*1Hcu6K&QN zPfyfQ)f(;HsAg_xweduoy$|y;e!n|GJsp4^uOM`LQmtH=Z@HXBr}G)KJ9?w@6kq3b z25pXBXtJY%SrC?!HYl~QMTw;~Djgir;OT)HKUwM5MXg&efK|)*n4c^kU{BciJp!Bo zu3{g%DFyS-s1Ns23(mC4 zs!#^Nt`V-z7`YF15L%+CXnejUE_8C5N%JKhUkF7DVQcaAL$jw3n%ww4ZiLAD9NNzk zQr~mv2?#-#KabA_qQl1@SH1ajJP7q^s;R3dYFwFvd3d45-5r%~uBi5u`;>X0*4GPl z%)#W2FS2}_+^la3GFd*rUWEWAAyBEoW*@0O8UT}$y}KoHT+C?`Pa?zN1d{Ad;DXgL zq@DA_P-h1wRKY{a_A`*_+YDrC(@Gu!+2pAq{dH1;9v?wZV;vHF+>z+vggjX(*WVeH z0Zxol3O0f3N;q>ghPL-&coQ-|Z92cK4iznHWe_fc*LukxEqtyiIuMP_&l*&OpgAEz z4PJ}7HH8PEA;=%~0sgq+??*s<35pM@eY{Y~Jg)kzH}?d_#}ieCsPy$lxj$dS6TT+Y zAJrkgR9qiah4`Q%)Q1Y}t(GQNkoh{RTODa*V5c+{Q;<0*$V9zV+mxY_D1hlDdx0#| z={S<@jv&_hC?c#+pgJ`Xp!(};C(dkB+YDrXWz*LH!N@Sm6XS8--V)hoTvhL0`B_H= znX-+{(XNDhs6t5nd2QbqLECmgtfM#DF8eCb)P&DVGQHoAcG4Hk1WrJ!j}1g!Y!K?= zLr@XjjDha(9RYU zsMP`zk_KrIbu7&1==eQw&EHVi!x#YLHEbOF|}Pii%0M zeUfzB+ZktxfuNnz%k zm!?`_qF&x83-&-c?QD6-Y5opwsP@;E)E2uqRiZbBOe=JVMKlIX#=|6J(NX~{#qN+= zVj$Y)xN4(nE-O{yFMXghklnb=KqlKHT$3YZ>S?(u%Opd2Se=!DAj=cDWXr2KPjV>$ zl>0fLittoR0Ys{egiMEPG9tu6GB1)bGFd<4g4~Df4BEoa;41em5k6?(>*^!C)!kMa z!el&677u0qBnybridF}^p(;qmt_X{d3kp3PkSoIqo(?EF>x?1-QzSR~JLk##P-YGI zs5`BwHR`EWHG25T{5Szkt19YhCQFi6^4}tsvDB#0af3y4GgpvhIv+=>z1$shKjN$p zA=>r?qMYr~R#l}S8=Cm~&3yh_+YDrCGt6;PF`?0AfJ-eANI9!w&JlECFD_Z`M=WiU zG{a_7JxY1<*ARkQDn(tWmYX#aoW=`2XpWSLp5A=yt@cfP+#D(6YE(GBu2~8s+&9Vh z@K~RbTp#MGqCuWJ&+iYHAp$-Q_C%d@!=G_N#Tm(?oCt`kYUq_YUsq&ur4(ND8O<^u zEWm~NoHJ^rFHv4Eg$@BMK=Mk-%jB_)hdHY9y$+bnc?aI|JDlw;9O( zE0FPVSwb{I%s*!iLN&AAhe+llF%ITx!JQ%>Ta-&XlBk(f7^zeZ7tWwDaw-}wcq>~d z7EcN04=Ji zz2}t>>7*As$lOr@Mr&(;Om%S>2AroL(~2E>xn69d047#ZR7@aCKPAPEgDMwGpo+!V z>?dS<5$13l&6Nd^b?jxmlo`lw+-4w~4w>?Z@|@wT@)WcAoQshNI;lYxZM_$fmIrWA zuIP@(k#pJ{g=g&4_*pGaaJl12J(a6L0E^@Vei8Dr~=3&yp?P(~O!6AbIuGuqW4caXXrQgfuNL*k{HkwvMbS|}YI z6;cg7t4(Lo$HFGtru?QA8XDAQHsfsuvM+&5mF`8*48n%taU_O>B7iwrtnFST*zIG&e~^lHkdF@_+5QmH zoKGOn#~u~I(%a~TI+C+hRboJ3SbV0n2Q}?97Lkrh*0t}!WC)xDf~`; zjO>_TjF0y5Pc!6L39&6sMy|Bw+D&2l#KMirF1R3IR)`WsbGn zgY(BfhVQYD5qHiTL;XD%mA~EeKk?Umn}O_0AXBNBv{n(Yq2VzM4U8c@CLaFgqFnoU z75|JU+dd>X&@S2^R**@>G2ZbQ(oQp%IYV^_qLKuAp-P&EC2t~RtyH5{f^wC6S$$a6 zZM;fYq@h@DuBR-ejGHmUVruPI{!~LzL_h5gmlymAqD&n1Q&Vng!hBTJhM!SUMKvrZ zV5Q8xN@WRcU*=n9r8iN#^NLgwb;yi6JM>b0hRaD_ERG|^`6!Z|j%a|{A5f6VahlxR zPyXGOw9Ztp@M9ms_sAzW@8O2d=GMuJ)66!t%|K>=Ofm`WKkb%Ea$h=$?%sa%^$wvh zJ%^AHD2D?`vHuLo4zx{6#BcN^qeOuW$Y_Tx;tp= zs6?%?a;u^+w99?MqG|aqpHuBt^-=P=GgKu)BRAUPzAn<6$6lz3ka05~HEFaaY4K_HsZ0PwtW+LJ&?sE(YL=*gS&PVz?P!t3VbV%6uvaS0c|6Dgs37 zSQ+Au@^fxVmCAx-!suxQRrNW^w+LQ{+_U*Cs)M{0V5NSt7NVLOA4)WlJy?MS$v4lgYUy*&xZ(i^+skwKAKwk)GP*V5mQk$J=ZlVEPc(k8OQ`G zxiQ`75cdR)Cq?Vk4p=+7AtW*pE!RfSISAC%HzLfz4oOx=kwe>*;k*wiuChOd9LEz# zrG-kcKd5rF7@LDsykkfa(0H=v^W@IwiC#=4s*Gd~Mdhj|T#YfIw1#ruvryW>5Hws8 z&;ppt`O^0Jpd!eVw$BYEX9=1gfeVnw9@=ec1HDj5;3VX^!ZWVO^EyRn90-jTMQ2^q zdLkwK-eO-j6cWJvGj_=Ju|cl4H8MObkb3$Ak|o@ZBZ-mdO2C{6nBzXG*ysE=?L~^? zeq=cD;^K6WDn`ioZ%ndc9%lI-f)Bh2=MUdQghv2U6AO@$SA*uOT^Jl1#mMN0`rB%= z^klt{QD~$4UoX&RAcGV)MldowsE(Uj+VIBPAK=aRKSll3>uBs8K}+8luJ!dJ+Q)~< z{xM{qI)W^>!$@~KLW^|_S*K(SiBLK41htbQ!9m2>GWa;j*&G?3_Q>W5o-Im3cxnWs zs6av$OsImGX9-+^Xo?|t(R_}1R|6l*f<4kfU+zz+e5phRz>0aSg2zSN7x=gkFuuQs z0~N_eg@Vl2g{L2T3^a@2%Og>@~is2s=g~p~fjE;?ActjRA z9l{J`U-NBjOm6ElhMu15`14=(VB^+Z@bZs9GgYkVnm{&+>%+8+DJi&QXHHvn0@!y}Q$o6nVrn@~dPD@9=J@N@x z0U?up-Wewqxr8i}>LrnW`lKpuq`4kfA;(F~!^9%S8z4(2aH$MYuuSK}1|{2%WZO@v zVjm!ika>LiCs@4y7sLc5AU?VniK*4_Iun7D77pmUK7dg*OIoJFs_C%!I$FlBEo8=X zo&+%2yuAFeW!pV?;>qWbTik$_?oqV%j-u`Q82X0B(cjUD7*7`@I$2Q3P9ob)U^}78 z-Z^g46~U91DwjgQQkmZ*5xQ6^+huE7NV_BIPB9rCcFID^QU=9=(jD)us*pA3eNjsV ztBH^*BLP!4e~|fL-l&wqMxY1EXb~l3`b#-&qU;4a0WF7CQIsr4@<75>!uOYau$XqU zkbB7wQ(Y|yJ1-I*vM$GABpV=0aXO|7I8vUMs%bJUVzPs#VCht_EEiF1LdHBTg%&c| z<`cx*{srOY@5AAvH{pKV2FX$Rh>xkDl2sxmz7RkD>F@B_zGD~~9#IxtEgY+6pwB4T zzx<|d$S!voF@yjnA9-{ho;UkGHb}u+W#po2VO#IY$f93su3Muj)atQy!p;PEMK(=-e&{U z-*n$V?u*$U;>?tZU)5+ z?TvMa^L8aU81oTQ>1;}!p~QZxZARb~)N=epft#91-lv8Gzs z%NUfL?3T>eXz#r36bwayqHeT?=R8psB$klYk_skDR!WEp&bq3JnMDEa1c)}#|Fi-u zpRbe0xo2FIdI@BC0vN5LC})z31@kUz1z7^&ig(gfEQuEb=~hW$q%wz0wLO3|+x^IL zJjgtgfKk122$(3Ds8|veF3E;UX1xbd79YXo^S2S`;))FBVJXR15F1y8%W)+Ht(2DW z64tKYh27tO1Z9;~w2d;MQy=J`f$U#?)74D>uyb+?@%{ULh;e@ub zfad-&LI!jV0=;9hj^Hq=QsS7G*{NmGay^;j_?$$Z`!N(y&GHCYrt=YA`46iJju|c| zkgm5T*&IZy#pk$W{uwTDALqam{IoeOoCU**HqKTn`x6ead0JJFO6NlW8Tm3p`YiLW zGtS86^Ab4(E89oZ${ATcw2X`_Dp!W5ohrDboVHex&c}&_EY67*)=|dz4y$Ttg019O zgv;g-(y6wYb_bB-NWl1-Y=V~Sauhj)EW`Pb%Fj}yq^~+XK7#warU_hWr;_yoZG+>uMyuE}M93yY&Bk!OsTR3s-I2>2 zE7!}CN<_Fs$y|@|gw(G5nJ!vUBui!!yJ*!%)hR*6h_%{>sFQmTdGb?SvfhgrDoMPP zRQD`s<1Cpc5eh0#x{I}{6v|B@GG!Jtk5f+DB8}>l?qQEiPe){WIjZAScRTHC1YcAu z+09Dr6RBbew5ah;CshF^o(h{F1r8ZdCS-{OEQOKI+%b!GHj9=qo6l!C96%;5V-D3U zOD}pbM@x~xX^VXbI`k1PdAlPsJ_D(#)rc1*ORPj(Vlghol;C1)89w;lB8e|u@Wnt|+}Z8IL@oa9OVr+s03LK5#`ez=kojH&yON$TA9KEzxE_Vk|zxWkMEp{9{~X#8~Y|tPKIM zJB}pgd|Jr;zG(GM5kAM0ghL=Xjzq$eBrEq4pj3jM>|(B-OK?0vP|cM+l+Kexf)(o^ z_X|6!_6d%BZz*or>_sBsmi$WwmeZucS;qdTZkdEIlMrUm9;Q3dI=V_L72$G_g2+BK zVKemD=Loc*N?(jaR%!`S(rXcy#z;}-LAQPlU$A(nWEs)7qD(mX;{zsqTuKOOtx^4Gh z?S{Kxvi@#7@vB#nUEG1{mT@$70v&xocmD*g6S6*@7`@{Y3bcVyf_A+dr3ti3?s8`n zxznVT3b{FXwgT)%$fRvaZ(WiigG?KVx1x%f@4@90A2U8hQ>vD{0<%VbId94|u%a!Xkmvs1@1NUnwSStjylrV_4H zv58inBaQYjgJ20{=~A$f5XhXUWUf>=7g|Z@{YbRii+G!Th&11iAPa&X6oP`Z0%W9D zA|^8jfhq+XS1Oj8k%ebp`UA{1?ZCRNyRmxxPMEH{1Ew49!LOfw2Zfcr z3bN*FK<9O!hxyp`;W6}&j^aAstdGGo4WlC?0J=a$zZmRnLvDB=l3lg6FhtD+IDtuD z-AR@A<=EZwhDnez0Wz7Y5@-3j0!_hYE`aU9MFJH{$yq{d zN^(jD9)IGOSi5mMV<*;Zz6&eY?SP5dPOLK9g%@7?6lGTiQQHc%=#UK(s^M`A5;BS! z_!KQ8_?TDVkx_KiR3kay401eek?$!WnG>`V3bs74kTUsE6i(Smi%HOAGNdS)SVsv_ zwK(g~5ND-DtkoXIXN2o>hJf}t;%sDn5rIv*;x(`YGTFz;lpDTIO6)1p3MG3+nuC<& zwMZvGN~r`YQ7#=W!#>0D5Oc6Y$fb(qoZ3g*$nSI9$NY_8({hHK*pG{+Pa`8f2icjG zNYAcET23pHvj|yQ9U-egbZj9mTr5UtL?Oa2xwLHo>}eTX4sn_u^UR zz=cJ{>N6UZ8&gbt=|}i4v;Ff!CLf8|L&K*t&QDAlR7XW^#4$n!n}ML9^LXf?$FX+( zc9;<`vyBAIY&%vk)~vr1E7shJH{Lsfiuxf!HlgfdXP*Yy;K+mlvIz|`#`UoY4DtC< zTFK_Ja-^M+a=8uiyln}TXgkqOLDGB$OJfp zlId14$LSz)9QX2j_VRiDE>y5M=6Ye4$8pZa3TaWy!?La*E58Mq1?@=7ZPOr=yex%E z7FUFbD1od15s|rg;idQST|%~S(JHK1u?E|B+>MPJci@?4Uc{C9W_9r!7#uOcCbJ*3 zHtm0gI7ZP9`~7&%gxw6=Y+$KCUU50&PrkGqs*4Mh1q^kei8kAA)w) z37H3Ld)(^0C1oa~0yC8|;q)k}&KskDCrV2Yhgvymzv zUw2A|363Z@(^MXHM1618sRPI+C=xl&+CH1glw}CXzl@bkLFOoh4w+5BJ%LQK{fs%= zUR8BWv_FpXRwof)WrLIpmyw%Mij3S=WE6BDBmXKPYo%RmLZTEtk}7a1MuRNGpk&X# z_@07n{(==)vSc;PsAlWe@4(u%Tk)IUJcpdzV)eNVjY!TsuG+99U;9@YOZ%6DOw>#4 zM;9e1CO#cc{_1&{ncaa68+OyK+zC@!L$QY@>vm!}pU zlJb$s94xEgDzXaOxo<^!PNOP(B&O9MHmMvJV~P<$yBKmlALprL&piJQzH`%j%$>g+ zix#a^Y9@f0nr_9)l^gNXC;k%|nYk)o9vm9vMQa2jqr(a^_E^ z$a_n%MJvF_GH#h-OP!BtYAHFGz$$w}oJ!Cp^D>z$CX-R^#F8GyMT^4-J86z2|1jhv z6(YBg7O|)U*@P>vunoBd&4lg>(lTq2NUIn_$RcA(2w4e2!t)elzkl{keCxY&aQmF4 zSh#QnbF)=gwQ3_wO|~h}OiVW6`}aN!U%vpQWKso|&V4CX8MnXvGjIR%km+oE#l^}f z-7*Tb5{GI$l@CR`n@V5;fHw#t>PUpU9(d`w!&nq zisgiC`D$KO*Y3dbRa^1;+XqltKdh>Y^;aj*);*4E^oV`KqGp;s9GuV;jMrKW3uNOO zYyw z)GEXzR3Iv*R6%wwG#g?T;d2-bG2;+1m+fs$CZa>*@BsA-)*eFyWo zZd%6c6X+en6l7xpleSXsFtixrZ!v%|^i7Nq!f^}^44^D44aw49NT^CqA4QS-Nlj(E z2!Xc^as)Ji!P^?SUKXm+SXVe>E2*#IYrGDk{u)^yQNM@S)Uw(FoWQCpoIpt{NsE~w zvz{3Vr=&7T!0h%Q$#xHOzo`fLyZJPr#1ivTrc5Q%aGW*M$7yPJ+cKZf8)% z2w65E%gAlg>|$yyqT{O&6_1m$QN%cBf#I*w1+TB=91ygVlrsWKQYw3zjSh{?pI+m}k zm14-69eD1=4^UP+pdf4P0@`|kP9|Xg703o@Ap0lAa9tXXrDdzXANAR3s_K{{MGp_j z(HNdoAA%-R{|kLIRm&4wDGFq;jslA@K*me9>GurNpVRMzseO&_=_N4Ay7iKyO+hAk zTm~b>Sq7;06EG>N5HKn8+li_jLagNhMA0JpA3cZ!{~(lRl%lk-8HEHazxbL0E&m3{ zS|%Y&NU58IOa`Ju&gT-eWIXiPFY)c~-L4?JeU7NvVk}s+9E+E%QjjfOCb62Tww4#f zjo7q#2lnjQkIKp_?K76o-N-i1K=$9>a>+3~hUKUdQJ(1xq1rT!-5wapeRZJL4 zyagm#Ey@ms3J`5+Y#lHiCVhQG{SKJ=!le2lrN*mHNggPWiIT}2Hyt(w8C5LR`5=-V z_afQuGo;vjhEyA>m^GEn>Ig0#Ka3!A3#5cyL}_LzDoa{XT+)I3k}edeAZSHb3E5R; z86`K%$ZbY)dIKT5!i!xMA}^OIyBHdg3*UfP?A-MTzI*dr17r&@cb=wZix#h>qODRP zz%5#$soQFkb=bIR8-DSNCvomvF#371(o{@fo3V?3$0mSDxmIrEt<5!322pu$?J6cq z+$g{x<@6z>X5`_>aU1;Tr@tjsyQx}tCXB*-bVU(ba z_79+;v=kZs9>^BECpM3&RYXfyOrT^vL|GfLNWrG9L9aum1Ey{a5$K{qKdzR0R~xNm zFRv9P)2-rk$fW2Y)kUoj@iQuylZCqOxujm0m+ZDQ#m(Cvpnf30WIb zGMWilJz^4S5p}s@(k|NA`(x44bqcauZWYkx5weAtOUpQqpv_;nOu@Ebp=KX-WfKdz zYV}%vcBZ_LZpKs3JO`h%erRcHS8hg5jZtYbmT5CaHgbCWZ`uBbArpO)%8`Wpq4X~R z*C`(fiRt)c??F8BqbIOon+zCl#!A}36;k>&y91^KOo|+$S_0N8(`|%iivci!YLl{r zI$)w+3zw`@fa#D4h%!hmO19&!A0alS0=0y!wrw1(JzuS4UxZ8x{cBS0m!)|m1iF#o z5nQ`ciS>ATubJ;d!x>0+`lR zJb~-{zUzad=xS+3ar^}&Q^B%*2pR#A1#a@aHM=M`;nNEl#-NFsX*SVq(kf0bh=`Jj zicQbUbjXtJ_p2oalI#v4;^gNDwm6J9e?L?fl%t}$6Q%V7C~X)+N$nVltB0s&11PEL zM{%VSQ#PD0i}yGSKVBxJD~WZ@Tza4swxe|%#v{_UH$dU}9zk>Wgj#b^K{ou?AyawUWN2e&gA+1-Hi3TrOMCcy z55Ip%Y))?%YBJ)G=Iey4vof36k*dZVjNr*q+GS@A;P_}cS`oiic1CVF>x3GDRud#Q z?mI=m>R?mhm_l7Lb8xt=%d`@-M5sh-D5IX~}T3LhhwV)R)(wzOfq> z&BG{Y97Rdv1j_10QA)_lY8cfTXhj6BuwsyqT}M9EEWfzh09iYd(wa2LVrme1u^gf2 zi{KlWivRe{AMtPhKATE554X&wn$6bKOapD9f=h(~xViJSaWn-Qm2Ey1ZNU<%+p^Uv zmeE44Ub}&x**aRuHQ2IcJ6?YIRfL9xqp7Kx_EA?ihPn^2JpQWqf46-#WMBC^$piTZ z=p$HDF-F^`^`7bTgbdHA$J(37acg@kqT}Om8b0JuW(ErDm_)Um+C{lXdYBb=9i+eu?w}$ z1E_2oL3tyiUSe1^Nta)tlGPG01=)ZBvH@iw^UJOyx1<+Y`CUlM)*y>btRrMqh`3Nf z6)S?fcO340@CkhL+c#s@&2un&)*{TBy%@7^Ux-_8UobgtCSXY@Wivn~xteYx<#+*Y zq*%zM%U7#$wUw*Q_*t!E9=#DJYc^x^mb>u7$A3X}JC3ZJV%2c0ovGSfLM`_fOQ|ik zDywEqcTtnu{{{a3YmnXWr2KMP+1>ah@{O9j} zk2~+a2WA_#Gq0j*trx}Gp^gQ#RkUw9NGnXF>@K!W156%&A*6G|0GYs}$6_Yk5^}tV zkV(j61(^Xxd0!a}U1LUQO?KeH$9~5vbsJB<5j0#I#Z^jE*T_ExnPwlQC^D|*qV>sp zj7WFL5Uy5LAp3j}70r#HxS*WsRwkB_fR$3sO1x3a|2{0 zXGF=Q@FBgC$C2xP4C&5Ckm7KR7V#u5TAV;?XapK7>e1TLhlZ;osBRxe6?4$4=5f?e z$*LNMQOT%i7(p39E3GAL)q`IOS!Uifq-I@3Vrru*dR&gKMA-Ra1O(^9#xa~1%RBJx z@65t2v*r@Cg_yh>WQ%Uv5gs_!%!Z zV;ZoY`S=zUX6tw0{s$k&n{R)}-{T^#UcG8m0J(9z?f>PN+gC&Oh0Pc+X=Az(GWFF7 z87S6%@qr9MQOSK`~>orRljx{Z*{Cu9VTaLqQ@MIA8X&_PowCy-Ii zq`a?}`?c!hYJP@m6l4n*oA7g8L+Cc}{MgKMOY-aOYTnw@Pdx`q3me48C8DLdZL+YY z?BuwvANqN%+e`gefBcVcUkRC(Lw(T_YN4$eKmFI}A09znLlduR3D|q!Fn;voU#T`H zS)@j$n5?Bztz9pL3Jn$kL@5=IRc>VfOdbnZ5{s9wSD;OYZxTWSV3Uv;Y@#t##>bP8 z8I(-HyK=p{A}(FA84H(ffrXtP>RN_S#}l!scZ`rt{KJsRINHd#R^snB#C6HhMyUQn zqqyGHiMoPJWQ7MJ*WZgObsFWKjs(qKQ>e4n1j`!bXT&BtphT>sr+{UJB7VI<6wLc1 z;}{`3i6VFAWp1aC=;Va7pinfFRO4EEKd%+q z3g&97<-)lUYt~Axy%`&*ZoBS!08jn?CAhhrK~Yf!uJgiXSkKn5O+UZ&_`eRB1QMc0*fbaoD-l|ad|3XP2VYg8^mR>$Y+ zsAhFn$8e=}6tyj5lS(F#RW^>HvVM$^4Xe_=s90WUpMoqSw*$#izBedY<}zBQY9*loDwmfL9=sbsSk;HF#W5;UnaN)cqrHtK~CP0C00l<%n&neDm@!29v94lbA7#IcKXb8>ofObb)i{|p{bdO) zynIt}?}NX_zkiEXarP}#uv;+WbWlt0t|ZDBRLzlCN!4v4W0CF777$eC3=plLm6Ss@-?rhnHS^4bJYT zk&%;wp6fClcPjl+Ymkh|p!ZaB^4~MiJqg+L(Q*ZpJkOw`L2LUpWaSjWKQIiR>^X!V z(h9EMwhJa33DSDzR_nK6&BmQD<>TdRs7PzX&WXK~t_!W(ec39_-f0~dgkae^rBnjb z^w6I-hE4{W<*__3V5-+Gn}TXOTmsSphEx`fzcvXRe;4`VuaOG@e@{`{Wpee~unU0^ zNvLieKtt~YI!Hy&z?ia(#&+?)1)0%6wQ)#}Cb0GK>eV|su3+mK7)DQbAF2xrk$oWy zxdC1%4WKF!Fc~A0u`)TXQ1>lk1Pg@D$n$eSnx7{!BEnE#R)LO~Uwi(n9K?K$BQO&{j>tCBV&{ zzXJ0XN*|=DQZzM$Bk2ZJO{&NeD@~Y#tNzw4sy493Y?F%n9()vUz4HM)yw4)Hpcw7f zdTua_x|01pMUzR$rhlVA)^)v~iETEHGkJXSH_zg(yC1=Z&AXKiT(f}|kYKIeutOWK zqH?V?BT!~CSWGZXHW~^Qnk}3xsT*0ig-fU=2GAt*W7$hATxvE6n^HN0(&>-YYvnaY z7Emv02uM0i#&C%}6eW{liTrL-{x_l0%0)m_cR7FOC4Bz4ohNEq2T|WGN+x}i0-0tR zCl&3#0h!E0Q*+VyhZRMWDLXQpq1v%{r5q$=VjX$z;~I}U30&{MAbOh{Q574FV*fL! zRG^)viZNd^s8~g?o4QG0q3q-8lXQ$iymU6>8=C#Iz=rlU{J^N9+_oNd`Exp1#%y0MWL)y-JFmces&)f!obVh7exFz&qj zK|K9D70%TIrKP198j@Q-X`2q)e+x3>m&#Q7nkxMvLH%cln$4XrAB6V4s^DS(Y;td+DVfA#zRzoKe$1=-0Id|2;JPeBAd@!<*r;al zM19muY5uWg{A)T?(?iC})UiRqMkchO4N*7&Ow>`WhQ;T)Xw!SfM$tPmjK02p40ZLR zp`aXD;gQG=44{4VM&&tzM#zfJxg$O349ZedaILWoqs$$9`3rXRGk7d`wYjy|!FV`%FgM@x^a`#(<5Mrj+FW4BCI7^@n_P;o^d8$nUUAoH>7$|`0STtiA$ z8xpBxF-diZqLPJ079%h;2ZxWl^KZTm-}x?qnl*=j%~g=eVDu~kG;8)8bu2I$hX5vU z34pTK2Ct{=w_^j(`}^*H6feE}IxMXmkdT;xtL;5Xfb>mR zn{p5ordpL%*C8PIJU-mB4?q0rFVvcZQd$?7WF@Dy8}2lKrHx}rxm~J(Y9LsR zQEB5;0+bHY^f9Zi3LOyL-p!}d2o&;O>OBqlnjQkNKqi1KSfZ(w@feuw<@@!=qFi$q zh@Fr>tme;^jn(%OGT1Fm#ilYPeg{@CXMFUBzoIRwM}6lYm24c>7=5B*hGK=3;q?NB z98ZVpuZF1Egm(W)ITlrv^+N>M>l34VKSDOl+-!IR*ZHEW*M^W+*o2h$Vr0c;AwMbx z`Jv|+fyh1|hScbIq@|Z2C8r7{byo@4IJya!{LZpQN#D>Iy8DOGd3_Ka%=y|$v|Ko3 zDvvZlYmia(x`t5CJhZk|mSB*g$BmE`ln?N4qCu9C--+a`RwSf1;c{XvqT;F$5?O?R zupGSm!6Dpw>r&iw6IDsd_Os?G$YvXXr9q?}3sh5JO+6Ms1u{{xsXT2;&E^ucd4|Di z8B3GOqda%Rptdw1OGQ#T{g+4;Qi~zoB$K%?eIeFCD0_3i%!dnAo|cT7g19FfM%Pp<79TOevvJ zb>ff}->5oadu6;# z0Q-9(GpLyUSet(~WjTi-<7gwy&$KljC2Cu*Bj9`%+|DGy);SW#&ClZ45mz|acp)U< z5;9UtP*~J}w46Fb#uviYH4q;D7m-tT1zm&VY7PG`%CCUdMYuW!M+n)N2HABDGRfCk zddAS)HH^kis@c^srDig(u7Z%2*Nvj2dYD$RpH{JtR+0HwUI&sgTM(bth)W4I3bN3s zVw^pffnWaWC4B2!RI!^Ed?jSlLkCOLOS6s(ZYYcx7e{U=^E2ixTxw7@4LX5Kht2po zW7ss{sA^Iq5gRELNdstl$k?e4oQ%B*bh6*D`7Z2Y>h$D)JdHz#jw3ZC9UUEA7^fqd zFfga~2GG8tR?lUu+q7FLm6|FdRY8MV>42$mDIG3dS-xa^N{8mlAkzW(vJmwV$aKKu z`^6eg2W(Qo#40Y62H>fmt^bVaiY5RGT)LfbeopO&dLMCb^@sB|!Ih;(58DWfSLAZv;Wk06I*`(r_oL7T)KXb&7fAcZ!|H-?! z^U*(I>jN)f%l$7hUcfz%{}C^~Z2_NiX(*}fS9hW*tnR`E!shOG3BggRD6egUthUv~ z-@lvCby7Ap$i@|9O3nI2&Bm!_qiDJ|Ml~BJ++zmFMipdQK1RrjdTAAzkL9*2$l_8P z6krk2*{$-*+K+)mXJ&}6ULnhb!+v7R64 z>Y;-*{a9BwV*n)dqJ;5d0Zdd!SDZ;W4V6T_e6OpRUL;ZZni1RzF20w%r`FLSGocM2 z8q`r!ur12!Ds__qaMc63O%*|8mh}9^X87%Muj5KbKTp7sNyv01Q)67?2H3`LEQ08T zkQ)Z4Cjk@SMwz1xF@_D0jVZX)WKX`fyuJ;V&VhL1sXt@WJ_g}=i z?>~=?55Ivm_rHdP+kS^7o1es{-M_}`?;JyLL>3k78j9=skzUXYpP+bHo$`f$Xbehg zTU9PeM@TgrSL!Sm4^gzXz6l;PH)CGbbZr6+9TOU4jU%Y2A4OU1h?@G6U)qoC!d_a% zYe>zxs;pv6@)bnJRwC?TiGs|^A&mLYW_+3l}SzA6mSL` zX>2DYcN6H$)@{Z5_1myv!**=mdZ!_=bXOjjZ6b-6#wV zxzoBVZUpQ`h^E^=UCngBbO4N1OSgxzm%M2nLx)QhFl1VaD!~dMS{|kYriY&U=|59{ zPkBxOByCrQzD7OI)AC4z-Bqf*S(WYuyj80R8*|JheC-22_$5!+wi}e}OCg*1B4pD$ zKqLp7f{Y5rXNL)xtazo$`}}(M$T*_YityrF2e9?N-(mB;&tv<;uVee8?_kpdZ(suf z+i>3tFuU(%EWhI!EZzP)tlIIP*m%d2*t-3vc=SgvV$V@8#AehZucC**b>MtVJ`S94 z!H0V-5lH*nO#9m{c^>}}ZGA&%?UUQ}j`QC*p%xBmx`t_xNw>$a>h_SLM`nRo#ZIJT zw<*Y?lj?9GrUK_Lmnplr=fG*)G;5hrJ|>n?;;RAE)lERt6;7`->R}9->~E7}fl92Q zLD6)WM7892wm@oloer6?>U|kt(_x#mkw#Wh2TfVYwOg>(OkmrFb?apeZo4{`1zdOD zaW5YK$uIE@t(|GAvwgBLSDkbkSkniHm4X;S_ElEUSY3>j%NQ~}Zkw}0g?wFEIt9j5 zRZ)JX*u?pZ*QmV!rmLwMU|y=_U@{X|w}r;}qA|RBKBlaq3~H+ai#C?GN=o_aBEvt_ zw(lb@GoL5q7&=ImJAREj9()O#?)(ilZGRFQcK#A3TYiEE zfASg*nEN6=s{y&?%$>68VC@u$&3FC~ue|j!YFaxLXzc?dxY{qUjj6m$2C5r7CzM^3 zoUEc@80A;AzC~%L$}JWZ6RX&vAd`G-I%KcEYmRS!cM;)QM6e_lDkYmGO~OVtae7QI zdd#{-vyOU6f4ZXGE@gdz#|WG$>$nuR@cX{~z1ak9fzj7)giIgI)?u3-dcHQ9vl(op zUMSJ5q|9Fw;A9ABD-}*==5M8?lm(r3swVhvsP?3lGIk(iP;zo>`{`imp^s@P&YQuyE>%2ex6S!K2p-oY2tJh1lOkx9r@{KJqLmMY+TrleNlwYSW% z?(U}v&`a2O@2lAM@Y^bOJo>h>iFf?qb!>k04Qzbq57@+RLv+YmdsaN(QAR--E#jQxoYlOq;Fl@Z@Vf_4eFQDW~GrC43 zKO6Z1WK#H$>Y{28u9I2PqGEl>F6u#gu2{u(RaumLOe%}YE?z28)y3aG|EU2oflE^| z>07+{W=*M#)oMCqdI?`1>#x(F*DH*gs!dIiQILscG$@+H?AsP9z`n=#5E$h-v5k}8 zV}MKsvb7Swi2`kUOoAr%(O@A}7}-g^(L%3O%XuXY4ieg0GXmLa8Qc|Bkds#S+VKs5 z8G$t!a&j9^TBT&utfH=DI&3oj^<|KWMVz-lM(bCr{j6J;@Oe{Z5!L$&R0f-<-b3C? z&&eeCSl&b4Z?b>UpjZl4!|$k6QSA*y6j8vH+IZd)fl^sV{=rskRwaDt09nk}{`vEx z$|iR9$yk$C#+S0Xf^1C2$PAG2cu>Z?Zpg_bw5s8dJTJ;6ut^^y!MoN!3|q%QJoxBy z*nHP-vGtKRvH9V*u=$~Pu;KnU3D|qs`tY0Ba{nt-Gs5-ApRoBczUHAJlQ zuwgghy8A_}x%*Xu_7qHaJc$*Xeu5=y9>IcD_uy#_nC2t=n;B0i%A_NPOzZu*Qi6LcYzpNL|xIu z9)6Fx-M79oO9RaC{1+fwAO(>X3@QC<)y72%wi|()ZYTBrNF6p+FHk9op_pb!LBt`+ z5Z5ZY!f(g}W0g{Q&PpwR(N9X<4jMyaYzgJ$*GupE^SW~B(CL*vd9A39_VqQY4Mw%Z z7}{iRn?tF;brE6Gr!q`+Zs_kVq5n>zg0jEC66#?hoTokVzp!6ibR5%)iEl zR4?cNy`c;|3#=9O{dn(FTWs3(1lH~TPYog}*Y+QLfbEaHk6n*{NV~|#5B&+dfAk)6 zv$wE?ui2{N4Q!>VZGM2N_uy;T`282K>HE)M)s|mif$0x0-{fH|S^Fp!tiG4(^)q~S z%mbHGst}b>j>G0YxOKrMY}oz?ZC<*%Xmm2~Z0+nvWBagbt*UOCKxO>|N~%VvV*Ls* z85>I@V5ym{NMha>lgjr?tU|=)YMhU(!s*kOv32W1_}+J=ny4w6u4XreR!!6uOoz%i z2QwZ=GcM&Tn`kI}=%IIlNZJ2;H{FWwe0R3`9^=ZR4&)87fH~bF!nRmj?qGo$)YeM- z(;<_+ac|_8DxA@H+hqR6^XnUWo6@BH(k+?+DE(yqD##=RAe9dpJ!cGnq1p7n9|+JJ*uvQP*t^Wl-sLg#v&Y`Soj-mbcM>?WdtSoY-Opjo zu4kC9J&#p8e~s1K{{zc6KEe127Mndr$R5EGvxhKmwwAecWDv7`K_DP zYgMV=U<;L%G|Js3!J7t|R2-)iP3!R2L7V<~dVxeA)HWUp(1rsx;2YCbY%;zCD&xmr z_OV|w$mVNGCi~mxF2i?kmMhVUNre(isLJxowYg&QSQR-8YAf*R zKliUeCbn_M}Pc0Hg5k3?A@Z!aE;(y9mZjYP~7q8i&#RtxAno7waOy%vb%opA=cjgIsyAL zwo%0-Hb3|WnC*HNrg#1xX1kxl!u3BTTtCOs4L`x0l@IXvM_9i8G0a_gH*Q~g2j;A} z19#p3A2@CufKwh9m71;J_9*`CJ4jDd{apNUx&>tx%AKMwKG;d@){rZ$Y>q4v9tLq%$c`J{e1ns^)@MaY^+)Wnep%Y*C5k7`1K0qQhn-;0JcJkA)2a5 z%w1rL-#`0DWfx^J9qkS;f5R>cWK!f97gf_>lM3Q>zDIOy4oDHUw-y2r6%^An7pVA+NrV5!-|xPAF9%w2I8Ze6k!-@DBWKV*((>wF$|j9)+V zK5m(_9wzJV#WT-;fVhMLvrTA^Z{xeviU}k-Dnqeh0_P7b?{UvpL-c!`}TKk zp;f$X@^u2)t+yM>_tW6|O30+?SmkJj=`#zpqKI)mW~^q$af5v{iX}Y96lA)J>Elr9 zu@MkDP{zRM5XoMtlHs+w(&*o#?4cnCGkzc4E=q+*)Jy?pn7W`sIDKxCcV=WNJ0o56huW->r1E=f?S0nF&LQZ1@ALjxpE+~d zoSE6*^IL1}wf8|RxsOAyf0Eq8N6~lqH1r-a8U2Ufhk>K+NB^OdNxg1GAI>gD-3Y&a zNzrD%@DWCjos3r(e1)fUT#K&Jlra>b$Ytt3?d3hCBvpNwg2(WLyjmPIpw&250H(>6o-{PjbpF`Bh zdl55w3SL_94XN5GHEMZ#axUh)xeOz&dkn*_c^o4q&Zb!Ham0`-Ibh5~Dh3ND$ojl>ed!PJ@m*4mr zFTC^_UU}miyfF7u++~%Lu-M>eHPp~s9Z-qoZQ#Hx9T_RPzhp#Ou3Dnz%AFI z_K}po;ToH!0p%>J6`!f>;$Y`{Z~s1+^RESJPDOs=W~bRjm7>2GGCroHyawyn?Z&ci zHshdXFApBZ*hK)w|z@hL68j9|u zV3&LKr`LgS^9m=(=yxFqUwvyi7QVld0Q(lt&RK++v);zE2VPclbF5mQfP(UNRpr6` zVh2(<=~1O(GIkgD>@UNveJ3?!i5ZAX%*6-)UP=F3f8B|!+&~v(Y@%8kFdet)SKVpd zaUBEMaeP^aY7YxCo%ql(ne6L~#}s6`GQ?h5rCdejMqUgVyNk~DXvJlnB|v1IeS4>n zaU)}>d?`MX#;6K#SQLK+>h03Qt`_go(tnRep-`)CCd{qZ{bRe zoAkU&zlTIk!1eb$h9y7zj-1l7D6eV9&V5;!_2MFm&mPg8*5pP;jh>D^1ZJO@J4neU zAt-zT+=7O|BXkrTVIv8$A?V^efFSFKuD;>u;Wv=fY#;^>vfhiew|39>A*Y;4<|i)UZ_ z5blmJJsr1-t6Z+3JtosNjT$I-cUC#xH`rLFSFXmliiK5t#fcEZUDQhEt0zX~OrbNS z@9Ixe^E)cYw4z-E83ES8U1Z2qT;>9d+n{fN22WH=#K5_1?Q6P?u4G8KhD_YV4%tOk zHwMLW^#l%;uwb*+nI=H8vdF%&O#x?_39TQ&&7IJyLpeZ}`3vv`x?EYMIK8X{2ZJOr zq}tD=WPHsR-3a(RD!v+^JJCaVPJGv~43b>0F4NLwSG*thr}43aV#gsnw^(Hf8K`rl zT>LDu2DPjQaO(LwE})+K!rFMCXDbr+rQ@excVf-@WUT+=7&gUaVrzUJ;&v5a(~dl> z+m?Y9>keY^@_5Yt*Vl-->OqRP?m_tIX&7+Vz8m`42>b>ih`Se6uJ>u|LxfafA{VWMd@UZC zxd2Z*{UIKh@hYZ0_zI>!{03flaS7ghdnNwy&o^=7Z4cwUPgme%d8>-UxP(edsS*#A z5%49d(qqRSvfX+3W7{#@e$Pybp99d{!3xwd{<1?R%P!MuCa$G2M=*M@3OX2^5as%D zB7?yZcob{`kC~e1l)j~8ysuP!bY{A|N>}Ima-8PRoz(nZCqXy?B8tT@iKoTuJ98UN z&?KJwn>lR6G~GB|?jS>DW(iG|5)&w$#~6^AX0Kc1Y$3-zGPu%oH%(WTK{J;XXaY8a zXDOE*GC7wCqq^pxi`U6}>4evPaD(W_5691|HmHe&&J$ecE)ZnxZK!9+peymuGGJ{y zR|mb4pLins6gF->jP1L!v2#x$_EG~qz!eiITu)ez#6xA+vL_#Fw;jiKzwE`QOSj^Q zIiDf=>gfoHorXRm9zoBT$#{C+$2gXikJAn3aJ--#vnYNVa_uZck9!jRhd)Ab*d+M% z9t+=|!w9m$6o(BW$OfQ`54ne=WL6B$odakG>J3 z(3Rm)NeK;%nc(pIGhpa%=$-D(O3a_``_426wo@vXEwN`bV(X*r;u3y{TXCV zxB@tRZ<+O80md#ND~*67&|C47>G~k zI17#3Pu41swJXT@p%O~b=(UdANmjMYlVw=HIY~X{H7U6qsVC}?p3{Wvf_61@gy+gQ zc%l{w)Ofci6=UP}EPTIWFTPv353hc-2L6$EqVLE@5jA!ufpjOHp8p{ZXPrVxT?79wKw6a)^OgpkM^;n(YGf@~DL!(!kO7>Vxw1JNTe3hqHV$_04<03NzYL_t(^ zgXlFJp24vgeeG1-J8cf8O`nG+pZN%L<}JZ{^jSau$|{?N`L8d>9h0BMo%hYgq&pwS zXJ7x0<2m)%eXvwj-0OP95>>OfgKippcf{V+gg47%#?2c;4*ahsE*btCp*#wOhjonRAK_`?d%czITn2>3+pdz3I zEO8-C`0QCo$uNpb=}dfZ<2B6$MchR(StkIRCh2c+8nwhzystENcIoU& zD}br>ypIK0XD|tPlFpZNE48v>JiCdK@v`10lCC)%F|lKjS5T_5g{G46yd3)d1@$DC zqKaB<*>Q;O@|gr!8B&hc;zZ_o39wHkh1OATY?Q6j^o$0 zhp=Hs4#wX4JR-(Cj^4u_Mi9A!gT_t8lk+}Da#j`cs++O%Xg=va`D6-BOLKXfDY>f#-tQumzv7%*%S9(w!@JWDG0+QRSf_6Mu5v zN~d`2bKHCXTs-jTd_48S$9R9yY8=bvL7J7MUPaFFV{BY~pGd&1{o@EG-1HDG>%wy? z2B;~xd#LeaF2MdTka>EASr$TY@HnxaPIu7-nTE+_I%UtxqF{DK6L*t=bGngMoTgOG z0!}L(cVJt9Ss>|*qbnf+vK&q0;>?I!i97CB^Os~uNI!6gw1P~AkCE~|Zv#%{tO>ZbwgsIGD|kY&DZJ6v|x&%RB%CREJDsehwyO|HQX zUK#`=w^ICP>0FTJx81I9dtz9Sw(&tVUt z*YNugGyW0GeRl=YPBkE>ssS7K9L9+2?}lf{aCilcgL}YmxCKPwGDja=;n1LYhmAnb z$m{Trr{Bf=x4*-}4}Zo-pRdI?KkURhiV+i&=o-_{VdZZ}@W`z9Fk|Lhc$Fah_ZPoo z@i$uuurq3?3q!VRKZC}V_xS|cN$eqo`~0hosx$lYZXAyhC_bEYaJh>Dm}``@E6XUE z$Ic)VC1c1~$-I3-2@2iU)e$6d9qrI*r88Yg9@xns@xG#JYOtr_Iy%jOjNLw8E2S?< z5Pu^ZZYD{@B$3C8redwhpnG z1&=^t2S%>rVsJEEqF4epU!VOv`q^fY^yh@(t#>|974%BQ+C<58Ojb`4mvkfttJWrB zM`AVsR*keQ0^(#V@{9Ehy{BsQ6mw@9NzrP^tt@FpN_Hc~JyqDgouBWOj`V_aNK7fi zRkyr=UPES}H^pXsMo&ldH8U~h)@QKj$E`>?c?N04)mZf1Z|D~@5k34yl4=cun;*N1 zktz=J3>k`mK3C%I2j}ADh0F2A2S4HcPgmoMWm~X@U}kVQHGeF#2}_pkz|${$j(0!) z4PSk~3qSsvgk>uduqi$hIYq75lYB~nwfkTR9ao@W<23&B|M~>p0a55e@l$sPLFC1W zj{s-lLx8eF#;<<{nY)U|G-Mo;@$eNM8^&s8DwF^vahGWw0duY6S9Uwy+L+%=Zm#3(p|2g5y(6Ccs4oNCfNv+>${KjQWGf5KZI|ALPeuf_6T_aL5J zzC#of9?xw;D!H;>|F9dMF5N;mh*YfGl!1+L*;xJiQ7m7%7pWOFO3~u?1D=YtWX^j9CpAuhfK$2G90Fho2ObQ zBdN_~h@N~$r}Ld|p%s6brb_`WSJDEnQ^>f%nu?+N%y``;z>;NqJjQC}RIDKF9!l)R z#toPulLqf>&|$95<%`UU!^|5%2e;9I-U`?5f5KsNqL3 zwYH$Dr5P3H+fY>3j`ZRtBvIV9Wmh2*lZ$ck^f?rf;_W(8j8PMxLZ9IeAav+t^c?jd zBFE3fpsOFol@n)@>-P(`CFbGxZ6|QkJx`*WUo;${L&&%jI)>cDYgJw30&)@G`E-pM zE&avvIBeXJfh3Bvj?+ybyZ8c*r~KL*Q4O$YvFAMBCC}X3$a5jKp{|8qTN$)g0<8_@1Rg(8<>2wNh}(S%M{~}iw5APZ6tm@5 zG~xCKUP1p6QxP)wZuGnIVS;QHB1V%7Ip}UR(DUC*HsjX~hwFI9%q@kCZGH zK4Bwq>y&2|SZ{x_8gG8M3Lh-~9ji8^V1H^QeNF>1i<;G=dov1K2%HMCGo(`7>0FCl zN#*z>J_n1J#bN34?Kno)wTEKNok@k*vA+--x255WuYSjvakt}&uGDY|j2_&8z5TRn zX8~jfOD(IRF8*+5z?22(jHD+)z?no9hj9v@Gm9bMQ5l|I9H%iP43Lh^G+fq01r2x6 z2^Cj^_|fqUke`mlw2C=Y#Xc`{7O?|hcE~J<)a=Ao0z}?B0qX=Z)0~h=DqmbNe$Upa zD=7`#YK$@o4lj2|hFIqie=@yCu6IG$al)Jp-z z(|k9zpq{M-YNT}?#cyZZ+EIO;XNLj~rBNJ~T&)^BPtkU!ffTT|9aA2D6M^BA;N5>B zLWfL6)YVU5*!52#a?ErD^uGbIW2WM@cYegGbqDd>yid`?e-PXQ1|uYVJRW{>p#tpn z_kPC0k5}V|)d#WbKm`HTqyWq1r?{MMLw0Ekeg0Vjy#WV~)zfPo5)Piiy0|oa{%stc zV-P_SIUOer#AJ6~79mTrbj&F4AJ~9wyJk~+s2r!3V7(D%Z!plEYnS=Kw zm$pk+cV#l;l_(;s8ozgeriWh%NHPVu#9|DcJnTZnW=6t8Vl-ZV$;5{V8Na^>GFF;E z9fz??D5-np9{Tm63+U4+WXcsaK>I6T1R4`C`?Z)i2K)CgyC5zFnbWm2%!Dj3ARIk| zqm=9EL*Id){_^cl8&Oz(9vLTjZuna4J5ot^`BH32*WX`-pop8`8!-XFgYH5U#bv`LJdWrq zA0T(|COASyA|m!CEO_sGEdON}Zn*miboY;efA1?X;sD9HYFTKR!JjvCF?%D zH5-m#(c;zMPI~tqoO0*64ns)Eg2~nESnY8s$OJI%aAq)hS@((QjAD0p&i;j|M$Tz` zRx~x5I#+aD!WSPYs!?dAZElQe7tlumi)LCS6=@BB8J?IXXbs5mliC;hl@8*+?GymVik@M%*XSZky+e~ zqN;Y3l3Q9>c>(DKEfk}*5@=2IUFs0OuL!?vOvSgW_TtMQcVg47G`ayaBO$qz;7F2e~eEh?dT1gp| zWD@0ioN8r2rs^3j@SN`Ar67|AEDiS}$Sj2rH50hhggAbDL6?Bcm!D`KuImtucuc@B z;o$WQnOutrnR&hP-rTQ)x^<#t9e^_wO!kxYDkck#L`dL36`OIQ#fQGzV^6+}6FF7t zp?TRw?Kqml$)6a}PmH3S&Dh1{ps(AuOPm{`w%o##nL+mw>=^Qg-yZaYru zl1gq|dSN{Z&zw^;WaXZ!LClzY;T}2)U4n<9JH2}L9D|4vw1ao>pD>91CqoA@CW#pQc z)PR(&9clUPO63k7uff*DeEhQEC{~eMxMuS)Y>dysPM&9RUopAGxfGM7W8|1SNf8JF z@1CmRvBG%z>M9LMc66p@D$!vnmqM`}>5 z=9E9nu3@|GsIG5m>Y!vb=UY+J%%(f0)AQSKERPg1qk`hH(`sJCPrh0Wuh22@?Kd95 z(G$^^)ak~1W@G*KRKy?1!-9{0B*>z1g;!r(;pm0S9KF%ak1IatH|%p2o}2##maW{4 z&AW0H{K+Ti+A_J&xEVS8;Q5*hC~we^WtX%g{UqHivd+^@;*2`xx6Q|~J}zBBwQUb8 z^eKX@6mh!?@ay_R=+$=&HF#=V>OUs{s1bVj=z7D>+(lkifLX4gKqm2+xQVQ8qGsI4 z8AvyGPHt$G<4Kmd@p6)c_Z4MPs^h1@WI#O#Fi%n=2f2}~WZVJGv6x$T2Yh@PTx;$| zCsY?FJ|s;qE~3O_0+#fPIXkT_*vt-UCuDY)&~Ch4Vk+mdzb=b1lO5t>NoG+1lk+-! z$Vc`LQ}4xP6xi%)CXk8RvB`R|&LA`6Jq2ASkV!UC;xYlOGervujBqNMx~b3&q<_?v zbT>bYqBG=fl><2?1PV_)bCTT0f_jw@(bL9BWqxx<$eQ?B)cR4mWz@*Ifgj0iLE_;e zg5Wf{i>;V4V=nx9k4NCZ8xR!?)BQV`iLYRAAygZB&2(^jZ`)w%Tf_|=CRySuMeGI1Aq9!8#~fXAo#TCvz) zLKfH&GA^59kQ8hdP;5>Btr*TsfGEfW0JC9>^4QG;PGTJ?rxM8Q>3h=zGCr4b7p<6! z&ntkLkO@e#j~ysGWd0!?)sLa*3^IYsu3Tarm5gJuK?n46oL0}C=4}y(5p?!OgRHan^ z)x94E4!spC)*e)@;-15&6=bPd=TrtW|8$#Du?mKa6fL{7l|XM%kR>FaLfoE{3b1W^ zN|BgcNmfP1F=qvxuLKJ}_?iCa82Z1->+sV`=1GmcJ0~&z5;Csd(1{G~{%NoTHv6(2 zI2D^Y7z%x(XVXKMBEUrt%E)8#AXRhorudM{t_U=q@Kk3N1L#;+Ci2pdX@xXX^*obR zXO$mP+sGyEh2T;|gY-n5QCL*g<4NzD}! zVu2IPs-b^CIgbKe+*XF%23-g6_=o5Boj@jWnjJE8o4^(vOxGBov#Gq!kJXG^$md`F zh!m`eK-0;CBA(*9n&*?(57*;|JJdD{XgtufT|rjYd_m27U)Rc+#5Qs*IVNjD!hti? zz)Ntlq6sg*wG=%EOhib;B>425fNSr17Ml~YkxwujN;`u|_dG)YUWK6WtJM?(j*y|~ z>KmmJA%49_!_6-Sp25TM&L?XKjxv>!XUI|rGIkC5It8-g8d9;MCLGOa#K99a1bQ*H z?d931O6a%>>^)LTke($at3&+$)1+!;6qCL~H%kJHeitA9KNSEv@$uJ?X;;xqdWd@{ zAn`U+*;H1M;p6219x+d@sk2g_*R#9W2V7Llka>}s^`IEd!%Bkm@bbsy6pQh^jLKE? z;f&;^+(jPt!b+)?Nt8^b>@Aoi!NI@<@>4wnHBh`>l+LMS(s1R@FD9yGz86!jCBKTB zXn`g%nKHi1SXoBrI%_=}gT}9-C=8TjE6t8zdvZloQ@RXz9XEW*aH?||>t$I?WeW|U z1SUC$I?e{3GjmG6Ly)@8{`4pI#Z9-(z=30>$fLNdu!>;e2R794Q&QSV$u8hb13!pQ zCpzS@OFY($6CQPKZDiVAqt#2vGYKQQmcf6rzt+GMbgo81SnUfaJ+Vw zAS=OyNe`29@zi|uTX=Kq6s8)wJA=mY)+GSb#lIcl`YW?5n^G2kcF_cGopt1d3txvT zM$^d-&MJ0y_r_&cxY2%o3M8{njnn_W{+w75KZ9?6E z1Fe2z78!1D1fZHhSh;?dQYaV8P_0Wt=IVr&tfH8@lUNW5Y$|q>{pc8_X0#j-Xbfu! zvWj$##%}_mAmJ}$!D8=5Fpn425pYb%OhuE=k!5i&P505CjosJ~9`&t3iN4K7g!}^VpwKhON7D2!v{^*>(aEqo*SJ z>WAPza00Hs_bFO;6gyH*;myz1BJ#?q2p=&8y$0U_pMKZCH+(!iNxj@j%{U%YkOhy# z-@OLGD|j@%SiTbphfX8uIJt}24XXN|<1lr-T&P^#j^p`f)n_wgtbB>d<=CHELvYoT zayC*d*Qzq8oPk^ycMN?a$J75v{~5)re*U__Iaocs$YuN!6;owX4h@&-3fjRERTC4? z6hQtOE+oy2`$iUfF646=PFnRTQ69H#ei2fICCmkLTAb<=C>b zP`PXiKV6FfqoyJ9s{1kIy6O06*=B4_%EMZrK7wpAf}?Ih2&tKO-*Ipc z8;NcKgO!r`gpEQs-@#yOPQ6ORd6*ye3jk;8dM<6&bRkYR+udA~~%F z2MNTzN2-)@Hu6YDgG!cU6tp6%m>)&~f_4KO0nzlkL~1XC@BGxzJxIm6d2lDPu0`w= zGLMdsnGl)Q8FaGEnd!5P*GYdG!=U%&<8(C$*C_t?72V;+6QBB6%B3dGk!PD}Z0Xm7;s!~{gfjG`YY%&A-gme_xyWKP%6 z`Y_iAxlAbM?d(7Et2Ag)Gf}F}AW;zUvgI-glzg0m)!2_sAnagrY+y&1v~$2{e^xGr zEHpv^#!ALj`F_FCnEU$YYG?}gH*te4Bd|`BRW))!FvVp&y|)#YX~;O?L4Y;2psHD` zUvhdiwk8%KF0lf;l1}5+sjnh->o-NyYr>_vV^ZUq9Ud zJ;_yb^9(@`+o))}lG)uw6Shl1XR4XGzo}&Ae%y~H!(uqA_+OWGRf;CcrD_%xU<@6X zY?+_W=VW(OXAR|ZBz=DoWLDcZL!%CmHP%<-Lfbj)-IIu+BgyR`dYvFyuA{h;5~qnP zY09Gjr_{`%Sv6q(V5>p%vTF3!#W4N+$Ru7T^NE;okO`Zdi;HyCd93pbh_au&7gbWQ z^L7g+bDJD*DxbMcLq@L*KX+h<@`S442n}WTHWJ%@#Hj0LV%|F|kU;L+ z`h+}OeaBPq?LPs1hTcW+-H+a}_fSlBJ1N-J@C#?q#u8-1ahYR)0?nV)jpH&dy?XQG z->`mr4yjo=G74KMCTmk*RnX0VZwdvKEjXI1UCGQM?vOr@!|8Rju7Om#iQLOJmDu5a zwd_;%xarek#E^ak^&KkSZ|LN|jJEIvaH#dHw%f;@ZJ+bju_GeIuqRD#w zJ`^5a{^~hpTyf7y4;jSCpqZV}T#lt7lk+iL?3KCPMRk5rHA^iyCKQp8w#seYgp8AY ze>+!Sg~kRA+KJ;S7&827jtn%cvxiKh)Z0S2a;TQ8Q5?fkfRI ztaF$!nCD<~0%(0n=Q0Dr=P}M<9%EN56L33dDpP61WFa9uok27~HUQV%GMyUlNrH@A zKZ2%`j1}rM$=B)nCIYPmbT+iOmYK!m3sU8CT}#m0eI>5hqTb zQ^}CLa-RE9_ocCW8Gj%Ry`o3Mhkg&=ApQ^O|5Mc#p>XGT%n_!ZGuIhp&Y>*UydBc% zYzInATtz!j{|RL5E;3+l?yO?n(6zfm0oG|Y(N9XUEI?IK#ej_a!K^q?k{&917-+R? ltF0=LG1@!7PMPu`{s(bKmuOs)oDBc~002ovPDHLkV1f@8;q?Fj literal 0 HcmV?d00001 diff --git a/images/img_3.png b/images/img_3.png new file mode 100644 index 0000000000000000000000000000000000000000..85179eb2edc8f42aca6316b14b343f187b38b4f5 GIT binary patch literal 48639 zcmeGEXIPWz+BOX1IEspZ9i(NHu_8^Xw5W`tBH*Zi5+O2CdX*LkB;zQcLJ}LjL_|Qv zfV5DP2uPwJgc>?AiAW~|2nnRU7c=8p|TS<%2){@%s;le=1FtDUJPcTdD31 zO(BV+x@XTr^xGeQSTidf;(toZjP%%l?1{zLjYuoT)XFuzGy~7J^N*thyfk4QY?e~l zSU2ovB_lI^dcn9(-H9X$fB5s+$KiPqpAdTt6|-xna56G)&38lgoqhb&rWH0d`#9#g zoQzC`hhNgqXD@2(hOCh}XaOq(-ZTH9Z0)r_ApS2845ue?Ejw#LLL+$S!dNUKRP}laq|hCR*R&vyWd`+`6eHBNOZS zzw=AV2Wft;Z}sms>0YkS-?Ga{WPr?myiT4>5R7gjcF%Ejqz5{G<}duxA(bMxgUHa(CZ4)w7LwkyR-x$Vk)kZDLTHi*)Y%}iWJY}mbkh&TAkllN?! z0kvgX{*-Ctd%-m1>%*Y0i|))f-kK_jn>_6z4`&)h`k5kFg7w=QuWsKTUq-Q$_e@ON z6_8%B_tRCW$CWMM-h@3CR+Gy?l;zyUS7VqB42y^x8TS6|JOr%aX771

  • =zMRl^( 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 FzW^MfuuT8} literal 0 HcmV?d00001 diff --git a/images/img_4.png b/images/img_4.png new file mode 100644 index 0000000000000000000000000000000000000000..89a1ee7e9395e67a18328f6d852e8653582afaa4 GIT binary patch literal 142745 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
    XrQ7X?z{+TuCXC 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 KRit4X_P+piFkemp literal 0 HcmV?d00001 diff --git a/images/img_5.png b/images/img_5.png new file mode 100644 index 0000000000000000000000000000000000000000..fed0445e6d87424dc90d0c221e32e96bfd2a7760 GIT binary patch literal 101069 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
    s<-@&&e@~^(QMeQb`$_>1J{s1pX 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 LNkvXXu0mjfpQxkw literal 0 HcmV?d00001 diff --git a/images/img_7.png b/images/img_7.png new file mode 100644 index 0000000000000000000000000000000000000000..8e58c9b20b14314aa4ca7ff1487c6640962fd6f8 GIT binary patch literal 1719 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Ò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 literal 0 HcmV?d00001 diff --git a/images/spring-security.png b/images/spring-security.png new file mode 100644 index 0000000000000000000000000000000000000000..1c1e8bd37f9f9d82ed019399df2dabd251b2a778 GIT binary patch literal 18268 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 literal 0 HcmV?d00001 diff --git a/images/spring.png b/images/spring.png new file mode 100644 index 0000000000000000000000000000000000000000..336f594419f5f6c1b8f7af01d9210f736f616b9a GIT binary patch literal 13454 zcmdUWWl&sQw`ORp@kWA6Hxk^PKyVB0?(PH$?wUZLk)R1qaCZ-qV8Jc8C%6R-b`S6S z-MN3KYHFrxeslrn^jT-Gz1LprSZQAg-(k8?AbFcc{wTdXU`Dez=sHo0$d40 z$18vKj7LjeN?g<1`0(?MAA#1wRrceroAr*B{Qw(J!hSQ4Pj3iqC@DUZ$jbIpNaG?% zOA{jZ1(+pCt7;m;Sz$0Z94-cep}`@Ekb#~=2p9>h2bNzGz8A@@ao6$k{5++#{CVs4 zw3Quxq~F^5*MI+$-z~c|7#6O3Vsb_W{DiQpiaq@)jsW~_j*J`*k%)dy0FeO0wEzFU z5o?c9g;gArI##NYnxQpyW3M%5TsdUmHnWmspfz}^_|d5AwNuHX=A+(pyZGbF^2UHF z`<-HRr@4ZrE?+0rqYOAF4sv)bsqbI*5`3b4Eh~eBp>l)Dl+>=g73RR#Bcoj^N{hZl z8EF?}7YDyg$mU}V9t(^yoZ|0IgUB3Gi)-P}D7sXOTB{6`i^K-fLO~KTEcZH9J0b1W zcAx(i_(x`#oJVJT3TTr=3ayr(@6!5%PBodQK7Q?F`_^6V0_%K8gVs`05&=f@e&vD9 z^V%^&-{3yi*JdusUVYXnu3O|e-4O$KSZq|9Is}$S1}wT&8nu;P zHW3zkd42H0Y|NiuS-43nwVii9q!AAs`f+$wI)C#xUB@Sph=m+pkUXpKL5M&byV7EC zZ8M~9Ir$S!*~R66OUWxEYLgeVu7D?W&^og8)vB$BcndL#m`n3fDlO%Eo6?|a730$4 zdLw)7DfeUbF~?46m#)UYh&O~1peT?;A~s5wl@+@nirPYzXP>r$O<21n_A5~i6_KPH z<_nKs>=$qA&K`49>%sCbfI(|sX8k}D5nMea7O-1gR9Jk-dmZPJl6r)Ky7+#kul$YB zKIOZZF(dW~P!Kw7FdVQCdQa+HdjFGCchY>Z33b(7%HH$xvxfUy;T%f6$H$qBp_^8J z^w*`rExR^*F^Ddhe(W%DV6{W00tz)MRz&+b#U?iv6DLdf&xF_b^*e%`8mjzVZ;Ob<6W+zaNy7 zT3Q+LfWhtBU=pBvR-P5%N)khhj}AsdI^Pxx%_IlgU0&+i{yGgD3@?@sYmuD`w|*gt zhIZLS{6RVq1v&g0yARQ<(Ct~lJXuNwyd|)*Ny*q53y+IavYSg=Yf<@z3l<`V0PA%7 zvL7CYmxu@*S%Ffzqf@Hdw5kjY2ZVK(-S6FRpzXaIXR%z)MLx5V0EK`g{PXvRkcEB( zG`!iX!4jRks9b2x*xr6yeYiukARAh}VmoXYehtLUHE3bDvNY|v6{KK(A)hR;*v36= z#wYjY4t8NUTd~(N(xv8kXayMc2V%kBOmc*}|CwAJcle(9uT$q!Z_m!F*!F48kZ6lb z1RLMC_e{WOJAu_f3p=CTL1ROe$SC=sp<;C>Y}uu1qSIl~fElp@O>6O2N8Fx0vtiuTfA1Q_75oyHpMZYoxEjt}=i9X|R|0HDYhR<9%Us z^)v!3bTH?aUH=BQOc<)HK1-Xltd5y>Fkz?QMRw^CGtsuy1s1KxC}Xq9m@6OEgH)$t zw2P`(G_EaXgU4|_Ll~{n0(W}TPGPBQRUEL5Kb#5StxpBiT_~bfgwZfx;cd_pK+L6p zM4RE=5y3QK=Nh|jRXXm7ct4bY*}VVrg$T3U3m+^KyHnqawO4<|Vl0WUvYF{kyeLcIMw@k~VMmNeq|-e2;=Nl0D0M&h(7@TKv-?CON^7F;l2S z1)X4U99=J_MUQ8<*dXMZ7YeQVb+5$lE+PB%DZ>>i2%XfdeR9p(v6Pd8JiUxVYzV>A za*=fbioPHr@$3z8ZRW)qhAfXi@d>>cOV;RhA>oAH;<487u<0vd957mt0@k`S14%~E42G)0!}POaB|FX&2(by z7?WWP0iP3Rr+ZcT`u*M%vVCSYtQVzIdY06(XZd@g;Fia60H{f+Gb_uy#zrLVEI>vy z1J)FuAqIxJ@4w zQT?%GNaSzf!ph0VQrkg|ZPu1jpdezay_%UR7xG;=SJzxMt!gKriR_?nDy8RkR_AV9 z&0lC!8A?TyCq@Uq!$^@NJn~uL^e!5zZVx9xI@pcPY*1xk3=r4JlkUS$NnViP{(_M@ zw)egf(W0J-wa;}gWz|7k#Jg3uQ&Fx*RZPxMUx;iPNUR&g14(vic9`3mcT)76fz5t- z3;x~_aeS?=Ek;>fXd(MtG{-K!Bse{ z8YvChFo<{xQvEp9%!<(@@_aH)H^LevGpk)oEY@Tc=doQ;(M866<_mii{i6 zm|}eU&q(u^l+=#ADjE<1O4a2sKLD->ARFjsXvXZ#tDIj^?R4EHKH4i3mG;^&Z!vz5 zSN7yB!H$VNyNDv(1=rt1;FM)OJmohu08~}-ywxl#5%dy3xq)KVVTaFmX81KRi6r35 z6)q%zsk_JdninOWz0a5}>*vp@zZH=$>y`eF4ZQBP+8^J3vEweR3lLTIDK~}vaEP-2 zn0-{_Z^WIAie|mzoM+1yr`tMbQN`$NAU2tIl7Ew*-17?fnEd=J+mJ-ZPi{(h`7Oj} zZ=eP7j7~+f;ZR-0@o$N8Y`GJA5IlI>=rS|m&e$>1O+9JR8?BDnqq5oO9CD%H^ ze-O-*B*8BQmXkSD|IbWw+8qcKqxv#Fdq=#d3o~pgx5^YIZ^2H%{(a~zM-(o+xXfh2 zmzUq9G_n+U?1^B;Cv-{#M6UeB?sBg9kFLvxVw;G9#t*zP+qrT`JF9OV7aq0u9SDa~ zV}Sw*1wLsxIISQ2T4U2N#RQw%leJuO(d-+h|6(({x5*l)NUqLzD z91PSLS;%~TDBxPEN*QU0Dl(moZB*3H_aOJ2uOf-vfO82I@bTfv&r=n#@4IZl#ZI1w zqy}X&7R8nipZB_tAL5TXCPjBtaFV!<`aS6fPcs9R>4i=yfI+`AQP9Qbit_a#ceK#R zxBYZzr{<1+q=QrS7zCihidNiYlO16=>j2_S;gHbXJO6ZeH~`Snaxi5!l+WL^vR@gz zq|(rlarOI|BeuWP^qz928#&(jI^?*8G-{DqVzryq7p*3`&^&q!*kX#RD82Cbue9d5Fe33(czjmKO?D1n!H{e`QcpN7rotyeSD|4>7hp;aR&e(^T|mco^>e+ zfe6kRJFD+E9HSoDssP5F=8iAo3e2rigIs)lOEoq*<6Y!<^SM-XxKC+={V62RrhG56-bS6&>o?M6CYK&rb9 z_IED|Ep?Mv3ED;#CTNY^ETe0zuW^wgajVzWLipE3Z(cz^$9nrw(x}~EyEEe7X~F#H zo=quD+)g%or2wG1Hp-;rrma#Uw}+ft_q7F6l-h#xh_AjK`ABz56gZ{y{MaL)Fd=M` zwx?aUkHhK_9jcQFzhS0G(VsJB^LqJZr^{EGoi0~^TJcI8ZA6%(t!>)NxO16bpPjeV z&fu{;fW?7nb($ORpLsGA$3bJnG{!=l8(w_i`ZBkIYuE5pEgBKTDe&U6ceXlbM`do_ znuvG5w#?}rtL<2Kcyb#6BbCr(FZ)pn>^CRo42uu;N6UK>E^SMPX=^9*=)5$?t#$r? zR8eJEOqAx`qU;59=vI$ju4)Ap*a$_Rl-e&c{-;)aJYxR5cM%#S*w-Bsf!r6L7fgdj zt7uJOT=F6k#rZlIO5RKvEhqWzEm&dPka9;GfN0|i*4#~xMxXcP%UOhB6F@c9sWfgY z)jrPNgrKtX5h5dTH(teL&-R=GIQlvDM9;?Q#;j;b#-)0TJoM{v_?9?JW^Uu`S_1+A z#_=LS5*xKZb&nG8u7M%kET-x9^xy}{EURBQ+K$Woblmd%T05g)aEv)3oJgd2;&gHA zdxPFTCRnQv;0vI8l{17V#J#Rjhi;IdU$2*tEyi1qdt=~gG0b!E>|Z~Setirn5EsRu z{l2-e{q_Q=f%;!-EWcxV;1K}PMzj^i@>66G201-QAL*LJ70YixKYkZ;VL#KU=bH{z z(C!tzWfgjd*AwcxU>Rym4PpD#|FSJ>x{gL7G#Dfy9KxZ>2rad|}8 zA$9J5c_@@m4#K-hSG&2KxDZvPIu4Ncyz&|vK`i8_B?NXsYiBH<^6zZO(;zm`w%ioQ zI);HkU?LtA-5QfUmv>}94$UIfO_2;^A$XshO{AuR&*iNB)K@Yy7C&nFa{c!GdBSRc zmaA@LF|Z{F-LRot|!Vx;8b+w<%bC!T2%l$a09sbsl!x58T*MsHIS4U_~kPD^+=BW z@Y)Q5R#2nFt-uSb)l$lMM)J-2O>&icj4MU#k?FWWBRZ^e!*`1MmXA1iJb+gu(;gDa zA?}b5PQ(M_b}n}F^|&>$$d5AOn@xKi8%6alh`H4#b^~L`y<7=zvur+SWa3n*BI?|3 zA0^5ROP@QpNQyM<{{Fk9DvbM$01XWfz@Fwo4j~rM4>rWXoWyh4i|k&hZczJyNtw#w zepo_g>-LpC0le)r)-_I+H09Sx)|I4$`_>Xd%VNQ#C^6pU^4RLYZLn=>!`4s}?#4?1 zYa(UU5~V7?!7M(C)EkJO&J)q_kaI2FJv`PP`Ry=0OOw4n7K*p8Yb}}3t6TS>dKX+a zZX<527`VxAH^G4MJSqF9cTyJaI=No!XIczkd?+eQ(I*LEWtmu>D{YL`qkhh&jHs-Z z3M!6jCR!a84t~2mk+ANsj)-{>N`DIyYt{7^stg|j`IPJxp7R8h*+{IbnoqCh9fv(x ztJwhBLIIR{??@{u%}b{PFds8nXo&jmw|=haIj!Sj{us)MerapIPd~0TemVDXMPpdM zh_2Od^~w;+*w`+W8_z+Xf2cmW$rGP3MGxS#bOg|d_NQH;+%LaZ4vAeiN#3K64z$TO zy}bx?n5*2g6#4P~sbPNt&OR?G)yHfewb>QKIljAun)YQ|Ns*#hImU#B?+kg?8Qm6k&WDEzgA#dZz7bvxc`$NuU(-FKa7Q>o|0akmprTtN_Ns*Q5 zbNL_c@joDC%QWR*+yt1q&9rFNMuNkyK#;}zgXyYbkNA*FN&Ymej$pMPpRC?cAey|QfsHjsLQUkK{9TnXxuaI zb~br=vLTHY`4|+b9RTgtySL{TDP<`S?H+a&R1v+Z`XTQF5E{#E5pc_=UTtD>K4-CR zC}cjyEG77dGmr3)%e4%zhi2*fltX)md;4XSx7rV)=e3FgYR7|0q8&$F9N9+USc~hs zMp1jlUO8jzzPe-9%7((_C{xhaETjy`I0?i;zt_zLt%i?hCfq-|;r~NA;Cs#}` zD8AdWugO${9Gost_w*>f@wIQb{H#uvlVbwXuZdU%gJ89M@04gbLL>r3kW6F__I-Mq zE~cJsO2R3I$eQ^qh@N|)EilkD>+*B`RsFz}%1gHMEH$8;D%th%YO(I6VIc`Y3NHWw zSp@l7GUa2(0r6U-Q^A{5hHcL7P0e5BLv;(~<)+ef{R}?GL+g>ZdyLuj+*r7ba&t6`xZL zYXaG3k^;#>=k9(5j`>d2UP2uJT-WG-BTZWvgvTQ=u#X&97*>U1Bi%m=dC|y8WiI4>!BE=}`{2X({Z;xZ)Sl zfYHtX0ezekghE}$@zYGuZZs}vAHL-6uXWQ%h$?8hH&7C5vR7Eik4~ixRMlea&x|wJ zzdVpGIsw9Pm-<6-i`G0JK_n&>=ALFp;;l}AQI7<1x;*9B7pD$x9t-BAC|X)Npm;%Z z3yAUvuzn}#AhH@2#?guWU5TyP#E z4$iwQFotZHH0h;-dBP(0=U!DpKW`HOou4f?W261_S} zsB$vlM$x07yBc+qA==?rchcFBvGj`AuVXFnl8@dFSY)Kph@(GystP4{zs<-UnP&?J ztWqv?`IEK9O+m0-z#whJLw6u=&fn>eWxb2#c}hn>ztTz`WiZ;S%cDsc$(;rFhyaMW z*LE6}`Z~7>LnV)jsXN|H*NnWcHf`Sgq5Pf*D<={M(d0%6lPm&DGa2GefvdiAf*Mul zWY#xfdrYKa8iz{43EX-uR*A%PlGoHsF4doxD-~e9>~_gTPXmOwJYz*F=?wigH#y>- zF4vFmq(Y@zg)rJfpns^(X{S@^==k%de@!Uk@I%jIaRs{%i^#UH| zA+&IC7qmwmCp$_(%xU!tjT4w283OP3Rj)b>0{l)yc)L!_mWy9wuawlbyrk4z4IjnW zUTmv0gcm6f6o)+#+6;d}3fi1xU+FLp73~)VdYmUA`aw|EB_h_gx2uW|dYLa2Eeh&K z==#_JVtP6_rPbCt!kB{0p0Ercs%D;mRN*+i&FT>Zft`ELi}kn@?)_HeXZ-k1%soXTP)y{9GoPh*a09(ja%1LO+LVKV|nZ3djzsT25`} z<#~m5;-7JxR$q>@dMOR00R$fy)(0#NEF8kj00jh&av)_&fNOw0_W$k;Jm_4d(Z@%r zfntEUj2`naX(@h7u~_hrgs^hctZyhJZAI}Q)nII&>_TTL1^C$~3&hJbSp-gr4gceU z*;M0$-l5|Plpki<2h^!PdXC<-EWaj6fr3MkbQ*r(nWw9$08eY6$Jq-boN$y`5!u_= zu5%*_j}-uXz5ZIFFtYcpBFHUTnuQt2w@0CHTvR~hq52tQA0tj z{-!1loln;Qy7hky)L=9`!A!w$>XdC>e>yMmfoNdqqjAo0E=#=LzFLR8x8>vgjq?Ky zmJbvU*ekV}Mg^rM;ZYdz^G4w$+=_8pdug9ko&U^C{`z~x9k;SRfeerHct8dA1dm!uln*QGl5>$!b z*#n)B)|kW7&-9?m{6j%0Nt67Odm=9XQOo5pzMQ$CkKMzi9c|LQ*;OrOO22VRQbtjh zC4N?M>;jz6%!Hr55#>$_djf;17zhcm{}jX1{_2#a0iZ1OwJ#H&RFn(f?t6a6(Kys; z**5x8m8*^~K=|%EdtRGe`ykTbm@Q7QPv3sSm*~Gs&Coar)^BiW6#A*nvPw#Hm!@J^ zuJbaJzjW-ftMV6-NFM$#Uf$o>PS-CpUUaBkQw4mw`|dKG;Es9@g%Dh?AKU&_ zW?lMo_hIZ>{svQPqSgqbh=>EcF8qgdcIOzq!tSC|Vs)bQz24r}5{dhp&5#gmk?~bP z-*SoX+J;BYVT+czkL#oJnHhhXjsv0 zlhVp&L;HM7*V5K(`trOQXLY#l&tu6GMR)y@%mJ9kHK5b~=x*7-RvCq$l~NaNQ@r;c z0g@N`UGi|5ej6r?$k}5Gi^pxODqERR$vOSHX7bi8Q@`G(mJNmB3V-Z{)$$iq3B%Mz zg%P(av=D1$=Lk%gxpQdjSmgel_#je1mfNk|?Z#KKN(tS0?SgL_&Zxb?zYEdXt;rqA zL_Hj-8Udk7$EHOzD;zFI*D!e@Kg7e+O3i zO8iN2kKyyNNPc#~)8;7aJl@ioO?&VX|Ztpeun~Klzf^jgX ziw8lq)WnnI;}@?cFcA%T;!K3gjlm+g!&eHuEIl8T8mL}2CPdB~l{YpQwZ-j5#RDp% zr=yKMu^1Qhtf6IMy|B7Qg3Y?p6AanEp!aSX?=*y@+nmshhn!L;Dnkq+$Xz=bC| z=Dq^?%)@z{e>^|6d+TitOa9yW>O;<#-d)#r{kNgjg?>f5^O=mgfnRY9j@VPoZqU9) zRk#0GG^HBeGPPg84;XvL+S`Z|#v63Aq8oY4-~I^&_q(EcXTM7CBw^OhJ&3y)C{^VB zXgyz??&~hiq(Q3%{w6HFwOpMRT;%9-ptapWrwSq4UK~=DPZM9KJ`M&)BJg5ng?6w6 z+}Plt%)yL)El)$aag@jCt(CDKp zinU<8@YY7t1QeL_V)O_{A!}yQ?4DeKzgFf9?arxKE2N_2h)Z$KiU3{w^#S7}0~}-*Eic_O<(`+R?nl-aWU4)UPk$rlWFX zCRVkP_`@v)2p|fOqg~G@r%7v(ST&T8Eai7K4|Ptb^qegqxR@NqUs;Bw#Mbi9T7OZD zt@+2(J_m)4#gTBJNZ;s>qaZXtG5LXp5Rnv2liW-g$Fob%qDSMSMhl0gCho0;heES1jF?tk0yBcGQ*BbklV5~ z>i!(pQDWBa>kMk}5JHl=*(Xn0)^h5XU!`=@h2`V2ET(AJCb==UEk;-0@ zrADEmN^vza?kOt#Hhhync<4t3Y-~*N<`?D%+auf713$kf&$Gs~09xhKsRIf>T^TNt zSo_7Rp=A<`Xq~Vr(m3NSE@)fJla@x0K+iRs!Vl7Leg&!B)9&oWLLy7E_LW^&*u&Xk zbAcoWuc1+JGh#|i^a+ygQbTn|yMK(Z-U{InXi3>RP|x9JFJnoS4?4AzBHaP(XN$s^ zX-aH)K#K|4f2N?2%*WzeZO<1^H+Kj4O)SYXl*Z8S4XvXIWPxDt9Ty~6O57v0B8+l> zX`&}NWEBK5!S3-t?Q?!D1O{7EOmJ0p1k*vMGW5(O*9Uah5KskQxskC)4tyQ$bazYr z4mGirzA1~l&m{fV&GMQdGUk+s%@GapJWwcA$Gb2dN?jpwB|0B+_DH606DJyC)yZMv z(eAGpP<<5!%pHD)DiCUsu(7Zt@47ABk9#}_lAw19>n|B5WF#LbU*S!D$oA`& zM{krz-FiB1mQ`~?*ecZ+N0Nl?TE_Y4D6nE@J^W_h0%6*l4)O+`x$JuUtA z0%Xm53PQ{yp`NA%rpY(b`@+3B;WdJ|W{!y|oY!b5G>A=~m75kTBXW*BqSLK6+_&wq-?rW68AU)h{k zKrppa?Hn6f3wrmQW1ZesBY3qyI8gXMK>`Zoi<9~J)Rn+eY|jaJ_&~MI9`B0;{6xig z(uF%S&E^%}t}951nQQen&}o4}=R;SaXM^=Wa|s~VQtdo{-}8v3Zft}MaQfVN|2qLl zDt-(YY%Xm0lHFqA4Mz?m@$*`2YK}-qW<7%-T$L~LJ(D=*%+P@^SBv}~nGnQjxVyR) z=L^Qr715)Q;?1vfKK>|{4u6?xy{RGgNmY#HYrOV~VIvAEEgopt;LQJXdKx;o_2(e{ z9aLPm&`uP*yVUd?u4~r)4vvl>e*PTKAnYrTiv&8jGRi+b6Shj9LGy}16*9wvkqz1i z2bm*ejpL!A##%w}`=;|()bqIUH4sSj6>w&K*u;I%eJGtH3F{Mng2A6g>Dehs8mUC( zB7&hkj0sE6`8z9p``-xjCxJraKAed-N17&CHpTMZ$NsZS3Twf&mM+@?G=HF|Txv(_h=j#|x_pyC1+n`*w){cnJ=S$&jqM6$G~Xxgj!68j2)levQp zxsONFV3aKhK?rl`k1O|61&|9BlXApQQpD_#fS;q7orIPIui3H8L;V(L4L!P#O{}US5&xQg`?W9&*#ff|L)bxcZzkq6g zOEoS@udSilQA07VgaMZ{5X7g6d^=GQkPEDTUVeF~2>tF7<&=$CEzAPA{m%}2HNih# zRyU1H&E(P!J!sp*p?K$+04(9C$UGp=a^bjfDJq0`Hj;GLjMEeer9DP`e=b zh$nNTlL~^o2?FO~NZcy&&^>+96N>u1Zv7M=aN02P@b7V9xr`5_MrhExWN@J zYEFcOj9W_k->jXx=F}DkHN{MUJ_&PC7M?>mLED?2c7QMbG@Nd)up#ub0O!U!pUvt3 zB($?q2r2tm_rI%S2O5foG9h(>lj!-0SJ+=p&I4(rj<)QR{1fWhY?}wLlqcO5aA;?j z8LErTi{&JH)sy2l5iY)s{NFoXUJ?$AdEaq{@|HU}F1k-f4Cp=xeYu#)8ndB0yT{Wa zbK9rOn8N|J$H>UE0mzoNRMy+795feovI;EvFUewG()IikDR!@?ZX{*G@(;GGX`t0P z_R`W%!e9TJO}+XD3Ig~!A&@o!Z0#t0YEf}}|?cYaZ<v(qm|WCL>0xf$g~~ENP#Wsi;qV@a>dB&mnW`Q;{z*XDK9;TR5_EXUE+hV z^Nxi6KlcA50mLV|ig|Vp91J%N@9TAkXsTvCQbkB-Nv7AbYK8UrKX(Jqofm-~wW zzO%!4EBf2Ji%2p{MpE|UQX!|@hIDb;Qdh}85iYzzcR--GPUetueYO=Y^>W%du|L`h zz+2dhD>w)t>$|wTP3Bk|r(e020P&3C_QJmTs3s@4pes0dZ;DR44nllnM!US=@1koh zla1TOB&zzfZ-lv4p$??`<;5v6R38n#E$NC0&uVsV|8!yLJ++JrHv!@CdB`mR$8hYA zUy<NI#r80^VguH{o{TJ->u?z`sPfa}-RK4evaeEM#hpwb*_rW-kxf>2af$Uw(uL z3LSKi%P`;j<{4m=2Ku$$KS+pV2y><(bvT~qS8lMkC7{g5WinAiwMct|f1!l?wJ#lz;%>|cZFj0vV7lu?FKS#n&1K^+oxE~v&fuQGQ z8?qGfT}tfao?4I%9Et}CJ~n-VfdRC=YnhT44%gI5APb0coT~@WC`QAG>&HcuR!j#Q zpV*u1U*;=wpav?P7pioN14qJ@!XM^WxPn>gUDwV3$W)T*2)*#0|#7MFh0nC z)IE2#+jWGuokRdU#~bpo5ycoNbqztndpA*W(v;jD3Smz7OyD^2rbrEDH-~`D(>v*O zg(Pm=ee&sgPd4Mcxap~(&k)V?(%X!&V8hEgY}hY5iQom+>Rg7i7=Q4m(5u?wZ3c~O zA%?J3vf-0^B;I_9%PwJK7RlWN;E<^sQP$VsxcAs@*@0wuXf&yQN(M)PZ%hOG^pZG$ zV*M5Ki9TfGWpinUVovSoBF59IAs|qQIQf2|S=~<^nLiEg415P)z5Za)RipUA;4fN= z)cBYLC3glak9{^c=8V&r%*iaBk-_zG?VS;DITu~BJz9`|9L?QF&ovPD+K~F5Xh1=) z+Anc4z?rb@)2MC~XakX07_t#Xxym;qyGepVKHVzBoQS-9A}Q8m3g;huA8!NJ87+DI zk;-c&9Aa^!Kq*PO=h{M-b0ZG)#6=EqMJD{SzPbzIqR)|Vk=~`wLxz@3FF!IspaP9* zj#GW9Th_-1zFd2V=yzH#=6AvC-(o)j9o04F>~@0dx#vvVf?Z5r%vt2QdD^UnD!Z+r z!}I&~qTpwislEK6MS_{1hy~gbPNGSY4c@k3LA0B;r7Zhs+&XJI-oV+U;Ap-cbZXAf3G_m)@B4QXQMewAL+|FA)G>k|Af!Gu( z29Q95%OvYf!BU|d2Ey}Z+Tr$nkRd^2oSmYLlWcJMz4vj9ka~HZRa;Hi5<#+`tTh+9 zF*O;<96=p+a<-hM&o>nRS)jDnZ$AGWdQ5zSla`wnOsamexZ_7#Pvy_YGCzMEgNLAU z(Cqa_=?!JGPIUqPIVO0O@$c6Ip_E*TBkyP3f>IC8@Q-m;+IO9<9n}YWD0}vUexh0H zW^kz}P$GyUXYldvg&aZxv=&X}TJ8bEKy^ad7`&IUu-5NWF#KEoTo_UkQHsILY;9k} zLn)C**WJo_r(^M!jp2g@ejc_N^+axPta>6NG`tys%4~LBB~NJkiO&43laBt5vG}9a z#ub>%T2MTDQ7#h1^%_uRJYZe0zyk7cq;BMzyeY?SbysR1gHv?hI8O#>J^>)RppMI; z_)wn(##n(VyYYya4$M!w9M{`rhIjLSGc_E8)XdL_jg{zeT50$3&ZNbv%h#%6GK_!* zgbi(yTyc0u+~dpHESoXcr+_ah$%IFRKEUvg;UAE#j+CQFI-ac<`2Rc-I#^(=SBmAM zKloaR0_(}rfF|GWVTiABI1<9^QB<{!eisGnZ=n+)WXt5xGfIXl)*#v%%x?!^H1r?Q zI$A$!hrWRq*2-nAMb5OMNeJL-=qcF0j=aZDE#6rTKwi+=LIfk;BJo{JhjJuGak6qs zc1D4?-Vc@=99?%yaT5$X90)M*)6;T{r(t<^ykba))ahENM#`~)QPJ5@jB^y|Sl2BSyVv8y)|cmGId)kr*tB@#(U7I;O8D?-!PSfo|e* z5ChcWS@Jg-`Ge=%Q=ZL7c_K*{IAyu{>YX3q^&qTX2*mAd19!O|%ZLsmbJk7`O!m;V z<^9Dtu}9=X6mUj$(eouT9t#1S6Y0w#SVO9pS^_K&#KHe__2~aVp?d#_9LCxM3H&5k S2>hSXGkIxcsY(gc(EkDj0iXZ? literal 0 HcmV?d00001 diff --git a/images/zoom.png b/images/zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..8934f6966c206591cea0ed039a4625ec785e23e7 GIT binary patch literal 26864 zcmZ5{bzDT(x5V6z!=>n4WhJ!3{W~p3W$Kxr8FY_ z9nklEzwi6Q>2JsLocr8yUDtg-&%!m;74h#;+`D$|8osg;OdI%n?(z@L9pF={dc^nI zHM=@xn2fHs>Ceo&{>J)=7hQVJNlX)>>Uqyr?>}LsYicC>%3jNOn5IDVkc4PNN!HNU zXlk?7#_;Ky;X19XEPl)*qSwmv?4|J0lZ=b4X%U8|qZtta8jFnAb9+${iUQ8Fjo_bmR53Wi^@LEQb}$&8V1BLyY7m>+Qn%=XCQ zEuN2@LZ2gfH2NaBqgQt3If#f)`@Y48J@S7YU#_aU9akC`s&Aag+RO1B%p=pj{nkqX zzdTT%Gg`ligR{Jung6q6S(LgjK#a{pb|9eEjPU#O8J@?v(p(fH|7<_ z;yv0J94gYnBKX>JTP6#NXS3uO`A zt3}TJG`c~Y;qK`2+T9r!I!(iy;ic&Edha_~+7FEQX(;fIlpn9fgNcnjY#(tqbBKO^ z-6%)Q=^sS?CvxxA9Edc)#p-njErk&0(NM)712LP;WmPQ$u}*laKiFx9pbpUi^PjV> zd`(1?hKwirD1WM`+)e)$__n6Nl9|aP(m++V4haR#(38dw5orZ+)6WAoa;U0r*MfqA+P;$C6_Nt3#AG3hTW_zGCX%Io^=F&nxkn(iycl zmox-#&p_Ok?^jtRjb-9wo;Tb&pfqR&K}?8z!&m=aeGcwRtSCm3lSCsCP>lRoHm-Xs z7N%vOvYemkssVQA|HyQD0`p+>h+IwDS<>%}+>I!;WWu4uz;sQIurWnQD8y-vToHJ) z=a9#(RHpPvQWnXqaM(9&k#)VXoXy9c8`E8i2Acn27KpdeM80Jq|<@~gy1uH8B|sbV!HT8;#KAj%}+s@Sio)E>_rPHxaD*TI!z)SiL5 zN(n?n#GeSSTlgU`i6xWR+Zvn zqtTn~__jJc7>)$R^V4Ak#kQ4vgklx8dxY;d6(8+YDj6$N@qoG3$i+*0iAaen$CQAJ zP#|?y6Z_c|WoaNYBW$PQq(FEp6%~2FGaowK7{@C1X}Rf=Imwga=3v;^GJz@&Jb0Ij zcQ5AWukc)huezkeap+2cw@YI{iCEBo6euzULQND)4CSPUcX@}DaME31x#(>*Aa#hK zXe1}KyAl!hNjCdEcvr>cN|WwNq{G~fR9K?B|Gug45dPX=c^&*K?#|x+Its8aVwEl{ zU1VJ)ozmm^Di{4A-TR?2hT!#1uAF3Kh(eECV#TEYFkGn)2`oxQ3W932x%9j?XM=26 zVPi`LKE{ihPKKxXi~99Wj_@UPn_qb#bs=e(qja4V@SuFWNEuNm85CrwkW>)^n5e_< zx^N&~hpP4Hx0)~1ypt&J(U+3lUO9}iR|eUZaS;5o)Z1EbhTcs$aqby=n>Ifu^%b1$ zjd08}4Rsa2t3}@7NbmKweaynDW!tZ8pa~<~na0c=zx)h`g$R`Dd9U|o`Nqb_SX%)R z=>Dpct`(e&G?jHj_Kxs{$;)!v^8)#Dh0F|wwu=_hZ5@FMaPp3dOGLnpuv6}O!0pUx zJo^-EwugP{3YKi&ivz4TWkS0#`uF*D;&Yl40EugNiKXXF^lp{e!~C5B+;q{XegP9( zt2Oc@wD}sjk(iA(PytJqg`(}LkXVs|EN>DvcyL)ik;(wH7FZg{CSftW@Ak6hP4Ym&fj1mXKrBV9T4_dx12B^h5JqkjX=1&wrYy{; zRRWA__1Lf#W2Fuu+U*9&?}^x^inH~i_qMT@p^!SKF_iJWi7I_b833^ zBz}zi;=EMbSDjG6Q(~Q^wEzaF8?0xsxIq9$!Dgq%Wuz{@{?LrCCqU#kR3vxEM1BfWj-zUr-L_24c9;Cl z=$*-TiRtf+io7GE;^fbFf-ne7Yv>%{XeNB1?Ei6sa+f!NYODP?-XK4Gzve%fco*!l-CyX> zx0C>CXnTvqwJHmMneqzYMgAMrGC%@x3hP^eF0w9Nu7kmPPx*D-Qz_2ysg5Ae`0>o- zTFeqvweXiDUNe}|hTsu0eg=Tx{Ay2sEc{Zmn8Y7F);uvS+)=__&=9zMHbdf4wb^Ubrxp%7p+#GZ3tTqKw)WFI) z)dIw_!|IrzWouQ^3%~$Ih2r@?v;SpXXhF5>GWuvki-bt>+U_0UMuh+d#odWCc#HjmNf;s>CN0kpV}L*A=A>SDY$TCE83c>|8xsvL*5h-364$w;efZ?}=Q!pQbokP06dGtmSG2{Rqi%1a37&P;+R%v1t zHWPHz`DM{!)G5+r+rPb>-pS(KH*gO6Q!Vsok8Dq%q+u$z4N|8Ng}m4&0yyf5k~&GZ zlvKLiVSkG+4$a0#^kjsOX&vWOx+9d}yC9(B+zp zbd&8kZQ)BCG67z_0{j1bToSU%l~sQ~^d}9h;1E-KF&E|F?a9j&Wujh)l^lq#?Ea{G zmj<#&EE2NVA8UrKkUuSoiGh>j!Fvok0$yLD{?!W1JmCx1SscjK$9Msa3t+ngzzx1g zMWWq1y3fH-WlI^62kzd-zB4Fxqt0zkYwytFczWNcI3M?RPN2m|>-NFI4etFzZ`ZB! z<=b%ExmZ5W|H+Xyz>Se7q+dDTCL;+l)CP*inu`H9c4eLcrOgBO@#r^m%5&7g^`FvB zI#qq!wErtxR(AGvEWkHc%fiJv{z`l8ZyTCJJEWYdZS!+MA0vM?%Oj zxARD{Oexbol_t!25;DLIRAJnXF5Yij#MyJgyq~`#5x#YW7&P;e-NC zI`^vb+E%ObdPN$9r=5PwSNYD~!GzBobiSG(G@adIrwrew8fJbjx;BECyPeFm_X9=% z&`l_Cvr+f7#BlE$(zZ0YB>njxx92wfNX&vvB!D1rJ1y!>do#NmGZB;zS7rogCFT*? zz#%}%`k2#!sDaivs|=7thGLyb=$_;lc|ZXHSO63llerJtmZ^EX`JS;k0l>~ zqdH1J6XeU}j#e>v1c(p7)z08wKDm@hal3x52f5(T14p0ZO0B$OM)i#0|VcY=N;>zX9 zqRe8LYR3aI;-3hOuOs;I5-DG~9JBNVARIi>;Y{TNqG6TAZRDz!QNPACpdA-Q*>k#z zS4sJj-&~3X_3`>k$xPVb+GiJec&G$ia7M3cjk6ZDf9?oaW=h@&o1LVmsX}G-WXP2Z zER(+W3oll+(!%ZT22m4e%zV`;$8#tVTaXSxyx$;_XM<#E*N$Cckum6qxM)|N^Od54 zP_~`SWmkJuoLZM1twCJwQq;)T$ITqU^8FmP-pJKN!vRWg2gZ8uQ@jl>{dP-GPH z4!gCBx5EsDe1!)p8F7?j58_-)vC{%K~jzqY>CpjcL3rRziq+@FZ zGHlmAs1Iy7|R(e)ry3rIF|goR!kP;FA%E`ENv=c6F(x@?B?h<) zP~`s)Z~~nmoZ@Jk>Mws>U2+{Hj+|q%C~F5k)D_eh4FJ6AB2q_3(9q9rYw)uCr?YUx zRcOT)E(7!sDw1XK9}^2K>#aUlB;ftkjb9_?xaO_YhIL?oyg!#1_WYJ`7ma)o8)UIY z8F+|Et|$;Oe2|3gjQuoD$fz>WhZ8+Bk=&#M>34a z?||uoD8+TOQ6I}ZfN@i30S6iPxd10u8-Ql-L%JlYGN4R=2hdp9%Kx2dv5w;0wND| z8(fy&z_e;Oi(whAZ`oJb(CdluLJbV{l@!)^f0(2GT9j0@sn^YNH zo`I=s{M8h1f7DxwyJ{1B@?|on-Xo^PM7AP)LE5ZO8B`-WZkErT$ znI)y}uetz%RaTX7=5m=riQHVX0odc-6fmA%(W=xGPGsT)F3*w^ zHLkT3O;@lzkUf!Ss97=3zh2r(y%KDLQM2U+c>mULop?Yf|F7w8DCQiMryYx$a7wrQ-cRLSaF(pzQuzuI2E{dNKTx zM?}Q=xS>KYjPmN`uKa9UUq5It#})}_|GA`?wlTM=BA%w)3M7FCF<&Hbo41v&a(f<; zl$tlX`%=>by5qlsiPCQ~MZa_V@4K{nTuLU!eSl@6uk^dE(=d>+BTrSvAcSEEPm?qZ zTj*twlm00#b~3<tPHNCG@#BGK;0t=!G=44B_AUz~T?K9L2~fP@H( z*|H?XGRy;>qQA(a1B~O2*TrSE@r-)iDmy$a!^)2U!fMq{>f0wW&`tsk(m{-R{Y8y> z4RBjQ0C{B;vxPR+@C7vn11|iDR|<#v_6{2h?}71QqRvOsju5(p^aOO;?wV5V70Nh@1SyTTOzvPX}fnmk7j%^A+hyl+79%bMT17dsWxwPB~ zWcLV3ZVd8Cr|3UYyo&eb#G~?g6ul@g7R)WY|38rg7$U*XkNG{;$!6^xzRKxW9l{aH zG_M7MUz!MHE$}#7OIy{M|2~&!_>$2^41o-t+1_*pteG6)ix-mT0Ym+s-~frBFCVRP zrN^(5>=`g$!(fQ+e5a6iam}7H%1Z$z<5mDc{zp{D##U}b90AwbbduhaXVKFnRtN&_ z&`!j?TKQ_AK^nUfe$^XzBfS`z#-3Qvfigc7)dF5fa`DuR7#^ZwR|)WY$6A|!;wq$U z?nyDXhy3l`A}{d1TlE9l*)yJRf$lk!$Q>9}{znXxeq)xN?mUZi-t)@GOG<#vTDTGd z-Rz=Oe@M|1%X4PeWMKkNGhLJH{|b{UF93K>bIF1L$O8Z528Jn8Iz&~--&Dhe^_K$} zCQjo2BH`cHw2enlWj%T3DWww(OwYXRfkp>#@8-}L97bApKLob;j6Dy&00`w9|KE*3 z)A6tU0;=2!=&)ClfZFo5vI5w9d%E)Ur#%}W%Yhr2|Cd4kqY7SN^dRcz5PSBNk_Q~! z9`=S*WnLA9)XVKmm*sb(4}-GL(S5qye!5CW;0fMHee`8Zf0fAqy-%>H`h<61+RN1T zRd*TjYxp%i&6D3X3BYR}eSK_FyG%E$1&UVj&R3y2)pDlFx*CiF`cwsIewytkBj*7r zPn}qy`oGe+5)D~!BJ5WxF4nmme;oEpBvDlddW9;N5LQNdvJ(h{dD~l8Hia{XAkZ_{ zJ;qHuvVz<6!k)JaJ}$h`eQ^jsOM0p6ghD#28M6=J*w&I2eYoYW7uj#XG=gDg8ldJ& zZ5HMh7=J`?TISk-^PRC@aQ{cZ59f6;c?WTr!}f=JLDD2Qj>qSYK6{*&fd@tK%fBGX z4>&TjZQpfR3d0I~83Jb!UGKYGe|V{R`;Vp-3mzgkfrLs*y$!atvCeGf<{lNkm2bb0 zBKVvpvGcv98y#+o!8d=*4!pC<7L;tU7N0LYH(_hq2{uQF#G#&gi51@GrK(E@}@N=i--XT zrVG`ti1a5yuXGq`@5a6VGxNLqR@WAiLVXgF{_^ki!o?&Ony@$^z-@j|l`zH`4L{he z7%PiVf{XZW3n{18veS)z)6t$;;8C%5292YYA8)1TmQyB2%$o0bzCvrIPJ!ck%Tky! zLxi;j^L@K@2umFG%@M|#u&!7Hj66z2zTgi3W3RgfwIUY9#tR~2?+KNiPLP5xLLRF2 zqMi-hudjrA#r7%bI0ItDe2sH_PSlrpq=xi|caf)PW@|sUpu4YrKhULq3GQrBUwO^0Zx4F>Y1|VO94PGrZKXP_qH9;oUpQa=lIs zU_PcU87%RRGtZ};ETpA4O=fq7(@pOzx>PUwN6Sr;>|Mqr$gC5@Vd&y7CV+5dq8_edqT|BZcyga&eek_E7UI2WNO61B)l#=q z(LfAeTTm`yjWVA6VCZwsXOTmNg6sGV*P~O%i977>fyTvqQXs4TX?_5WOtTiR78ft( z3rfqCSqjSt`%4q<_P>&-_OKe$at`b6A+J=QO-hLOVq6Ttxj@gLTiUjs@Ex=5afkO- zif7KB?fgk!sNQY5HnA5X+PP5Y0Fj$0DSYUxU}LG95w()}3Tw>_%WC0zq6z!Y=zj-C z$FM!99)TfEEHRy6`QmsNydDL2GSXbvdzj&H*tajlFf#PPj6xsKe05c#qkcpqljx(R zDwH6@X+{XID}h2J1SgpCTPM&F+uMyrv2Q+6YGG!5Y$A#!pkh&2zk?4IugWQxvMmZe zqUmoxtQLCKIbnkejB?Cdy+%LsQp@#8G%+BK0Wz~Io*s&dDZ87q>Wi-^H-fRJvLKMF z4@?c6$U-kp>>(l7SAJ2&#PjlJAy%NEttA*HjCd$EqehC3=acIia!n|RvlKB$ zS4atnu19wc44HDu-5>dvhW4-W;*%9qkQES-y}J?BK7s#A%u?Qdm0ewcdsz^L#4p`3 zF3shCFNt@Z*LF&j)zj#=;RxTJ=kppp#r_0U6XJL_yNbtlRGyR>4GCD14HwJ@6W9Af zW94dM;gqK{f-`T(`M;EV(R@cPq?Wl?JZHJ2^CYzWvk9o@6h@sG{Q)#M^HQsb0Kegm zxoILzBesdx%;6KJoHVM2Ci5jt+cUu*mQ{Jl!rqBmZBM9oj6R%JH0%>Bh|QPyZw_xw z{=&Me8&Srll84(ov~reb;k!8~iCaE=k1t)=K}q6gcVQk2+FI4h>c6XoV~au5!ECcFFVrrP&F zY14>0jx7dLCBT(P4k~(>@MXB_MI!Nt-aOP{yDlmXCi7=%il#ar7>U|2%hr-663R}@ z9XPlWIBo})CeL#;XOCosBJHUfLzhKqO+?kHqMZxc1dZF4vG>J3Ap{gV{4zqj)~PCQ z({b1uK}ggTWioF%@GIQb-M7ueJrNU_Z#yYo8}<>(js9TXUm2|ZRTABB^fIOr7x_Ve>7)KYrFXWwZw9NS7}k2v!N21$F{Z-T9dC<}dSl8Qal)`_ z#rOWRr$aB3N7dryba!LPB!lI;kQXO{iCX7jqGK+49?@<8P0sDO0PJ&9J;P>D7w>!P2$8VNq`jSz z8heh7g1$w&kuYQRw-MZUIHr40f-GEK^nacA)(A zPjkYvdR+heT?gi|LbMMIPfcU%noSlHDfyz;J6XSk+;6zKCl?@z6tv_(6Yh21LCkVe z=jFYzk$)_fs3EV*S7doEu0hP1;?;a$LjTJv94fuBb+4z8u%lq*jLp#1Q59SNQ`zTB zC(BYwSpa_%$5Vw>C_6Pw!iFO^lZ%enVsMq9547PTxzo7kiWQ$FPQ90VH0;EG?!_nr*j)7Wp$kg4yz}d>q~9phpz#^7MK1a(?p72OP14 z{?z4OVcqcIddeLMo#9CR4T)+Idu2e^q0szNg2HP38E*0hAHUNkMF)s;A4+mp`QddD z-I1Zv6|_ckfd~j9p=1|(Gg=LQ&ghFUqin9ao{aa)#B%01c`fDEVqK)HwB|enb=USw zot0a_J0ug~(?=n64P+~C2+JV^^9MJzV#x_^BV7CsB||rMOq6{6o|slae_D0YY2vmH z>mjOigw3BvtMA`JB#}*1#BOXU_tXukXYGnRbCKNp(Zs|URYXlArzTe_b2-I7-i!kqSJ%=tund_ZxNCj<);zUgq-R?FGwT@A zXH){m=mVS0GM1+mDdH58a^$`wewj>UE5PU7W& zG_r~KBI(uZOG?a)6rk?ahZOtY<917eXyZofLh|*ZL3;(q0}O8d&PvN3VODyS6s2fR z(b|Xu(b_(p6kCOS$ll^O$0@UY!NI2nN+D$-_98Qyq`^SS%tvNQ^d+t!$LRctM}+b` z&z@*#Pz1I#hPTtg zD3+f}8lN1sAV5bCv^au3dnov-qlQw4&x!Tfuj^k|CaNjoJXj-41%fw16wrMI^(OoD z=!S9O`}J$aXtC5%u!vx!jRvjBNe>FU`8YfZ?PuKjfNk@>>Z50 zz3k=kS+I*Bd7`7K$vMI29#49tw>j#*ommvzJijQ$LBkfS2z3$K0)} zw_ZebES8clO+1uvl)6jLC0ia{;jvuEdkd8sC-YcC;qBB7e#MY>i6W8~@jFreQxvE` z@f~rLf3y4V9%XXRvPZXE2^CImvSVoCXwqxpdrZg)eR|Q_`gYg2TrgFXl%~8=DY5;Y z7oGn_BnyoDM3BNE9XrsGAiVsv#?FqgTeUyu!;2M1+GGlk`_+O+xm`_qi?{V1R$dM5 z%!AkD$H9$qQUnYbIQujuq8Ss0`y&{b-Zlka%w8Hb# zKTq?`nnQ-w8owk+8L_j5+dZPcFB;LcafJRn02A~}Jvd9hVA^&zKRW*os|^rl-xIl2 zPf=C4keuc|S`_uAAnJwWW6c1WN zBlu4Jy7zxXKUx)+7H00^2}Pv|u7kSAxa72}=`2WZ3)WcDOi8i}rEsLc>8Vl*;j?+yI$`>VvDwE6t@FLBs_0X`@qsQf1Bqa3j>3nE>d5FVjpP9 z-<18imh8yJNXIiqBAihS?N2AJz6#D;v}=j+%PdgS)^arC;`!NIQVQ*Rw$&Oug#xch z=xI7g+7<+=2!jqEG!roJQ^&((!#*41M3`!Ym1iK1({;!8-`ym~=fQAA(9rC?`S7uq zanp)`?6%d?7rvu8XM)^V2Zo^vVlvZ4lf7!kMf3ilXQt!+Y7NVgU_=G8#P|x1!eX%5 z1D~%Huv>j{{GN)k?2R}113px@zjGLPxjItS`xu9i?_zYg@P(G9dN6tRNBu=mfGI{F zuMO*%s!*mjzD4zL)>kZ8b4buB;L($jofO8_<1KIFDQC1?Q6zu!6U7=5+)P@~zRm73WZ8aaLP28~(Q(x&H|eCw`@ zP(zk5@@KhFd_+&L=8W1b!bK&kpe_M3F^+!_*FYqU-ztcv>bLd1(MA`z_>?)Bgym+z zTJn)6?;Qm{K28&bA};Dm5=lu0lO6(3hhoOT z3}t!wqEUJm%3*8)8Nbc#1MaoJ9)Ds*L#gAyRI@9aZAwj~b6dHt&^zuEZ);;p(y<#J z3d>NOjhaQ*Wg)hsVds5J;ZDu<9osgO&&3(!lN-oT$NQ0?12`$ehiE9r@||s_L`msm zZ%ISn{s3?8U#t)FJF&|R+YhELLJqdK)r|d849cQ~E|gQjm1gukH;L}qE23K_e&_7) z(ENc@_0AKbls7t4`a6!Kn!C(+9mUx4xPbi-%|3FV{}a0kb**XVZ2YtN08UfgHInhzOvxmZZ&Evd8^t+x(*iH2UPey8C^smm4 z^Do4FN5c$sM=fDzyL(;qyX0A3x1uREes(O>nB$8x$kfW%7u}CsV?D6_{DbG4bSUp0 zJtE8d*RuNiOoe=TvYU@EmV88yA3l=|v{uWlO5aMR(z^A;55;B7_!ukc5v#?; z(s=wc#%1`W;EPRC6Z3N1Xh%LsxzV3`s)?gFm_Wbmcg;{cyCCQ8Ay>F)G`?4O%}hcJ z_8W24+Vj|1M|tkX7rM>A2V5bZaruT99#}+!;$Xf9i{5}WpNhAfJ|BW~53puNrHrJ6g$yr*$+4HD#Pzq_$W}?7kg{?tV>4n;_oujpq>GE|^+46SYU1sS~X%m?=D*E0vm+mq{yIk9k_I>)?iy zvzp-v)=Asu!s)3>|J@@O16R}lq0v>4oZpi{SM{HXinT zn?*bNb*1T2#=BBovRk48M2m|C74^|c?zbUFg+v+%i(=R5s zNM-!P`IP<}RtP3Oe5tun z9_$`)PqvEZ>4S~Yq$mQJ8wEJc&r@=HeqK`&WQ^x;LBG<@lHkgVti=V9ski}m~i6LaWXD`Gm3u#=4% zPiRb$wL~)F+-J;3TUn7Gt4o%=ogB@WzkxOxsc{?XpK*LBi=R~u8T|SYFH`O0dc#8X z^|gsblma_sfTW$dNW|Oy`yUxqQ`a?}`8GQ#XZLr-z;55=b~Subn6smp=lbOyFH@eQ z#6ec`dLp>Qh$go13muLaqt5o!2T8V)pVKU!>BA4XvE4NSU5laOH%IEsqJ~wO&XZ9; zWbtym#!YF+e2v4p5U00(bsQEZ{7Is9Nz$ErjcxEw_FpPGQN7ukJ-3r$*8RMTCVm4r z=lMsEjP8V+DuzN325c$qn9uTgKGtQ&BKxS#1ZJ+KeR(Mb7d@D=GVVv7Q*(t`Ek2IFOQWW$<=| zcj+;ZCb-p2*|}@yQjoLi*lE<%)cV;me}D~LYuy%gd|}=1NN4KhSLC-jk_da&Qbr}V z->hl8Tn<=3f6hBz{@p!z;?a{;))@}pd$NK>eWlDC3C;cPsNC&!UXQt8@g}pW809t7 zI0_VCU;mTXcXvAa{_la+jAh8$?{1F(8VSYGTG!M{CI*)G69@HaoGLw?(afsd?{lEc z3-=BBOt5T}t?^}z3vYb3Hr0xzjrf+OhB_VhN=~_e-!3(_`0V^luAnZjbW=^!S1bVK zS(y1!=8S;mWD#RScZ!q+zI#7j$<8Hs5E&x9&*<$&iCe?q3h0n(@z3_~W=O=YCJ8HK% za%A@tw9vO6)nFejXB;AWF$2ojV>L*Lp(QW{CJ&^-Zbi{T zlI#?sWvb&>E3~!t_Qe#(#!q>dO^clFQG5;%_bj7`{jk+$ta_Il$FUdh*tDh~Y=0}a zYAHCdy7Bd_UrDK-uBrmT=wn5*VjGx@(07^low72 z{TZ0LO1deCoGJKmTWl9jg`M#GR1p_EW7!i-s@rzzz9+jk3$-_| z$LHCYBkmcg!e+hKv$b0r>@Wvp_O~*27)a){3J3*K45!ElioW6)M^K?k*bOi_h|N7rjIGT%19g0zHN# znrLk3Nk#JBt6Yc({s_^JFcjPz70N6f*$s7i;yJcJm{yk)Zc4(Cv%oHvc<~2JvDE5X zVvz6&xsaT?(b>OFi!W^`rZ7>VNB>j$cWb`???!T;d9ikM>S1;}cx|_`GKYXebjaHH$D=$#XY?S3j)^Y)mvD|?Q+UtI9ltUMO` zq@E+wGs~l$?0t(liWDj3>h$Ax;5~m0DK@tqzu$ci5W~LNbFSZBduQ9bJL>HvCB$kv zo1{g7wY+ds8pR%p1XO)T+E(S+vp@=LwFkep1Pai(*Qq~;JywFv`uEO~eGui$ARF`r zt-Mq1*B)x=2i@(MjxP?IOG zP<6-oVv7%9SM)Q{o;sM{tB5$_@l%A8NoLZ-Z-VY7LdU_#meKIE+9sD?i7->lmUQ^= zUII(T$n|15%k0^*IvpS6O74r)GI4x(+sD9DltR5y{s|WB^Q>YJDn*rMUtid>C6f6m zkyb{|2z^*m?iu(*>RghKBcPv3k+3s-f-z<-S^DYX7KUVN$(S!Z-m)%q@y}*VL$pip z9pG0ocf{h?D6k9lrkGY94Lcf@jj%bv&N^iE$J=~wLrcD&K9*g_b|~S-I`EJlP1e=a z;MnV^x4&U97bFobNHKdv@!gRn#65CiWZ?%2?P}jZHG186@Y}iNt@02KTgI`)_!otN zd!}1m5+^>;+Jr`@$tm-!-N31$+q z&G-RY%GkSys|T%#dzO0q4#&?|Za5U7d13K1hf+j|Usoa<0y-zC1q{2!nfP>QpFJT@ z_^<`)$v*Z7QPg{iFE>!(u6fMxu^*4j>lL=a6H`p@@{H*Q; z{x)F+G?nYo90MPfn?c+Ts`|B}{*={=^w3=&RQKMuI|DP|W|2E;IZ*1!s4mn)4CzXM zc>=BS-9-j7#jTbHQN$x(eh%Fp3rzh^x6C}-`yK>r^*mmQp}b(0LOpLDjVnyZiBr6p zr#?wFs->A1nSbizrFw1+mDQHKSf!FW8(;-CsH_D;$3_bnSjuE9G@HXUE7pJZRE%=H z@wi05>YJpr4@%cVEHthFHhQj{+rmzFjQn34pp#bA(<~^IID*Qzv zTmoLO`)SNp1cA>dtG@Re9yE`YeXG8%rYGwT_0*0H?+(Bz|L*N+J<3FUIF|%nGeE5Cpjc(aA!=8Re|9be_>XRkOY%nCe6i*#(OeP{evnu6te=m!; z#$!Z0VwgC3OI@jL3hXYx1@97cl30NXVgB7~D6NgQKuvTBCH7ST%6tu68w@6v`(J!hO{#4P>4X}OdbiG?OR$7i9 zH>ikG=*xTBx_ry!oXTV0KrRyf`3z1{!x}E`1$HR9!^(oLu?&v1MA67x)SRxrLy$2q zes9i-;|t)#HtDg-f+W`-k|bQz2es&CiLlY(7JuK^s#%_Nxs9HiuX%R*=#!5c#*};* zsa(L+CMwN$bWH1+YCNeVdUMdHe+t!bv*m;M!}s5AE-(M^Nhuq1_E+)$HX=&MX6Ol5 zvG8s6$Z-)%|0ztogFM~jp)XpHTybhyrOTaAcL9F)^HrAz_yxlO`5;?#A&nw2Gxb|8)#i))jADeDpQ?(i#??)}yteGJ z%L9)6ixoPYvC48Gc<#%236@S@3n%Na?hwDpUpOP!D#FFN;j3f&nsr2k-EHbcOSS(d zy$J{*B>`nUTSNIEXPdwp(YSnw>p75(RdprahW^Bl4 z{R!cjULFI!h{xmpGeZ1sTs>I6_1X0uF0{(QR7ytu3njFf81n}w`~6kWj?-#<64Ujg z#fzt%OVMe#&92V*~dHd0%G_w%lOAjubb1==Ko&94Ig`FZaq z)UNjyUB6-`p7piN;MrM{n2SGY#1Qz~!Bm3cfaBW%orkol=I5f&d+Vz!Nt!|Bh9hJ$ zRNs$ZLQERBXoPd#W&P0=~L+@ zv3-TLim{x$F;?rDOr)bnz}qsbM~WggVkA_SqRcI4ncZK%$tnPc1CwUSzL1tb18wm2 zN^nWE_uJO64p81vRVX)?H%Lnkz5n*8z`o<9ASZ3YI5#5F@%;6D2Kr|AJpNxb*S{W} zYx#IQ^2CM8NKq6EtE$~wy&y(H1$}nZ5IpP;fn#TX?(5Msa&l)Mg$e|9D^xR|jFtR5f_83z$>Des<=Vynlg9jvi^=~cP#{5Cl-5#i_Djqi!vP>99Rk{-vq7HiQ zN)y^A$ro7o=r+GRvU_A{FKN$~DH0)&tRA-HNciwI)SVxsgX6w2sn-NHSgZ=dPrr>v zA(OV!%k48dyB3C2@He4op2w7FST5qG#27JLo8kE2DktnX74^zIPaVqJg^?Gi7292V zTAbLA7>#5i-ZjcNspi&5jVdeLNIFlk#lGsdq5Y!v(cYEYy_eQy;ryq3$HKzwv^DzI z(N|rCtGSxzubaz`?tTVodPf89wZBnH)nzXY>lL3I+{j!=HpC6JK2hvkB-4OyPz`jb zuR6iCK=NJg%TLvZd8A=HhrazM6m$acu0KC!eU*1 z$4RArbZaST6S4>_N>}*u;tz0aIieQXz>(|u*ns_8nA*a&3030l;nu#OZE-)_eTE zj%lZIj#m*mji1&ej1Fy_I=Ur)J(ls=R!(#&&-aY=l-1!>%ZuSub;&9@X37dv}x-mnn4 z_Oo3QhbKcKt&%S@=Az9%|A4BWLqBXl;(e|op%}j4e60+iL!Rg#)y#?B=Rfwa+8Q6y zvpNv}z3w17j2GAZj$38i*&}L!W}mIdS*u~5f9d_leu};7#R|i)GLbv!4#MZZMNa13 z=H7cx``A}It9@ZM$ra`l@XernS;`k}vqnA>g()=JN})|=M!3H(QWzKqSB_bJRbqIa zixM^Uvl`;rI=^9hm*@{Es>k+x<%lC^lRPWlWw*@<1Iv&0WdKfb+TA&TBx{m!PLz`; zs_g&J(L0oj01NKFY;Y=k@mOiOxj}>bc5oa(-&Miy8)coG-k-dXI8hUN3*^Sr^AN^vq!k-alSzLNQk<)9Q+IB#(x zc5YKE^Gxy<$Y_e+COyb(;^A`kab5i+4vF)bhi*~XGWBXy%M*njtD5`wW6e$GN0{zxG6{1+3xxWPCxTqqRz$JUKI4Lxq^4adubG^CosKt)hWA=#GMR6DXy? z(nCDjKBZCj5zIu$<9vy4O$1-MQSkqC_SHdgtV`b~Ap{5>g1fuB2UsM*HNk`1;uf61 z0!y$E+}$-ua0%}29vl|f;12I_&b@VSefPhw>Zz%jXQ$?A`}NH9boXLZ6oh4IM*0Zw zhLs0a5>u&FQ_y7GukN%$(3epl>xsHB>lD^V2sb~Sen!r(46beV*M zInl)GY95N3gLs^LD$DUojB)l8#?{Wf=MmNRrrD(+)^K9P`d1hUMy zjgZHEd^UsfWIRL0;p?RUe6`sCw2rdF)*pgYiy#3R=Vn94r{9bj4HTr5xBU4h1X6ug zEyyRxB_z2(C8R*-2$W1<0KlsB?a!RI^|HPdbH)!mqStos@lSO*HZ<)V#`b8opVH3H z!{?uZ^F$`bAWknj7+a>U-Uao^$M2`15jg&o`X1?HEsw!hFYj&tB4f)^cT0fR<;o=wX&`TqWG=W>RwD;>9eThfoy;g@*n)2&ypiH zR!CXmzK6<|OZa)F13i^PU4_@7JHO-#y|R=hqZry(_lt?+9D0Hw(PRCoCj|;WfK1>m zxkADz3%!o`5g@+#MP_Ve2aMzQP)Xud;3bz07@ z)3*KF$PGM_H>(~-IKD-FiUd~0S|WC0xS@F_#X>!%`zHuadbjmUdCnxZw%X%q*+{K2 zX}Nu7b>y*0_z_8qW!@#1QhiSuM=hRH;0(hk>|!G$nU$Yq%B>e+*xXgSutcGh*2sQ7 z#I0X}lnrZ#$h6}O1*OCtsa()&Bb}RCO6iIDBI~wE0i%%g5cUTOO7X(VG;ouf4)UqjH6$ z8-$~d*A&hvZ$&*75%(uipWxh}1bu@&QC5siky)L~Z$5EId(L88F4@IsFHs1hrLIN# zt@sqltQSf80wZ@wPcARYI5&bo*G0mtYw4Na-8_*RM*mbf!xrcPTy&jAEe{f&Y$&1;`&I+$LSTMOj=I6)=Yy*DC2vNx-=Q4l_?1?`oKY6 z4m~wqUPcI&YjO4X+jDOquZJ!STLhJWq*)zAHFXS%P-EI+OwB>&d3WK zt}b1E7m;5}n@<>zTlW0tty`U#qG!yb64PboaljY(!P?v}Ud&Fo|+yw%hr+}@KKZ-*ymO|xDzk7X9L zyxUyPi0FS%O~bm40C^4!E4FxAc>THDE)OJb3vFxo3mpkwq7!9x4E5gjyEiX*X1nvH z%RsNzCld16YxO!!%zSQPC^0D#OXtJ%6#J;$qCRypp7T!#@ML=x!R<-vd*uLhr-*pMUBHrAI$^ixSrU46-<$*fyjayj8AaCxynWC*59u|2 zZtkU2@|%grpepKC^;SkYqp+2<@f5C%A|ObBv~C%YS8H2Q>TSq3Ar}Qp?Fg?*-kUa% zgbRyazP=8T@1ydZeo}}ldt4)8)0Se&1JmW<0LEJ)8>q~^1Qxw2NlV^!HpCMoIKsC@S>Vfgr>`^(hj5wa%Jnfk{GN?k`*`$5aEFQKE?wd} zVMNvA_dcbd$GL>ZikQ4Egfot67+B?3cn=PqhvvtdHdd@FYq((l*x z45pHwaaPvv?oU*sC+kQFfi6qs++rKAZ{jJ#KVCt=evj(ev!icDd4vOS@ZJS0n#>6| z8@lvzEx$6JC2O-9TkwD>49}Zaax^mNj=z9z^VTeJK;O+*JW`y*RlpPK%E`Z5?NH<% zbRf^S$a-5~^bdZZ-Ev+XuNAnu9fz7kxn+Ld0&(osVBly44~g$dk^Mq`C<&1!yUOVc zjM`tC@L-+9g=x^Fxg2SYMsmD7C81JY`yqT3-iJz&MyKIz8@L_$EN-k$gmxN==b{@W zh+nWZ^Y~^Sf0}-oK1p@i#C%Bb=K->5tMxE8JCP*(QCH;B-9his)llK6+spUGmu}<- zk+?&ZGjDp=5-^U{ZX@Y(^G8(rg=eI(?vI#614$Cq!!0X1(+kV&+-#0Ccg=K8XAKTy z*^T5`KR>5#g0?fgQO4h&F9Kl&&!H9Qo{ia`+jl5?*e3P#JZv5Vx?Yi!nRYQAxWRXD%hr7=d`?RK{5#dZA2ni?jX4p7f z?e%`|(BASjYZ_%zt(cjZ*AL&c6*k=O{03ndN~3M*tjje6$b~PqK0u8}TB+`8Xg6QW zPy$^Y;sk&X^Cb(^YCbb;4d<(qN+}b^==j`ZlYC}>vQgtMjYQuA+iCqNweDf^3)^bx37P!rg1zW&o%{=Bc7SsCiNzR~&m8s50 zkX1^kk^X!H)8`?Pac9@E#4L=%H?Ph;Nk92J!C_AijnMw+*ZsaiUCKT04?8jDR>{{b zeFP7uN%o=5=v9i{Pz#w&#e1~~j*6r8a2^}u?K2~Kl3~jm8GD&XGht%Tv#XPnvL@5~ z5ecualh29xd%NmrD0|D$29-1VFt*pvIP+-0yE9#ApsqVFwp`2Ick(z8>!XPN(8bAZ zXU?HJt;O#@utt+F1}pyDo~|BwXWDS0oZlK(g7Ye+z47EeE`Qk(EK&ZsbadcZ;ht!- z&H<(Y1rFQUXO>A3%dM{YU-!hKb$Y(%J=aTI>XFt_4<|g!r$@KCH}72g*k}J!{c6)M zZ|f@PeqGq6VhSj)DvrA~>j}aZ^ZOlll;;0jPIG~GDsl5o_Ea* zH!Z>0$;e|mCNkuC86Uq-!P5}u#eEevMKe(Q4}P|+>sBfgjs0~NC_?;!@(d=INTWvG z5w{Q_CDUh~M<1Z#Dwod|IXLJk<+M24Woi?6qq9CVc(!E8<*`H~4`Lk-`>W;;*_X5* zxu?vE&5+3vJ+;dYqPGsmzbl~4#-d#U#OOG^pTu_0Uh79Apx~o@^~K17*GiqhSFul* zOp+*_$uuNeSYb2p_2WS*I_AL%&YLWLbX^(Bj~dAfoR4>wI_V^wK4~5uYOiPZoWWCS zvh8wn$SCI{UiV|;GDFAqS2cZx7lK^E_n2&a+og^2OCG}SEo8NY=st8XAj%7b{ySYi z|FnYZyvA1$G2&rGd>5&?D@~c_HL0-M#$CY>;S_J2#F=@czhE|3qB*zFc>SyF<)V3J znPJ=lv;B;Hc&+1pE~%tAv|)*m*iEqZr)E>0-6@VaVg@Byc{@kGgCUTI$ZSs#vuA-Z7>j5rr+X|^lFu`-_r{2* zWYS-*x8cPrg(P+5qu}!Cucv3n6%bmXO#A5uB2O|hUl)aK*6YA|lPT{22W3Z{gk7bT z+pfC#YjD>*zBtWly>hCMrTOMJnyH5AA+|P>>R&)qYUXgHd93a%vpJ8M%J80Y1QL93 zqvtsugK~{d)4YcDnj0vdsKV{A;YkJF@aM@G2PS-^pK6BViwuOQaPdWHx$(q-=A|Xd zVwX5ccd3ZBQ#Xp7HHx^j2C)j@I*(*oj^}5s>-J@X5ag z<2G%cxs$|R`si>$69@oBSV#8 z`!3>lhVO+}w2fHY_qqcRwca7PU2nW7NxN(#E6a@vyePniYq>kD-&oF1<%|!H(`^me z8B@OLIz5o|`+UnUZQ$kcvG@Z<3VMwOQ>$OJpoHuXMdU|p2R^J_7x5ECtt$Oba9K);Nin)p<6-F`Csr$SqYR2f&|snPxh1)P%>53BZ|crXD- zHae982!?C6PXK*WRHMVHRPD`-pW1~0EyH*ZH`E%M4Vmyo*s2rm-;Fe%p)}mYbe?p> zgSHkgr8h$aw7ajy?ZZwxSIxhk#H_y9M8XX9-Y=lSZxLpj{D3Aud{RI4sjCS1FsYaf zX%7PH1v~6zBRJhn^lk>oKhW{}GSL`bf9XpXb=(t%YHLz38llk-eCD9NM|d}1$If_} z-Fwf_(Sy#9Iama{%sD z)`uj9yX8?^{HuiQdv0cF)VogKX!t!J)#G)i(Y&L(3Z5P>1N+B_Nb}!?Q>9azGCied zMZ0sXlUP*A%FHVS-xw3!r=>6NSXTMs7WWR6G(Vj4aA-b&KBS+3it8GXIXn zm;q{)SeF@7cd)C`#UFDyLAopNdXA=D@M2$wUJ+6Rcce;DVUTsk_X0&M~L&rbMl3 z`+I$}lZD2%d!*cbH^Dg@h8%ag$qkc5kX-kACD3*Pkhhk;_T*M6Z<#Rp?}dPx<{E0o z0=Qg%wtK$WGAUKcDti@a2l%#-O?j{{0M>az2Wen8bbgy(Cs7&aSOgwS6csI**5vcotwy4-J*xZ zz+#U8ot4?844y1e9hP2xnHFsIcB2Ez!@fvQ58h3f)hCYr(2Pobsx}luX|=KNtp+^i zoB(vuA!3tHCY?E_+tHR^cXEO!raCHuR!&BsL-2i|*_YZ6<2r3ewUE$Sw)7masqV%l%48dxpKXgmQ7=-crR! zZBfir=5T+6K(e+lDdk!#G8EqY>{uTf?X4=F-kD{6?61)6e9K1AVZu?T%gLm!^>Rq8 zD8gnevnkM0u9Lv%V(}>tvY|-(aEURC{BpUG5nADE<?F@ha-7^kx8wuI9@YZ#2|ASYoCIX9k z*6aBVq7kZi)Q3H}+U!7sS9P!3JQTR?jm(a-Krv5$&4P9WPZ{&mbD|(sj#-Q`5I6&m zN6B<Bjy=jLlv||pg4F8U#Bezq55dULi-kaJnodB1A^F|>5Xlr zt71fiU1SV7pV1h#Ci6OtIyi4eo`CDMgf}S{xt;Z^JJFl@)09DN7BK5pvEOD@#L4Oa^@==U3VUz0c)R)XpG2Zi>vx5YR`lzjzpiXul zY-zWd>k-YYyPlD?8|X*ibbJ^(_Dsbjvz0-pfI*Wc4^nb+C^yR|Rf$(&Fw2=A zT6x+VG*V2I@1#T6TxQy4ZF&C)lfFB@T$mf5=gGnb8uZY41Ic3Y!!CPCzWWs`;8J2O zO>l>E#c*)pXY_k;7a^%pHEjr){2`sLkc@D1d_?4!=GE;>WI;vk0^PMiRg^eF`P*EN zeqXDu%g45s+rxa~@g%)x!6#Rm9wW@|lO2d2+@(jaROTnk`c^)l zOBCNU70vo3huCv7E1N2xww=Y3EY>DmsMX$4VQRWsT@fyal^$a13wx%6w^SeatDm+GOsUt~iT9?qdaaZ$RBl8I&SGQ~FVt-32i(h-65yw+BBaXpgev_U zN|RoeB!`2XD+_@IO&_<|ck7S)DB-@gf%|b}Ko1l@%?=B7Vt5`1&wNK>T`r zw!n+UHAk_iqFx&zv(h|w;hE?F$Zlo4H){)u^~$7eKiLNZW%#{C(S1mPlgK3lD;Omb zRR~>itPj4!=ZY)l5m6;ODP4m_n(r<$LmZG^f5P!7;z=&j@8ud)PMm4@Rpo;hb6!SO zybu<0lLf8B9BlPH{bqfpa4hBa1TP_%>b>inAK`qAgBFyQ&uWnLb` ziIMGzqyt)h_pNAkcH7g{UV%GYv0jO@B5B&+TejaSr^2`R&F%LLlJy%hwrAZZ?ak_o z(!TR=EiJfTkGguew|ERp6_XgUp+bJ)c%O~xcES(M33mQDWF7N!R!XR$2u?X_w*KXm5`xKaC>oD z?agXxJ&us9s*` zA5=a$J=C8cv>C+8I=YW{pZMYY-2PhJW2?6OZWLa+tkkk4Y$ZXlyP7Z|`l0A(U+G7r zchrXb>Z^ERCy{~-46(Sf%`oqlwedrHQ)WN@G?If{#A{bAGVYf0%dT%(1WJ_MkW|#Ldvf^kMjjD++H$6l~@$q5k;4@z$kE4RS%K)&53$)B@aJBDLkV<@K53_YNV{Cu5 zrNw79v-1RE=TnWkyUKX;`{AXmecnui=i?`e()jWMwU=fbAj0AFJ4|ynuE?M;T-na< z@Qr!Y=w8WKECW*#;Pt$xIBd&7Fv1ebmz@5ACCD--qT^h$CQ%84q9YkglP8QR86gUp zIAoUtgo{3I1jV54cu84oiKoefM25|W0n9KFWp`qc%0SR1HO5(rEipu>z$CzoCJ!it zQiz?Z6h&3Kx-eVt546$|iXo*jjzt>0)(owr1K|#5f8B1U?&zTuLQ|ENav=!lJmUm? z#L50@t}5-khHbO~oLZO-{5oy~nxpvN^Rqj-Iz}37il)x4Vco@fe)v+cbQaIsLG%a| z1C|&=$Ek=BvXZesk-Ayl4}B3NO26wRspsqxePZ?;RG(6HG@=O& zbx{BP8%;;TAucfeB$U4yWedcp{saAnEQMU+{HTy8wDYJr^5xc?@+T@$l-Zaup52Qd z(uBiby!^4K->0-3?^)uRvD{H0N!84yt}y3(lcbddB>kH5X|&QIJAU4mh5$1Dhme1^ zsV^k&cyNK`6<$6O{LksZPHWh|E5iRAd??b`SrY$BsWX(>O;VrpTe^o2^>P*jR_#f~ zgXXaSZAZ*_!nl$V`2FXy!-MD_Im7U(9jKw$Tce@Kq@O_q{a<7uS6h7e26FgFnpVFYsMSmsxA6~I&y5#X+p0zRS0tU^NoVgJ(E-ZT*k5zx-pK{Vj_BUhzNsz#>mZ9}W=uA5*Fz?r1A; z!rLa8xD;dGX(t^_z3XLJ3WN|SKP<8=bq398k0pi?E5G5yrur{tA^-sVt@D30|Nm^w zA=621d1~ryk2Q(XVcPXbD2{Pi@l_6(IK}|n0X2pZn&2INhH@o8nU=6b*K!0rbS(SH zg27~eTV`Rlw#N8BLYfo#2jrpOkW(z4kf(^1MaKU+>u(n3M4mVT@c9phzafWKdOU%D zJMi9y1uT`y_3+euK^xq7fz%~gyshLF_&Go^eVF5V~i`td(Y%l{S$f_FWF9)vn c$7h0crN|eKcd@`f8U6K6S_xDx`6=N400$88*Z=?k literal 0 HcmV?d00001 From a758f5bca395fd69b88060e9647be5d240779fbd Mon Sep 17 00:00:00 2001 From: jongheonleee Date: Tue, 10 Dec 2024 12:33:17 +0900 Subject: [PATCH 095/167] =?UTF-8?q?[chore]=20=EB=A6=AC=EB=93=9C=EB=AF=B8?= =?UTF-8?q?=201=EC=B0=A8=20=EC=B4=88=EC=95=88=20=EC=9E=91=EC=84=B1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 533 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 516 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 805055f9..19fea89c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@
    +![img_3.png](images/img_3.png) +![img_4.png](images/img_4.png)
    @@ -10,16 +12,16 @@
    -### :runner: 프로젝트 기간 (54 days) -> **전체 개발 기간: ( Weeks | %)**
    -> - 기능 구현 기간: ( Weeks | %) -> - 리팩토링 및 발표 준비 기간: +### 🏃🏻 프로젝트 기간 (54 days) +> **전체 개발 기간: ( 8 Weeks | 45 %)**
    +> - 기능 구현 기간: ( 5 Weeks | 60 %) +> - 발표 준비 기간: 3 days
    -### :computer: 코드수 +### 💻 코드수

    
    -Java         :  
    +Java : 33,731

    @@ -31,42 +33,50 @@ Java :
    #### 팀원 구성 +| Backend
    박준홍 \| 팀장 | Backend
    이종헌 | Backend
    유민우 | Backend
    최윤서 | Backend
    김규영 | Backend
    류은기 | +|:--------------------------------------------------:|:--------------------------------------------------:|:--------------------------------------------------:|:------------------------------:|:-------------------------------:|:------------------------------:| +| ![img.png](images/img.png) | ![img_1.png](images/img_1.png) | ![img_2.png](images/img_2.png) | ![img_5.png](images/img_5.png) | ![img_6.png](images/img_6.png) | ![img_7.png](images/img_7.png) | + +
    ## 기술 스택 ### 🧑🏻‍💻 Enviroment -|IntelliJ|VS Code|Git|Github| Gradle | -|:---:|:---:|:---:|:---:|:------:| +|IntelliJ|VS Code|Git|Github|Gradle| +|:---:|:---:|:---:|:---:|:---:| +|IntelliJ|VS Code|Git|GitHub|Gradle|
    ### 🛠️ Tool - #### Backend -|Java| Spring Framework | Spring Security | JPA | Lombok | jUnit | -|:---:|:----------------:|:---------------:|:---:|:------:|:-----:| +|Java| Spring Framework | Spring Security | JPA | Lombok |jUnit| +|:---:|:------------------------------------------------------:|:------------------------------------------------------------------------------------:|:------------------------------------------------------------------------:|:------------------------------------------------------:|:---:| +|Java| Spring | Spring Security | JPA | Lombok |jUnit| #### Database |MySQL| |:---:| - +|MySQL| #### Web Server -|Apache Tomcat| -|:---:| +|Apache Tomcat| AWS | RDS |Prometheus|Grafana|Docker| Compose |GitHub Action| +|:---:|:--------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------------------------------:|:---:|:---:|:---:|:--------------------------------------------------------:|:---:| +|Apache Tomcat| AWS | RDS |Prometheus|Grafana|Docker| Compose |GitHub Action|
    ### 👀 Communication -|Zoom| Notion | Google Sheets | Google Slides | -|:---:|:------:|:-------------:|:-------------:| +| Zoom |Notion| Google Sheets | Google Slides | +|:--------------------------------------------------:|:---:|:-------------------------------------------------------------------:|:--------------------------------------------------------------------:| +| Zoom |Notion| Google Sheets | Google Slides |
    -## ERD + @@ -99,6 +109,495 @@ Java :
    ## 🏭 디렉토리 구조
    
    +src
    +├── main
    +│   ├── java
    +│   │   └── com
    +│   │       └── oreo
    +│   │           └── finalproject_5re5_be
    +│   │               ├── FinalProject5Re5BeApplication.java
    +│   │               ├── code
    +│   │               │   ├── controller
    +│   │               │   │   ├── CodeController.java
    +│   │               │   │   └── advice
    +│   │               │   │       └── CodeExceptionHandler.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── CodeRequest.java
    +│   │               │   │   │   └── CodeUpdateRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── CodeResponse.java
    +│   │               │   │       └── CodeResponses.java
    +│   │               │   ├── entity
    +│   │               │   │   └── Code.java
    +│   │               │   ├── exeption
    +│   │               │   │   ├── CodeDuplicatedException.java
    +│   │               │   │   └── CodeNotFoundException.java
    +│   │               │   ├── repository
    +│   │               │   │   └── CodeRepository.java
    +│   │               │   └── service
    +│   │               │       └── CodeServiceImpl.java
    +│   │               ├── concat
    +│   │               │   ├── config
    +│   │               │   │   └── README.md
    +│   │               │   ├── controller
    +│   │               │   │   ├── AudioFileController.java
    +│   │               │   │   ├── BgmFileController.java
    +│   │               │   │   ├── ConcatController.java
    +│   │               │   │   ├── ConcatMaterialController.java
    +│   │               │   │   ├── ConcatRowController.java
    +│   │               │   │   ├── ConcatRowTabController.java
    +│   │               │   │   ├── ConcatTabController.java
    +│   │               │   │   └── ConcatWithBgmController.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── ConcatResponseDto.java
    +│   │               │   │   ├── ConcatResultDto.java
    +│   │               │   │   ├── ConcatRowDto.java
    +│   │               │   │   ├── ConcatRowListDto.java
    +│   │               │   │   ├── RowAudioFileDto.java
    +│   │               │   │   ├── RowInfoDto.java
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── AudioFileDto.java
    +│   │               │   │   │   ├── AudioFileRequestDto.java
    +│   │               │   │   │   ├── AudioFormatRequest.java
    +│   │               │   │   │   ├── BgmFunctionRequestDto.java
    +│   │               │   │   │   ├── ConcatCreateRequestDto.java
    +│   │               │   │   │   ├── ConcatResultRequest.java
    +│   │               │   │   │   ├── ConcatRowRequest.java
    +│   │               │   │   │   ├── ConcatRowRequestDto.java
    +│   │               │   │   │   ├── ConcatRowSaveRequestDto.java
    +│   │               │   │   │   ├── ConcatTabRequest.java
    +│   │               │   │   │   ├── ConcatUpdateRequestDto.java
    +│   │               │   │   │   ├── OriginAudioRequest.java
    +│   │               │   │   │   ├── README.md
    +│   │               │   │   │   ├── SelectedConcatRowRequest.java
    +│   │               │   │   │   └── TabRowUpdateRequestDto.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── ConcatResultDetailsResponse.java
    +│   │               │   │       ├── ConcatResultResponse.java
    +│   │               │   │       ├── ConcatRowTabResponseDto.java
    +│   │               │   │       ├── ConcatTabResponseDto.java
    +│   │               │   │       ├── ConcatUrlResponse.java
    +│   │               │   │       ├── README.md
    +│   │               │   │       └── TabRowResponseDto.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── AudioFile.java
    +│   │               │   │   ├── BgmFile.java
    +│   │               │   │   ├── ConcatResult.java
    +│   │               │   │   ├── ConcatRow.java
    +│   │               │   │   ├── ConcatRowLog.java
    +│   │               │   │   ├── ConcatTab.java
    +│   │               │   │   ├── ConcatTabLog.java
    +│   │               │   │   └── MaterialAudio.java
    +│   │               │   ├── exception
    +│   │               │   │   └── README.md
    +│   │               │   ├── repository
    +│   │               │   │   ├── AudioFileRepository.java
    +│   │               │   │   ├── BgmFileRepository.java
    +│   │               │   │   ├── ConcatResultRepository.java
    +│   │               │   │   ├── ConcatRowLogRepository.java
    +│   │               │   │   ├── ConcatRowRepository.java
    +│   │               │   │   ├── ConcatTabLogRepository.java
    +│   │               │   │   ├── ConcatTabRepository.java
    +│   │               │   │   └── MaterialAudioRepository.java
    +│   │               │   └── service
    +│   │               │       ├── AudioFileService.java
    +│   │               │       ├── AudioMultipartFile.java
    +│   │               │       ├── AudioStreamService.java
    +│   │               │       ├── BgmFileService.java
    +│   │               │       ├── ConcatResultService.java
    +│   │               │       ├── ConcatRowService.java
    +│   │               │       ├── ConcatRowTabService.java
    +│   │               │       ├── ConcatService.java
    +│   │               │       ├── ConcatTabService.java
    +│   │               │       ├── MaterialAudioService.java
    +│   │               │       ├── README.md
    +│   │               │       ├── bgm
    +│   │               │       │   └── BgmProcessor.java
    +│   │               │       ├── concatenator
    +│   │               │       │   ├── AudioProperties.java
    +│   │               │       │   ├── Concatenator.java
    +│   │               │       │   ├── IntervalConcatenator.java
    +│   │               │       │   ├── MonoConcatenator.java
    +│   │               │       │   ├── MonoIntervalConcatenator.java
    +│   │               │       │   ├── StereoConcatenator.java
    +│   │               │       │   └── StereoIntervalConcatenator.java
    +│   │               │       └── helper
    +│   │               │           ├── AudioFileHelper.java
    +│   │               │           ├── ConcatRowHelper.java
    +│   │               │           └── ConcatTabHelper.java
    +│   │               ├── global
    +│   │               │   ├── component
    +│   │               │   │   ├── AudioInfo.java
    +│   │               │   │   ├── ByteArrayMultipartFile.java
    +│   │               │   │   ├── S3Service.java
    +│   │               │   │   ├── SqsService.java
    +│   │               │   │   └── audio
    +│   │               │   │       ├── AudioChannels.java
    +│   │               │   │       ├── AudioExtensionChecker.java
    +│   │               │   │       ├── AudioExtensionConverter.java
    +│   │               │   │       ├── AudioExtensions.java
    +│   │               │   │       ├── AudioFileTypeConverter.java
    +│   │               │   │       ├── AudioFormats.java
    +│   │               │   │       ├── AudioResample.java
    +│   │               │   │       ├── BeepMaker.java
    +│   │               │   │       └── SoundPlayer.java
    +│   │               │   ├── config
    +│   │               │   │   ├── AuditorAwareImpl.java
    +│   │               │   │   ├── JpaAuditingConfig.java
    +│   │               │   │   ├── MultipartFileAccepter.java
    +│   │               │   │   ├── S3Config.java
    +│   │               │   │   ├── SqsConfig.java
    +│   │               │   │   └── SwaggerConfig.java
    +│   │               │   ├── constant
    +│   │               │   │   ├── BatchProcessType.java
    +│   │               │   │   └── MessageType.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── request
    +│   │               │   │   │   └── SqsRequestDto.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── AudioFileInfo.java
    +│   │               │   │       ├── ErrorResponseDto.java
    +│   │               │   │       └── ResponseDto.java
    +│   │               │   ├── entity
    +│   │               │   │   └── BaseEntity.java
    +│   │               │   ├── error
    +│   │               │   │   └── README.md
    +│   │               │   └── exception
    +│   │               │       ├── BusinessException.java
    +│   │               │       ├── DataNotFoundException.java
    +│   │               │       ├── EntityNotFoundException.java
    +│   │               │       ├── ErrorCode.java
    +│   │               │       ├── GlobalExceptionHandler.java
    +│   │               │       ├── InValidValueException.java
    +│   │               │       ├── README.md
    +│   │               │       └── RestGlobalExceptionHandler.java
    +│   │               ├── member
    +│   │               │   ├── config
    +│   │               │   │   ├── LoginAuthenticationFailureHandler.java
    +│   │               │   │   ├── LoginAuthenticationSuccessHandler.java
    +│   │               │   │   ├── MemberConfig.java
    +│   │               │   │   └── MemberSecurityConfig.java
    +│   │               │   ├── controller
    +│   │               │   │   ├── MemberController.java
    +│   │               │   │   ├── MemberTermConditionController.java
    +│   │               │   │   ├── MemberTermsController.java
    +│   │               │   │   ├── TestController.java
    +│   │               │   │   └── advice
    +│   │               │   │       └── MemberExceptionHandler.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── CustomUserDetails.java
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── MemberChangePasswordRequest.java
    +│   │               │   │   │   ├── MemberRegisterRequest.java
    +│   │               │   │   │   ├── MemberRemoveRequest.java
    +│   │               │   │   │   ├── MemberTermCheckOrNotRequest.java
    +│   │               │   │   │   ├── MemberTermConditionRequest.java
    +│   │               │   │   │   ├── MemberTermConditionUpdateRequest.java
    +│   │               │   │   │   ├── MemberTermRequest.java
    +│   │               │   │   │   ├── MemberTermUpdateRequest.java
    +│   │               │   │   │   └── MemberUpdateRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── ErrorResponse.java
    +│   │               │   │       ├── MemberReadResponse.java
    +│   │               │   │       ├── MemberRegisterResponse.java
    +│   │               │   │       ├── MemberResponse.java
    +│   │               │   │       ├── MemberTermConditionResponse.java
    +│   │               │   │       ├── MemberTermConditionResponses.java
    +│   │               │   │       ├── MemberTermResponse.java
    +│   │               │   │       ├── MemberTermResponses.java
    +│   │               │   │       └── MemberTermsDetailResponse.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── Member.java
    +│   │               │   │   ├── MemberCategory.java
    +│   │               │   │   ├── MemberChangeHistory.java
    +│   │               │   │   ├── MemberConnectionHistory.java
    +│   │               │   │   ├── MemberDelete.java
    +│   │               │   │   ├── MemberRoles.java
    +│   │               │   │   ├── MemberRolesCategory.java
    +│   │               │   │   ├── MemberState.java
    +│   │               │   │   ├── MemberTerms.java
    +│   │               │   │   ├── MemberTermsCondition.java
    +│   │               │   │   └── MemberTermsHistory.java
    +│   │               │   ├── exception
    +│   │               │   │   ├── DeletedMemberException.java
    +│   │               │   │   ├── HumanMemberException.java
    +│   │               │   │   ├── MemberDuplicatedEmailException.java
    +│   │               │   │   ├── MemberDuplicatedIdException.java
    +│   │               │   │   ├── MemberDuplicatedPasswordException.java
    +│   │               │   │   ├── MemberInvalidTermConditionException.java
    +│   │               │   │   ├── MemberMandatoryTermNotAgreedException.java
    +│   │               │   │   ├── MemberNotFoundEmailException.java
    +│   │               │   │   ├── MemberNotFoundException.java
    +│   │               │   │   ├── MemberTermInvalidException.java
    +│   │               │   │   ├── MemberTermsConditionNotFoundException.java
    +│   │               │   │   ├── MemberTermsNotFoundException.java
    +│   │               │   │   ├── MemberWrongCountTermCondition.java
    +│   │               │   │   ├── RestrictedMemberException.java
    +│   │               │   │   └── RetryFailedException.java
    +│   │               │   ├── repository
    +│   │               │   │   ├── MemberCategoryRepository.java
    +│   │               │   │   ├── MemberChangeHistoryRepository.java
    +│   │               │   │   ├── MemberConnectionHistoryRepository.java
    +│   │               │   │   ├── MemberDeleteRepository.java
    +│   │               │   │   ├── MemberRepository.java
    +│   │               │   │   ├── MemberStateRepository.java
    +│   │               │   │   ├── MemberTermConditionRepository.java
    +│   │               │   │   ├── MemberTermsHistoryRepository.java
    +│   │               │   │   └── MemberTermsRepository.java
    +│   │               │   └── service
    +│   │               │       ├── MemberServiceImpl.java
    +│   │               │       ├── MemberTermsConditionServiceImpl.java
    +│   │               │       └── MemberTermsServiceImpl.java
    +│   │               ├── project
    +│   │               │   ├── config
    +│   │               │   │   └── README.md
    +│   │               │   ├── controller
    +│   │               │   │   └── ProjectController.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── request
    +│   │               │   │   │   └── ProjectTextRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       └── ProjectResponse.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── Project.java
    +│   │               │   │   └── ProjectStatus.java
    +│   │               │   ├── exception
    +│   │               │   │   ├── InvalidProjectNameException.java
    +│   │               │   │   ├── ProjectExceptionHandler.java
    +│   │               │   │   ├── ProjectNotFoundException.java
    +│   │               │   │   └── projectNotMemberException.java
    +│   │               │   ├── repository
    +│   │               │   │   └── ProjectRepository.java
    +│   │               │   └── service
    +│   │               │       ├── ProjectService.java
    +│   │               │       └── ProjectServiceImpl.java
    +│   │               ├── tts
    +│   │               │   ├── client
    +│   │               │   │   ├── AudioConfigGenerator.java
    +│   │               │   │   ├── GoogleTTSConfig.java
    +│   │               │   │   ├── GoogleTTSService.java
    +│   │               │   │   ├── SynthesisInputGenerator.java
    +│   │               │   │   └── VoiceParamsGenerator.java
    +│   │               │   ├── config
    +│   │               │   │   └── README.md
    +│   │               │   ├── controller
    +│   │               │   │   ├── LanguageController.java
    +│   │               │   │   ├── StyleController.java
    +│   │               │   │   ├── TtsController.java
    +│   │               │   │   └── VoiceController.java
    +│   │               │   ├── dto
    +│   │               │   │   ├── external
    +│   │               │   │   │   ├── TtsMakeRequest.java
    +│   │               │   │   │   ├── TtsMakeResponse.java
    +│   │               │   │   │   └── common
    +│   │               │   │   │       ├── AudioOptionDto.java
    +│   │               │   │   │       ├── TtsSentenceDto.java
    +│   │               │   │   │       └── VoiceDto.java
    +│   │               │   │   ├── request
    +│   │               │   │   │   ├── TtsAttributeInfo.java
    +│   │               │   │   │   ├── TtsAudioFileInfo.java
    +│   │               │   │   │   ├── TtsSentenceBatchInfo.java
    +│   │               │   │   │   ├── TtsSentenceBatchRequest.java
    +│   │               │   │   │   └── TtsSentenceRequest.java
    +│   │               │   │   └── response
    +│   │               │   │       ├── LanguageDto.java
    +│   │               │   │       ├── LanguageListDto.java
    +│   │               │   │       ├── SentenceInfo.java
    +│   │               │   │       ├── StyleDto.java
    +│   │               │   │       ├── StyleListDto.java
    +│   │               │   │       ├── TtsProgressStatusDto.java
    +│   │               │   │       ├── TtsSentenceDto.java
    +│   │               │   │       ├── TtsSentenceListDto.java
    +│   │               │   │       ├── VoiceDto.java
    +│   │               │   │       └── VoiceListDto.java
    +│   │               │   ├── entity
    +│   │               │   │   ├── Language.java
    +│   │               │   │   ├── SampleAudio.java
    +│   │               │   │   ├── ServerCode.java
    +│   │               │   │   ├── Style.java
    +│   │               │   │   ├── TtsAudioFile.java
    +│   │               │   │   ├── TtsProcessHistory.java
    +│   │               │   │   ├── TtsProgressStatus.java
    +│   │               │   │   ├── TtsProgressStatusCode.java
    +│   │               │   │   ├── TtsSentence.java
    +│   │               │   │   └── Voice.java
    +│   │               │   ├── exception
    +│   │               │   │   ├── DuplicatedSentenceException.java
    +│   │               │   │   ├── InValidRequestException.java
    +│   │               │   │   ├── InvalidTTSParamException.java
    +│   │               │   │   ├── ProjectMismatchException.java
    +│   │               │   │   ├── SaveTtsMakeResultException.java
    +│   │               │   │   ├── TtsMakeException.java
    +│   │               │   │   ├── TtsMakeInvalidParamException.java
    +│   │               │   │   ├── TtsSentenceInValidInput.java
    +│   │               │   │   ├── TtsSentenceNotFound.java
    +│   │               │   │   └── VoiceEntityNotFound.java
    +│   │               │   ├── repository
    +│   │               │   │   ├── LanguageRepository.java
    +│   │               │   │   ├── SampleAudioRepository.java
    +│   │               │   │   ├── StyleRepository.java
    +│   │               │   │   ├── TtsAudioFileRepository.java
    +│   │               │   │   ├── TtsProcessHistoryRepository.java
    +│   │               │   │   ├── TtsProgressStatusRepository.java
    +│   │               │   │   ├── TtsSentenceRepository.java
    +│   │               │   │   └── VoiceRepository.java
    +│   │               │   ├── service
    +│   │               │   │   ├── LanguageService.java
    +│   │               │   │   ├── SaveTtsMakeResultService.java
    +│   │               │   │   ├── StyleService.java
    +│   │               │   │   ├── TtsMakeService.java
    +│   │               │   │   ├── TtsSentenceService.java
    +│   │               │   │   ├── TtsSentenceServiceImpl.java
    +│   │               │   │   └── VoiceService.java
    +│   │               │   └── util
    +│   │               │       └── TtsSentenceComparator.java
    +│   │               └── vc
    +│   │                   ├── config
    +│   │                   │   └── README.md
    +│   │                   ├── controller
    +│   │                   │   └── VcController.java
    +│   │                   ├── dto
    +│   │                   │   ├── request
    +│   │                   │   │   ├── VcAudioRequest.java
    +│   │                   │   │   ├── VcRequestHistoryRequest.java
    +│   │                   │   │   ├── VcResultHistoryRequest.java
    +│   │                   │   │   ├── VcResultsRequest.java
    +│   │                   │   │   ├── VcRowRequest.java
    +│   │                   │   │   ├── VcSrcRequest.java
    +│   │                   │   │   ├── VcSrcsRequest.java
    +│   │                   │   │   ├── VcTextRequest.java
    +│   │                   │   │   └── VcUrlRequest.java
    +│   │                   │   └── response
    +│   │                   │       ├── VcActivateResponse.java
    +│   │                   │       ├── VcResponse.java
    +│   │                   │       ├── VcRowResponse.java
    +│   │                   │       ├── VcTextResponse.java
    +│   │                   │       └── VcUrlResponse.java
    +│   │                   ├── entity
    +│   │                   │   ├── Vc.java
    +│   │                   │   ├── VcRequestHistory.java
    +│   │                   │   ├── VcResultFile.java
    +│   │                   │   ├── VcResultHistory.java
    +│   │                   │   ├── VcSrcFile.java
    +│   │                   │   ├── VcText.java
    +│   │                   │   └── VcTrgFile.java
    +│   │                   ├── exception
    +│   │                   │   ├── VcAPIFilesIsEmptyException.java
    +│   │                   │   ├── VcExceptionHandler.java
    +│   │                   │   └── VcNotMemberException.java
    +│   │                   ├── repository
    +│   │                   │   ├── VcRepository.java
    +│   │                   │   ├── VcRequestHistoryRepository.java
    +│   │                   │   ├── VcResultFileRepository.java
    +│   │                   │   ├── VcResultHistoryRepository.java
    +│   │                   │   ├── VcSrcFileRepository.java
    +│   │                   │   ├── VcTextRepository.java
    +│   │                   │   └── VcTrgFileRepository.java
    +│   │                   └── service
    +│   │                       ├── VcApiService.java
    +│   │                       ├── VcApiServiceImpl.java
    +│   │                       ├── VcHistoryService.java
    +│   │                       ├── VcHistoryServiceImpl.java
    +│   │                       ├── VcService.java
    +│   │                       └── VcServiceImpl.java
    +│   └── resources
    +│       ├── application-ndb-test.properties
    +│       ├── application-test.properties
    +│       ├── application.properties
    +│       └── tts.json
    +└── test
    +    └── java
    +        └── com
    +            └── oreo
    +                └── finalproject_5re5_be
    +                    ├── FinalProject5Re5BeApplicationTests.java
    +                    ├── audio
    +                    │   ├── AudioExtensionCheckerTest.java
    +                    │   ├── AudioExtensionConverterTest.java
    +                    │   ├── AudioExtensionsTest.java
    +                    │   ├── AudioResampleTest.java
    +                    │   ├── BeepMakerTest.java
    +                    │   ├── MonoConcatenatorTest.java
    +                    │   ├── MonoIntervalConcatenatorTest.java
    +                    │   ├── SoundPlayerTest.java
    +                    │   ├── StereoConcatenatorTest.java
    +                    │   ├── StereoIntervalConcatenatorTest.java
    +                    │   └── service
    +                    │       └── AudioInfoTest.java
    +                    ├── concat
    +                    │   ├── repository
    +                    │   │   └── MaterialAudioRepositoryTest.java
    +                    │   └── service
    +                    │       └── ConcatTabServiceTest.java
    +                    ├── member
    +                    │   ├── config
    +                    │   │   ├── LoginAuthenticationSuccessHandlerTest.java
    +                    │   │   └── MemberSecurityConfigTest.java
    +                    │   ├── controller
    +                    │   │   ├── CodeControllerTest.java
    +                    │   │   ├── MemberControllerTest.java
    +                    │   │   ├── MemberTermConditionControllerTest.java
    +                    │   │   └── MemberTermsControllerTest.java
    +                    │   ├── repository
    +                    │   │   ├── CodeRepositoryTest.java
    +                    │   │   ├── MemberChangeHistoryRepositoryTest.java
    +                    │   │   ├── MemberRepositoryTest.java
    +                    │   │   ├── MemberTermConditionRepositoryTest.java
    +                    │   │   └── MemberTermsRepositoryTest.java
    +                    │   └── service
    +                    │       ├── CodeServiceImplTest.java
    +                    │       ├── MemberServiceImplTest.java
    +                    │       ├── MemberServiceImplTestByMock.java
    +                    │       ├── MemberTermsConditionServiceImplTest.java
    +                    │       └── MemberTermsServiceImplTest.java
    +                    ├── project
    +                    │   └── service
    +                    │       └── ProjectServiceImplTest.java
    +                    ├── tts
    +                    │   ├── client
    +                    │   │   └── GoogleTTSServiceTest.java
    +                    │   ├── controller
    +                    │   │   ├── LanguageControllerTest.java
    +                    │   │   ├── StyleControllerTest.java
    +                    │   │   ├── VoiceControllerTest.java
    +                    │   │   └── ttsController
    +                    │   │       ├── TestGetSentence.java
    +                    │   │       ├── TestGetSentenceList.java
    +                    │   │       ├── TestMakeTts.java
    +                    │   │       ├── TestRegisterSentence.java
    +                    │   │       └── TestUpdateSentence.java
    +                    │   ├── repository
    +                    │   │   ├── LanguageRepositoryTest.java
    +                    │   │   ├── SampleAudioRepositoryTest.java
    +                    │   │   ├── StyleRepositoryTest.java
    +                    │   │   ├── TtsAudioFileRepositoryTest.java
    +                    │   │   ├── TtsProcessHistoryRepositoryTest.java
    +                    │   │   ├── TtsProgressStatusRepositoryTest.java
    +                    │   │   ├── TtsSentenceRepositoryTest.java
    +                    │   │   ├── VoiceRepositoryFindTest.java
    +                    │   │   └── VoiceRepositoryTest.java
    +                    │   └── service
    +                    │       ├── LanguageServiceTest.java
    +                    │       ├── SaveTtsMakeResultTest.java
    +                    │       ├── StyleServiceTest.java
    +                    │       ├── TtsMakeServiceTest.java
    +                    │       ├── VoiceServiceTest.java
    +                    │       └── ttsSentenceService
    +                    │           ├── TestAddSentence.java
    +                    │           ├── TestBatchSave.java
    +                    │           ├── TestGetSentence.java
    +                    │           ├── TestGetSentenceList.java
    +                    │           ├── TestPatchSentenceOrder.java
    +                    │           └── TestUpdateSentence.java
    +                    └── vc
    +                        ├── controller
    +                        │   └── VcControllerTest.java
    +                        ├── repository
    +                        │   └── VcSrcFileRepositoryTest.java
    +                        └── service
    +                            ├── VcApiServiceImplTest.java
    +                            └── VcServiceImplTest.java
     
     
    From 80ec1531072a029b010cd38afeb2ab66d04adc9f Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:24:26 +0900 Subject: [PATCH 096/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A1=9C=20ToString=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/project/entity/Project.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java index e973fc9f..1c53d5e1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java @@ -18,7 +18,6 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @EqualsAndHashCode(callSuper = false) -@ToString public class Project extends BaseEntity { @Id From 28814f86e940e36cfb964a9ca2b6acfb5e4e7688 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:25:28 +0900 Subject: [PATCH 097/167] =?UTF-8?q?[Feat]=20:=20=EC=95=A4=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20FetchType=20LAZY=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/concat/entity/ConcatTab.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java index a832df57..7d104c49 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java @@ -7,7 +7,6 @@ import java.util.List; -@ToString @Getter @Builder @NoArgsConstructor @@ -18,7 +17,7 @@ public class ConcatTab extends BaseEntity { private Long projectId; @MapsId // Project 엔티티의 ID를 ConcatTab의 ID로 사용 - @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) + @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) @JoinColumn(name = "pro_seq") private Project project; @@ -28,8 +27,9 @@ public class ConcatTab extends BaseEntity { @Column(name = "front_silence") private Float frontSilence; + @ToString.Exclude // 하나의 ConcatTab에 여러 bgmFile들 매칭 - @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.EAGER) + @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.LAZY) private List bgmFiles; From d7b12e1f911f0ef9442baa859c5b8694537f0e78 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:26:41 +0900 Subject: [PATCH 098/167] =?UTF-8?q?[Feat]=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=95=84=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/dto/request/ConcatRowRequestDto.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java index 82d6ce47..e7a34e7c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java @@ -14,8 +14,6 @@ public class ConcatRowRequestDto { @NotNull private Long concatTabId; @NotNull - private Long memberSeq; - @NotNull private String fileName; @NotNull private List concatRowRequests; From eff54708f0078475657e04c5b9b9190540fc6f1a Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:27:07 +0900 Subject: [PATCH 099/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A1=9C=20ToString=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java index 4294bf39..5103defe 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java @@ -4,7 +4,6 @@ import jakarta.persistence.*; import lombok.*; -@ToString @Getter @Builder @AllArgsConstructor From acf16beaaf65c7b44ee5d66bfa3ac40635df6039 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:28:47 +0900 Subject: [PATCH 100/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A5=BC=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=99=B8=EB=9E=98?= =?UTF-8?q?=ED=82=A4=20=EB=A7=A4=ED=95=91=20ToString=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oreo/finalproject_5re5_be/concat/entity/ConcatResult.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java index f8f0fffc..c69cde3b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java @@ -24,6 +24,7 @@ public class ConcatResult extends BaseEntity { @JoinColumn(name = "pro_seq") private ConcatTab concatTab; + @ToString.Exclude @OneToMany(mappedBy = "concatResult", cascade = CascadeType.ALL, orphanRemoval = true) private List bgmFiles = new ArrayList<>(); From 4a3155caddb0bc2b7e27e4f1382e5ce223170939 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:29:33 +0900 Subject: [PATCH 101/167] =?UTF-8?q?[Fix]=20:=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EC=9D=B4=EC=8A=88=EB=A5=BC=20=EB=B0=A9=EC=A7=80?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=EC=99=B8=EB=9E=98?= =?UTF-8?q?=ED=82=A4=20=EB=A7=A4=ED=95=91=20ToString=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java index 01964ad5..a8c8466c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java @@ -8,7 +8,6 @@ import java.time.LocalDateTime; -@ToString @Getter @Builder @AllArgsConstructor @@ -21,10 +20,12 @@ public class BgmFile extends BaseEntity { @Column(name = "bgm_file_seq") private Long bgmFileSeq; + @ToString.Exclude @ManyToOne @JoinColumn(name = "concat_tab_seq") // 외래 키: concat_tab의 ID private ConcatTab concatTab; + @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "concat_result_seq", nullable = true) private ConcatResult concatResult; From 6f6b6e204790e339dba21d53906a256a53f9e0e7 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:30:25 +0900 Subject: [PATCH 102/167] =?UTF-8?q?[Feat]=20:=20=EB=A0=88=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EB=B9=88=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/config/RestTemplateConfig.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java new file mode 100644 index 00000000..4ce37423 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.oreo.finalproject_5re5_be.concat.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} From 838861da553d4a733289b0a4028f9addfb43698b Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:34:04 +0900 Subject: [PATCH 103/167] =?UTF-8?q?[Feat]=20:=20=EB=9E=8C=EB=8B=A4=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=EC=9A=A9=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/dto/lambda/AudioFormatDto.java | 40 +++++++++++++ .../dto/lambda/LambdaConcatRequest.java | 59 +++++++++++++++++++ .../concat/dto/lambda/response/AudioInfo.java | 48 +++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java new file mode 100644 index 00000000..758af81c --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java @@ -0,0 +1,40 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda; + +import lombok.Getter; +import lombok.Setter; + +import javax.sound.sampled.AudioFormat; + +@Getter +@Setter +public class AudioFormatDto { + private Float sampleRate; + private Integer bitDepth; + private Integer channels; + private Integer frameSize; + private Float frameRate; + + public AudioFormatDto() { + } + + public AudioFormatDto(AudioFormat audioFormat) { + this.sampleRate = audioFormat.getSampleRate(); + this.bitDepth = audioFormat.getSampleSizeInBits(); + this.channels = audioFormat.getChannels(); + this.frameSize = audioFormat.getFrameSize(); + this.frameRate = audioFormat.getFrameRate(); + } + + public AudioFormatDto(Float sampleRate, Integer bitDepth, Integer channels, Integer frameSize, Float frameRate) { + this.sampleRate = sampleRate; + this.bitDepth = bitDepth; + this.channels = channels; + this.frameSize = frameSize; + this.frameRate = frameRate; + } + + public AudioFormat toAudioFormat() { + return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, + sampleRate, bitDepth, channels, frameSize, frameRate, false); + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java new file mode 100644 index 00000000..c32521e3 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java @@ -0,0 +1,59 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda; + +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; +import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; +import lombok.Builder; + +import java.util.List; + +@Builder +public class LambdaConcatRequest { + private ConcatTabResponseDto concatTabResponseDto; + private AudioFormatDto audioFormatDto; + private List audios; + private String fileName; + + public LambdaConcatRequest() { + } + + public LambdaConcatRequest(ConcatTabResponseDto concatTabResponseDto, AudioFormatDto audioFormatDto, + List audios, String fileName) { + this.concatTabResponseDto = concatTabResponseDto; + this.audioFormatDto = audioFormatDto; + this.audios = audios; + this.fileName = fileName; + } + + public List getAudios() { + return audios; + } + + public void setAudios(List audios) { + this.audios = audios; + } + + public AudioFormatDto getAudioFormatDto() { + return audioFormatDto; + } + + public void setAudioFormatDto(AudioFormatDto audioFormatDto) { + this.audioFormatDto = audioFormatDto; + } + + public ConcatTabResponseDto getConcatTabResponseDto() { + return concatTabResponseDto; + } + + public void setConcatTabResponseDto(ConcatTabResponseDto concatTabResponseDto) { + this.concatTabResponseDto = concatTabResponseDto; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java new file mode 100644 index 00000000..8014b5c7 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java @@ -0,0 +1,48 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda.response; + + +import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.sound.sampled.AudioInputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +@Getter +@Setter +@NoArgsConstructor +public class AudioInfo { + private byte[] audioData; + private String fileName; + private float contentLength; + private String contentType; + + public AudioInfo(AudioInputStream audioData, String fileName, float contentLength, String contentType) { + this.audioData = AudioExtensionConverter.mp3ToWav(audioData); + this.fileName = fileName; + this.contentLength = contentLength; + this.contentType = contentType; + } + + private byte[] getAudioBytes(AudioInputStream audioStream) { + + try { + return audioStream.readAllBytes(); + } catch (IOException e) { + throw new RuntimeException("오디오 변환 실패", e); + } + } + + public Long getContentSize() { + return (long) audioData.length; + } + + + + public InputStream toInputStream() { + return new ByteArrayInputStream(audioData); + } +} From 59023b44999926849828bdaf75d95a0842254ceb Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:34:29 +0900 Subject: [PATCH 104/167] =?UTF-8?q?[Feat]=20:=20=EB=9E=8C=EB=8B=A4=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=EC=9A=A9=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/LambdaConcatResultDto.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java new file mode 100644 index 00000000..85c045f1 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java @@ -0,0 +1,48 @@ +package com.oreo.finalproject_5re5_be.concat.dto.lambda.response; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class LambdaConcatResultDto { + private final AudioInfo info; + private final List processed; + private final String s3Url; + private final String contentType; + private final String processId; + private final int i; + + @JsonCreator + public LambdaConcatResultDto( + @JsonProperty("info") AudioInfo info, + @JsonProperty("processed") List processed, + @JsonProperty("s3Url") String s3Url, + @JsonProperty("contentType") String contentType, + @JsonProperty("processId") String processId, + @JsonProperty("i") int i + ) { + this.info = info; + this.processed = processed; + this.s3Url = s3Url; + this.contentType = contentType; + this.processId = processId; + this.i = i; + } + + @Override + public String toString() { + return "LambdaConcatResultDto{" + + ", processed=" + processed + + ", s3Url='" + s3Url + '\'' + + ", contentType='" + contentType + '\'' + + ", processId='" + processId + '\'' + + ", i=" + i + + '}'; + } +} From 6d5a48cbdc6383a2c175d431397982aac33ec4ca Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:37:23 +0900 Subject: [PATCH 105/167] =?UTF-8?q?[Feat]=20:=20=EB=9E=8C=EB=8B=A4=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=84=9C=EB=B9=84=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/lambda/LambdaConcatService.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java new file mode 100644 index 00000000..7873d36a --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java @@ -0,0 +1,122 @@ +package com.oreo.finalproject_5re5_be.concat.service.lambda; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.oreo.finalproject_5re5_be.concat.dto.ConcatResultDto; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.AudioFormatDto; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.LambdaConcatRequest; +import com.oreo.finalproject_5re5_be.concat.dto.lambda.response.LambdaConcatResultDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequestDto; +import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; +import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; +import com.oreo.finalproject_5re5_be.concat.entity.MaterialAudio; +import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; +import com.oreo.finalproject_5re5_be.concat.service.MaterialAudioService; +import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class LambdaConcatService { + + private final ConcatResultService concatResultService; + private final MaterialAudioService materialAudioService; + private final RestTemplate restTemplate; + + //S3 저장까지 완료된 상태 + //해야하는거 + //재료 오디오 DB 저장 + //결과 오디오 DB 저장 + //병합 결과 반환 + public List concatOnLambda(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto audioRequests) { + LambdaConcatRequest lambdaConcatRequest = LambdaConcatRequest.builder() + .concatTabResponseDto(concatTabResponseDto) + .audioFormatDto(new AudioFormatDto(AudioFormats.STEREO_FORMAT_SR441_B16)) + .audios(audioRequests.getConcatRowRequests()) + .fileName(audioRequests.getFileName()) + .build(); + + List list = lambdaConcatRequest(lambdaConcatRequest); + + List concatResults = getConcatResults(concatTabResponseDto, list); + + return getConcatResultDtos(concatResults); + } + + private static List getConcatResultDtos(List concatResults) { + return concatResults.stream().map(concatResult -> + ConcatResultDto.builder() + .concatResultSequence(concatResult.getConcatResultSequence()) + .audioUrl(concatResult.getAudioUrl()) + .fileName(concatResult.getFileName()) + .fileLength(concatResult.getFileLength()) + .fileSize(concatResult.getFileSize()) + .extension(concatResult.getExtension()) + .build()).toList(); + } + + private List lambdaConcatRequest(LambdaConcatRequest lambdaConcatRequest) { + Object response = restTemplate.postForObject( + "https://bewpsh81xa.execute-api.ap-northeast-2.amazonaws.com/default/Test", // Lambda URL + lambdaConcatRequest, + Object.class + ); + + if (response == null) { + throw new IllegalArgumentException("오디오 병합 실패 : 반환값이 없습니다."); + } + +// ObjectMapper를 사용해 JSON을 List로 변환 + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.convertValue(response, new TypeReference<>() { + }); + } + + private List getConcatResults(ConcatTabResponseDto concatTabResponseDto, List list) { + //재료 오디오와 결과 저장 + /* + * 결과가 여러개로 나눠져 올 가능성 있음 + * 결과 하나당 재료 오디오 여러개 + * List 하나는 나눠져 온 결과 오디오 하나를 변환 한 값 + * */ + List concatResults = new ArrayList<>(); + List> materials = list.stream().map(result -> { + ConcatResult concatResult = of(result, concatTabResponseDto); + concatResults.add(concatResult); + List processed = result.getProcessed(); + return processed.stream().map(process -> MaterialAudio.builder() + .concatResult(concatResult) + .audioFile(AudioFile.builder().audioFileSeq(process.getSeq()).build()) + .method("NORMAL").build()).toList(); + + }).toList(); + + materials.forEach(materialAudioService::saveMaterialAudio); + return concatResults; + } + + public ConcatResult of(LambdaConcatResultDto concatResult, ConcatTabResponseDto concatTabResponseDto) { + ConcatResult build = ConcatResult.builder() + .concatTab(ConcatTab + .builder() + .projectId(concatTabResponseDto.getTabId()) + .build()) + .fileName(concatResult.getInfo().getFileName()) + .extension(concatResult.getInfo().getContentType()) + .fileSize(concatResult.getInfo().getContentSize()) + .fileLength(concatResult.getInfo().getContentLength()) + .audioUrl(concatResult.getS3Url()) + .build(); + return concatResultService.saveConcatResult(build); + + } + +} From 43f062c8a87a818dc3827d17d3e14a25607c1b5f Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:38:04 +0900 Subject: [PATCH 106/167] =?UTF-8?q?[Refactor]=20:=20=EC=98=A4=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EB=B3=80=ED=99=98=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EB=8F=99=EC=9D=BC=ED=95=9C=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../audio/AudioExtensionConverter.java | 41 ++++++------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java index d49fb67d..f7cff57b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java @@ -8,44 +8,29 @@ public class AudioExtensionConverter { private static final int DEFAULT_BIT_DEPTH = 16; - public static byte[] mp3ToWav(File file) throws UnsupportedAudioFileException, IOException { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);// 파일을 AudioInputStream으로 읽기 - + public static byte[] mp3ToWav(AudioInputStream audioInputStream) { AudioFormat baseFormat = audioInputStream.getFormat();// WAV 포맷으로 변환할 대상 포맷 설정 AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); + try { + AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 - - return wavOutputStream.toByteArray();// 바이트 배열 반환 + ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray + AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 + return wavOutputStream.toByteArray();// 바이트 배열 반환 + } catch (IOException e) { + throw new RuntimeException("오디오 변환에 문제가 발생 했습니다." ,e); + } } - public static byte[] mp3ToWav(AudioInputStream audioInputStream) throws IOException { - AudioFormat baseFormat = audioInputStream.getFormat();// WAV 포맷으로 변환할 대상 포맷 설정 - AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 - - return wavOutputStream.toByteArray();// 바이트 배열 반환 - + public static byte[] mp3ToWav(File file) throws UnsupportedAudioFileException, IOException { + AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);// 파일을 AudioInputStream으로 읽기 + return mp3ToWav(audioInputStream); } public static byte[] mp3ToWav(InputStream inputStream) throws UnsupportedAudioFileException, IOException { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputStream);// 파일을 AudioInputStream으로 읽기 - - AudioFormat baseFormat = audioInputStream.getFormat();// WAV 포맷으로 변환할 대상 포맷 설정 - AudioFormat decodedFormat = getDecodedFormat(baseFormat); - AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 - - return wavOutputStream.toByteArray();// 바이트 배열 반환 - + return mp3ToWav(audioInputStream); } private static AudioFormat getDecodedFormat(AudioFormat baseFormat) { From ecba4318baf809979c2d23762562f5d96b580ef6 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 14:38:24 +0900 Subject: [PATCH 107/167] =?UTF-8?q?[Feat]=20:=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=EA=B0=80=20=EB=9E=8C=EB=8B=A4=EB=A5=BC=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/controller/ConcatController.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java index 8c758a29..4706a7f7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java @@ -5,8 +5,8 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; -import com.oreo.finalproject_5re5_be.concat.service.ConcatService; import com.oreo.finalproject_5re5_be.concat.service.ConcatTabService; +import com.oreo.finalproject_5re5_be.concat.service.lambda.LambdaConcatService; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.project.service.ProjectService; @@ -21,13 +21,14 @@ import java.io.IOException; import java.util.List; import java.util.NoSuchElementException; +import java.util.concurrent.ExecutionException; @Tag(name = "Concat", description = "Concat 관련 API") @RestController @RequiredArgsConstructor @RequestMapping("api/concat") public class ConcatController { - private final ConcatService concatService; + private final LambdaConcatService lambdaConcatService; private final ConcatTabService concatTabService; private final ConcatResultService concatResultService; private final ProjectService projectService; @@ -37,16 +38,31 @@ public class ConcatController { description = "병합이 성공 했다면 저장된 오디오 정보를 반환합니다." ) @PostMapping("") - public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, - @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { + public ResponseEntity>> concat(@RequestBody ConcatRowRequestDto audioRequests, + @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException, ExecutionException, InterruptedException { projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); ConcatTabResponseDto concatTabResponseDto = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); - ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); - return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); + + List concatResult = lambdaConcatService.concatOnLambda(concatTabResponseDto, audioRequests); + + return new ResponseDto<>(HttpStatus.OK.value(), concatResult).toResponseEntity(); } +// @PostMapping("") +// public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, +// @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { +// projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); +// +// ConcatTabResponseDto concatTabResponseDto +// = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); +// ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); +// return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); +// } + + + @Operation( summary = "오디오 결과 목록 불러오기", description = "프로젝트 번호에 해당하는 오디오 결과 목록을 반환합니다." From 7a7a53f00ef59ac2309980e4f7c37508f61abdaf Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:20:45 +0900 Subject: [PATCH 108/167] =?UTF-8?q?[fix]=20Url=EB=A1=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=98=EA=B3=A0=201=EA=B0=9C=EB=A7=8C=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=20=EC=BF=BC=EB=A6=AC=EB=A5=BC=20seq?= =?UTF-8?q?=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=ED=95=B4=EC=84=9C=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EB=8A=94=20=EC=BF=BC=EB=A6=AC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/repository/AudioFileRepository.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java index f2667e58..aa298613 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java @@ -64,7 +64,9 @@ public interface AudioFileRepository extends JpaRepository { " AND cr.status = 'Y'") List findAudioFileByProjectSeq(@Param("proSeq") Long projectSeq); - @Query(value = "SELECT * FROM audio_file WHERE audio_url = :audioUrl ORDER BY audio_file_seq ASC LIMIT 1", nativeQuery = true) - Optional findFirstByAudioUrlNative(String audioUrl); + @Query(value = "SELECT * FROM audio_file WHERE audio_file_seq = :audioFileSeq ", nativeQuery = true) + Optional findByAudioFileSeq(Long audioFileSeq); + + } From 7cfd5bea08ce85b6f5f3ac2ee72931aea4c6685e Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:43:41 +0900 Subject: [PATCH 109/167] =?UTF-8?q?[fix]=20findFirstByAudioUrlNative=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=8B=AC?= =?UTF-8?q?=EB=9D=BC=EC=A7=80=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/AudioFileService.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java index 78a0ce8b..0d49bed7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java @@ -54,16 +54,9 @@ public List getAudioFilesByProjectAndStatusTrue(Long projectSeq } // audioFile Url로 audioFile 정보 조회 (1개) - public AudioFile getAudioFileByUrl(String audioUrl) { - return audioFileRepository.findFirstByAudioUrlNative(audioUrl) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioUrl)); - } - - // audioFile Url로 audioFileSeq 정보 조회 (N개) - public List getAudioFileSeqsByUrls(List audioUrls) { - return audioUrls.stream() - .map(url -> getAudioFileByUrl(url).getAudioFileSeq()) // URL로 AudioFile 조회 후 Seq 추출 - .toList(); + public AudioFile getAudioFileByUrl(Long audioSeq) { + return audioFileRepository.findByAudioFileSeq(audioSeq) + .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioSeq)); } // audioFile Name으로 audioFile 정보 조회 (1개) From 09e98cc83b182da31184ee792943637a2c104f1f Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:45:02 +0900 Subject: [PATCH 110/167] =?UTF-8?q?[fix]=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20log=EB=93=A4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcatWithBgmController.java | 72 ++++--------------- .../concat/service/AudioStreamService.java | 10 +-- .../concat/service/ConcatTabService.java | 2 +- 3 files changed, 14 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index a25a3cee..55acfec3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -4,7 +4,6 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.*; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; -import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.service.*; import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; @@ -91,106 +90,61 @@ public ResponseEntity> executeConcatWithBgm( float frontSilence = concatTab.getFrontSilence(); String bgmFileUrl = concatTab.getBgmFileList().get(0).getAudioUrl(); + log.info("concatTab:{}",concatTabSeq); + projectService.projectCheck(customUserDetails.getMember().getSeq(), requestDto.getConcatTab().getTabId()); IntervalConcatenator intervalConcatenator = new StereoIntervalConcatenator(defaultAudioFormat); - // Concat 작업: 1. Row 오디오 파일 로드 및 무음 처리 -// List audioProperties = audioStreamService.loadAudioFiles(selectedRows); - List audioProperties = audioStreamService.loadAudioFiles(concatRows); - - log.info("[BGM] Row Concat 작업 1: AudioProperties 로드 성공: {}", audioProperties); - // 2. 병합된 오디오 생성 ByteArrayOutputStream concatenatedAudioBuffer = intervalConcatenator.intervalConcatenate(audioProperties, frontSilence); - log.info("[BGM] Row Concat 작업 2: AudioProperties와 initialSilence로 IntervalConcatenate 성공. ByteArrayOutputStream Buffer 사이즈: {}", concatenatedAudioBuffer.size()); - AudioInputStream concatenatedAudioStream = audioStreamService.createAudioInputStream(concatenatedAudioBuffer, defaultAudioFormat); - log.info("[BGM] Row Concat 작업 3: buffer로 AudioInputStream 변환 성공. Frame Length: {}", concatenatedAudioStream.getFrameLength()); - // BGM 작업 1: BGM 스트림 로드 및 버퍼링 AudioInputStream bufferedBgmStream = audioStreamService.loadAsBufferedStream(bgmFileUrl); - log.info("[BGM] BGM 파일 loadASBufferedStream 성공. Frame Length: {}", bufferedBgmStream.getFrameLength()); - // 3. BGM 길이 조정 long targetFrames = audioStreamService.getValidFrameLength(concatenatedAudioStream); long bgmFrames = audioStreamService.getValidFrameLength(bufferedBgmStream); // 로그 추가: 프레임 길이 확인 - log.info("[BGM] Concatenated Audio Frames: {}", targetFrames); - log.info("[BGM] Original BGM Frames: {}", bgmFrames); bufferedBgmStream = BgmProcessor.adjustBgmLength(bufferedBgmStream, targetFrames, bgmFrames); - log.info("BGM 길이 조정 성공"); - // 4. 믹싱 AudioInputStream mixedAudioStream = BgmProcessor.mixAudio(concatenatedAudioStream, bufferedBgmStream); - log.info("오디오 믹싱 성공"); - // 결과파일 S3 업로드 String resultAudioUrl = s3Service.uploadAudioStream(mixedAudioStream, "concat/result", concatResultFileName); - log.info("S3 업로드 성공: {}", resultAudioUrl); - - log.info("Saving ConcatResult to database with tabSeq: {}, result URL: {}, file name: {}", concatTabSeq, resultAudioUrl, concatResultFileName); - - // DB에 결과파일, bgm파일, row에 들어가는 audio파일, row, materials 에 정보들을 넣어야한다. - // DB ConcatResult테이블에 결과 저장 + // DB 저장1. ConcatResult DB ConcatUrlResponse concatResultResponse = concatResultService.saveConcatResult(concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); - log.info("ConcatResult 저장 성공: {}", concatResultResponse); - - log.info("Fetching BGM AudioFile information from requestDto"); OriginAudioRequest bgmRequest = concatTab.getBgmFileList().get(0); - log.info("BGM information from requestDto: {}", bgmRequest); - - // BGM 파일 정보를 DB에 저장 - BgmFile bgmAudioFile = bgmFileService.saveBgmFile( - BgmFile.builder() - .audioUrl(bgmRequest.getAudioUrl()) - .extension(bgmRequest.getExtension()) - .fileSize(bgmRequest.getFileSize()) - .fileLength(bgmRequest.getFileLength()) - .fileName(bgmRequest.getFileName()) - .build() - ); - - log.info("Saved BGM AudioFile in DB: {}", bgmAudioFile); - - log.info("Saving Material data for provided rows and concat result"); + // BGM 데이터와 ConcatResult 매칭 업데이트 + try { + bgmFileService.updateBgmFileWithConcatResult(bgmFileUrl, concatResultResponse.getSeq()); + } catch (IllegalArgumentException e) { + log.warn("[BGM] Failed to update BgmFile: {}", e.getMessage()); + } - // Material 데이터 저장 (재료 파일, 결과파일 저장되어 있는 상태로 교차테이블에 데이터 저장) + // DB 저장2. Material 데이터 저장 (재료 파일, 결과파일 저장되어 있는 상태로 교차테이블에 데이터 저장) materialAudioService.saveMaterialsForConcatRows(concatRows, concatResultResponse); - log.info("Material data saved successfully"); - - log.info("Fetching AudioFile for each row in concatRows"); - - // Concat 재료 파일 정보 생성 + // 응답에 들어갈 concatRowFiles 생성 List concatRowFiles = concatRows.getConcatRowRequests().stream() .map(row -> { - log.info("Fetching AudioFile for URL: {}", row.getOriginAudioRequest()); - AudioFile audioFile = audioFileService.getAudioFileByUrl(row.getOriginAudioRequest().getAudioUrl()); - log.info("Fetched AudioFile: {}", audioFile); + AudioFile audioFile = audioFileService.getAudioFileByUrl(row.getOriginAudioRequest().getSeq()); return audioFile; }) .map(this::convertToOriginAudioRequest) .peek(originAudioRequest -> log.info("Converted to OriginAudioRequest: {}", originAudioRequest)) .toList(); - log.info("Generated ConcatRowFiles: {}", concatRowFiles); - - log.info("Creating final response with result URL: {}, BGM file: {}, ConcatRow files: {}", - resultAudioUrl, bgmRequest.getAudioUrl(), concatRowFiles); - // 응답 생성 ConcatResponseDto responseDto = ConcatResponseDto.builder() .audioUrl(resultAudioUrl) @@ -198,8 +152,6 @@ public ResponseEntity> executeConcatWithBgm( .concatRowFiles(concatRowFiles) .build(); - log.info("Created final response: {}", responseDto); - return new ResponseDto<>(HttpStatus.OK.value(), responseDto).toResponseEntity(); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java index 5862cc0a..8cb8c1b1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java @@ -52,10 +52,9 @@ public List loadAudioFiles(ConcatRowSaveRequestDto selectedRows List audioPropertiesList = new ArrayList<>(); for (ConcatRowRequest row : selectedRows.getConcatRowRequests()) { OriginAudioRequest originAudio = row.getOriginAudioRequest(); - log.info("[loadAudioFiles] SelectedConcatRowRequest의 Row에 박혀있는 URL: {}", originAudio.getAudioUrl()); + try { AudioInputStream audioStream = S3Service.load(originAudio.getAudioUrl()); - log.info("[loadAudioFiles] S3에서 오디오 파일 load 완료: "); // 리샘플링 처리 audioStream = audioResample.formatting(audioStream); // 리샘플링 처리 @@ -77,14 +76,11 @@ public AudioInputStream loadAsBufferedStream(String s3Url) { try { URL url = new URL(s3Url); - log.info("[loadAsBufferedStream] BGM으로 쓰일 S3 URL: {}", s3Url); - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); log.info("[loadAsBufferedStream] AudioInputStream 가져오기 성공. Format: {}", audioInputStream.getFormat()); // mp3 -> WAV 변환 byte[] wavData = AudioExtensionConverter.mp3ToWav(audioInputStream); - log.info("[loadAsBufferedStream] mp3ToWAV 변환 성공. Data Size: {} bytes", wavData.length); // Target Format으로 변환 (formatting) AudioInputStream wavStream = new AudioInputStream(new ByteArrayInputStream(wavData), defaultAudioFormat, wavData.length / defaultAudioFormat.getFrameSize()); @@ -94,11 +90,9 @@ public AudioInputStream loadAsBufferedStream(String s3Url) { // 데이터를 메모리에 버퍼링 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); AudioSystem.write(formattedStream, AudioFileFormat.Type.WAVE, buffer); - log.info("[loadASBufferedStream] AudioInputStream 데이터를 ByteArrayOutputStream으로 버퍼링 성공. 크기: {} bytes", buffer.size()); byte[] bufferedData = buffer.toByteArray(); AudioFormat format = formattedStream.getFormat(); - log.info("[loadASBufferedStream] Buffered Data 생성 성공. 총 길이: {} bytes, FrameSize: {}", bufferedData.length, format.getFrameSize()); AudioInputStream bufferedStream = new AudioInputStream( new ByteArrayInputStream(bufferedData), @@ -106,8 +100,6 @@ public AudioInputStream loadAsBufferedStream(String s3Url) { bufferedData.length / format.getFrameSize() ); - log.info("[loadAsBufferedStream] Buffered AudioInputStream 생성 성공. Frame Length: {}", bufferedStream.getFrameLength()); - return bufferedStream; } catch (MalformedURLException e) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index 2c5e427b..7358ce44 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -157,7 +157,7 @@ public boolean updateBgmAudioFiles(Long tabSeq, List bgmFileSeqs) { return true; } - // + @Transactional public ConcatTab getConcatTabBySeq(Long tabSeq) { return concatTabRepository.findById(tabSeq) From 2fe2a8653534ee09d47d574445758a2f733f5117 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:45:43 +0900 Subject: [PATCH 111/167] =?UTF-8?q?[fix]=20findFirstByAudioUrlNative=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=8B=AC?= =?UTF-8?q?=EB=9D=BC=EC=A7=80=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/MaterialAudioService.java | 57 ++++++++++++++----- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java index 62e46a43..86c7f7d1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java @@ -3,7 +3,6 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; -import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; import com.oreo.finalproject_5re5_be.concat.entity.*; import com.oreo.finalproject_5re5_be.concat.repository.AudioFileRepository; @@ -11,11 +10,13 @@ import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; import com.oreo.finalproject_5re5_be.concat.repository.MaterialAudioRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; +@Log4j2 @RequiredArgsConstructor @Service public class MaterialAudioService { @@ -77,18 +78,14 @@ public MaterialAudio saveMaterial(Long concatResultSeq, Long audioFileSeq) { // 1개의 concatResult와 그에 매칭되는 여러개의 AudioFile을 저장 (N개) - public List saveMaterials(Long concatResultSeq, List audioFileSeqs) { + public List saveMaterials(Long concatResultSeq, List audioFiles) { // ConcatResult 조회 ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with id: " + concatResultSeq)); // AudioFileSeq를 하나씩 처리하여 MaterialAudio 생성 및 저장 - return audioFileSeqs.stream() - .map(audioFileSeq -> { - // AudioFile 조회 - AudioFile audioFile = audioFileRepository.findById(audioFileSeq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with id: " + audioFileSeq)); - + return audioFiles.stream() + .map(audioFile -> { // MaterialAudio 생성 MaterialAudio materialAudio = MaterialAudio.builder() .concatResult(concatResult) @@ -149,17 +146,49 @@ public boolean saveMaterialAudio(List materialAudios) { } } - // 기존 기능 외 추가 메서드: SelectedConcatRowRequest 처리 + public void saveMaterialsForConcatRows(ConcatRowSaveRequestDto concatRows, ConcatUrlResponse concatResultResponse) { - List usedAudioFileSeqs = concatRows.getConcatRowRequests().stream() - .map(row -> row.getOriginAudioRequest().getAudioUrl()) // URL 추출 - .map(audioFileRepository::findFirstByAudioUrlNative) // URL로 AudioFile 조회 - .map(audioFile -> audioFile.orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioFile.get().getAudioUrl()))) - .map(AudioFile::getAudioFileSeq) // Seq 추출 + Long concatResultSeq = concatResultResponse.getSeq(); + if(concatResultSeq == null){ + throw new IllegalArgumentException("ConcatResult seq is null, cannot save materials."); + } + + log.info("[saveMaterialsForConcatRows] Processing concatRows: {}", concatRows); + + List usedAudioFileSeqs = concatRows.getConcatRowRequests().stream() + .map(row -> { + Long seq = row.getOriginAudioRequest().getSeq(); + log.info("[saveMaterialsForConcatRows] Fetching AudioFile for seq: {}", seq); + + return audioFileRepository.findByAudioFileSeq(seq) + .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with seq: " + seq)); + }) .toList(); + log.info("[saveMaterialsForConcatRows] Saving materials with ConcatResult seq: {} and AudioFile seqs: {}", concatResultSeq, usedAudioFileSeqs); + // 기존 saveMaterials 메서드를 호출하여 저장 saveMaterials(concatResultResponse.getSeq(), usedAudioFileSeqs); } + public void updateBgmFileWithConcatResult(String bgmFileUrl, Long concatResultSeq) { + // 중복 데이터가 있을 경우 처리 + List bgmFiles = bgmFileRepository.findAllByAudioUrl(bgmFileUrl); + if (bgmFiles.isEmpty()) { + throw new IllegalArgumentException("BgmFile not found for URL: " + bgmFileUrl); + } + if (bgmFiles.size() > 1) { + log.warn("Multiple BGM files found for URL: {}. Using the first result.", bgmFileUrl); + } + + // 첫 번째 결과에 대해서만 처리 + BgmFile bgmFile = bgmFiles.get(0); + ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) + .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found for id: " + concatResultSeq)); + bgmFile.setConcatResult(concatResult); + bgmFileRepository.save(bgmFile); + + log.info("[updateBgmFileWithConcatResult] Updated BgmFile with ConcatResult: {}", bgmFile); + } + } From 9751b2e4bcab2c973feaf3f052bfc8009311d381 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:46:38 +0900 Subject: [PATCH 112/167] =?UTF-8?q?[fix]=20=EC=88=9C=ED=99=98=EC=B0=B8?= =?UTF-8?q?=EC=A1=B0=20=EB=B0=A9=EC=A7=80=EC=9A=A9=20=EC=97=90=EB=84=88?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/concat/entity/MaterialAudio.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java index 2843486b..6922d386 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java @@ -1,5 +1,6 @@ package com.oreo.finalproject_5re5_be.concat.entity; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; import lombok.*; @@ -18,10 +19,14 @@ public class MaterialAudio extends BaseEntity { @ManyToOne @JoinColumn(name = "concat_result_seq") + @ToString.Exclude // 순환 참조 방지 + @JsonIgnore // JSON 직렬화에서 제외 private ConcatResult concatResult; @ManyToOne @JoinColumn(name = "audio_file_seq") + @ToString.Exclude // 순환 참조 방지 + @JsonIgnore // JSON 직렬화에서 제외 private AudioFile audioFile; @Column(name ="method") From b5b5132178c48b17a21ae7fc0cfe734a0088f402 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:48:18 +0900 Subject: [PATCH 113/167] =?UTF-8?q?[fix]=20=EA=B2=B0=EA=B3=BC=EB=AC=BC=20?= =?UTF-8?q?=EC=98=A4=EB=94=94=EC=98=A4=ED=8C=8C=EC=9D=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EB=90=98=EB=A9=B4=20=EC=82=AC=EC=9A=A9=EB=90=9C=20bgm?= =?UTF-8?q?=EC=97=90=20=EA=B2=B0=EA=B3=BC=EB=AC=BC=20=EC=98=A4=EB=94=94?= =?UTF-8?q?=EC=98=A4=20=EB=A7=A4=EC=B9=AD=20update=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/service/BgmFileService.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java index 1cf8935b..49dd714b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java @@ -1,18 +1,22 @@ package com.oreo.finalproject_5re5_be.concat.service; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; +import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; import java.util.List; +@Log4j2 @Service @RequiredArgsConstructor public class BgmFileService { private final BgmFileRepository bgmFileRepository; - + private final ConcatResultRepository concatResultRepository; public List getBgmFilesByTabSeq(Long tabSeq) { return bgmFileRepository.findByConcatTabSeq(tabSeq); @@ -27,5 +31,25 @@ public BgmFile saveBgmFile(BgmFile bgmFile) { return bgmFileRepository.save(bgmFile); } + public void updateBgmFileWithConcatResult(String bgmFileUrl, Long concatResultSeq) { + // 중복 데이터가 있을 경우 처리 + List bgmFiles = bgmFileRepository.findAllByAudioUrl(bgmFileUrl); + if (bgmFiles.isEmpty()) { + throw new IllegalArgumentException("BgmFile not found for URL: " + bgmFileUrl); + } + if (bgmFiles.size() > 1) { + log.warn("Multiple BGM files found for URL: {}. Using the first result.", bgmFileUrl); + } + + // 첫 번째 결과에 대해서만 처리 + BgmFile bgmFile = bgmFiles.get(0); + ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) + .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found for id: " + concatResultSeq)); + bgmFile.setConcatResult(concatResult); + bgmFileRepository.save(bgmFile); + + log.info("[updateBgmFileWithConcatResult] Updated BgmFile with ConcatResult: {}", bgmFile); + } + } \ No newline at end of file From 7a8685b710914f4b316747fd4c1f50e703b260d3 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:48:57 +0900 Subject: [PATCH 114/167] =?UTF-8?q?[fix]=20BgmFile=20Repository=EC=97=90?= =?UTF-8?q?=20findAllByAudioUrl=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concat/repository/BgmFileRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java index c0b65e55..d374ad75 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java @@ -21,4 +21,7 @@ public interface BgmFileRepository extends JpaRepository { Optional findByAudioUrl(String audioUrl); + // 특정 audioUrl로 모든 BgmFile 조회 + List findAllByAudioUrl(String audioUrl); + } From 5330067f71574d49fbc0f8baea960842f22412b1 Mon Sep 17 00:00:00 2001 From: Ryu-Eun Date: Thu, 12 Dec 2024 23:49:44 +0900 Subject: [PATCH 115/167] =?UTF-8?q?[fix]=20bgm=EC=97=90=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EB=AC=BC=20=EC=98=A4=EB=94=94=EC=98=A4=20=EB=A7=A4?= =?UTF-8?q?=EC=B9=AD=20update=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EC=97=90=20setter=20=EC=93=B0=EC=97=AC=EC=84=9C=20?= =?UTF-8?q?=EC=97=90=EB=84=88=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java index a8c8466c..b5be2639 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java @@ -25,6 +25,7 @@ public class BgmFile extends BaseEntity { @JoinColumn(name = "concat_tab_seq") // 외래 키: concat_tab의 ID private ConcatTab concatTab; + @Setter @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "concat_result_seq", nullable = true) From b2e273b9d1ff0b5eb7b1f57c0fab3d58ac840e66 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 17:44:21 +0900 Subject: [PATCH 116/167] =?UTF-8?q?[Feat]=20:=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EA=B0=80=20=EB=82=98=EB=88=84=EC=96=B4=EC=A0=B8=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9=EB=90=9C=20=EA=B2=BD=EC=9A=B0=EB=A5=BC=20=ED=8C=90?= =?UTF-8?q?=EB=B3=84=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EC=B9=BC?= =?UTF-8?q?=EB=9F=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/concat/dto/ConcatResultDto.java | 2 ++ .../finalproject_5re5_be/concat/entity/ConcatResult.java | 6 ++++++ .../concat/service/ConcatResultService.java | 5 +++-- .../concat/service/lambda/LambdaConcatService.java | 4 ++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java index 56a9fbce..5be5b806 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java @@ -9,8 +9,10 @@ public class ConcatResultDto { private Long concatResultSequence; private Long fileSize; private Float fileLength; + private Integer seperated; private String audioUrl; private String fileName; private String extension; + private String processId; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java index c69cde3b..0d429500 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java @@ -43,6 +43,12 @@ public class ConcatResult extends BaseEntity { @Column(name = "file_size") private Long fileSize; + @Column(name = "process_id") + private String processId; + + @Column + private Integer seperated; + public void addBgmFile(BgmFile bgmFile) { this.bgmFiles.add(BgmFile.builder() .concatResult(this) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java index 5294bc7c..c797f887 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java @@ -13,7 +13,6 @@ import org.springframework.stereotype.Service; import javax.sound.sampled.AudioInputStream; -import java.io.IOException; import java.util.List; @RequiredArgsConstructor @@ -49,7 +48,7 @@ public ConcatUrlResponse saveConcatResult(ConcatResultRequest request) { // AudioInputStream에서 ConcatResult 저장 public ConcatUrlResponse saveConcatResult( - Long concatTabSeq, String audioUrl, String fileName, AudioInputStream mixedAudioStream) throws IOException { + Long concatTabSeq, String audioUrl, String fileName, AudioInputStream mixedAudioStream) { // 1. AudioInputStream을 사용하여 길이 계산 long fileLength = (long) (mixedAudioStream.getFrameLength() / mixedAudioStream.getFormat().getFrameRate()); @@ -108,6 +107,8 @@ public List findByConcatTabSequence(Long projectSeq) { .fileSize(cr.getFileSize()) .audioUrl(cr.getAudioUrl()) .fileLength(cr.getFileLength()) + .seperated(cr.getSeperated()) + .processId(cr.getProcessId()) .build()).toList(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java index 7873d36a..fe277bb1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java @@ -60,6 +60,8 @@ private static List getConcatResultDtos(List conc .fileLength(concatResult.getFileLength()) .fileSize(concatResult.getFileSize()) .extension(concatResult.getExtension()) + .seperated(concatResult.getSeperated()) + .processId(concatResult.getProcessId()) .build()).toList(); } @@ -114,6 +116,8 @@ public ConcatResult of(LambdaConcatResultDto concatResult, ConcatTabResponseDto .fileSize(concatResult.getInfo().getContentSize()) .fileLength(concatResult.getInfo().getContentLength()) .audioUrl(concatResult.getS3Url()) + .processId(concatResult.getProcessId()) + .seperated(concatResult.getI()) .build(); return concatResultService.saveConcatResult(build); From cf87fcc4cf3b9d950214bce6b6ab00d0a1c67412 Mon Sep 17 00:00:00 2001 From: K-KY Date: Thu, 12 Dec 2024 17:44:21 +0900 Subject: [PATCH 117/167] =?UTF-8?q?[Feat]=20:=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EA=B0=80=20=EB=82=98=EB=88=84=EC=96=B4=EC=A0=B8=20=EB=B3=91?= =?UTF-8?q?=ED=95=A9=EB=90=9C=20=EA=B2=BD=EC=9A=B0=EB=A5=BC=20=ED=8C=90?= =?UTF-8?q?=EB=B3=84=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EC=B9=BC?= =?UTF-8?q?=EB=9F=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../finalproject_5re5_be/concat/dto/ConcatResultDto.java | 2 ++ .../finalproject_5re5_be/concat/entity/ConcatResult.java | 6 ++++++ .../concat/service/ConcatResultService.java | 5 +++-- .../concat/service/lambda/LambdaConcatService.java | 4 ++++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java index 56a9fbce..5be5b806 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResultDto.java @@ -9,8 +9,10 @@ public class ConcatResultDto { private Long concatResultSequence; private Long fileSize; private Float fileLength; + private Integer seperated; private String audioUrl; private String fileName; private String extension; + private String processId; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java index c69cde3b..0d429500 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java @@ -43,6 +43,12 @@ public class ConcatResult extends BaseEntity { @Column(name = "file_size") private Long fileSize; + @Column(name = "process_id") + private String processId; + + @Column + private Integer seperated; + public void addBgmFile(BgmFile bgmFile) { this.bgmFiles.add(BgmFile.builder() .concatResult(this) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java index 5294bc7c..c797f887 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java @@ -13,7 +13,6 @@ import org.springframework.stereotype.Service; import javax.sound.sampled.AudioInputStream; -import java.io.IOException; import java.util.List; @RequiredArgsConstructor @@ -49,7 +48,7 @@ public ConcatUrlResponse saveConcatResult(ConcatResultRequest request) { // AudioInputStream에서 ConcatResult 저장 public ConcatUrlResponse saveConcatResult( - Long concatTabSeq, String audioUrl, String fileName, AudioInputStream mixedAudioStream) throws IOException { + Long concatTabSeq, String audioUrl, String fileName, AudioInputStream mixedAudioStream) { // 1. AudioInputStream을 사용하여 길이 계산 long fileLength = (long) (mixedAudioStream.getFrameLength() / mixedAudioStream.getFormat().getFrameRate()); @@ -108,6 +107,8 @@ public List findByConcatTabSequence(Long projectSeq) { .fileSize(cr.getFileSize()) .audioUrl(cr.getAudioUrl()) .fileLength(cr.getFileLength()) + .seperated(cr.getSeperated()) + .processId(cr.getProcessId()) .build()).toList(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java index 7873d36a..fe277bb1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java @@ -60,6 +60,8 @@ private static List getConcatResultDtos(List conc .fileLength(concatResult.getFileLength()) .fileSize(concatResult.getFileSize()) .extension(concatResult.getExtension()) + .seperated(concatResult.getSeperated()) + .processId(concatResult.getProcessId()) .build()).toList(); } @@ -114,6 +116,8 @@ public ConcatResult of(LambdaConcatResultDto concatResult, ConcatTabResponseDto .fileSize(concatResult.getInfo().getContentSize()) .fileLength(concatResult.getInfo().getContentLength()) .audioUrl(concatResult.getS3Url()) + .processId(concatResult.getProcessId()) + .seperated(concatResult.getI()) .build(); return concatResultService.saveConcatResult(build); From 24344cfe9e069f6622856470d41b4a170ca5efa8 Mon Sep 17 00:00:00 2001 From: alswooy Date: Fri, 3 Jan 2025 22:54:08 +0900 Subject: [PATCH 118/167] =?UTF-8?q?[feat]=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EC=B8=A1=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/MethodTime.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/com/oreo/finalproject_5re5_be/global/MethodTime.java diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/MethodTime.java b/src/main/java/com/oreo/finalproject_5re5_be/global/MethodTime.java new file mode 100644 index 00000000..6d4c51d4 --- /dev/null +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/MethodTime.java @@ -0,0 +1,37 @@ +package com.oreo.finalproject_5re5_be.global; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StopWatch; + +@Aspect +@Component +public class MethodTime { + private static final Logger log = LoggerFactory.getLogger(MethodTime.class); + + @Around("execution(* com.oreo.finalproject_5re5_be.code.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.concat.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.global.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.member.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.tts.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.vc.controller.*.*(..)) || " + + "execution(* com.oreo.finalproject_5re5_be.project.controller.*.*(..))") + + public Object executionAspect(ProceedingJoinPoint joinPoint) throws Throwable{ + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + try { + return joinPoint.proceed(); + } finally { + stopWatch.stop(); + log.info("시간측정 time for method [{}]: {} ms", + joinPoint.getSignature().toShortString(), + stopWatch.getTotalTimeMillis()); + } + } +} From c8fd5da5cc66df1e3bdee079786ea82b0219d2a0 Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Sat, 4 Jan 2025 16:29:09 +0900 Subject: [PATCH 119/167] =?UTF-8?q?[fix]=20methodTime=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/{ => component}/MethodTime.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename src/main/java/com/oreo/finalproject_5re5_be/global/{ => component}/MethodTime.java (96%) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/MethodTime.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/MethodTime.java similarity index 96% rename from src/main/java/com/oreo/finalproject_5re5_be/global/MethodTime.java rename to src/main/java/com/oreo/finalproject_5re5_be/global/component/MethodTime.java index 6d4c51d4..b74c137e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/MethodTime.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/MethodTime.java @@ -1,4 +1,4 @@ -package com.oreo.finalproject_5re5_be.global; +package com.oreo.finalproject_5re5_be.global.component; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -20,7 +20,6 @@ public class MethodTime { "execution(* com.oreo.finalproject_5re5_be.tts.controller.*.*(..)) || " + "execution(* com.oreo.finalproject_5re5_be.vc.controller.*.*(..)) || " + "execution(* com.oreo.finalproject_5re5_be.project.controller.*.*(..))") - public Object executionAspect(ProceedingJoinPoint joinPoint) throws Throwable{ StopWatch stopWatch = new StopWatch(); stopWatch.start(); From e999f8bf0c2683b7ee4be002c3cb37e9b65bd25e Mon Sep 17 00:00:00 2001 From: alswooy <108874185+alswooy@users.noreply.github.com> Date: Fri, 13 Dec 2024 13:49:14 +0900 Subject: [PATCH 120/167] =?UTF-8?q?[fix]=20google=20java=20format=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 30 + .../FinalProject5Re5BeApplication.java | 3 - .../code/controller/CodeController.java | 81 +-- .../advice/CodeExceptionHandler.java | 64 +-- .../code/dto/request/CodeRequest.java | 2 - .../code/dto/request/CodeUpdateRequest.java | 1 - .../code/dto/response/CodeResponse.java | 1 - .../code/dto/response/CodeResponses.java | 1 - .../code/entity/Code.java | 4 +- .../exeption/CodeDuplicatedException.java | 2 - .../code/exeption/CodeNotFoundException.java | 2 - .../code/repository/CodeRepository.java | 16 +- .../code/service/CodeServiceImpl.java | 16 +- .../controller/AudioFileController.java | 83 ++- .../concat/controller/BgmFileController.java | 5 +- .../concat/controller/ConcatController.java | 82 +-- .../controller/ConcatMaterialController.java | 51 +- .../controller/ConcatRowController.java | 80 ++- .../controller/ConcatRowTabController.java | 89 +-- .../controller/ConcatTabController.java | 63 +-- .../controller/ConcatWithBgmController.java | 122 ++-- .../concat/dto/ConcatResponseDto.java | 5 +- .../concat/dto/ConcatRowDto.java | 1 - .../concat/dto/ConcatRowListDto.java | 7 +- .../concat/dto/RowAudioFileDto.java | 20 +- .../concat/dto/lambda/AudioFormatDto.java | 19 +- .../dto/lambda/LambdaConcatRequest.java | 14 +- .../concat/dto/lambda/response/AudioInfo.java | 17 +- .../response/LambdaConcatResultDto.java | 28 +- .../concat/dto/request/AudioFileDto.java | 3 +- .../dto/request/AudioFileRequestDto.java | 1 - .../dto/request/AudioFormatRequest.java | 2 - .../dto/request/BgmFunctionRequestDto.java | 7 +- .../dto/request/ConcatResultRequest.java | 4 +- .../concat/dto/request/ConcatRowRequest.java | 6 +- .../dto/request/ConcatRowRequestDto.java | 12 +- .../dto/request/ConcatRowSaveRequestDto.java | 3 +- .../concat/dto/request/ConcatTabRequest.java | 3 +- .../dto/request/ConcatUpdateRequestDto.java | 4 +- .../dto/request/OriginAudioRequest.java | 2 +- .../dto/request/SelectedConcatRowRequest.java | 4 +- .../response/ConcatResultDetailsResponse.java | 8 +- .../dto/response/ConcatResultResponse.java | 3 +- .../dto/response/ConcatRowTabResponseDto.java | 4 +- .../dto/response/ConcatTabResponseDto.java | 3 +- .../dto/response/ConcatUrlResponse.java | 3 +- .../dto/response/TabRowResponseDto.java | 1 - .../concat/entity/AudioFile.java | 14 +- .../concat/entity/BgmFile.java | 8 +- .../concat/entity/ConcatResult.java | 20 +- .../concat/entity/ConcatRow.java | 11 +- .../concat/entity/ConcatRowLog.java | 4 +- .../concat/entity/ConcatTab.java | 25 +- .../concat/entity/MaterialAudio.java | 6 +- .../repository/AudioFileRepository.java | 61 +- .../concat/repository/BgmFileRepository.java | 6 +- .../repository/ConcatResultRepository.java | 5 +- .../repository/ConcatRowLogRepository.java | 3 +- .../repository/ConcatRowRepository.java | 22 +- .../repository/ConcatTabLogRepository.java | 3 +- .../repository/ConcatTabRepository.java | 3 +- .../repository/MaterialAudioRepository.java | 21 +- .../concat/service/AudioFileService.java | 129 +++-- .../concat/service/AudioMultipartFile.java | 4 +- .../concat/service/AudioStreamService.java | 55 +- .../concat/service/BgmFileService.java | 22 +- .../concat/service/ConcatResultService.java | 108 ++-- .../concat/service/ConcatRowService.java | 254 +++++---- .../concat/service/ConcatRowTabService.java | 28 +- .../concat/service/ConcatService.java | 134 +++-- .../concat/service/ConcatTabService.java | 95 ++-- .../concat/service/MaterialAudioService.java | 157 ++--- .../concat/service/bgm/BgmProcessor.java | 53 +- .../service/concatenator/AudioProperties.java | 5 +- .../service/concatenator/Concatenator.java | 7 +- .../concatenator/IntervalConcatenator.java | 32 +- .../concatenator/MonoConcatenator.java | 14 +- .../MonoIntervalConcatenator.java | 16 +- .../concatenator/StereoConcatenator.java | 12 +- .../StereoIntervalConcatenator.java | 28 +- .../service/helper/AudioFileHelper.java | 7 +- .../service/helper/ConcatRowHelper.java | 6 +- .../service/helper/ConcatTabHelper.java | 20 +- .../service/lambda/LambdaConcatService.java | 135 +++-- .../global/component/AudioInfo.java | 39 +- .../component/ByteArrayMultipartFile.java | 2 +- .../global/component/S3Service.java | 63 +-- .../global/component/SqsService.java | 48 +- .../audio/AudioExtensionChecker.java | 36 +- .../audio/AudioExtensionConverter.java | 34 +- .../component/audio/AudioExtensions.java | 29 +- .../audio/AudioFileTypeConverter.java | 17 +- .../global/component/audio/AudioFormats.java | 206 +++---- .../global/component/audio/AudioResample.java | 50 +- .../global/component/audio/BeepMaker.java | 18 +- .../global/component/audio/SoundPlayer.java | 26 +- .../global/config/AuditorAwareImpl.java | 9 +- .../global/config/JpaAuditingConfig.java | 2 +- .../global/config/MultipartFileAccepter.java | 4 +- .../global/config/S3Config.java | 2 +- .../global/config/SqsConfig.java | 24 +- .../global/config/SwaggerConfig.java | 103 ++-- .../global/dto/request/SqsRequestDto.java | 1 - .../global/dto/response/AudioFileInfo.java | 6 +- .../global/dto/response/ErrorResponseDto.java | 8 +- .../global/dto/response/ResponseDto.java | 2 +- .../global/entity/BaseEntity.java | 7 +- .../exception/EntityNotFoundException.java | 2 + .../global/exception/ErrorCode.java | 3 - .../exception/GlobalExceptionHandler.java | 5 +- .../exception/RestGlobalExceptionHandler.java | 3 +- .../LoginAuthenticationFailureHandler.java | 6 +- .../LoginAuthenticationSuccessHandler.java | 84 ++- .../member/config/MemberConfig.java | 11 +- .../member/config/MemberSecurityConfig.java | 111 ++-- .../member/controller/MemberController.java | 61 +- .../MemberTermConditionController.java | 83 ++- .../controller/MemberTermsController.java | 87 ++- .../member/controller/TestController.java | 5 +- .../advice/MemberExceptionHandler.java | 66 ++- .../member/dto/CustomUserDetails.java | 1 - .../request/MemberChangePasswordRequest.java | 10 +- .../dto/request/MemberRegisterRequest.java | 34 +- .../dto/request/MemberRemoveRequest.java | 1 - .../request/MemberTermConditionRequest.java | 6 +- .../MemberTermConditionUpdateRequest.java | 5 - .../member/dto/request/MemberTermRequest.java | 6 +- .../dto/request/MemberTermUpdateRequest.java | 4 - .../dto/request/MemberUpdateRequest.java | 25 +- .../member/dto/response/ErrorResponse.java | 1 - .../dto/response/MemberReadResponse.java | 13 +- .../dto/response/MemberRegisterResponse.java | 4 +- .../member/dto/response/MemberResponse.java | 1 - .../response/MemberTermConditionResponse.java | 21 +- .../MemberTermConditionResponses.java | 4 +- .../dto/response/MemberTermResponse.java | 1 - .../dto/response/MemberTermResponses.java | 1 - .../response/MemberTermsDetailResponse.java | 25 +- .../member/entity/Member.java | 16 +- .../member/entity/MemberCategory.java | 6 +- .../member/entity/MemberChangeHistory.java | 7 +- .../entity/MemberConnectionHistory.java | 5 +- .../member/entity/MemberDelete.java | 4 +- .../member/entity/MemberRoles.java | 9 +- .../member/entity/MemberRolesCategory.java | 5 +- .../member/entity/MemberState.java | 6 +- .../member/entity/MemberTerms.java | 16 +- .../member/entity/MemberTermsCondition.java | 8 +- .../member/entity/MemberTermsHistory.java | 13 +- .../exception/DeletedMemberException.java | 1 - .../MemberDuplicatedEmailException.java | 1 - .../MemberDuplicatedIdException.java | 2 - .../MemberInvalidTermConditionException.java | 1 - ...MemberMandatoryTermNotAgreedException.java | 1 - .../MemberNotFoundEmailException.java | 1 - .../exception/MemberNotFoundException.java | 1 - .../exception/MemberTermInvalidException.java | 1 - .../MemberTermsNotFoundException.java | 3 - .../MemberWrongCountTermCondition.java | 1 - .../exception/RetryFailedException.java | 3 +- .../repository/MemberCategoryRepository.java | 5 +- .../MemberChangeHistoryRepository.java | 23 +- .../MemberConnectionHistoryRepository.java | 7 +- .../repository/MemberDeleteRepository.java | 4 +- .../member/repository/MemberRepository.java | 33 +- .../repository/MemberStateRepository.java | 23 +- .../MemberTermConditionRepository.java | 20 +- .../MemberTermsHistoryRepository.java | 1 - .../repository/MemberTermsRepository.java | 38 +- .../member/service/MemberServiceImpl.java | 248 ++++---- .../MemberTermsConditionServiceImpl.java | 58 +- .../service/MemberTermsServiceImpl.java | 55 +- .../project/controller/ProjectController.java | 87 ++- .../project/dto/response/ProjectResponse.java | 3 +- .../project/entity/Project.java | 6 +- .../project/entity/ProjectStatus.java | 13 +- .../exception/ProjectExceptionHandler.java | 16 +- .../exception/projectNotMemberException.java | 1 + .../project/repository/ProjectRepository.java | 6 +- .../project/service/ProjectService.java | 18 +- .../project/service/ProjectServiceImpl.java | 132 ++--- .../tts/client/AudioConfigGenerator.java | 24 +- .../tts/client/GoogleTTSConfig.java | 3 +- .../tts/client/GoogleTTSService.java | 21 +- .../tts/client/SynthesisInputGenerator.java | 6 +- .../tts/client/VoiceParamsGenerator.java | 6 +- .../tts/controller/LanguageController.java | 4 +- .../tts/controller/StyleController.java | 59 +- .../tts/controller/TtsController.java | 267 +++++---- .../tts/controller/VoiceController.java | 64 ++- .../dto/external/common/TtsSentenceDto.java | 1 - .../tts/dto/request/TtsAttributeInfo.java | 29 +- .../tts/dto/request/TtsAudioFileInfo.java | 8 +- .../tts/dto/request/TtsSentenceBatchInfo.java | 13 +- .../dto/request/TtsSentenceBatchRequest.java | 15 +- .../tts/dto/request/TtsSentenceRequest.java | 11 +- .../tts/dto/response/LanguageDto.java | 3 +- .../tts/dto/response/LanguageListDto.java | 12 +- .../tts/dto/response/SentenceInfo.java | 8 +- .../tts/dto/response/StyleDto.java | 2 +- .../tts/dto/response/StyleListDto.java | 11 +- .../dto/response/TtsProgressStatusDto.java | 3 +- .../tts/dto/response/TtsSentenceDto.java | 5 +- .../tts/dto/response/TtsSentenceListDto.java | 11 +- .../tts/dto/response/VoiceListDto.java | 11 +- .../tts/entity/SampleAudio.java | 7 +- .../tts/entity/Style.java | 2 +- .../tts/entity/TtsAudioFile.java | 8 +- .../tts/entity/TtsProgressStatus.java | 9 +- .../tts/entity/TtsProgressStatusCode.java | 1 - .../tts/entity/TtsSentence.java | 2 +- .../tts/entity/Voice.java | 2 +- .../exception/InValidRequestException.java | 1 - .../TtsMakeInvalidParamException.java | 26 +- .../tts/exception/TtsSentenceNotFound.java | 4 +- .../tts/exception/VoiceEntityNotFound.java | 5 +- .../tts/repository/LanguageRepository.java | 3 +- .../tts/repository/SampleAudioRepository.java | 3 +- .../tts/repository/StyleRepository.java | 5 +- .../repository/TtsAudioFileRepository.java | 3 +- .../TtsProcessHistoryRepository.java | 3 +- .../TtsProgressStatusRepository.java | 3 +- .../tts/repository/TtsSentenceRepository.java | 4 +- .../tts/repository/VoiceRepository.java | 6 +- .../tts/service/LanguageService.java | 3 +- .../tts/service/SaveTtsMakeResultService.java | 120 ++-- .../tts/service/StyleService.java | 12 +- .../tts/service/TtsMakeService.java | 138 +++-- .../tts/service/TtsSentenceService.java | 34 +- .../tts/service/TtsSentenceServiceImpl.java | 200 +++---- .../tts/service/VoiceService.java | 25 +- .../tts/util/TtsSentenceComparator.java | 2 - .../vc/controller/VcController.java | 399 ++++++------- .../vc/dto/request/VcAudioRequest.java | 7 +- .../dto/request/VcRequestHistoryRequest.java | 1 - .../dto/request/VcResultHistoryRequest.java | 1 - .../vc/dto/request/VcResultsRequest.java | 2 +- .../vc/dto/request/VcRowRequest.java | 1 + .../vc/dto/request/VcSrcRequest.java | 8 +- .../vc/dto/request/VcSrcsRequest.java | 3 + .../vc/dto/request/VcTextRequest.java | 2 +- .../vc/dto/request/VcUrlRequest.java | 3 +- .../vc/dto/response/VcTextResponse.java | 4 +- .../vc/dto/response/VcUrlResponse.java | 3 +- .../finalproject_5re5_be/vc/entity/Vc.java | 9 +- .../vc/entity/VcRequestHistory.java | 7 +- .../vc/entity/VcResultFile.java | 25 +- .../vc/entity/VcResultHistory.java | 5 +- .../vc/entity/VcSrcFile.java | 28 +- .../vc/entity/VcText.java | 16 +- .../vc/entity/VcTrgFile.java | 16 +- .../exception/VcAPIFilesIsEmptyException.java | 2 +- .../vc/exception/VcExceptionHandler.java | 8 +- .../vc/exception/VcNotMemberException.java | 1 + .../VcRequestHistoryRepository.java | 3 +- .../vc/repository/VcResultFileRepository.java | 1 - .../repository/VcResultHistoryRepository.java | 4 +- .../vc/repository/VcSrcFileRepository.java | 7 +- .../vc/repository/VcTextRepository.java | 1 - .../vc/repository/VcTrgFileRepository.java | 4 +- .../vc/service/VcApiService.java | 10 +- .../vc/service/VcApiServiceImpl.java | 75 ++- .../vc/service/VcHistoryService.java | 7 +- .../vc/service/VcHistoryServiceImpl.java | 76 +-- .../vc/service/VcServiceImpl.java | 462 ++++++++------- .../FinalProject5Re5BeApplicationTests.java | 4 +- .../audio/AudioExtensionCheckerTest.java | 17 +- .../audio/AudioExtensionConverterTest.java | 16 +- .../audio/AudioExtensionsTest.java | 10 +- .../audio/AudioResampleTest.java | 74 ++- .../audio/BeepMakerTest.java | 57 +- .../audio/MonoConcatenatorTest.java | 93 ++- .../audio/MonoIntervalConcatenatorTest.java | 255 +++++---- .../audio/SoundPlayerTest.java | 39 +- .../audio/StereoConcatenatorTest.java | 82 ++- .../audio/StereoIntervalConcatenatorTest.java | 251 ++++---- .../audio/service/AudioInfoTest.java | 76 ++- .../MaterialAudioRepositoryTest.java | 89 ++- .../concat/service/ConcatTabServiceTest.java | 223 ++++---- ...LoginAuthenticationSuccessHandlerTest.java | 139 +++-- .../config/MemberSecurityConfigTest.java | 167 +++--- .../member/controller/CodeControllerTest.java | 109 ++-- .../controller/MemberControllerTest.java | 249 ++++---- .../MemberTermConditionControllerTest.java | 157 ++--- .../controller/MemberTermsControllerTest.java | 275 +++++---- .../member/repository/CodeRepositoryTest.java | 47 +- .../MemberChangeHistoryRepositoryTest.java | 107 ++-- .../repository/MemberRepositoryTest.java | 27 +- .../MemberTermConditionRepositoryTest.java | 304 +++++----- .../repository/MemberTermsRepositoryTest.java | 195 +++---- .../member/service/CodeServiceImplTest.java | 172 +++--- .../member/service/MemberServiceImplTest.java | 535 ++++++++---------- .../service/MemberServiceImplTestByMock.java | 479 ++++++++-------- .../MemberTermsConditionServiceImplTest.java | 510 +++++++++-------- .../service/MemberTermsServiceImplTest.java | 263 +++++---- .../service/ProjectServiceImplTest.java | 120 ++-- .../tts/client/GoogleTTSServiceTest.java | 20 +- .../controller/LanguageControllerTest.java | 65 +-- .../tts/controller/StyleControllerTest.java | 61 +- .../tts/controller/VoiceControllerTest.java | 78 ++- .../ttsController/TestGetSentence.java | 139 +++-- .../ttsController/TestGetSentenceList.java | 115 ++-- .../controller/ttsController/TestMakeTts.java | 131 +++-- .../ttsController/TestUpdateSentence.java | 198 ++++--- .../repository/LanguageRepositoryTest.java | 71 ++- .../tts/repository/StyleRepositoryTest.java | 103 ++-- .../TtsAudioFileRepositoryTest.java | 316 ++++++----- .../TtsProcessHistoryRepositoryTest.java | 126 ++--- .../TtsProgressStatusRepositoryTest.java | 46 +- .../repository/TtsSentenceRepositoryTest.java | 157 +++-- .../repository/VoiceRepositoryFindTest.java | 88 ++- .../tts/repository/VoiceRepositoryTest.java | 183 +++--- .../tts/service/LanguageServiceTest.java | 61 +- .../tts/service/SaveTtsMakeResultTest.java | 63 +-- .../tts/service/StyleServiceTest.java | 65 +-- .../tts/service/TtsMakeServiceTest.java | 131 ++--- .../tts/service/VoiceServiceTest.java | 84 +-- .../ttsSentenceService/TestAddSentence.java | 218 ++++--- .../ttsSentenceService/TestBatchSave.java | 314 +++++----- .../ttsSentenceService/TestGetSentence.java | 29 +- .../TestGetSentenceList.java | 53 +- .../TestPatchSentenceOrder.java | 45 +- .../TestUpdateSentence.java | 188 +++--- .../vc/controller/VcControllerTest.java | 60 +- .../repository/VcSrcFileRepositoryTest.java | 496 ++++++++-------- .../vc/service/VcApiServiceImplTest.java | 46 +- .../vc/service/VcServiceImplTest.java | 230 ++++---- 327 files changed, 8325 insertions(+), 8074 deletions(-) diff --git a/build.gradle b/build.gradle index 03fc11ea..46eb5dc9 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.6' id 'io.spring.dependency-management' version '1.1.6' + id 'com.diffplug.spotless' version '6.25.0' } group = 'com.oreo' @@ -116,3 +117,32 @@ dependencies { test { useJUnitPlatform() } + +spotless { + java { + // import 순서 정의 + importOrder( + "java", + "javax", + "lombok", + "org.springframework", + "", + "\\#", + "org.junit", + "\\#org.junit", + "com.guide", + "\\#com.guide" + ) + // 사용하지 않는 import 제거 + removeUnusedImports() + // 구글 자바 포맷 적용 + googleJavaFormat() + + indentWithTabs(2) + indentWithSpaces(4) + // 공백 제거 + trimTrailingWhitespace() + // 끝부분 New Line 처리 + endWithNewline() + } +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java b/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java index f1109db8..0b56f21e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/FinalProject5Re5BeApplication.java @@ -1,7 +1,5 @@ package com.oreo.finalproject_5re5_be; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.servers.Server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.retry.annotation.EnableRetry; @@ -15,5 +13,4 @@ public class FinalProject5Re5BeApplication { public static void main(String[] args) { SpringApplication.run(FinalProject5Re5BeApplication.class, args); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java index c2f5c0d4..7e280c83 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/CodeController.java @@ -31,84 +31,91 @@ public class CodeController { private final CodeServiceImpl codeService; -// @Operation(summary = "코드 등록") -// @PostMapping("/register") + // @Operation(summary = "코드 등록") + // @PostMapping("/register") public ResponseEntity create(@RequestBody @Valid CodeRequest request) { // 서비스를 호출하여 코드를 등록한다 CodeResponse response = codeService.create(request); // 등록된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); - + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "등록된 모든 코드 조회") -// @GetMapping("/all") + // @Operation(summary = "등록된 모든 코드 조회") + // @GetMapping("/all") public ResponseEntity readAll() { // 서비스를 호출하여 모든 코드를 조회한다 CodeResponses responses = codeService.readAll(); // 조회된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.OK) - .body(responses); + return ResponseEntity.status(HttpStatus.OK).body(responses); } -// @Operation(summary = "시퀀스로 특정 코드 조회") -// @GetMapping("/seq/{codeSeq}") - public ResponseEntity readBySeq(@Parameter(description = "Code 시퀀스") @Min(value = 1L, message = "코드 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("codeSeq") Long codeSeq) { + // @Operation(summary = "시퀀스로 특정 코드 조회") + // @GetMapping("/seq/{codeSeq}") + public ResponseEntity readBySeq( + @Parameter(description = "Code 시퀀스") + @Min(value = 1L, message = "코드 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("codeSeq") + Long codeSeq) { // 서비스를 호출하여 시퀀스로 특정 코드를 조회한다 CodeResponse response = codeService.read(codeSeq); // 조회된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "코드 번호로 특정 코드 조회") -// @GetMapping("/{code}") - public ResponseEntity readByCode(@Parameter(description = "Code의 코드번호") @PathVariable("code") String code) { + // @Operation(summary = "코드 번호로 특정 코드 조회") + // @GetMapping("/{code}") + public ResponseEntity readByCode( + @Parameter(description = "Code의 코드번호") @PathVariable("code") String code) { // 서비스를 호출하여 코드 번호로 특정 코드를 조회한다 CodeResponse response = codeService.read(code); // 조회된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } @Operation(summary = "각 파트(cateNum)으로 사용 가능한 코드 조회 - 회원 삭제 유형 카테고리 조회시 cateNum에 MD 코드를 입력해주세요") @GetMapping("/{cateNum}/available") - public ResponseEntity readAvailable(@Parameter(description = "Code의 파트별 번호") @PathVariable("cateNum") String cateNum) { + public ResponseEntity readAvailable( + @Parameter(description = "Code의 파트별 번호") @PathVariable("cateNum") String cateNum) { // 서비스를 호출하여 각 파트별 사용 가능한 코드를 조회한다 CodeResponses responses = codeService.readAvailableCodeByCateNum(cateNum); // 조회된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.OK) - .body(responses); + return ResponseEntity.status(HttpStatus.OK).body(responses); } -// @Operation(summary = "각 파트(cateNum)으로 모든 코드 조회") -// @GetMapping("/{cateNum}/all") - public ResponseEntity readAll(@Parameter(description = "Code의 파트별 번호") @PathVariable("cateNum") String cateNum) { + // @Operation(summary = "각 파트(cateNum)으로 모든 코드 조회") + // @GetMapping("/{cateNum}/all") + public ResponseEntity readAll( + @Parameter(description = "Code의 파트별 번호") @PathVariable("cateNum") String cateNum) { // 서비스를 호출하여 각 파트별 모든 코드를 조회한다 CodeResponses responses = codeService.readAllByCateNum(cateNum); // 조회된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.OK) - .body(responses); + return ResponseEntity.status(HttpStatus.OK).body(responses); } -// @Operation(summary = "특정 코드 수정 처리") -// @PatchMapping("/{codeSeq}") - public ResponseEntity update(@Parameter(description = "Code 시퀀스") @Min(value = 1L, message = "코드 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("codeSeq") Long codeSeq, @Valid @RequestBody CodeUpdateRequest request) { + // @Operation(summary = "특정 코드 수정 처리") + // @PatchMapping("/{codeSeq}") + public ResponseEntity update( + @Parameter(description = "Code 시퀀스") + @Min(value = 1L, message = "코드 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("codeSeq") + Long codeSeq, + @Valid @RequestBody CodeUpdateRequest request) { // 서비스를 호출하여 코드를 수정한다 codeService.update(codeSeq, request); // 수정된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } -// @Operation(summary = "특정 코드 삭제 처리") -// @DeleteMapping("/{codeSeq}") - public ResponseEntity delete(@Parameter(description = "Code 시퀀스") @Min(value = 1L, message = "코드 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("codeSeq") Long codeSeq) { + // @Operation(summary = "특정 코드 삭제 처리") + // @DeleteMapping("/{codeSeq}") + public ResponseEntity delete( + @Parameter(description = "Code 시퀀스") + @Min(value = 1L, message = "코드 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("codeSeq") + Long codeSeq) { // 서비스를 호출하여 코드를 삭제한다 codeService.delete(codeSeq); // 삭제된 코드를 반환한다 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java index a94c1790..04c14aaf 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/controller/advice/CodeExceptionHandler.java @@ -28,16 +28,13 @@ public ResponseEntity handleRuntimeException(RuntimeException log.error("CODE : [RuntimeException] ", e); // 응답 데이터 생성 - ErrorResponseDto response = ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), - e.getMessage()); + ErrorResponseDto response = + ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), e.getMessage()); // 응답 데이터 반환 - return ResponseEntity.status(response.getStatus()) - .body(response); - + return ResponseEntity.status(response.getStatus()).body(response); } - // 코드 파트에서 BusinessException이 발생한 경우 @ExceptionHandler(BusinessException.class) public ResponseEntity handleBusinessException(BusinessException e) { @@ -45,18 +42,16 @@ public ResponseEntity handleBusinessException(BusinessExceptio log.error("CODE : [BusinessException] ", e); // 응답 데이터 생성 - ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), - e.getMessage()); + ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); // 응답 데이터 반환 - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // 코드 파트에서 MethodArgumentNotValidException이 발생한 경우 - 데이터 유효성 검증 실패 @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + public ResponseEntity handleMethodArgumentNotValidException( + MethodArgumentNotValidException e) { // 로그로 어떤 예외 클래스가 발생했는지 표시 log.error("CODE : [MethodArgumentNotValidException] ", e); @@ -65,43 +60,48 @@ public ResponseEntity handleMethodArgumentNotValidException(Me BindingResult result = e.getBindingResult(); // 필드 에러 리스트 형태로 변환 - List fieldErrorList = result.getFieldErrors() - .stream() - .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) - .toList(); + List fieldErrorList = + result.getFieldErrors().stream() + .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) + .toList(); // ErrorResponseDto 생성 - ErrorResponseDto response = ErrorResponseDto.of(CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), - CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), - fieldErrorList); + ErrorResponseDto response = + ErrorResponseDto.of( + CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), + CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), + fieldErrorList); // 응답 데이터 반환 - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // 코드 파트에서 ConstraintViolationException 발생한 경우 - 데이터베이스 제약 조건 위반할 경우 발생(JPA/Hibernate) @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity handleConstraintViolationException(ConstraintViolationException e) { + public ResponseEntity handleConstraintViolationException( + ConstraintViolationException e) { // 로그로 어떤 예외 클래스가 발생했는지 표시 log.error("CODE : [ConstraintViolationException] ", e); // 각 violation에 접근하여 에러 내용 상세화한 Set 생성 Set> constraintViolationSet = e.getConstraintViolations(); - List violationList = constraintViolationSet.stream() - .map(violation -> FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .toList(); + List violationList = + constraintViolationSet.stream() + .map( + violation -> + FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .toList(); // ErrorResponseDto 생성 - ErrorResponseDto response = ErrorResponseDto.of(CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), - CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), - violationList); - + ErrorResponseDto response = + ErrorResponseDto.of( + CODE_INVALID_INPUT_VALUE_ERROR.getStatus(), + CODE_INVALID_INPUT_VALUE_ERROR.getMessage(), + violationList); // 응답 데이터 반환 - return ResponseEntity.status(CODE_INVALID_INPUT_VALUE_ERROR.getStatus()) - .body(response); + return ResponseEntity.status(CODE_INVALID_INPUT_VALUE_ERROR.getStatus()).body(response); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java index 5f995b96..8b84190a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeRequest.java @@ -36,7 +36,6 @@ public class CodeRequest { private String comt; - public Code createCodeEntity() { return Code.builder() .cateNum(cateNum) @@ -47,5 +46,4 @@ public Code createCodeEntity() { .comt(comt) .build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java index 438f7570..4545661e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/request/CodeUpdateRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.code.dto.request; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Builder; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java index a9659870..bda5364c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponse.java @@ -6,7 +6,6 @@ import lombok.Getter; import lombok.ToString; - @Getter @ToString @Builder diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java index 779674b6..88f0ce1b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/dto/response/CodeResponses.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.code.dto.response; - import java.util.List; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java b/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java index 48e3a1a0..d45b3d18 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/entity/Code.java @@ -1,7 +1,7 @@ package com.oreo.finalproject_5re5_be.code.entity; -import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import com.oreo.finalproject_5re5_be.code.dto.request.CodeUpdateRequest; +import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -56,6 +56,4 @@ public void update(CodeUpdateRequest request) { this.chkUse = request.getChkUse(); this.comt = request.getComt(); } - } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java index 7755725b..fd30c96f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeDuplicatedException.java @@ -4,7 +4,6 @@ import com.oreo.finalproject_5re5_be.global.exception.BusinessException; - // 중복된 코드 등록시 발생하는 예외 public class CodeDuplicatedException extends BusinessException { @@ -15,5 +14,4 @@ public CodeDuplicatedException() { public CodeDuplicatedException(String message) { super(message, CODE_DUPLICATED_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java index 554940ef..e2314147 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/exeption/CodeNotFoundException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -; // 입력값으로부터 코드를 찾지 못했을 때 발생하는 예외 public class CodeNotFoundException extends BusinessException { @@ -15,5 +14,4 @@ public CodeNotFoundException() { public CodeNotFoundException(String message) { super(message, MEMBER_NOT_FOUND_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java index 60594456..e104e84a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/repository/CodeRepository.java @@ -14,18 +14,16 @@ public interface CodeRepository extends JpaRepository { Code findCodeByCodeSeq(Long codeSeq); // 각 파트별로 사용 가능한 코드를 조회. - @Query( "SELECT c " + - "FROM Code c " + - "WHERE c.cateNum = :cateNum " + - "AND c.chkUse = 'Y' " + - "ORDER BY c.ord") + @Query( + "SELECT c " + + "FROM Code c " + + "WHERE c.cateNum = :cateNum " + + "AND c.chkUse = 'Y' " + + "ORDER BY c.ord") List findAvailableCodesByCateNum(String cateNum); // 각 파트별로 모든 코드를 조회. - @Query( "SELECT c " + - "FROM Code c " + - "WHERE c.cateNum = :cateNum " + - "ORDER BY c.ord") + @Query("SELECT c " + "FROM Code c " + "WHERE c.cateNum = :cateNum " + "ORDER BY c.ord") List findCodesByCateNum(String cateNum); // 코드 번호로 코드가 존재하는지 확인. diff --git a/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java index 95440ed2..456bd5b5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/code/service/CodeServiceImpl.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.code.service; - import com.oreo.finalproject_5re5_be.code.dto.request.CodeRequest; import com.oreo.finalproject_5re5_be.code.dto.request.CodeUpdateRequest; import com.oreo.finalproject_5re5_be.code.dto.response.CodeResponse; @@ -45,9 +44,7 @@ public CodeResponses readAll() { // 모든 코드 엔티티를 조회 List foundCodes = codeRepository.findAll(); // 리스트로 변환 - List codeResponseList = foundCodes.stream() - .map(CodeResponse::of) - .toList(); + List codeResponseList = foundCodes.stream().map(CodeResponse::of).toList(); // 조회된 엔티티를 response로 변환하여 반환한다 return CodeResponses.of(codeResponseList); @@ -69,15 +66,12 @@ public CodeResponse read(String code) { return CodeResponse.of(foundCode); } - // 각 파트별 사용 가능한 코드 조회 public CodeResponses readAvailableCodeByCateNum(String cateNum) { // 전달 받은 파트에 해당하는 사용 가능한 모든 코드 엔티티를 조회한다 List foundCodes = codeRepository.findAvailableCodesByCateNum(cateNum); // 리스트에 담는다 - List codeResponseList = foundCodes.stream() - .map(CodeResponse::of) - .toList(); + List codeResponseList = foundCodes.stream().map(CodeResponse::of).toList(); // 조회된 엔티티를 responses로 변환하여 반환한다 return CodeResponses.of(codeResponseList); } @@ -87,14 +81,11 @@ public CodeResponses readAllByCateNum(String cateNum) { // 전달 받은 파트에 해당하는 모든 코드 엔티티를 조회한다 List foundCodes = codeRepository.findCodesByCateNum(cateNum); // 리스트에 담는다 - List codeResponseList = foundCodes.stream() - .map(CodeResponse::of) - .toList(); + List codeResponseList = foundCodes.stream().map(CodeResponse::of).toList(); // 조회된 엔티티를 responses로 변환하여 반환한다 return CodeResponses.of(codeResponseList); } - // 코드 수정 public void update(Long codeSeq, CodeUpdateRequest request) { // 시퀀스로 특정 코드 엔티티를 조회한다 @@ -124,5 +115,4 @@ public void delete(Long codeSeq) { // 조회된 엔티티를 삭제한다 codeRepository.delete(foundCode); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java index faccc50d..78b764bb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/AudioFileController.java @@ -11,6 +11,9 @@ import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.IOException; +import java.util.List; +import javax.sound.sampled.UnsupportedAudioFileException; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -24,10 +27,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; -import javax.sound.sampled.UnsupportedAudioFileException; -import java.io.IOException; -import java.util.List; - @Tag(name = "Concat", description = "Concat 관련 API") @RestController @RequiredArgsConstructor @@ -38,12 +37,9 @@ public class AudioFileController { private final ConcatRowService concatRowService; private final MaterialAudioService materialAudioService; - - @Operation( - summary = "업로드 할 오디오 형식 검사", - description = "업로드 할 수 없는 오디오 목록을 반환합니다." - ) - @PostMapping(value = "extension/check", + @Operation(summary = "업로드 할 오디오 형식 검사", description = "업로드 할 수 없는 오디오 목록을 반환합니다.") + @PostMapping( + value = "extension/check", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity>> check( @@ -55,64 +51,63 @@ public ResponseEntity>> check( return buildResponse(status, audioFileRequestDtos); } - @Operation( - summary = "오디오 업로드", - description = "업로드한 오디오의 정보를 반환합니다." - ) - @PostMapping(value = "save", + @Operation(summary = "오디오 업로드", description = "업로드한 오디오의 정보를 반환합니다.") + @PostMapping( + value = "save", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity>> save( - @RequestParam("audio") List audioFiles) throws IOException, UnsupportedAudioFileException { + @RequestParam("audio") List audioFiles) + throws IOException, UnsupportedAudioFileException { List audioDto = convertToDto(audioFiles); List originAudioRequests = audioFileService.saveAudioFile(audioDto); return buildResponse(HttpStatus.OK, originAudioRequests); } - @Operation( - summary = "행의 아이디에 저장된 오디오 불러오기", - description = "업로드 된 오디오의 정보를 반환합니다." - ) + @Operation(summary = "행의 아이디에 저장된 오디오 불러오기", description = "업로드 된 오디오의 정보를 반환합니다.") @PostMapping("read") - public ResponseEntity>> read(@RequestParam List concatRowSeq, - @AuthenticationPrincipal CustomUserDetails userDetails) { - concatRowSeq.forEach(seq -> { - Long projectId = concatRowService.readConcatRow(seq).getConcatTab().getProjectId(); - projectService.projectCheck(userDetails.getMember().getSeq(), projectId); - }); + public ResponseEntity>> read( + @RequestParam List concatRowSeq, + @AuthenticationPrincipal CustomUserDetails userDetails) { + concatRowSeq.forEach( + seq -> { + Long projectId = concatRowService.readConcatRow(seq).getConcatTab().getProjectId(); + projectService.projectCheck(userDetails.getMember().getSeq(), projectId); + }); concatRowSeq.sort(Long::compareTo); List audioFileList = audioFileService.findByConcatRowSeq(concatRowSeq); return buildResponse(HttpStatus.OK, audioFileList); } - @Operation( - summary = "사용자가 업로드 한 모든 오디오 파일을 조회합니다.", - description = "업로드 된 오디오의 정보를 반환합니다." - ) + @Operation(summary = "사용자가 업로드 한 모든 오디오 파일을 조회합니다.", description = "업로드 된 오디오의 정보를 반환합니다.") @GetMapping("read/my/audio") - public ResponseEntity>> readMyAudio(@AuthenticationPrincipal CustomUserDetails userDetails, - @RequestParam int page, - @RequestParam int size, - @RequestParam String sort) { + public ResponseEntity>> readMyAudio( + @AuthenticationPrincipal CustomUserDetails userDetails, + @RequestParam int page, + @RequestParam int size, + @RequestParam String sort) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - String user = authentication.getPrincipal().toString(); + String user = authentication.getPrincipal().toString(); System.out.println("user = " + user); - Sort.Direction direction = Sort.Direction.fromString(sort); // "ASC" 또는 "DESC" - Pageable pageable = PageRequest.of(page, size, Sort.by(direction, "createdDate")); // "created_date"가 아니라 매핑된 엔티티 필드 이름 사용 - return buildResponse(HttpStatus.OK, audioFileService.getMemberAudioFile(userDetails.getMember().getSeq(), pageable)); + Pageable pageable = + PageRequest.of( + page, size, Sort.by(direction, "createdDate")); // "created_date"가 아니라 매핑된 엔티티 필드 이름 사용 + return buildResponse( + HttpStatus.OK, + audioFileService.getMemberAudioFile(userDetails.getMember().getSeq(), pageable)); } @Operation( summary = "전달받은 페이지 사이즈로 계산한 페이지 배열을 반환 합니다.", - description = "숫자 배열을 반환합니다. 숫자는 0부터 시작합니다." - ) + description = "숫자 배열을 반환합니다. 숫자는 0부터 시작합니다.") @GetMapping("read/my/audio/pages") - public ResponseEntity>> readMyAudioPages(@AuthenticationPrincipal CustomUserDetails userDetails, - @RequestParam int size) { - return buildResponse(HttpStatus.OK, audioFileService.getAudioFilePages(userDetails.getMember().getSeq(), size)); + public ResponseEntity>> readMyAudioPages( + @AuthenticationPrincipal CustomUserDetails userDetails, @RequestParam int size) { + return buildResponse( + HttpStatus.OK, audioFileService.getAudioFilePages(userDetails.getMember().getSeq(), size)); } private List convertToDto(List audioFiles) { @@ -124,4 +119,4 @@ private List convertToDto(List audioFiles) { private ResponseEntity> buildResponse(HttpStatus status, T data) { return new ResponseEntity<>(new ResponseDto<>(status.value(), data), status); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java index 866ece47..96796649 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/BgmFileController.java @@ -2,6 +2,7 @@ import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.service.BgmFileService; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -9,9 +10,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - - @RestController @RequiredArgsConstructor @RequestMapping("/api/bgms") @@ -23,5 +21,4 @@ public ResponseEntity> getBgmFiles(@PathVariable Long tabSeq) { List bgmFiles = bgmFileService.getBgmFilesByTabSeq(tabSeq); return ResponseEntity.ok(bgmFiles); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java index 4706a7f7..d5a48851 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatController.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.controller; - import com.oreo.finalproject_5re5_be.concat.dto.ConcatResultDto; import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; @@ -12,17 +11,16 @@ import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.IOException; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.concurrent.ExecutionException; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.io.IOException; -import java.util.List; -import java.util.NoSuchElementException; -import java.util.concurrent.ExecutionException; - @Tag(name = "Concat", description = "Concat 관련 API") @RestController @RequiredArgsConstructor @@ -33,60 +31,64 @@ public class ConcatController { private final ConcatResultService concatResultService; private final ProjectService projectService; - @Operation( - summary = "오디오 병합을 수행합니다.", - description = "병합이 성공 했다면 저장된 오디오 정보를 반환합니다." - ) + @Operation(summary = "오디오 병합을 수행합니다.", description = "병합이 성공 했다면 저장된 오디오 정보를 반환합니다.") @PostMapping("") - public ResponseEntity>> concat(@RequestBody ConcatRowRequestDto audioRequests, - @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException, ExecutionException, InterruptedException { - projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); + public ResponseEntity>> concat( + @RequestBody ConcatRowRequestDto audioRequests, + @AuthenticationPrincipal CustomUserDetails customUserDetails) + throws IOException, ExecutionException, InterruptedException { + projectService.projectCheck( + customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); - ConcatTabResponseDto concatTabResponseDto - = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); + ConcatTabResponseDto concatTabResponseDto = + concatTabService.readConcatTab( + audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); - List concatResult = lambdaConcatService.concatOnLambda(concatTabResponseDto, audioRequests); + List concatResult = + lambdaConcatService.concatOnLambda(concatTabResponseDto, audioRequests); return new ResponseDto<>(HttpStatus.OK.value(), concatResult).toResponseEntity(); } -// @PostMapping("") -// public ResponseEntity> concat(@RequestBody ConcatRowRequestDto audioRequests, -// @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { -// projectService.projectCheck(customUserDetails.getMember().getSeq(), audioRequests.getConcatTabId()); -// -// ConcatTabResponseDto concatTabResponseDto -// = concatTabService.readConcatTab(audioRequests.getConcatTabId(), customUserDetails.getMember().getSeq()); -// ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); -// return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); -// } - - - - @Operation( - summary = "오디오 결과 목록 불러오기", - description = "프로젝트 번호에 해당하는 오디오 결과 목록을 반환합니다." - ) + // @PostMapping("") + // public ResponseEntity> concat(@RequestBody ConcatRowRequestDto + // audioRequests, + // @AuthenticationPrincipal + // CustomUserDetails customUserDetails) throws IOException { + // projectService.projectCheck(customUserDetails.getMember().getSeq(), + // audioRequests.getConcatTabId()); + // + // ConcatTabResponseDto concatTabResponseDto + // = concatTabService.readConcatTab(audioRequests.getConcatTabId(), + // customUserDetails.getMember().getSeq()); + // ConcatResultDto concat = concatService.concat(concatTabResponseDto, audioRequests); + // return new ResponseDto<>(HttpStatus.OK.value(), concat).toResponseEntity(); + // } + + @Operation(summary = "오디오 결과 목록 불러오기", description = "프로젝트 번호에 해당하는 오디오 결과 목록을 반환합니다.") @GetMapping("read/result") - public ResponseEntity>> readConcatResult(@RequestParam Long projectSeq, - @AuthenticationPrincipal CustomUserDetails userDetails) { + public ResponseEntity>> readConcatResult( + @RequestParam Long projectSeq, @AuthenticationPrincipal CustomUserDetails userDetails) { projectService.projectCheck(userDetails.getMember().getSeq(), projectSeq); - return new ResponseDto<>(HttpStatus.OK.value(), concatResultService.findByConcatTabSequence(projectSeq)).toResponseEntity(); + return new ResponseDto<>( + HttpStatus.OK.value(), concatResultService.findByConcatTabSequence(projectSeq)) + .toResponseEntity(); } // IllegalArgumentException 처리 @ExceptionHandler(IllegalArgumentException.class) - public ResponseEntity> handleDataNotFoundException(IllegalArgumentException ex) { + public ResponseEntity> handleDataNotFoundException( + IllegalArgumentException ex) { String errorMessage = ex.getMessage(); return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), errorMessage).toResponseEntity(); } - // NoSuchElementException 처리 @ExceptionHandler(NoSuchElementException.class) - public ResponseEntity> handleDataNotFoundException(NoSuchElementException ex) { + public ResponseEntity> handleDataNotFoundException( + NoSuchElementException ex) { String errorMessage = ex.getMessage(); return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), errorMessage).toResponseEntity(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java index 462eeb8e..79d0d749 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatMaterialController.java @@ -13,6 +13,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.constraints.NotNull; +import java.util.List; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -21,8 +22,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @Tag(name = "Concat", description = "Concat 관련 API") @RestController @RequestMapping("/api/concat/audio/materials") @@ -31,7 +30,8 @@ public class ConcatMaterialController { private final MaterialAudioService materialAudioService; private final ProjectService projectService; - public ConcatMaterialController(MaterialAudioService materialAudioService, ProjectService projectService) { + public ConcatMaterialController( + MaterialAudioService materialAudioService, ProjectService projectService) { this.materialAudioService = materialAudioService; this.projectService = projectService; } @@ -44,32 +44,36 @@ public ResponseEntity> getAllMaterialsByResult projectService.projectCheck(userDetails.getMember().getSeq(), concatResultSeq); // ConcatResult에서 결과 파일 URL 조회 - String resultAudioUrl = materialAudioService.findResultAudioUrlByConcatResultSeq(concatResultSeq); + String resultAudioUrl = + materialAudioService.findResultAudioUrlByConcatResultSeq(concatResultSeq); // BGM 파일 조회 BgmFile bgmFile = materialAudioService.findBgmFileByConcatResultSeq(concatResultSeq); OriginAudioRequest bgmFileResponse = null; if (bgmFile != null) { - bgmFileResponse = OriginAudioRequest.builder() - .seq(bgmFile.getBgmFileSeq()) - .audioUrl(bgmFile.getAudioUrl()) - .extension(bgmFile.getExtension()) - .fileSize(bgmFile.getFileSize()) - .fileLength(bgmFile.getFileLength()) - .fileName(bgmFile.getFileName()) - .build(); + bgmFileResponse = + OriginAudioRequest.builder() + .seq(bgmFile.getBgmFileSeq()) + .audioUrl(bgmFile.getAudioUrl()) + .extension(bgmFile.getExtension()) + .fileSize(bgmFile.getFileSize()) + .fileLength(bgmFile.getFileLength()) + .fileName(bgmFile.getFileName()) + .build(); } // 재료 오디오 파일 조회 - List materialAudioFiles = materialAudioService.findMaterialAudioFilesByConcatResultSeq(concatResultSeq); + List materialAudioFiles = + materialAudioService.findMaterialAudioFilesByConcatResultSeq(concatResultSeq); // 응답 생성 - ConcatResultResponse response = ConcatResultResponse.builder() - .concatResultSeq(concatResultSeq) - .audioUrl(resultAudioUrl) - .bgmFile(bgmFileResponse) - .materialAudioFiles(materialAudioFiles) - .build(); + ConcatResultResponse response = + ConcatResultResponse.builder() + .concatResultSeq(concatResultSeq) + .audioUrl(resultAudioUrl) + .bgmFile(bgmFileResponse) + .materialAudioFiles(materialAudioFiles) + .build(); return new ResponseDto<>(HttpStatus.OK.value(), response).toResponseEntity(); } @@ -84,11 +88,12 @@ public ResponseEntity> getMaterialRowListByResultS projectService.projectCheck(userDetails.getMember().getSeq(), concatResultSeq); // resultSeq로 재료가 된 concatRowList 얻어오기 - List materialConcatRowList = materialAudioService.findConcatRowListByResultSeq(concatResultSeq); + List materialConcatRowList = + materialAudioService.findConcatRowListByResultSeq(concatResultSeq); // 응답 - return new ResponseDto<>(HttpStatus.OK.value(), ConcatRowListDto.of(materialConcatRowList)).toResponseEntity(); + return new ResponseDto<>(HttpStatus.OK.value(), ConcatRowListDto.of(materialConcatRowList)) + .toResponseEntity(); // 조회 결과 응답 DTO로 변환 } - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java index 1c89c784..40dedc36 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowController.java @@ -1,7 +1,6 @@ package com.oreo.finalproject_5re5_be.concat.controller; import com.oreo.finalproject_5re5_be.concat.dto.ConcatRowDto; -import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; import com.oreo.finalproject_5re5_be.concat.service.ConcatRowService; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; @@ -9,15 +8,14 @@ import com.oreo.finalproject_5re5_be.project.service.ProjectService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.IOException; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.io.IOException; -import java.util.List; - @Tag(name = "Concat", description = "Concat 관련 API") @RestController @RequestMapping("/api/concat/row") @@ -26,84 +24,76 @@ public class ConcatRowController { private final ConcatRowService concatRowService; private final ProjectService projectService; - //오디오 파일 업로드 -> S3url리턴 -> 클라에서 url로 로우 생성 -> 저장 요청 -> url로 테이블 로우 생성 - @Operation( - summary = "행 저장", - description = "새로운 행을 저장합니다.") + // 오디오 파일 업로드 -> S3url리턴 -> 클라에서 url로 로우 생성 -> 저장 요청 -> url로 테이블 로우 생성 + @Operation(summary = "행 저장", description = "새로운 행을 저장합니다.") @PostMapping("save") public ResponseEntity> save( @RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto, - @AuthenticationPrincipal CustomUserDetails customUserDetails) throws IOException { - projectService.projectCheck(customUserDetails.getMember().getSeq(), - concatRowSaveRequestDto.getConcatTabId()); + @AuthenticationPrincipal CustomUserDetails customUserDetails) + throws IOException { + projectService.projectCheck( + customUserDetails.getMember().getSeq(), concatRowSaveRequestDto.getConcatTabId()); - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.saveConcatRows(concatRowSaveRequestDto)) + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.saveConcatRows(concatRowSaveRequestDto)) .toResponseEntity(); } - @Operation( - summary = "행 비활성", - description = "오디오 파일이 조회되지 않도록 비활성 처리 합니다." - ) + @Operation(summary = "행 비활성", description = "오디오 파일이 조회되지 않도록 비활성 처리 합니다.") @PostMapping("disable") - public ResponseEntity> disable(@RequestParam List rowSeq, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), + public ResponseEntity> disable( + @RequestParam List rowSeq, + @AuthenticationPrincipal CustomUserDetails customUserDetails) { + projectService.projectCheck( + customUserDetails.getMember().getSeq(), concatRowService.readConcatRow(rowSeq.get(0)).getConcatTab().getProjectId()); return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.disableConcatRows(rowSeq)) .toResponseEntity(); } - - @Operation( - summary = "행 조회", - description = "하나 행을 조회합니다. 이전에 비활성 된 행은 조회 할 수 없습니다." - ) + @Operation(summary = "행 조회", description = "하나 행을 조회합니다. 이전에 비활성 된 행은 조회 할 수 없습니다.") @GetMapping("read") public ResponseEntity>> readOne( @RequestParam Long concatRowSequence, @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), + projectService.projectCheck( + customUserDetails.getMember().getSeq(), concatRowService.readConcatRow(concatRowSequence).getConcatTab().getProjectId()); - //사용자 예외 처리 - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.readConcatRows(concatRowSequence)) + // 사용자 예외 처리 + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.readConcatRows(concatRowSequence)) .toResponseEntity(); } - @Operation( - summary = "행 조회", - description = "프로젝트의 활성 상태인 행을조회합니다. 이전에 비활성 된 행은 조회 할 수 없습니다." - ) + @Operation(summary = "행 조회", description = "프로젝트의 활성 상태인 행을조회합니다. 이전에 비활성 된 행은 조회 할 수 없습니다.") @GetMapping("read/recent") public ResponseEntity>> readRecent( @RequestParam Long projectSequence, @AuthenticationPrincipal CustomUserDetails customUserDetails) { projectService.projectCheck(customUserDetails.getMember().getSeq(), projectSequence); - //사용자 예외 처리 - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.readRecentConcatRows(projectSequence)) + // 사용자 예외 처리 + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.readRecentConcatRows(projectSequence)) .toResponseEntity(); } - @Operation( - summary = "행 업데이트", - description = "행을 업데이트 합니다. 새로운 행이 생성 되므로 이전의 행과 다른 아이디를 반환 합니다." - ) + @Operation(summary = "행 업데이트", description = "행을 업데이트 합니다. 새로운 행이 생성 되므로 이전의 행과 다른 아이디를 반환 합니다.") @PostMapping("update") - public ResponseEntity> update(@RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), concatRowSaveRequestDto.getConcatTabId()); + public ResponseEntity> update( + @RequestBody ConcatRowSaveRequestDto concatRowSaveRequestDto, + @AuthenticationPrincipal CustomUserDetails customUserDetails) { + projectService.projectCheck( + customUserDetails.getMember().getSeq(), concatRowSaveRequestDto.getConcatTabId()); - return new ResponseDto<>(HttpStatus.OK.value(), concatRowService.updateConcatRows(concatRowSaveRequestDto)) + return new ResponseDto<>( + HttpStatus.OK.value(), concatRowService.updateConcatRows(concatRowSaveRequestDto)) .toResponseEntity(); } - @Operation( - summary = "행 텍스트 업로드", - description = "행에 텍스트를 업로드 합니다. 이전과 같은 아이디를 반환합니다." - ) + @Operation(summary = "행 텍스트 업로드", description = "행에 텍스트를 업로드 합니다. 이전과 같은 아이디를 반환합니다.") @PostMapping("upload/text") public ResponseEntity> uploadText( @AuthenticationPrincipal CustomUserDetails customUserDetails, diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java index 2a47ed67..c2ff5b4d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatRowTabController.java @@ -9,16 +9,14 @@ import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Tag(name = "Concat", description = "Concat 관련 API") - @RestController @RequiredArgsConstructor @RequestMapping("api/v2/concat") @@ -27,18 +25,17 @@ public class ConcatRowTabController { private final AudioFileService audioFileService; private final ConcatRowTabService concatRowTabService; - //탭 로우 조회 - //탭 로우 저장 + // 탭 로우 조회 + // 탭 로우 저장 - @Operation( - summary = "ConcatRow, ConcatTab을 저장합니다." - ) + @Operation(summary = "ConcatRow, ConcatTab을 저장합니다.") @PostMapping("save") public ResponseEntity> saveRowAndTab( @RequestBody TabRowUpdateRequestDto dto, @AuthenticationPrincipal CustomUserDetails customUserDetails) { try { - boolean result = concatRowTabService.saveTabAndRows(dto, customUserDetails.getMember().getSeq()); + boolean result = + concatRowTabService.saveTabAndRows(dto, customUserDetails.getMember().getSeq()); return new ResponseDto<>(HttpStatus.OK.value(), result).toResponseEntity(); } catch (Exception e) { e.printStackTrace(); @@ -46,51 +43,57 @@ public ResponseEntity> saveRowAndTab( } } - - @Operation( - summary = "ConcatRow, ConcatTab을 조회합니다.") + @Operation(summary = "ConcatRow, ConcatTab을 조회합니다.") @GetMapping("read") public ResponseEntity> readRowAndTab( - @RequestParam Long projectSeq, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { + @RequestParam Long projectSeq, @AuthenticationPrincipal CustomUserDetails customUserDetails) { // Tab setting - ConcatTabResponseDto concatTabResponseDto - = concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq()); + ConcatTabResponseDto concatTabResponseDto = + concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq()); // ConcatTabResponseDto에 bgmFileList 추가 - concatTabResponseDto = ConcatTabResponseDto.builder() - .tabId(concatTabResponseDto.getTabId()) - .frontSilence(concatTabResponseDto.getFrontSilence()) - .status(concatTabResponseDto.getStatus()) - .bgmFileList(concatTabResponseDto.getBgmFileList()) // BgmFile 리스트 추가 - .build(); + concatTabResponseDto = + ConcatTabResponseDto.builder() + .tabId(concatTabResponseDto.getTabId()) + .frontSilence(concatTabResponseDto.getFrontSilence()) + .status(concatTabResponseDto.getStatus()) + .bgmFileList(concatTabResponseDto.getBgmFileList()) // BgmFile 리스트 추가 + .build(); // Row setting // ConcatRow와 AudioFile 리스트 조회 - List audioFiles = audioFileService.getAudioFilesByProjectAndStatusTrue(projectSeq); + List audioFiles = + audioFileService.getAudioFilesByProjectAndStatusTrue(projectSeq); - List concatRowRequests = audioFiles.stream().map(x -> ConcatRowRequest.builder() - .originAudioRequest(OriginAudioRequest.builder() - .seq(x.getAudioFileSeq()) - .audioUrl(x.getAudioUrl()) - .fileName(x.getFileName()) - .fileSize(x.getFileSize()) - .fileLength(x.getFileLength()) - .extension(x.getExtension()).build() - ) - .rowText(x.getConcatRow().getRowText()) - .selected(x.getConcatRow().getSelected()) - .rowIndex(x.getConcatRow().getRowIndex()) - .rowSilence(x.getConcatRow().getSilence()) - .status(x.getConcatRow().getStatus()) - .seq(x.getConcatRow().getConcatRowSequence()) - .build()).toList(); + List concatRowRequests = + audioFiles.stream() + .map( + x -> + ConcatRowRequest.builder() + .originAudioRequest( + OriginAudioRequest.builder() + .seq(x.getAudioFileSeq()) + .audioUrl(x.getAudioUrl()) + .fileName(x.getFileName()) + .fileSize(x.getFileSize()) + .fileLength(x.getFileLength()) + .extension(x.getExtension()) + .build()) + .rowText(x.getConcatRow().getRowText()) + .selected(x.getConcatRow().getSelected()) + .rowIndex(x.getConcatRow().getRowIndex()) + .rowSilence(x.getConcatRow().getSilence()) + .status(x.getConcatRow().getStatus()) + .seq(x.getConcatRow().getConcatRowSequence()) + .build()) + .toList(); - - return new ResponseDto<>(HttpStatus.OK.value(), new TabRowResponseDto(concatTabResponseDto, - new ConcatRowSaveRequestDto(concatTabResponseDto.getTabId(), concatRowRequests))) + return new ResponseDto<>( + HttpStatus.OK.value(), + new TabRowResponseDto( + concatTabResponseDto, + new ConcatRowSaveRequestDto(concatTabResponseDto.getTabId(), concatRowRequests))) .toResponseEntity(); } } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java index b0dc23e9..6b8a278a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatTabController.java @@ -10,14 +10,13 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import java.util.List; - @Tag(name = "Concat", description = "Concat 관련 API") @RestController @RequiredArgsConstructor @@ -27,56 +26,54 @@ public class ConcatTabController { private final ConcatTabService concatTabService; private final ProjectService projectService; - @Operation( - summary = "프로젝트의 Concat 탭을 생성합니다.", - description = "생성이 성공했다면 True를 반환합니다." - ) + @Operation(summary = "프로젝트의 Concat 탭을 생성합니다.", description = "생성이 성공했다면 True를 반환합니다.") @PostMapping("create") - public ResponseEntity> create(@AuthenticationPrincipal CustomUserDetails customUserDetails, - @RequestParam Long projectSeq) { + public ResponseEntity> create( + @AuthenticationPrincipal CustomUserDetails customUserDetails, @RequestParam Long projectSeq) { projectService.projectCheck(customUserDetails.getMember().getSeq(), projectSeq); - //사용자 예외처리 - return new ResponseDto<>(HttpStatus.OK.value(), concatTabService - .createConcatTab(new ConcatCreateRequestDto(projectSeq, customUserDetails.getMember().getSeq()))) + // 사용자 예외처리 + return new ResponseDto<>( + HttpStatus.OK.value(), + concatTabService.createConcatTab( + new ConcatCreateRequestDto(projectSeq, customUserDetails.getMember().getSeq()))) .toResponseEntity(); } - @Operation( - summary = "탭 조회", - description = "프로젝트의 Concat 탭 정보를 조회합니다. 탭에 저장된 행 정보는 반환되지 않습니다." - ) + @Operation(summary = "탭 조회", description = "프로젝트의 Concat 탭 정보를 조회합니다. 탭에 저장된 행 정보는 반환되지 않습니다.") @GetMapping("read") public ResponseEntity> read( - @RequestParam Long projectSeq, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { + @RequestParam Long projectSeq, @AuthenticationPrincipal CustomUserDetails customUserDetails) { projectService.projectCheck(customUserDetails.getMember().getSeq(), projectSeq); - //사용자 예외 처리 - return new ResponseDto<>(HttpStatus.OK.value(), - concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq())) + // 사용자 예외 처리 + return new ResponseDto<>( + HttpStatus.OK.value(), + concatTabService.readConcatTab(projectSeq, customUserDetails.getMember().getSeq())) .toResponseEntity(); } - @Operation( - summary = "탭 업데이트", - description = "행 정보를 업데이트 합니다. 성공했다면 True를 반환합니다." - ) + @Operation(summary = "탭 업데이트", description = "행 정보를 업데이트 합니다. 성공했다면 True를 반환합니다.") @PostMapping("update") - public ResponseEntity> update(@RequestBody ConcatUpdateRequestDto updateRequestDto, - @AuthenticationPrincipal CustomUserDetails customUserDetails) { - projectService.projectCheck(customUserDetails.getMember().getSeq(), updateRequestDto.getTabId()); - return new ResponseDto<>(HttpStatus.OK.value(), - concatTabService.updateConcatTab(updateRequestDto, customUserDetails.getMember().getSeq())) + public ResponseEntity> update( + @RequestBody ConcatUpdateRequestDto updateRequestDto, + @AuthenticationPrincipal CustomUserDetails customUserDetails) { + projectService.projectCheck( + customUserDetails.getMember().getSeq(), updateRequestDto.getTabId()); + return new ResponseDto<>( + HttpStatus.OK.value(), + concatTabService.updateConcatTab( + updateRequestDto, customUserDetails.getMember().getSeq())) .toResponseEntity(); } @Operation( summary = "BGM 오디오 파일 업데이트", - description = "BGM 오디오 파일을 추가하거나 제거합니다. BgmFile ID 목록을 전달합니다." - ) + description = "BGM 오디오 파일을 추가하거나 제거합니다. BgmFile ID 목록을 전달합니다.") @PostMapping("update-bgm") public ResponseEntity> updateBgm( @RequestParam Long tabSeq, - @RequestBody(required = false) @Schema(description = "BgmFile ID 목록", example = "[101, 102, 103]") List bgmAudioFileSeqs, + @RequestBody(required = false) + @Schema(description = "BgmFile ID 목록", example = "[101, 102, 103]") + List bgmAudioFileSeqs, @AuthenticationPrincipal CustomUserDetails customUserDetails) { // 프로젝트 권한 확인 projectService.projectCheck(customUserDetails.getMember().getSeq(), tabSeq); @@ -87,6 +84,4 @@ public ResponseEntity> updateBgm( // 응답 반환 return new ResponseDto<>(HttpStatus.OK.value(), result).toResponseEntity(); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java index 55acfec3..9cd00ded 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/controller/ConcatWithBgmController.java @@ -21,6 +21,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.http.HttpStatus; @@ -28,13 +33,6 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import java.io.ByteArrayOutputStream; -import java.util.ArrayList; -import java.util.List; - - @Tag(name = "Concat", description = "Concat 관련 API") @RestController @Log4j2 @@ -56,27 +54,25 @@ public class ConcatWithBgmController { summary = "Row 오디오와 BGM 파일 병합", description = "선택된 Row 오디오 파일과 BGM 파일을 병합하여 S3에 업로드합니다.", responses = { - @ApiResponse( - responseCode = "200", - description = "성공적으로 병합된 오디오 URL을 반환합니다.", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ConcatResponseDto.class) - ) - ), - @ApiResponse( - responseCode = "500", - description = "병합 작업 중 오류 발생", - content = @Content( - mediaType = "application/json", - schema = @Schema(implementation = ResponseDto.class) - ) - ) - } - ) + @ApiResponse( + responseCode = "200", + description = "성공적으로 병합된 오디오 URL을 반환합니다.", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = ConcatResponseDto.class))), + @ApiResponse( + responseCode = "500", + description = "병합 작업 중 오류 발생", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = ResponseDto.class))) + }) @PostMapping("/execute-with-bgm") public ResponseEntity> executeConcatWithBgm( - @Parameter(description = "저장할 결과파일 이름", required = true) @RequestParam String concatResultFileName, + @Parameter(description = "저장할 결과파일 이름", required = true) @RequestParam + String concatResultFileName, @RequestBody TabRowUpdateRequestDto requestDto, @AuthenticationPrincipal CustomUserDetails customUserDetails) { @@ -90,18 +86,22 @@ public ResponseEntity> executeConcatWithBgm( float frontSilence = concatTab.getFrontSilence(); String bgmFileUrl = concatTab.getBgmFileList().get(0).getAudioUrl(); - log.info("concatTab:{}",concatTabSeq); + log.info("concatTab:{}", concatTabSeq); - projectService.projectCheck(customUserDetails.getMember().getSeq(), requestDto.getConcatTab().getTabId()); + projectService.projectCheck( + customUserDetails.getMember().getSeq(), requestDto.getConcatTab().getTabId()); - IntervalConcatenator intervalConcatenator = new StereoIntervalConcatenator(defaultAudioFormat); + IntervalConcatenator intervalConcatenator = + new StereoIntervalConcatenator(defaultAudioFormat); List audioProperties = audioStreamService.loadAudioFiles(concatRows); // 2. 병합된 오디오 생성 - ByteArrayOutputStream concatenatedAudioBuffer = intervalConcatenator.intervalConcatenate(audioProperties, frontSilence); + ByteArrayOutputStream concatenatedAudioBuffer = + intervalConcatenator.intervalConcatenate(audioProperties, frontSilence); - AudioInputStream concatenatedAudioStream = audioStreamService.createAudioInputStream(concatenatedAudioBuffer, defaultAudioFormat); + AudioInputStream concatenatedAudioStream = + audioStreamService.createAudioInputStream(concatenatedAudioBuffer, defaultAudioFormat); // BGM 작업 1: BGM 스트림 로드 및 버퍼링 AudioInputStream bufferedBgmStream = audioStreamService.loadAsBufferedStream(bgmFileUrl); @@ -115,13 +115,17 @@ public ResponseEntity> executeConcatWithBgm( bufferedBgmStream = BgmProcessor.adjustBgmLength(bufferedBgmStream, targetFrames, bgmFrames); // 4. 믹싱 - AudioInputStream mixedAudioStream = BgmProcessor.mixAudio(concatenatedAudioStream, bufferedBgmStream); + AudioInputStream mixedAudioStream = + BgmProcessor.mixAudio(concatenatedAudioStream, bufferedBgmStream); // 결과파일 S3 업로드 - String resultAudioUrl = s3Service.uploadAudioStream(mixedAudioStream, "concat/result", concatResultFileName); + String resultAudioUrl = + s3Service.uploadAudioStream(mixedAudioStream, "concat/result", concatResultFileName); // DB 저장1. ConcatResult DB - ConcatUrlResponse concatResultResponse = concatResultService.saveConcatResult(concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); + ConcatUrlResponse concatResultResponse = + concatResultService.saveConcatResult( + concatTabSeq, resultAudioUrl, concatResultFileName, mixedAudioStream); OriginAudioRequest bgmRequest = concatTab.getBgmFileList().get(0); @@ -136,21 +140,27 @@ public ResponseEntity> executeConcatWithBgm( materialAudioService.saveMaterialsForConcatRows(concatRows, concatResultResponse); // 응답에 들어갈 concatRowFiles 생성 - List concatRowFiles = concatRows.getConcatRowRequests().stream() - .map(row -> { - AudioFile audioFile = audioFileService.getAudioFileByUrl(row.getOriginAudioRequest().getSeq()); - return audioFile; - }) - .map(this::convertToOriginAudioRequest) - .peek(originAudioRequest -> log.info("Converted to OriginAudioRequest: {}", originAudioRequest)) - .toList(); + List concatRowFiles = + concatRows.getConcatRowRequests().stream() + .map( + row -> { + AudioFile audioFile = + audioFileService.getAudioFileByUrl(row.getOriginAudioRequest().getSeq()); + return audioFile; + }) + .map(this::convertToOriginAudioRequest) + .peek( + originAudioRequest -> + log.info("Converted to OriginAudioRequest: {}", originAudioRequest)) + .toList(); // 응답 생성 - ConcatResponseDto responseDto = ConcatResponseDto.builder() - .audioUrl(resultAudioUrl) - .bgmFile(bgmRequest) - .concatRowFiles(concatRowFiles) - .build(); + ConcatResponseDto responseDto = + ConcatResponseDto.builder() + .audioUrl(resultAudioUrl) + .bgmFile(bgmRequest) + .concatRowFiles(concatRowFiles) + .build(); return new ResponseDto<>(HttpStatus.OK.value(), responseDto).toResponseEntity(); } catch (Exception e) { @@ -159,7 +169,6 @@ public ResponseEntity> executeConcatWithBgm( } } - private OriginAudioRequest convertToOriginAudioRequest(AudioFile audioFile) { return OriginAudioRequest.builder() .seq(audioFile.getAudioFileSeq()) @@ -172,12 +181,13 @@ private OriginAudioRequest convertToOriginAudioRequest(AudioFile audioFile) { } private ResponseEntity> createErrorResponse() { - return new ResponseDto<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), - ConcatResponseDto.builder() - .audioUrl(null) // 결과 파일 URL 없음 - .bgmFile(null) // BGM 파일 정보 없음 - .concatRowFiles(new ArrayList<>()) // ConcatRow 파일 정보 없음 - .build() - ).toResponseEntity(); + return new ResponseDto<>( + HttpStatus.INTERNAL_SERVER_ERROR.value(), + ConcatResponseDto.builder() + .audioUrl(null) // 결과 파일 URL 없음 + .bgmFile(null) // BGM 파일 정보 없음 + .concatRowFiles(new ArrayList<>()) // ConcatRow 파일 정보 없음 + .build()) + .toResponseEntity(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java index f0004909..0c677328 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatResponseDto.java @@ -1,9 +1,8 @@ package com.oreo.finalproject_5re5_be.concat.dto; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; -import lombok.*; - import java.util.List; +import lombok.*; @Getter @Setter @@ -14,4 +13,4 @@ public class ConcatResponseDto { private String audioUrl; // 결과 파일 URL private OriginAudioRequest bgmFile; // BGM 오디오 파일 정보 private List concatRowFiles; // ConcatRow에서 사용된 파일 정보 리스트 -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java index 44cc2a7e..d14d9d34 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowDto.java @@ -17,7 +17,6 @@ public class ConcatRowDto { private Float silence; private Integer rowIndex; - // concatRow 엔티티 정보로 ConcatRowDto 객체 생성하는 메서드 public static ConcatRowDto of(ConcatRow concatRow) { return ConcatRowDto.builder() diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java index 24412d58..46742651 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/ConcatRowListDto.java @@ -1,12 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.dto; import com.oreo.finalproject_5re5_be.concat.entity.ConcatRow; +import java.util.List; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.util.List; - @Getter @Builder @ToString @@ -20,8 +19,6 @@ public static ConcatRowListDto of(List concatRowEntityList) { concatRowEntityList.stream().map(ConcatRowDto::of).toList(); // ConcatRowDto 리스트를 넣으며 ConcatRowListDto 생성 - return ConcatRowListDto.builder() - .rowList(concatRowDtoLList) - .build(); + return ConcatRowListDto.builder().rowList(concatRowDtoLList).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java index 6fed9882..2db4615c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/RowAudioFileDto.java @@ -1,23 +1,23 @@ package com.oreo.finalproject_5re5_be.concat.dto; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.time.LocalDateTime; @ToString @Builder @AllArgsConstructor @Getter public class RowAudioFileDto { - private Long audioFileSeq; - private String audioUrl; - private String extension; - private Long fileSize; - private Long fileLength; - private String fileName; - private LocalDateTime createdDate; + private Long audioFileSeq; + private String audioUrl; + private String extension; + private Long fileSize; + private Long fileLength; + private String fileName; + private LocalDateTime createdDate; - private ConcatRowDto concatRow; -} \ No newline at end of file + private ConcatRowDto concatRow; +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java index 758af81c..67fb8de7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/AudioFormatDto.java @@ -1,10 +1,9 @@ package com.oreo.finalproject_5re5_be.concat.dto.lambda; +import javax.sound.sampled.AudioFormat; import lombok.Getter; import lombok.Setter; -import javax.sound.sampled.AudioFormat; - @Getter @Setter public class AudioFormatDto { @@ -14,8 +13,7 @@ public class AudioFormatDto { private Integer frameSize; private Float frameRate; - public AudioFormatDto() { - } + public AudioFormatDto() {} public AudioFormatDto(AudioFormat audioFormat) { this.sampleRate = audioFormat.getSampleRate(); @@ -25,7 +23,8 @@ public AudioFormatDto(AudioFormat audioFormat) { this.frameRate = audioFormat.getFrameRate(); } - public AudioFormatDto(Float sampleRate, Integer bitDepth, Integer channels, Integer frameSize, Float frameRate) { + public AudioFormatDto( + Float sampleRate, Integer bitDepth, Integer channels, Integer frameSize, Float frameRate) { this.sampleRate = sampleRate; this.bitDepth = bitDepth; this.channels = channels; @@ -34,7 +33,13 @@ public AudioFormatDto(Float sampleRate, Integer bitDepth, Integer channels, Inte } public AudioFormat toAudioFormat() { - return new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, - sampleRate, bitDepth, channels, frameSize, frameRate, false); + return new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + sampleRate, + bitDepth, + channels, + frameSize, + frameRate, + false); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java index c32521e3..9bbae75f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/LambdaConcatRequest.java @@ -2,9 +2,8 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; -import lombok.Builder; - import java.util.List; +import lombok.Builder; @Builder public class LambdaConcatRequest { @@ -13,11 +12,13 @@ public class LambdaConcatRequest { private List audios; private String fileName; - public LambdaConcatRequest() { - } + public LambdaConcatRequest() {} - public LambdaConcatRequest(ConcatTabResponseDto concatTabResponseDto, AudioFormatDto audioFormatDto, - List audios, String fileName) { + public LambdaConcatRequest( + ConcatTabResponseDto concatTabResponseDto, + AudioFormatDto audioFormatDto, + List audios, + String fileName) { this.concatTabResponseDto = concatTabResponseDto; this.audioFormatDto = audioFormatDto; this.audios = audios; @@ -55,5 +56,4 @@ public String getFileName() { public void setFileName(String fileName) { this.fileName = fileName; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java index 8014b5c7..334199e5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/AudioInfo.java @@ -1,15 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.dto.lambda.response; - import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import javax.sound.sampled.AudioInputStream; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Getter @Setter @@ -20,7 +18,8 @@ public class AudioInfo { private float contentLength; private String contentType; - public AudioInfo(AudioInputStream audioData, String fileName, float contentLength, String contentType) { + public AudioInfo( + AudioInputStream audioData, String fileName, float contentLength, String contentType) { this.audioData = AudioExtensionConverter.mp3ToWav(audioData); this.fileName = fileName; this.contentLength = contentLength; @@ -40,9 +39,7 @@ public Long getContentSize() { return (long) audioData.length; } - - public InputStream toInputStream() { - return new ByteArrayInputStream(audioData); + return new ByteArrayInputStream(audioData); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java index 85c045f1..d4748e85 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/lambda/response/LambdaConcatResultDto.java @@ -3,11 +3,10 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import java.util.List; import lombok.Getter; import lombok.Setter; -import java.util.List; - @Getter @Setter public class LambdaConcatResultDto { @@ -25,8 +24,7 @@ public LambdaConcatResultDto( @JsonProperty("s3Url") String s3Url, @JsonProperty("contentType") String contentType, @JsonProperty("processId") String processId, - @JsonProperty("i") int i - ) { + @JsonProperty("i") int i) { this.info = info; this.processed = processed; this.s3Url = s3Url; @@ -37,12 +35,20 @@ public LambdaConcatResultDto( @Override public String toString() { - return "LambdaConcatResultDto{" + - ", processed=" + processed + - ", s3Url='" + s3Url + '\'' + - ", contentType='" + contentType + '\'' + - ", processId='" + processId + '\'' + - ", i=" + i + - '}'; + return "LambdaConcatResultDto{" + + ", processed=" + + processed + + ", s3Url='" + + s3Url + + '\'' + + ", contentType='" + + contentType + + '\'' + + ", processId='" + + processId + + '\'' + + ", i=" + + i + + '}'; } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java index 7ad0c8c6..e5ff6141 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileDto.java @@ -1,12 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.time.LocalDateTime; - @ToString @Builder @AllArgsConstructor diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java index 47635c5e..e6459edb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFileRequestDto.java @@ -16,5 +16,4 @@ public AudioFileRequestDto(String fileName) { this.fileName = fileName; this.audioFile = null; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java index 8393cdaf..4e9f354c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/AudioFormatRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; - import lombok.*; @Getter @@ -18,5 +17,4 @@ public class AudioFormatRequest { private Integer frameSize; private Short frameRate; private Character isBigEndian; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java index 771e1353..eb850917 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/BgmFunctionRequestDto.java @@ -1,9 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; - -import lombok.*; - import java.util.List; +import lombok.*; @Getter @Setter @@ -19,7 +17,7 @@ public class BgmFunctionRequestDto { private String bgmFileUrl; // 결과 파일 S3에 저장에 필요한 정보 private String concatResultFileName; - + @Getter @Setter @Builder @@ -29,5 +27,4 @@ public static class Row { private String audioUrl; // S3 URL 또는 파일 경로 private float silenceInterval; // 해당 행 뒤에 삽입될 무음 간격 } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java index eaf1eb60..02910b06 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatResultRequest.java @@ -2,9 +2,8 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import lombok.*; - import java.time.LocalDateTime; +import lombok.*; @Getter @Setter @@ -38,5 +37,4 @@ public class ConcatResultRequest { @NotNull(message = "createdDateTime 필드는 null 일 수 없습니다.") private LocalDateTime CreatedDateTime; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java index 904591bd..78f58b3d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequest.java @@ -12,11 +12,11 @@ @ToString @NoArgsConstructor @AllArgsConstructor -public class ConcatRowRequest { //화면을 저장하기 위해 SelectedConcatRowRequest와 달리 selected여부도 저장해야함 +public class ConcatRowRequest { // 화면을 저장하기 위해 SelectedConcatRowRequest와 달리 selected여부도 저장해야함 private Long seq; @NotNull(message = "originAudioRequest 필드는 null 일 수 없습니다.") - private OriginAudioRequest originAudioRequest; //행마다 매칭되는 원본 오디오파일 + private OriginAudioRequest originAudioRequest; // 행마다 매칭되는 원본 오디오파일 @Size(max = 255, message = "rowText 필드는 최대 255자까지 허용됩니다.") private String rowText; @@ -31,7 +31,7 @@ public class ConcatRowRequest { //화면을 저장하기 위해 SelectedConcatRo @Positive(message = "rowIndex 필드는 양수여야 합니다.") @NotNull(message = "rowIndex 필드는 null 일 수 없습니다.") - private Integer rowIndex; //행 순서 + private Integer rowIndex; // 행 순서 private Character status; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java index e7a34e7c..6f71cd4c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowRequestDto.java @@ -1,20 +1,16 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; import jakarta.validation.constraints.NotNull; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @Getter @AllArgsConstructor public class ConcatRowRequestDto { - @NotNull - private Long concatTabId; - @NotNull - private String fileName; - @NotNull - private List concatRowRequests; + @NotNull private Long concatTabId; + @NotNull private String fileName; + @NotNull private List concatRowRequests; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java index b59c25aa..c1f5f21c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatRowSaveRequestDto.java @@ -1,11 +1,10 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @Getter @AllArgsConstructor diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java index 5b5daa22..90c6d773 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatTabRequest.java @@ -2,7 +2,6 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.PositiveOrZero; - import java.util.List; public class ConcatTabRequest { @@ -15,5 +14,5 @@ public class ConcatTabRequest { @NotNull(message = "frontSilence 필드는 null 일 수 없습니다.") private Float frontSilence; - private String BgmFileUrl; //없을 수도 있음 + private String BgmFileUrl; // 없을 수도 있음 } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java index 6a7634cd..5650129e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/ConcatUpdateRequestDto.java @@ -1,12 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @AllArgsConstructor @Builder @@ -16,5 +15,4 @@ public class ConcatUpdateRequestDto { private final float frontSilence; private final Character status; private final List bgmFileList; // BgmFile 정보 리스트 - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java index 5f957e4b..21afe563 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/OriginAudioRequest.java @@ -10,7 +10,7 @@ @ToString @NoArgsConstructor @AllArgsConstructor -public class OriginAudioRequest { //순수한 오디오 파일 +public class OriginAudioRequest { // 순수한 오디오 파일 private Long seq; @Size(max = 1024, message = "fileUrl 필드는 최대 1024자까지 허용됩니다.") diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java index 6513ee3f..6dcfb734 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/request/SelectedConcatRowRequest.java @@ -1,8 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.dto.request; -import lombok.*; - import java.util.List; +import lombok.*; @Getter @Setter @@ -23,5 +22,4 @@ public static class Row { private String audioUrl; // S3 URL 또는 파일 경로 private float silenceInterval; // 해당 행 뒤에 삽입될 무음 간격 } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java index 0934c6dd..4179a780 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultDetailsResponse.java @@ -9,14 +9,14 @@ @Builder public class ConcatResultDetailsResponse { - private Long concatTabSeq; //객체가 아닌 seq를 반환 - private Long concatOptionSeq; //객체가 아닌 seq를 반환 + private Long concatTabSeq; // 객체가 아닌 seq를 반환 + private Long concatOptionSeq; // 객체가 아닌 seq를 반환 private String audioUrl; private String extension; private Float fileLength; private String fileName; - //format 관련 필드 + // format 관련 필드 private String encoding; private Float sampleRate; private Integer sampleSizeBit; @@ -24,6 +24,4 @@ public class ConcatResultDetailsResponse { private Integer frameSize; private Float frameRate; private Character isBigEndian; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java index 8c676300..347c4bbf 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatResultResponse.java @@ -1,11 +1,10 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import java.util.List; import lombok.Builder; import lombok.Getter; -import java.util.List; - @Builder @Getter public class ConcatResultResponse { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java index 2360fc08..13efb3c9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatRowTabResponseDto.java @@ -1,15 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; import com.oreo.finalproject_5re5_be.concat.dto.RowAudioFileDto; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.List; - @Getter @AllArgsConstructor public class ConcatRowTabResponseDto { private ConcatTabResponseDto concatTab; private List audioFiles; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java index d5897c3c..3dfcd5ea 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatTabResponseDto.java @@ -1,13 +1,12 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.ToString; -import java.util.List; - @ToString @Getter @Builder diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java index 0f8263b9..1926da9d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/ConcatUrlResponse.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.dto.response; - import lombok.*; @Getter @@ -10,7 +9,7 @@ @NoArgsConstructor @AllArgsConstructor public class ConcatUrlResponse { - //조회, 저장 후 출력할 SEQ와 URL + // 조회, 저장 후 출력할 SEQ와 URL private Long seq; private String url; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java index f26dbeaf..a5fe8d99 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/dto/response/TabRowResponseDto.java @@ -5,7 +5,6 @@ import lombok.Getter; import lombok.ToString; - @Getter @AllArgsConstructor @ToString diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java index 7d883a47..6fc6b997 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/AudioFile.java @@ -1,13 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedDate; -import java.time.LocalDateTime; - @ToString @Getter @Builder @@ -21,8 +19,8 @@ public class AudioFile extends BaseEntity { @SequenceGenerator( name = "audio_file_seq_generator", sequenceName = "audio_file_seq", // 실제 시퀀스 이름 - allocationSize = 1 // ID를 하나씩 할당 - ) + allocationSize = 1 // ID를 하나씩 할당 + ) @Column(name = "audio_file_seq") private Long audioFileSeq; @@ -30,17 +28,13 @@ public class AudioFile extends BaseEntity { @JoinColumn(name = "concat_row_seq") private ConcatRow concatRow; - - private String audioUrl; private String extension; private Long fileSize; private Long fileLength; private String fileName; + @CreatedDate @Column(updatable = false, name = "created_date") private LocalDateTime createdDate; - - } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java index b5be2639..f2c158e7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/BgmFile.java @@ -1,13 +1,11 @@ package com.oreo.finalproject_5re5_be.concat.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedDate; -import java.time.LocalDateTime; - @Getter @Builder @AllArgsConstructor @@ -36,10 +34,8 @@ public class BgmFile extends BaseEntity { private Long fileSize; private Long fileLength; private String fileName; + @CreatedDate @Column(updatable = false, name = "created_date") private LocalDateTime createdDate; - - } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java index 0d429500..329f165a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatResult.java @@ -2,10 +2,9 @@ import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; -import lombok.*; - import java.util.ArrayList; import java.util.List; +import lombok.*; @ToString @Getter @@ -46,16 +45,17 @@ public class ConcatResult extends BaseEntity { @Column(name = "process_id") private String processId; - @Column - private Integer seperated; + @Column private Integer seperated; public void addBgmFile(BgmFile bgmFile) { - this.bgmFiles.add(BgmFile.builder() - .concatResult(this) - .audioUrl(bgmFile.getAudioUrl()) - .fileName(bgmFile.getFileName()) - .fileLength(bgmFile.getFileLength()) - .extension(bgmFile.getExtension()).build()); + this.bgmFiles.add( + BgmFile.builder() + .concatResult(this) + .audioUrl(bgmFile.getAudioUrl()) + .fileName(bgmFile.getFileName()) + .fileLength(bgmFile.getFileLength()) + .extension(bgmFile.getExtension()) + .build()); } public void addBgmFiles(List bgmFiles) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java index 5103defe..a8950287 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRow.java @@ -17,26 +17,27 @@ public class ConcatRow extends BaseEntity { @SequenceGenerator( name = "concat_row_seq_generator", sequenceName = "concat_row_seq", // 실제 시퀀스 이름 - allocationSize = 1 // ID를 하나씩 할당 - ) + allocationSize = 1 // ID를 하나씩 할당 + ) @Column(name = "concat_row_seq") private Long concatRowSeq; - @ManyToOne(cascade = CascadeType.PERSIST) @JoinColumn(name = "pro_seq") private ConcatTab concatTab; @Column(name = "row_text") private String rowText; + @Column(name = "selected") private Character selected; + @Column(name = "silence") private Float silence; + @Column(name = "row_index") private Integer rowIndex; + @Column(name = "status") private Character status; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java index 185b201c..f82a1ee1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatRowLog.java @@ -2,9 +2,8 @@ import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; -import lombok.*; - import java.time.LocalDateTime; +import lombok.*; @ToString @Getter @@ -28,5 +27,4 @@ public class ConcatRowLog extends BaseEntity { private String RequestContext; private Character selected; private Float silence; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java index 7d104c49..b982b19d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/ConcatTab.java @@ -3,9 +3,8 @@ import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import com.oreo.finalproject_5re5_be.project.entity.Project; import jakarta.persistence.*; -import lombok.*; - import java.util.List; +import lombok.*; @Getter @Builder @@ -13,8 +12,7 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @Entity(name = "concat_tab") public class ConcatTab extends BaseEntity { - @Id - private Long projectId; + @Id private Long projectId; @MapsId // Project 엔티티의 ID를 ConcatTab의 ID로 사용 @OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) @@ -32,21 +30,18 @@ public class ConcatTab extends BaseEntity { @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "concatTab", fetch = FetchType.LAZY) private List bgmFiles; - public void addBgmFile(BgmFile bgmFile) { - bgmFiles.add(BgmFile.builder() - .concatTab(this) - .audioUrl(bgmFile.getAudioUrl()) - .fileName(bgmFile.getFileName()) - .fileLength(bgmFile.getFileLength()) - .extension(bgmFile.getExtension()).build()); + bgmFiles.add( + BgmFile.builder() + .concatTab(this) + .audioUrl(bgmFile.getAudioUrl()) + .fileName(bgmFile.getFileName()) + .fileLength(bgmFile.getFileLength()) + .extension(bgmFile.getExtension()) + .build()); } public void addBgmFile(List bgmFiles) { bgmFiles.forEach(this::addBgmFile); } - - } - - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java index 6922d386..f3656a0a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/entity/MaterialAudio.java @@ -20,15 +20,15 @@ public class MaterialAudio extends BaseEntity { @ManyToOne @JoinColumn(name = "concat_result_seq") @ToString.Exclude // 순환 참조 방지 - @JsonIgnore // JSON 직렬화에서 제외 + @JsonIgnore // JSON 직렬화에서 제외 private ConcatResult concatResult; @ManyToOne @JoinColumn(name = "audio_file_seq") @ToString.Exclude // 순환 참조 방지 - @JsonIgnore // JSON 직렬화에서 제외 + @JsonIgnore // JSON 직렬화에서 제외 private AudioFile audioFile; - @Column(name ="method") + @Column(name = "method") private String method; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java index aa298613..b08e8aec 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/AudioFileRepository.java @@ -1,6 +1,9 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.AudioFile; +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -8,14 +11,10 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - @Repository public interface AudioFileRepository extends JpaRepository { -// Optional findByAudioUrl(String audioUrl); + // Optional findByAudioUrl(String audioUrl); Optional findByFileName(String filename); @@ -25,48 +24,52 @@ public interface AudioFileRepository extends JpaRepository { @Query("SELECT af FROM audio_file af WHERE FUNCTION('DATE', af.createdDate) = :date") List findByCreatedDateOnly(LocalDate date); - //페이징 처리해서 데이터를 한번에 모두 가져오지 않고 필요한 만큼만 나눠서 처리 + // 페이징 처리해서 데이터를 한번에 모두 가져오지 않고 필요한 만큼만 나눠서 처리 Page findByExtension(String extension, Pageable pageable); - @Query(value = "SELECT * FROM audio_file" + - " WHERE concat_row_seq IN (:concatRowSeq)", nativeQuery = true) + @Query( + value = "SELECT * FROM audio_file" + " WHERE concat_row_seq IN (:concatRowSeq)", + nativeQuery = true) List findAllByConcatRowSeq(@Param("concatRowSeq") List concatRowSeq); - void deleteById(Long seq); - @Query("SELECT af.concatRow.concatRowSeq FROM audio_file af WHERE af.audioFileSeq IN :audioFileSeqs") + @Query( + "SELECT af.concatRow.concatRowSeq FROM audio_file af WHERE af.audioFileSeq IN :audioFileSeqs") List findConcatRowSeqsByAudioFileSeqs(List audioFileSeqs); - @Query(value = "SELECT * FROM audio_file" + - " WHERE concat_row_seq IN (:concatRowSeq)", nativeQuery = true) + @Query( + value = "SELECT * FROM audio_file" + " WHERE concat_row_seq IN (:concatRowSeq)", + nativeQuery = true) List findAllByConcatRowSeqs(@Param("concatRowSeq") List concatRowSeqs); - @Query("SELECT af FROM audio_file af " + - "JOIN af.concatRow cr " + - "JOIN cr.concatTab p " + - "WHERE p.project.member.seq = :member_seq") + @Query( + "SELECT af FROM audio_file af " + + "JOIN af.concatRow cr " + + "JOIN cr.concatTab p " + + "WHERE p.project.member.seq = :member_seq") List findAudioFileByMember(@Param("member_seq") Long memberSeq, Pageable pageable); - @Query("SELECT COUNT(af) FROM audio_file af " + - "JOIN af.concatRow cr " + - "JOIN cr.concatTab p " + - "WHERE p.project.member.seq = :memberSeq") + @Query( + "SELECT COUNT(af) FROM audio_file af " + + "JOIN af.concatRow cr " + + "JOIN cr.concatTab p " + + "WHERE p.project.member.seq = :memberSeq") long countByMemberSeq(@Param("memberSeq") Long memberSeq); @Query("SELECT a FROM audio_file a WHERE a.audioFileSeq = :audioFileSeq") AudioFile findAudioFileById(Long audioFileSeq); - @Query("SELECT af FROM audio_file af" + - " JOIN af.concatRow cr" + - " JOIN cr.concatTab ct" + - " WHERE ct.projectId = :proSeq" + - " AND cr.status = 'Y'") + @Query( + "SELECT af FROM audio_file af" + + " JOIN af.concatRow cr" + + " JOIN cr.concatTab ct" + + " WHERE ct.projectId = :proSeq" + + " AND cr.status = 'Y'") List findAudioFileByProjectSeq(@Param("proSeq") Long projectSeq); - @Query(value = "SELECT * FROM audio_file WHERE audio_file_seq = :audioFileSeq ", nativeQuery = true) + @Query( + value = "SELECT * FROM audio_file WHERE audio_file_seq = :audioFileSeq ", + nativeQuery = true) Optional findByAudioFileSeq(Long audioFileSeq); - - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java index d374ad75..2e103621 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/BgmFileRepository.java @@ -1,14 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; - @Repository public interface BgmFileRepository extends JpaRepository { // concatTab seq에 들어가는 bgmFile 정보들 조회 @@ -23,5 +22,4 @@ public interface BgmFileRepository extends JpaRepository { // 특정 audioUrl로 모든 BgmFile 조회 List findAllByAudioUrl(String audioUrl); - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java index 0fac9786..b4914989 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatResultRepository.java @@ -1,14 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; +import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; -import java.util.Optional; - @Repository public interface ConcatResultRepository extends JpaRepository { Optional findByConcatResultSequence(Long concatResultSeq); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java index 39dd50b1..e4a0c4fc 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowLogRepository.java @@ -5,5 +5,4 @@ import org.springframework.stereotype.Repository; @Repository -public interface ConcatRowLogRepository extends JpaRepository { -} +public interface ConcatRowLogRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java index 8f12457d..201a7e50 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatRowRepository.java @@ -1,33 +1,29 @@ package com.oreo.finalproject_5re5_be.concat.repository; import com.oreo.finalproject_5re5_be.concat.entity.ConcatRow; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface ConcatRowRepository extends JpaRepository { List findByStatusAndConcatTab_Project_ProSeq(Character status, Long projectSeq); + @Modifying - @Query(value = "UPDATE concat_row " + - "SET status = :status " + - "WHERE concat_row_seq IN :concatRowSeq", + @Query( + value = + "UPDATE concat_row " + "SET status = :status " + "WHERE concat_row_seq IN :concatRowSeq", nativeQuery = true) - int updateStatusByConcatRowSeq(@Param("concatRowSeq") List concatRowSeq, - @Param("status") Character status); + int updateStatusByConcatRowSeq( + @Param("concatRowSeq") List concatRowSeq, @Param("status") Character status); List findByConcatRowSeq(long concatRowSequence); - - @Query(value = "SELECT concat_row_seq " + - " FROM concat_row" + - " WHERE pro_seq=:proSeq", + @Query( + value = "SELECT concat_row_seq " + " FROM concat_row" + " WHERE pro_seq=:proSeq", nativeQuery = true) List findConcatRowIdByProjectSeq(@Param("proSeq") Long projectSeq); - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java index e63df093..40f7885c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabLogRepository.java @@ -5,5 +5,4 @@ import org.springframework.stereotype.Repository; @Repository -public interface ConcatTabLogRepository extends JpaRepository { -} +public interface ConcatTabLogRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java index ff7744ac..26b691ca 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/ConcatTabRepository.java @@ -5,5 +5,4 @@ import org.springframework.stereotype.Repository; @Repository -public interface ConcatTabRepository extends JpaRepository { -} +public interface ConcatTabRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java index 5b80b626..c8847c0a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/repository/MaterialAudioRepository.java @@ -4,30 +4,33 @@ import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; import com.oreo.finalproject_5re5_be.concat.entity.ConcatRow; import com.oreo.finalproject_5re5_be.concat.entity.MaterialAudio; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface MaterialAudioRepository extends JpaRepository { - @Query("SELECT ma.audioFile FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :resultSeq") + @Query( + "SELECT ma.audioFile FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :resultSeq") List findAudioFilesByConcatResult(Long resultSeq); - @Query("SELECT ma.concatResult FROM material_audio ma WHERE ma.audioFile.audioFileSeq = :audioFileSeq") + @Query( + "SELECT ma.concatResult FROM material_audio ma WHERE ma.audioFile.audioFileSeq = :audioFileSeq") List findConcatResultsByAudioFileSeq(Long audioFileSeq); @Modifying(clearAutomatically = true) // 변경 후 자동으로 영속성 컨텍스트를 초기화 - @Query("DELETE FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") + @Query( + "DELETE FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") void deleteByConcatResultSeq(Long concatResultSeq); - - @Query("SELECT ma FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") + + @Query( + "SELECT ma FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") List findByConcatResultSeq(Long concatResultSeq); - @Query("SELECT ma.audioFile.concatRow FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") + @Query( + "SELECT ma.audioFile.concatRow FROM material_audio ma WHERE ma.concatResult.concatResultSequence = :concatResultSeq") List findConcatRowListByConcatResultSeq(Long concatResultSeq); - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java index 0d49bed7..e9f6508d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioFileService.java @@ -11,17 +11,6 @@ import com.oreo.finalproject_5re5_be.concat.service.helper.AudioFileHelper; import com.oreo.finalproject_5re5_be.global.component.S3Service; import com.oreo.finalproject_5re5_be.global.exception.DataNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.UnsupportedAudioFileException; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -31,7 +20,16 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; - +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; @RequiredArgsConstructor @Service @@ -44,7 +42,8 @@ public class AudioFileService { // audioFile seq로 audioFile 정보 조회 (1개) public AudioFile getAudioFile(Long audioFileSeq) { - return audioFileRepository.findById(audioFileSeq) + return audioFileRepository + .findById(audioFileSeq) .orElseThrow(() -> new RuntimeException("Audio file not found")); } @@ -55,52 +54,60 @@ public List getAudioFilesByProjectAndStatusTrue(Long projectSeq // audioFile Url로 audioFile 정보 조회 (1개) public AudioFile getAudioFileByUrl(Long audioSeq) { - return audioFileRepository.findByAudioFileSeq(audioSeq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with URL: " + audioSeq)); + return audioFileRepository + .findByAudioFileSeq(audioSeq) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found with URL: " + audioSeq)); } // audioFile Name으로 audioFile 정보 조회 (1개) public AudioFile getAudioFileByName(String fileName) { - return audioFileRepository.findByFileName(fileName) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with fileName: " + fileName)); + return audioFileRepository + .findByFileName(fileName) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found with fileName: " + fileName)); } - // concatRow의 seq를 받아서 그에 매칭되는 audioFile 정보 조회 (1개) public AudioFile getAudioFileByRowSeq(Long rowSeq) { - return audioFileRepository.findByRowSeq(rowSeq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found for concatRowSeq: " + rowSeq)); + return audioFileRepository + .findByRowSeq(rowSeq) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found for concatRowSeq: " + rowSeq)); } // concatRow의 seq를 받아서 그에 매칭되는 audioFile 정보 조회 (n개) public List getAudioFileByRowSeq(List rowSeq) { return audioFileRepository.findAllByConcatRowSeqs(rowSeq).stream() - .map(this::convertToAudioFileDto).toList(); + .map(this::convertToAudioFileDto) + .toList(); } - // 날짜를 받아서 매칭되는 audioFile 정보 조회 (N개) public List getAudioFilesByCreatedDate(LocalDate date) { - //매칭되는 오디오파일을 리스트로 저장 + // 매칭되는 오디오파일을 리스트로 저장 List audioFiles = audioFileRepository.findByCreatedDateOnly(date); if (audioFiles.isEmpty()) { - throw new IllegalArgumentException("No AudioFiles found with the specified created date: " + date); + throw new IllegalArgumentException( + "No AudioFiles found with the specified created date: " + date); } return audioFiles; } - // 파일확장자로 오디오파일들을 페이징처리해서 조회 (N개) - public List findAudioFilesByExtensionWithPaging(String extension, int page, int size) { + public List findAudioFilesByExtensionWithPaging( + String extension, int page, int size) { Pageable pageable = PageRequest.of(page, size); // 페이지 번호와 크기를 설정 Page audioFilePage = audioFileRepository.findByExtension(extension, pageable); // AudioFile -> ConcatUrlResponse 변환 return audioFilePage.getContent().stream() - .map(file -> ConcatUrlResponse.builder() - .seq(file.getAudioFileSeq()) - .url(file.getAudioUrl()) - .build()) + .map( + file -> + ConcatUrlResponse.builder() + .seq(file.getAudioFileSeq()) + .url(file.getAudioUrl()) + .build()) .collect(Collectors.toList()); } @@ -109,10 +116,9 @@ public List findByConcatRowSeq(List concatRowSeq) { return audioFiles.stream().map(this::convertToAudioFileDto).collect(Collectors.toList()); } - // AudioFile seq로 삭제 (1개) public void deleteAudioFileBySeq(Long audioFileSeq) { - //만약 존재하지 않으면 예외 + // 만약 존재하지 않으면 예외 if (!audioFileRepository.existsById(audioFileSeq)) { throw new IllegalArgumentException("Audio file not found with seq: " + audioFileSeq); } @@ -122,7 +128,7 @@ public void deleteAudioFileBySeq(Long audioFileSeq) { // AudioFile seq로 삭제 (N개) public void deleteAudioFilesBySeq(List audioFileSeqList) { for (Long seq : audioFileSeqList) { - //만약 존재하지 않으면 예외 + // 만약 존재하지 않으면 예외 if (!audioFileRepository.existsById(seq)) { throw new IllegalArgumentException("Audio file not found with seq: " + seq); } @@ -135,7 +141,8 @@ public List findConcatRowSeqsByAudioFileSeqs(List audioFileSeqs) { return audioFileRepository.findConcatRowSeqsByAudioFileSeqs(audioFileSeqs); } - public List checkExtension(List audioDto) throws IOException { + public List checkExtension(List audioDto) + throws IOException { List notSupported = new ArrayList<>(); @@ -146,34 +153,38 @@ public List checkExtension(List audioD continue; } - notSupported.add(new AudioFileRequestDto(audioFileRequestDto.getAudioFile().getOriginalFilename())); + notSupported.add( + new AudioFileRequestDto(audioFileRequestDto.getAudioFile().getOriginalFilename())); log.info("checkExtension : [{}]", "AUDIO_FILE_CHECK_FAIL"); } return notSupported; } - //s3 업로드 - public List saveAudioFile(List audioDto) throws IOException { + // s3 업로드 + public List saveAudioFile(List audioDto) + throws IOException { if (audioDto.isEmpty()) { throw new IllegalArgumentException("[AudioFileService.saveAudioFile] 오디오 파일이 비어있습니다."); } if (checkExtension(audioDto).isEmpty()) { - return audioDto.stream().map(dto -> { - // S3 업로드 - String audioUrl = s3Service.upload(dto.getAudioFile(), "concat/audio"); - - // AudioFile 엔티티 생성 - try { - return prepareDto(dto, audioUrl); - } catch (Exception e) { - throw new RuntimeException(e); - } - }).toList(); + return audioDto.stream() + .map( + dto -> { + // S3 업로드 + String audioUrl = s3Service.upload(dto.getAudioFile(), "concat/audio"); + + // AudioFile 엔티티 생성 + try { + return prepareDto(dto, audioUrl); + } catch (Exception e) { + throw new RuntimeException(e); + } + }) + .toList(); } throw new DataNotFoundException("파일 형식이 올바르지 않습니다."); } - public void saveAudioFiles(List audioFiles) { audioFileHelper.batchInsert(audioFiles); } @@ -192,20 +203,22 @@ private OriginAudioRequest prepareDto(AudioFileRequestDto dto, String audioUrl) } } - //사용자의 오디오 파일 전체 조회 + // 사용자의 오디오 파일 전체 조회 public List getMemberAudioFile(Long memberSeq, Pageable pageable) { List memberAudios = audioFileRepository.findAudioFileByMember(memberSeq, pageable); - if (memberAudios.isEmpty()) {//페이지 범위를 벗어나면 null을 반환 하므로 가장 뒤의 페이지를 반환 + if (memberAudios.isEmpty()) { // 페이지 범위를 벗어나면 null을 반환 하므로 가장 뒤의 페이지를 반환 log.info("요청 가능한 페이지 번호 초과, PageNumber : [{}]", pageable.getPageNumber()); int maxPageNumber = getAudioFilePages(memberSeq, pageable.getPageSize()).size() - 1; - Pageable maxPageable = PageRequest.of(maxPageNumber, pageable.getPageSize(), pageable.getSort()); - List maxMemberAudios = audioFileRepository.findAudioFileByMember(memberSeq, maxPageable); + Pageable maxPageable = + PageRequest.of(maxPageNumber, pageable.getPageSize(), pageable.getSort()); + List maxMemberAudios = + audioFileRepository.findAudioFileByMember(memberSeq, maxPageable); return maxMemberAudios.stream().map(this::convertToAudioFileDto).toList(); } return memberAudios.stream().map(this::convertToAudioFileDto).toList(); } - //사용자 오디오 파일 페이지 배열 반환 + // 사용자 오디오 파일 페이지 배열 반환 public List getAudioFilePages(Long memberSeq, int size) { long totalCount = audioFileRepository.countByMemberSeq(memberSeq); int totalPages = (int) Math.ceil((double) totalCount / size); @@ -229,7 +242,6 @@ public static long getFileLength(InputStream inputStream) throws Exception { } } - public static boolean isAudioFile(File file) { try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file)) { return true; // 파일이 오디오 형식으로 처리 가능 @@ -247,14 +259,15 @@ public static boolean isAudioFile(InputStream stream) { } public static boolean isAudioFile(byte[] stream) { - try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(stream))) { + try (AudioInputStream audioInputStream = + AudioSystem.getAudioInputStream(new ByteArrayInputStream(stream))) { return true; // 파일이 오디오 형식으로 처리 가능 } catch (UnsupportedAudioFileException | IOException e) { return false; // 오디오 파일이 아니거나 지원하지 않는 형식 } } - //AudioFileDto변환기 + // AudioFileDto변환기 private AudioFileDto convertToAudioFileDto(AudioFile audioFile) { return AudioFileDto.builder() .audioFileSeq(audioFile.getAudioFileSeq()) @@ -283,4 +296,4 @@ private RowAudioFileDto convertToRowAudioFileDto(AudioFile audioFile) { public List saveAll(List audioFiles) { return audioFileRepository.saveAll(audioFiles); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java index fa8c6e68..49a073ba 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioMultipartFile.java @@ -1,8 +1,7 @@ package com.oreo.finalproject_5re5_be.concat.service; -import org.springframework.web.multipart.MultipartFile; - import java.io.*; +import org.springframework.web.multipart.MultipartFile; public class AudioMultipartFile implements MultipartFile { private final byte[] data; @@ -56,5 +55,4 @@ public void transferTo(File dest) throws IOException, IllegalStateException { out.write(data); } } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java index 8cb8c1b1..da3bf8d7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/AudioStreamService.java @@ -3,18 +3,12 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; -import com.oreo.finalproject_5re5_be.concat.dto.request.SelectedConcatRowRequest; import com.oreo.finalproject_5re5_be.concat.service.bgm.BgmProcessor; import com.oreo.finalproject_5re5_be.concat.service.concatenator.AudioProperties; import com.oreo.finalproject_5re5_be.global.component.S3Service; import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import org.springframework.stereotype.Service; - -import javax.sound.sampled.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -22,6 +16,10 @@ import java.net.URL; import java.util.ArrayList; import java.util.List; +import javax.sound.sampled.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Service; @RequiredArgsConstructor @Log4j2 @@ -33,14 +31,17 @@ public class AudioStreamService { public AudioInputStream createAudioInputStream(ByteArrayOutputStream buffer, AudioFormat format) { byte[] data = buffer.toByteArray(); - return new AudioInputStream(new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); + return new AudioInputStream( + new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); } - public AudioInputStream bufferAudioStream(AudioInputStream stream, AudioFormat format) throws IOException { + public AudioInputStream bufferAudioStream(AudioInputStream stream, AudioFormat format) + throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); AudioSystem.write(stream, AudioFileFormat.Type.WAVE, buffer); byte[] data = buffer.toByteArray(); - return new AudioInputStream(new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); + return new AudioInputStream( + new ByteArrayInputStream(data), format, data.length / format.getFrameSize()); } public long getValidFrameLength(AudioInputStream audioStream) throws IOException { @@ -61,12 +62,15 @@ public List loadAudioFiles(ConcatRowSaveRequestDto selectedRows log.info("[loadAudioFiles] 리샘플링 완료된 오디오 포맷: {}", audioStream.getFormat()); AudioProperties audioProperties = new AudioProperties(audioStream, row.getRowSilence()); - log.info("[loadAudioFiles] 생성된 AudioProperties: silenceInterval={}, frameLength={}", - row.getRowSilence(), audioStream.getFrameLength()); + log.info( + "[loadAudioFiles] 생성된 AudioProperties: silenceInterval={}, frameLength={}", + row.getRowSilence(), + audioStream.getFrameLength()); audioPropertiesList.add(audioProperties); } catch (Exception e) { - log.error("Failed to load or process audio file from URL: {}", originAudio.getAudioUrl(), e); + log.error( + "Failed to load or process audio file from URL: {}", originAudio.getAudioUrl(), e); } } return audioPropertiesList; @@ -77,15 +81,23 @@ public AudioInputStream loadAsBufferedStream(String s3Url) { URL url = new URL(s3Url); AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); - log.info("[loadAsBufferedStream] AudioInputStream 가져오기 성공. Format: {}", audioInputStream.getFormat()); + log.info( + "[loadAsBufferedStream] AudioInputStream 가져오기 성공. Format: {}", + audioInputStream.getFormat()); // mp3 -> WAV 변환 byte[] wavData = AudioExtensionConverter.mp3ToWav(audioInputStream); // Target Format으로 변환 (formatting) - AudioInputStream wavStream = new AudioInputStream(new ByteArrayInputStream(wavData), defaultAudioFormat, wavData.length / defaultAudioFormat.getFrameSize()); + AudioInputStream wavStream = + new AudioInputStream( + new ByteArrayInputStream(wavData), + defaultAudioFormat, + wavData.length / defaultAudioFormat.getFrameSize()); AudioInputStream formattedStream = audioResample.formatting(wavStream); - log.info("[loadAsBufferedStream] formatting 변환 성공. Frame Length: {}", formattedStream.getFrameLength()); + log.info( + "[loadAsBufferedStream] formatting 변환 성공. Frame Length: {}", + formattedStream.getFrameLength()); // 데이터를 메모리에 버퍼링 ByteArrayOutputStream buffer = new ByteArrayOutputStream(); @@ -94,11 +106,11 @@ public AudioInputStream loadAsBufferedStream(String s3Url) { byte[] bufferedData = buffer.toByteArray(); AudioFormat format = formattedStream.getFormat(); - AudioInputStream bufferedStream = new AudioInputStream( - new ByteArrayInputStream(bufferedData), - format, - bufferedData.length / format.getFrameSize() - ); + AudioInputStream bufferedStream = + new AudioInputStream( + new ByteArrayInputStream(bufferedData), + format, + bufferedData.length / format.getFrameSize()); return bufferedStream; @@ -111,5 +123,4 @@ public AudioInputStream loadAsBufferedStream(String s3Url) { throw new IllegalArgumentException("오디오 처리 실패", e); } } - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java index 49dd714b..e934390a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/BgmFileService.java @@ -4,12 +4,11 @@ import com.oreo.finalproject_5re5_be.concat.entity.ConcatResult; import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; -import java.util.List; - @Log4j2 @Service @RequiredArgsConstructor @@ -23,8 +22,10 @@ public List getBgmFilesByTabSeq(Long tabSeq) { } public BgmFile getBgmFileByUrl(String bgmFileUrl) { - return bgmFileRepository.findByAudioUrl(bgmFileUrl) - .orElseThrow(() -> new IllegalArgumentException("BGM File not found with URL: " + bgmFileUrl)); + return bgmFileRepository + .findByAudioUrl(bgmFileUrl) + .orElseThrow( + () -> new IllegalArgumentException("BGM File not found with URL: " + bgmFileUrl)); } public BgmFile saveBgmFile(BgmFile bgmFile) { @@ -43,13 +44,16 @@ public void updateBgmFileWithConcatResult(String bgmFileUrl, Long concatResultSe // 첫 번째 결과에 대해서만 처리 BgmFile bgmFile = bgmFiles.get(0); - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found for id: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found for id: " + concatResultSeq)); bgmFile.setConcatResult(concatResult); bgmFileRepository.save(bgmFile); log.info("[updateBgmFileWithConcatResult] Updated BgmFile with ConcatResult: {}", bgmFile); } - - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java index c797f887..30575993 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatResultService.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.service; - import com.oreo.finalproject_5re5_be.concat.dto.ConcatResultDto; import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatResultRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatResultDetailsResponse; @@ -9,12 +8,11 @@ import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatTabRepository; +import java.util.List; +import javax.sound.sampled.AudioInputStream; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import javax.sound.sampled.AudioInputStream; -import java.util.List; - @RequiredArgsConstructor @Service public class ConcatResultService { @@ -25,41 +23,48 @@ public class ConcatResultService { // ConcatResult 정보를 받아서 저장 (1개) public ConcatUrlResponse saveConcatResult(ConcatResultRequest request) { // 1. ConcatTab 조회 - ConcatTab concatTab = concatTabRepository.findById(request.getConcatTabSeq()) - .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + request.getConcatTabSeq())); - - //조회한 값과 입력한 값 저장을 하기 위한 ConcatResult 객체 생성 - ConcatResult concatResult = ConcatResult.builder() - .concatTab(concatTab) //concatTab 객체 필요 - .audioUrl(request.getResultUrl()) - .extension(request.getResultExtension()) - .fileLength(request.getResultFileLength()) - .fileName(request.getResultFileName()) - .build(); + ConcatTab concatTab = + concatTabRepository + .findById(request.getConcatTabSeq()) + .orElseThrow( + () -> + new IllegalArgumentException( + "Invalid ConcatTab ID: " + request.getConcatTabSeq())); + + // 조회한 값과 입력한 값 저장을 하기 위한 ConcatResult 객체 생성 + ConcatResult concatResult = + ConcatResult.builder() + .concatTab(concatTab) // concatTab 객체 필요 + .audioUrl(request.getResultUrl()) + .extension(request.getResultExtension()) + .fileLength(request.getResultFileLength()) + .fileName(request.getResultFileName()) + .build(); ConcatResult result = concatResultRepository.save(concatResult); - return ConcatUrlResponse.builder() //response 객체 생성 - .seq(result.getConcatResultSequence()) //저장된 객체의 seq - .url(result.getAudioUrl()) //저장된 객체의 url + return ConcatUrlResponse.builder() // response 객체 생성 + .seq(result.getConcatResultSequence()) // 저장된 객체의 seq + .url(result.getAudioUrl()) // 저장된 객체의 url .build(); - } // AudioInputStream에서 ConcatResult 저장 public ConcatUrlResponse saveConcatResult( Long concatTabSeq, String audioUrl, String fileName, AudioInputStream mixedAudioStream) { // 1. AudioInputStream을 사용하여 길이 계산 - long fileLength = (long) (mixedAudioStream.getFrameLength() / mixedAudioStream.getFormat().getFrameRate()); + long fileLength = + (long) (mixedAudioStream.getFrameLength() / mixedAudioStream.getFormat().getFrameRate()); // 2. ConcatResultRequest 생성 - ConcatResultRequest request = ConcatResultRequest.builder() - .concatTabSeq(concatTabSeq) - .ResultUrl(audioUrl) - .ResultFileName(fileName + ".wav") - .ResultExtension("wav") - .ResultFileLength((float) fileLength) - .build(); + ConcatResultRequest request = + ConcatResultRequest.builder() + .concatTabSeq(concatTabSeq) + .ResultUrl(audioUrl) + .ResultFileName(fileName + ".wav") + .ResultExtension("wav") + .ResultFileLength((float) fileLength) + .build(); // 3. 기존 메서드를 호출하여 저장 return saveConcatResult(request); @@ -69,14 +74,18 @@ public ConcatResult saveConcatResult(ConcatResult request) { return concatResultRepository.save(request); } - // ConcatResult Seq를 받아서 ConcatResult의 세부 정보 조회 (1개) public ConcatResultDetailsResponse getConcatResultDetails(Long concatResultSeq) { // ConcatResult 조회 - ConcatResult concatResult = concatResultRepository.findByConcatResultSequence(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with seq: " + concatResultSeq)); - - //Response에 정보 담기 + ConcatResult concatResult = + concatResultRepository + .findByConcatResultSequence(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with seq: " + concatResultSeq)); + + // Response에 정보 담기 return ConcatResultDetailsResponse.builder() .concatTabSeq(concatResult.getConcatTab().getProjectId()) .audioUrl(concatResult.getAudioUrl()) @@ -84,31 +93,38 @@ public ConcatResultDetailsResponse getConcatResultDetails(Long concatResultSeq) .fileLength(concatResult.getFileLength()) .fileName(concatResult.getFileName()) .build(); - } // ConcatResult Seq를 받아서 해당 ConcatResult를 삭제 (1개) public void deleteConcatResultBySeq(Long concatResultSeq) { // ConcatResult 존재 여부 확인 - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with seq: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with seq: " + concatResultSeq)); // 삭제 concatResultRepository.delete(concatResult); - } public List findByConcatTabSequence(Long projectSeq) { List byProjectSeq = concatResultRepository.findByConcatTabSequence(projectSeq); - return byProjectSeq.stream().map(cr -> ConcatResultDto.builder() - .concatResultSequence(cr.getConcatResultSequence()) - .fileName(cr.getFileName()) - .extension(cr.getExtension()) - .fileSize(cr.getFileSize()) - .audioUrl(cr.getAudioUrl()) - .fileLength(cr.getFileLength()) - .seperated(cr.getSeperated()) - .processId(cr.getProcessId()) - .build()).toList(); + return byProjectSeq.stream() + .map( + cr -> + ConcatResultDto.builder() + .concatResultSequence(cr.getConcatResultSequence()) + .fileName(cr.getFileName()) + .extension(cr.getExtension()) + .fileSize(cr.getFileSize()) + .audioUrl(cr.getAudioUrl()) + .fileLength(cr.getFileLength()) + .seperated(cr.getSeperated()) + .processId(cr.getProcessId()) + .build()) + .toList(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java index bba04e32..59387423 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowService.java @@ -9,13 +9,11 @@ import com.oreo.finalproject_5re5_be.concat.repository.ConcatRowRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatTabRepository; import com.oreo.finalproject_5re5_be.concat.service.helper.ConcatRowHelper; -import com.oreo.finalproject_5re5_be.project.entity.Project; import jakarta.transaction.Transactional; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - import java.util.*; import java.util.stream.Stream; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; @Service @AllArgsConstructor @@ -25,61 +23,64 @@ public class ConcatRowService { private final ConcatRowHelper concatRowHelper; private final AudioFileService audioFileService; - //현재 Hibernate에서 데이터 무결성 확인을 위해 자동으로 project, concat_tab, concat_option을 확인 하는 쿼리를 생성함 + // 현재 Hibernate에서 데이터 무결성 확인을 위해 자동으로 project, concat_tab, concat_option을 확인 하는 쿼리를 생성함 public List readRecentConcatRows(long projectSequence) { - List concatRows = concatRowRepository - .findByStatusAndConcatTab_Project_ProSeq('Y', projectSequence); + List concatRows = + concatRowRepository.findByStatusAndConcatTab_Project_ProSeq('Y', projectSequence); if (concatRows.isEmpty()) { return new ArrayList<>(); } - return concatRows.stream().map(cr -> ConcatRowDto.builder() - .concatRowSequence(cr.getConcatRowSeq()) - .projectSequence(projectSequence) - .rowText(cr.getRowText()) - .rowIndex(cr.getRowIndex()) - .selected(cr.getSelected()) - .status(cr.getStatus()) - .silence(cr.getSilence()) - .build() - ).toList(); + return concatRows.stream() + .map( + cr -> + ConcatRowDto.builder() + .concatRowSequence(cr.getConcatRowSeq()) + .projectSequence(projectSequence) + .rowText(cr.getRowText()) + .rowIndex(cr.getRowIndex()) + .selected(cr.getSelected()) + .status(cr.getStatus()) + .silence(cr.getSilence()) + .build()) + .toList(); } public List readConcatRows(long concatRowSequence) { - List concatRows = concatRowRepository - .findByConcatRowSeq(concatRowSequence); - return concatRows.stream().map(cr -> ConcatRowDto.builder() - .concatRowSequence(cr.getConcatRowSeq()) - .rowText(cr.getRowText()) - .rowIndex(cr.getRowIndex()) - .selected(cr.getSelected()) - .silence(cr.getSilence()) - .build() - ).toList(); + List concatRows = concatRowRepository.findByConcatRowSeq(concatRowSequence); + return concatRows.stream() + .map( + cr -> + ConcatRowDto.builder() + .concatRowSequence(cr.getConcatRowSeq()) + .rowText(cr.getRowText()) + .rowIndex(cr.getRowIndex()) + .selected(cr.getSelected()) + .silence(cr.getSilence()) + .build()) + .toList(); } @Transactional public boolean disableConcatRows(List rowSeq) { - return concatRowRepository.updateStatusByConcatRowSeq(rowSeq, 'N') == rowSeq.size();//행 비활성 처리 + return concatRowRepository.updateStatusByConcatRowSeq(rowSeq, 'N') == rowSeq.size(); // 행 비활성 처리 } - - @Transactional(rollbackOn = Exception.class)//모든 예외에 대해 롤백 수행 + @Transactional(rollbackOn = Exception.class) // 모든 예외에 대해 롤백 수행 public boolean updateConcatRows(ConcatRowSaveRequestDto requestDto) { Optional concatTabOpt = concatTabRepository.findById(requestDto.getConcatTabId()); if (concatTabOpt.isPresent()) { - return disableConcatRowsForUpdate(requestDto.getConcatRowRequests()) && - saveConcatRows(requestDto); + return disableConcatRowsForUpdate(requestDto.getConcatRowRequests()) + && saveConcatRows(requestDto); } return false; } private boolean disableConcatRowsForUpdate(List concatRows) { - List concatRowSeq = concatRows - .stream().map(ConcatRowRequest::getSeq) - .filter(Objects::nonNull).toList(); - //행 비활성 처리 + List concatRowSeq = + concatRows.stream().map(ConcatRowRequest::getSeq).filter(Objects::nonNull).toList(); + // 행 비활성 처리 return concatRowRepository.updateStatusByConcatRowSeq(concatRowSeq, 'N') == concatRowSeq.size(); } @@ -87,58 +88,70 @@ public ConcatRow readConcatRow(Long concatRowSeq) { return concatRowRepository.findById(concatRowSeq).orElse(null); } - @Transactional public boolean saveConcatRows(ConcatRowSaveRequestDto requestDto) { // 1. ConcatTab 확인 및 조회 - ConcatTab concatTab = concatTabRepository.findById(requestDto.getConcatTabId()) - .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + requestDto.getConcatTabId())); + ConcatTab concatTab = + concatTabRepository + .findById(requestDto.getConcatTabId()) + .orElseThrow( + () -> + new IllegalArgumentException( + "Invalid ConcatTab ID: " + requestDto.getConcatTabId())); List audioFiles = new ArrayList<>(); // 2. ConcatRowRequest 처리 - List saveRows = getConcatRows(requestDto.getConcatRowRequests(), concatTab, audioFiles); + List saveRows = + getConcatRows(requestDto.getConcatRowRequests(), concatTab, audioFiles); // 3. ConcatRow, 저장 -// concatRowHelper.batchInsert(saveRows); + // concatRowHelper.batchInsert(saveRows); audioFileService.saveAudioFiles(audioFiles); return true; } // @Transactional -// public boolean saveConcatRows(ConcatRowRequestDto requestDto) { -// // 1. ConcatTab 확인 및 조회 -// ConcatTab concatTab = concatTabRepository.findById(requestDto.getConcatTabId()) -// .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + requestDto.getConcatTabId())); -// -// List audioFiles = new ArrayList<>(); -// // 2. ConcatRowRequest 처리 -// List concatRows = getConcatRows(requestDto.getConcatRowRequests(), concatTab, audioFiles); -// -// // 3. ConcatRow, 저장 -// concatRowHelper.batchInsert(concatRows); -// audioFileService.saveAudioFiles(audioFiles); -// return true; -// } - private List getConcatRows(List requestDto, ConcatTab concatTab, List audioFiles) { + // public boolean saveConcatRows(ConcatRowRequestDto requestDto) { + // // 1. ConcatTab 확인 및 조회 + // ConcatTab concatTab = concatTabRepository.findById(requestDto.getConcatTabId()) + // .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + + // requestDto.getConcatTabId())); + // + // List audioFiles = new ArrayList<>(); + // // 2. ConcatRowRequest 처리 + // List concatRows = getConcatRows(requestDto.getConcatRowRequests(), concatTab, + // audioFiles); + // + // // 3. ConcatRow, 저장 + // concatRowHelper.batchInsert(concatRows); + // audioFileService.saveAudioFiles(audioFiles); + // return true; + // } + private List getConcatRows( + List requestDto, ConcatTab concatTab, List audioFiles) { return requestDto.stream() - .filter(rowRequest -> rowRequest.getStatus() != 'N').map(rowRequest -> { - - // 2.2 ConcatRow 생성 - ConcatRow concatRow = ConcatRow.builder() - .concatTab(concatTab) - .rowText(rowRequest.getRowText()) - .selected(rowRequest.getSelected()) - .silence(rowRequest.getRowSilence()) - .rowIndex(rowRequest.getRowIndex()) - .status('Y') // 기본 상태 설정 - .build(); - - // 2.3 AudioFile 저장 및 연관 설정 - AudioFile originAudio = mapToAudioFile(rowRequest.getOriginAudioRequest(), concatRow); - audioFiles.add(originAudio); - - return concatRow; - }).toList(); + .filter(rowRequest -> rowRequest.getStatus() != 'N') + .map( + rowRequest -> { + + // 2.2 ConcatRow 생성 + ConcatRow concatRow = + ConcatRow.builder() + .concatTab(concatTab) + .rowText(rowRequest.getRowText()) + .selected(rowRequest.getSelected()) + .silence(rowRequest.getRowSilence()) + .rowIndex(rowRequest.getRowIndex()) + .status('Y') // 기본 상태 설정 + .build(); + + // 2.3 AudioFile 저장 및 연관 설정 + AudioFile originAudio = mapToAudioFile(rowRequest.getOriginAudioRequest(), concatRow); + audioFiles.add(originAudio); + + return concatRow; + }) + .toList(); } private AudioFile mapToAudioFile(OriginAudioRequest originAudioRequest, ConcatRow concatRow) { @@ -156,29 +169,36 @@ private AudioFile mapToAudioFile(OriginAudioRequest originAudioRequest, ConcatRo public boolean uploadText(ConcatRowSaveRequestDto concatRowSaveRequestDto) { // 1. 요청 데이터의 유효성 검사 - boolean check = concatRowSaveRequestDto.getConcatRowRequests().stream() - .anyMatch(rowRequest -> rowRequest.getStatus() == 'N' || rowRequest.getSeq() == null); + boolean check = + concatRowSaveRequestDto.getConcatRowRequests().stream() + .anyMatch(rowRequest -> rowRequest.getStatus() == 'N' || rowRequest.getSeq() == null); if (check) { return false; } // 2. ConcatTab 조회 Long concatTabId = concatRowSaveRequestDto.getConcatTabId(); - ConcatTab concatTab = concatTabRepository.findById(concatTabId) - .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + concatTabId)); + ConcatTab concatTab = + concatTabRepository + .findById(concatTabId) + .orElseThrow( + () -> new IllegalArgumentException("Invalid ConcatTab ID: " + concatTabId)); // 3. ConcatRow 리스트 생성 - List concatRows = concatRowSaveRequestDto.getConcatRowRequests().stream() - .map(request -> ConcatRow.builder() - .concatRowSeq(request.getSeq()) - .rowIndex(request.getRowIndex()) - .selected(request.getSelected()) - .silence(request.getRowSilence()) - .status(request.getStatus()) - .concatTab(concatTab) // 조회한 concatTab 설정 - .rowText(request.getRowText()) - .build()) - .toList(); + List concatRows = + concatRowSaveRequestDto.getConcatRowRequests().stream() + .map( + request -> + ConcatRow.builder() + .concatRowSeq(request.getSeq()) + .rowIndex(request.getRowIndex()) + .selected(request.getSelected()) + .silence(request.getRowSilence()) + .status(request.getStatus()) + .concatTab(concatTab) // 조회한 concatTab 설정 + .rowText(request.getRowText()) + .build()) + .toList(); // 4. ConcatRow 저장 concatRowRepository.saveAll(concatRows); @@ -189,9 +209,9 @@ public boolean uploadText(ConcatRowSaveRequestDto concatRowSaveRequestDto) { @Transactional(rollbackOn = Exception.class) public boolean updateConcatRows(List rowAudioFiles, Long tabId) { disableConcatRows(rowAudioFiles.stream().map(RowAudioFileDto::getConcatRow)); -// List audioFiles = getAudioFiles(rowAudioFiles, tabId); + // List audioFiles = getAudioFiles(rowAudioFiles, tabId); List audioFiles = audioFileService.saveAll(getAudioFiles(rowAudioFiles, tabId)); -// audioFileService.saveAudioFiles(audioFiles); + // audioFileService.saveAudioFiles(audioFiles); return true; } @@ -203,27 +223,33 @@ public boolean disableConcatRows(Stream concatRows) { private List getAudioFiles(List concatRowAudios, Long tabId) { - ConcatTab concatTab = concatTabRepository.findById(tabId) - .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + tabId)); - - return concatRowAudios.stream().map(a -> { - ConcatRow concatRow = ConcatRow.builder() - .rowText(a.getConcatRow().getRowText()) - .selected(a.getConcatRow().getSelected()) - .silence(a.getConcatRow().getSilence()) - .rowIndex(a.getConcatRow().getRowIndex()) - .status(a.getConcatRow().getStatus()) - .concatTab(concatTab) // 기존 객체 사용 - .build(); - - return AudioFile.builder() - .audioUrl(a.getAudioUrl()) - .extension(a.getExtension()) - .fileSize(a.getFileSize()) - .fileLength(a.getFileLength()) - .fileName(a.getFileName()) - .concatRow(concatRow) - .build(); - }).toList(); + ConcatTab concatTab = + concatTabRepository + .findById(tabId) + .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + tabId)); + + return concatRowAudios.stream() + .map( + a -> { + ConcatRow concatRow = + ConcatRow.builder() + .rowText(a.getConcatRow().getRowText()) + .selected(a.getConcatRow().getSelected()) + .silence(a.getConcatRow().getSilence()) + .rowIndex(a.getConcatRow().getRowIndex()) + .status(a.getConcatRow().getStatus()) + .concatTab(concatTab) // 기존 객체 사용 + .build(); + + return AudioFile.builder() + .audioUrl(a.getAudioUrl()) + .extension(a.getExtension()) + .fileSize(a.getFileSize()) + .fileLength(a.getFileLength()) + .fileName(a.getFileName()) + .concatRow(concatRow) + .build(); + }) + .toList(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java index 18c38b79..ff4aefc3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatRowTabService.java @@ -5,12 +5,11 @@ import com.oreo.finalproject_5re5_be.concat.dto.request.TabRowUpdateRequestDto; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @Service @RequiredArgsConstructor public class ConcatRowTabService { @@ -18,7 +17,7 @@ public class ConcatRowTabService { private final ConcatTabService concatTabService; private final ConcatRowService concatRowService; - @Transactional//트랜잭션이 완료되기 전까지 엔티티 변경내용 적용 안됨 + @Transactional // 트랜잭션이 완료되기 전까지 엔티티 변경내용 적용 안됨 public boolean saveTabAndRows(TabRowUpdateRequestDto dto, Long memberSeq) { // 1. ConcatTab 업데이트 ConcatUpdateRequestDto concatTabs = dto.getConcatTab(); @@ -28,16 +27,19 @@ public boolean saveTabAndRows(TabRowUpdateRequestDto dto, Long memberSeq) { // 3. BgmFile 저장 ConcatTab concatTab = concatTabService.getConcatTabBySeq(concatTabs.getTabId()); // ConcatTab 조회 - List bgmFiles = concatTabs.getBgmFileList().stream() - .map(bgmRequest -> BgmFile.builder() - .concatTab(concatTab) - .audioUrl(bgmRequest.getAudioUrl()) - .fileName(bgmRequest.getFileName()) - .fileSize(bgmRequest.getFileSize()) - .fileLength(bgmRequest.getFileLength()) - .extension(bgmRequest.getExtension()) - .build()) - .toList(); + List bgmFiles = + concatTabs.getBgmFileList().stream() + .map( + bgmRequest -> + BgmFile.builder() + .concatTab(concatTab) + .audioUrl(bgmRequest.getAudioUrl()) + .fileName(bgmRequest.getFileName()) + .fileSize(bgmRequest.getFileSize()) + .fileLength(bgmRequest.getFileLength()) + .extension(bgmRequest.getExtension()) + .build()) + .toList(); concatTab.addBgmFile(bgmFiles); return concatTabService.updateConcatTab(concatTabs, memberSeq) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java index ca751d0f..2760d155 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatService.java @@ -15,28 +15,29 @@ import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import javax.sound.sampled.AudioInputStream; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import javax.sound.sampled.AudioInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; - @Slf4j @Service @AllArgsConstructor public class ConcatService { - private final IntervalConcatenator concatenator - = new StereoIntervalConcatenator(AudioFormats.STEREO_FORMAT_SR441_B16); - private final AudioResample audioResample = new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B16); + private final IntervalConcatenator concatenator = + new StereoIntervalConcatenator(AudioFormats.STEREO_FORMAT_SR441_B16); + private final AudioResample audioResample = + new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B16); private final S3Service s3Service; private final MaterialAudioService materialAudioService; private final ConcatResultService concatResultService; - public ConcatResultDto concat(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) + public ConcatResultDto concat( + ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) throws IOException { Result concatResult = getResult(concatTabResponseDto, concatRowRequests); @@ -44,8 +45,9 @@ public ConcatResultDto concat(ConcatTabResponseDto concatTabResponseDto, ConcatR throw new IllegalArgumentException("허용되지 않은 접근입니다."); } - //재료 오디오 저장 - materialAudioService.saveMaterialAudio(prepareMaterialAudio(concatResult.audios(), concatResult.result())); + // 재료 오디오 저장 + materialAudioService.saveMaterialAudio( + prepareMaterialAudio(concatResult.audios(), concatResult.result())); return ConcatResultDto.builder() .concatResultSequence(concatResult.result().getConcatResultSequence()) .extension(concatResult.result().getExtension()) @@ -54,11 +56,11 @@ public ConcatResultDto concat(ConcatTabResponseDto concatTabResponseDto, ConcatR .fileSize(concatResult.result().getFileSize()) .fileLength(concatResult.result().getFileLength()) .build(); - } - //책임 : s3 저장, 결과 저장 - private Result getResult(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) + // 책임 : s3 저장, 결과 저장 + private Result getResult( + ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests) throws IOException { List audios = concatRowRequests.getConcatRowRequests(); if (checkNull(audios)) { @@ -69,26 +71,31 @@ private Result getResult(ConcatTabResponseDto concatTabResponseDto, ConcatRowReq return new Result(audios, result); } - private ConcatResult getConcatResult(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto concatRowRequests, List audios) throws IOException { + private ConcatResult getConcatResult( + ConcatTabResponseDto concatTabResponseDto, + ConcatRowRequestDto concatRowRequests, + List audios) + throws IOException { AudioInputStream concat = resampleAudio(concatTabResponseDto, audios); byte[] audioData = AudioExtensionConverter.mp3ToWav(concat); // AudioInputStream을 byte[]로 변환 - MultipartFile multipartFile - = new AudioMultipartFile(audioData, concatRowRequests.getFileName(), "audio/wav"); + MultipartFile multipartFile = + new AudioMultipartFile(audioData, concatRowRequests.getFileName(), "audio/wav"); String uploadUrl = getUploadtoS3(multipartFile); log.info("[Uploaded file URL : {}] ", uploadUrl); - //결과 저장 - ConcatResult result = ConcatResult.builder().concatTab(ConcatTab.builder() - .projectId(concatTabResponseDto.getTabId()).build()) - .audioUrl(uploadUrl) - .extension("WAV") - .fileSize((long) audioData.length) - .fileLength(concat.getFrameLength() / concat.getFormat().getFrameRate()) - .fileName(concatRowRequests.getFileName()) - .build(); + // 결과 저장 + ConcatResult result = + ConcatResult.builder() + .concatTab(ConcatTab.builder().projectId(concatTabResponseDto.getTabId()).build()) + .audioUrl(uploadUrl) + .extension("WAV") + .fileSize((long) audioData.length) + .fileLength(concat.getFrameLength() / concat.getFormat().getFrameRate()) + .fileName(concatRowRequests.getFileName()) + .build(); return concatResultService.saveConcatResult(result); } @@ -107,57 +114,48 @@ private String getUploadtoS3(MultipartFile multipartFile) throws IOException { "concat/result", multipartFile.getOriginalFilename(), multipartFile.getSize(), - multipartFile.getContentType() - ); + multipartFile.getContentType()); } - private AudioInputStream resampleAudio(ConcatTabResponseDto concatTabResponseDto, List audios) throws IOException { - List audioProperties = audios.stream().map(cr -> new AudioProperties( - resample(S3Service.load(cr.getOriginAudioRequest().getAudioUrl())) - , cr.getRowSilence() - )).toList();//오디오 받아오기 - - ByteArrayOutputStream concatResult = concatenator - .intervalConcatenate(audioProperties, concatTabResponseDto.getFrontSilence());//결과 생성 - - //리샘플 + private AudioInputStream resampleAudio( + ConcatTabResponseDto concatTabResponseDto, List audios) throws IOException { + List audioProperties = + audios.stream() + .map( + cr -> + new AudioProperties( + resample(S3Service.load(cr.getOriginAudioRequest().getAudioUrl())), + cr.getRowSilence())) + .toList(); // 오디오 받아오기 + + ByteArrayOutputStream concatResult = + concatenator.intervalConcatenate( + audioProperties, concatTabResponseDto.getFrontSilence()); // 결과 생성 + + // 리샘플 return audioResample.resample(concatResult); } - public List prepareMaterialAudio(List audios, ConcatResult concatResult) { - - return audios.stream().map(aud -> MaterialAudio.builder() - .concatResult(concatResult) - .method("Normal") - .audioFile(AudioFile.builder().audioFileSeq(aud.getOriginAudioRequest().getSeq()).build()) - .build()).toList(); - + public List prepareMaterialAudio( + List audios, ConcatResult concatResult) { + + return audios.stream() + .map( + aud -> + MaterialAudio.builder() + .concatResult(concatResult) + .method("Normal") + .audioFile( + AudioFile.builder() + .audioFileSeq(aud.getOriginAudioRequest().getSeq()) + .build()) + .build()) + .toList(); } public AudioInputStream resample(AudioInputStream audioInputStream) { return audioResample.resample(audioInputStream); } - private record Result(List audios, ConcatResult result) { - } - + private record Result(List audios, ConcatResult result) {} } - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java index 7358ce44..7b826736 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/ConcatTabService.java @@ -13,12 +13,11 @@ import com.oreo.finalproject_5re5_be.project.entity.Project; import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import jakarta.transaction.Transactional; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; - import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; @Service @AllArgsConstructor @@ -35,50 +34,53 @@ public class ConcatTabService { */ @Transactional public boolean createConcatTab(ConcatCreateRequestDto concatCreateRequestDto) { - Optional projectOpt = projectRepository.findById(concatCreateRequestDto.getProjectSequence()); - if (concatTabRepository.existsById(concatCreateRequestDto.getProjectSequence()) || projectOpt.isEmpty()) { + Optional projectOpt = + projectRepository.findById(concatCreateRequestDto.getProjectSequence()); + if (concatTabRepository.existsById(concatCreateRequestDto.getProjectSequence()) + || projectOpt.isEmpty()) { return false; } Project project = projectOpt.get(); System.out.println("project.getProSeq() = " + project.getProSeq()); - ConcatTab concatTab = ConcatTab.builder() - .project(project) // Hibernate가 projectId를 자동으로 동기화 - .status('Y') - .frontSilence(0.0f) - .bgmFiles(null)//create라서 처음엔 null - .build(); + ConcatTab concatTab = + ConcatTab.builder() + .project(project) // Hibernate가 projectId를 자동으로 동기화 + .status('Y') + .frontSilence(0.0f) + .bgmFiles(null) // create라서 처음엔 null + .build(); concatTabRepository.save(concatTab); return true; } - //중복 조회를 방지하기 위한 오버로드 + // 중복 조회를 방지하기 위한 오버로드 @Transactional public boolean createConcatTab(Project project) { if (concatTabRepository.existsById(project.getProSeq())) { return false; } - ConcatTab concatTab = ConcatTab.builder() - .project(project) // Hibernate가 projectId를 자동으로 동기화 - .status('Y') - .frontSilence(0.0f) - .bgmFiles(null)//create라서 처음엔 null - .build(); + ConcatTab concatTab = + ConcatTab.builder() + .project(project) // Hibernate가 projectId를 자동으로 동기화 + .status('Y') + .frontSilence(0.0f) + .bgmFiles(null) // create라서 처음엔 null + .build(); System.out.println("concatTab = " + concatTab); concatTabRepository.save(concatTab); return true; } - //projectSeq가 사용자가 소유한 프로젝트의 id가 맞는지 확인 해야함 + // projectSeq가 사용자가 소유한 프로젝트의 id가 맞는지 확인 해야함 @Transactional public ConcatTabResponseDto readConcatTab(long projectSeq, Long memberSeq) { // ConcatTab, Project 조회 Optional concatOpt = concatTabRepository.findById(projectSeq); Optional projectOpt = projectRepository.findById(projectSeq); - if (projectOpt.isEmpty()) { throw new NoSuchElementException("프로젝트를 찾을 수 없습니다."); } @@ -112,41 +114,54 @@ public boolean updateConcatTab(ConcatUpdateRequestDto concatUpdateRequestDto, Lo } // ConcatTab 및 Project 조회 - ConcatTab existingTab = concatTabRepository.findById(concatUpdateRequestDto.getTabId()) - .orElseThrow(() -> new NoSuchElementException("수정할 프로젝트가 없습니다.")); + ConcatTab existingTab = + concatTabRepository + .findById(concatUpdateRequestDto.getTabId()) + .orElseThrow(() -> new NoSuchElementException("수정할 프로젝트가 없습니다.")); - Project project = projectRepository.findById(concatUpdateRequestDto.getTabId()) - .orElseThrow(() -> new NoSuchElementException("수정할 프로젝트가 없습니다.")); + Project project = + projectRepository + .findById(concatUpdateRequestDto.getTabId()) + .orElseThrow(() -> new NoSuchElementException("수정할 프로젝트가 없습니다.")); // Builder로 새로운 ConcatTab 생성 - ConcatTab updatedTab = ConcatTab.builder() - .projectId(existingTab.getProjectId()) // 기존 값 유지 - .project(existingTab.getProject()) // 기존 값 유지 - .frontSilence(concatUpdateRequestDto.getFrontSilence()) // 업데이트된 값 - .status(concatUpdateRequestDto.getStatus()) // 업데이트된 값 - .build(); + ConcatTab updatedTab = + ConcatTab.builder() + .projectId(existingTab.getProjectId()) // 기존 값 유지 + .project(existingTab.getProject()) // 기존 값 유지 + .frontSilence(concatUpdateRequestDto.getFrontSilence()) // 업데이트된 값 + .status(concatUpdateRequestDto.getStatus()) // 업데이트된 값 + .build(); concatTabRepository.save(updatedTab); return true; - } // bgmFile들만 수정 @Transactional public boolean updateBgmAudioFiles(Long tabSeq, List bgmFileSeqs) { // ConcatTab 찾기 - ConcatTab concatTab = concatTabRepository.findById(tabSeq) - .orElseThrow(() -> new NoSuchElementException("ConcatTab not found with ID: " + tabSeq)); + ConcatTab concatTab = + concatTabRepository + .findById(tabSeq) + .orElseThrow( + () -> new NoSuchElementException("ConcatTab not found with ID: " + tabSeq)); if (bgmFileSeqs == null || bgmFileSeqs.isEmpty()) { // bgmFileSeqs가 비어있으면 기존 bgmFiles 제거 concatTab.addBgmFile(new BgmFile()); } else { // bgmFileSeqs를 통해 BgmFile 리스트 생성 - List bgmFiles = bgmFileSeqs.stream() - .map(seq -> bgmFileRepository.findById(seq) - .orElseThrow(() -> new NoSuchElementException("BgmFile not found with ID: " + seq))) - .toList(); + List bgmFiles = + bgmFileSeqs.stream() + .map( + seq -> + bgmFileRepository + .findById(seq) + .orElseThrow( + () -> + new NoSuchElementException("BgmFile not found with ID: " + seq))) + .toList(); // ConcatTab에 새로운 BgmFile 리스트 설정 concatTab.addBgmFile(bgmFiles); @@ -157,10 +172,10 @@ public boolean updateBgmAudioFiles(Long tabSeq, List bgmFileSeqs) { return true; } - @Transactional public ConcatTab getConcatTabBySeq(Long tabSeq) { - return concatTabRepository.findById(tabSeq) + return concatTabRepository + .findById(tabSeq) .orElseThrow(() -> new IllegalArgumentException("Invalid ConcatTab ID: " + tabSeq)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java index 86c7f7d1..3c2dede7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/MaterialAudioService.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.concat.service; - import com.oreo.finalproject_5re5_be.concat.dto.request.ConcatRowSaveRequestDto; import com.oreo.finalproject_5re5_be.concat.dto.request.OriginAudioRequest; import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatUrlResponse; @@ -9,13 +8,12 @@ import com.oreo.finalproject_5re5_be.concat.repository.BgmFileRepository; import com.oreo.finalproject_5re5_be.concat.repository.ConcatResultRepository; import com.oreo.finalproject_5re5_be.concat.repository.MaterialAudioRepository; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; -import java.util.List; -import java.util.stream.Collectors; - @Log4j2 @RequiredArgsConstructor @Service @@ -37,81 +35,97 @@ public BgmFile findBgmFileByConcatResultSeq(Long concatResultSeq) { // 결과에 사용된 Material 파일 조회 public List findMaterialAudioFilesByConcatResultSeq(Long concatResultSeq) { return materialAudioRepository.findByConcatResultSeq(concatResultSeq).stream() - .map(material -> OriginAudioRequest.builder() - .seq(material.getAudioFile().getAudioFileSeq()) - .audioUrl(material.getAudioFile().getAudioUrl()) - .extension(material.getAudioFile().getExtension()) - .fileSize(material.getAudioFile().getFileSize()) - .fileLength(material.getAudioFile().getFileLength()) - .fileName(material.getAudioFile().getFileName()) - .build()) + .map( + material -> + OriginAudioRequest.builder() + .seq(material.getAudioFile().getAudioFileSeq()) + .audioUrl(material.getAudioFile().getAudioUrl()) + .extension(material.getAudioFile().getExtension()) + .fileSize(material.getAudioFile().getFileSize()) + .fileLength(material.getAudioFile().getFileLength()) + .fileName(material.getAudioFile().getFileName()) + .build()) .toList(); } - //결과물seq로 결과물url조회 + // 결과물seq로 결과물url조회 public String findResultAudioUrlByConcatResultSeq(Long concatResultSeq) { - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with seq: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with seq: " + concatResultSeq)); return concatResult.getAudioUrl(); } // 1개의 concatResult와 그에 매칭되는 1개의 AudioFile을 저장 (1개) public MaterialAudio saveMaterial(Long concatResultSeq, Long audioFileSeq) { // ConcatResult 조회 - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with id: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with id: " + concatResultSeq)); // AudioFile 조회 - AudioFile audioFile = audioFileRepository.findById(audioFileSeq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with id: " + audioFileSeq)); + AudioFile audioFile = + audioFileRepository + .findById(audioFileSeq) + .orElseThrow( + () -> new IllegalArgumentException("AudioFile not found with id: " + audioFileSeq)); // MaterialAudio 생성 - MaterialAudio materialAudio = MaterialAudio.builder() - .concatResult(concatResult) - .audioFile(audioFile) - .build(); + MaterialAudio materialAudio = + MaterialAudio.builder().concatResult(concatResult).audioFile(audioFile).build(); - //객체를 저장 + // 객체를 저장 return materialAudioRepository.save(materialAudio); - } - // 1개의 concatResult와 그에 매칭되는 여러개의 AudioFile을 저장 (N개) public List saveMaterials(Long concatResultSeq, List audioFiles) { // ConcatResult 조회 - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found with id: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found with id: " + concatResultSeq)); // AudioFileSeq를 하나씩 처리하여 MaterialAudio 생성 및 저장 return audioFiles.stream() - .map(audioFile -> { - // MaterialAudio 생성 - MaterialAudio materialAudio = MaterialAudio.builder() - .concatResult(concatResult) - .audioFile(audioFile) - .build(); - - // 저장 - return materialAudioRepository.save(materialAudio); - }) + .map( + audioFile -> { + // MaterialAudio 생성 + MaterialAudio materialAudio = + MaterialAudio.builder().concatResult(concatResult).audioFile(audioFile).build(); + + // 저장 + return materialAudioRepository.save(materialAudio); + }) .collect(Collectors.toList()); } - // concatResultSeq와 매칭되는 audioFile List 조회 public List findAudioFilesByConcatResultSeq(Long concatResultSeq) { - //MaterialAudio에서 AudioFile 리스트 조회 - List audioFiles = materialAudioRepository.findAudioFilesByConcatResult(concatResultSeq); + // MaterialAudio에서 AudioFile 리스트 조회 + List audioFiles = + materialAudioRepository.findAudioFilesByConcatResult(concatResultSeq); - //AudioFile -> ConcatUrlResponse 변환 + // AudioFile -> ConcatUrlResponse 변환 return audioFiles.stream() - .map(audioFile -> ConcatUrlResponse.builder() - .seq(audioFile.getAudioFileSeq()) - .url(audioFile.getAudioUrl()) - .build()) + .map( + audioFile -> + ConcatUrlResponse.builder() + .seq(audioFile.getAudioFileSeq()) + .url(audioFile.getAudioUrl()) + .build()) .collect(Collectors.toList()); - } // AudioFile과 매칭되는 concatResult List 조회 @@ -126,8 +140,7 @@ public void deleteMaterialsByConcatResultSeq(Long concatResultSeq) { // concatResult의 seq로 매칭되는 audioFile seq들을 조회 public List findAudioFileSeqsByConcatResultSeq(Long concatResultSeq) { - return materialAudioRepository.findByConcatResultSeq(concatResultSeq) - .stream() + return materialAudioRepository.findByConcatResultSeq(concatResultSeq).stream() .map(materialAudio -> materialAudio.getAudioFile().getAudioFileSeq()) // AudioFile의 seq를 추출 .collect(Collectors.toList()); } @@ -146,26 +159,34 @@ public boolean saveMaterialAudio(List materialAudios) { } } - - public void saveMaterialsForConcatRows(ConcatRowSaveRequestDto concatRows, ConcatUrlResponse concatResultResponse) { + public void saveMaterialsForConcatRows( + ConcatRowSaveRequestDto concatRows, ConcatUrlResponse concatResultResponse) { Long concatResultSeq = concatResultResponse.getSeq(); - if(concatResultSeq == null){ + if (concatResultSeq == null) { throw new IllegalArgumentException("ConcatResult seq is null, cannot save materials."); } log.info("[saveMaterialsForConcatRows] Processing concatRows: {}", concatRows); - List usedAudioFileSeqs = concatRows.getConcatRowRequests().stream() - .map(row -> { - Long seq = row.getOriginAudioRequest().getSeq(); - log.info("[saveMaterialsForConcatRows] Fetching AudioFile for seq: {}", seq); - - return audioFileRepository.findByAudioFileSeq(seq) - .orElseThrow(() -> new IllegalArgumentException("AudioFile not found with seq: " + seq)); - }) - .toList(); - - log.info("[saveMaterialsForConcatRows] Saving materials with ConcatResult seq: {} and AudioFile seqs: {}", concatResultSeq, usedAudioFileSeqs); + List usedAudioFileSeqs = + concatRows.getConcatRowRequests().stream() + .map( + row -> { + Long seq = row.getOriginAudioRequest().getSeq(); + log.info("[saveMaterialsForConcatRows] Fetching AudioFile for seq: {}", seq); + + return audioFileRepository + .findByAudioFileSeq(seq) + .orElseThrow( + () -> + new IllegalArgumentException("AudioFile not found with seq: " + seq)); + }) + .toList(); + + log.info( + "[saveMaterialsForConcatRows] Saving materials with ConcatResult seq: {} and AudioFile seqs: {}", + concatResultSeq, + usedAudioFileSeqs); // 기존 saveMaterials 메서드를 호출하여 저장 saveMaterials(concatResultResponse.getSeq(), usedAudioFileSeqs); @@ -183,12 +204,16 @@ public void updateBgmFileWithConcatResult(String bgmFileUrl, Long concatResultSe // 첫 번째 결과에 대해서만 처리 BgmFile bgmFile = bgmFiles.get(0); - ConcatResult concatResult = concatResultRepository.findById(concatResultSeq) - .orElseThrow(() -> new IllegalArgumentException("ConcatResult not found for id: " + concatResultSeq)); + ConcatResult concatResult = + concatResultRepository + .findById(concatResultSeq) + .orElseThrow( + () -> + new IllegalArgumentException( + "ConcatResult not found for id: " + concatResultSeq)); bgmFile.setConcatResult(concatResult); bgmFileRepository.save(bgmFile); log.info("[updateBgmFileWithConcatResult] Updated BgmFile with ConcatResult: {}", bgmFile); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java index 38ae4bb9..2921570d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/bgm/BgmProcessor.java @@ -4,26 +4,27 @@ import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; public class BgmProcessor { public static AudioInputStream prepareBgm(File bgmFile) throws IOException { try { - AudioResample resampler = new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B32); // 고정된 목표 포맷 + AudioResample resampler = + new AudioResample(AudioFormats.STEREO_FORMAT_SR441_B32); // 고정된 목표 포맷 // 1. 파일 포맷 검사 if (AudioExtensionChecker.isSupported(bgmFile)) { System.out.println("BGM 파일이 MP3 형식입니다. WAV로 변환 중..."); byte[] wavBytes = AudioExtensionConverter.mp3ToWav(bgmFile); - AudioInputStream wavStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(wavBytes)); + AudioInputStream wavStream = + AudioSystem.getAudioInputStream(new ByteArrayInputStream(wavBytes)); // 변환 후에도 리샘플링 수행 return resampler.resample(wavStream); } else if (AudioExtensionChecker.isWavExtension(bgmFile)) { @@ -39,19 +40,15 @@ public static AudioInputStream prepareBgm(File bgmFile) throws IOException { } } - // BGM이 이미 source보다 길 경우 필요 - public static AudioInputStream trimBgm(AudioInputStream bgm, long targetFrames) throws IOException { + public static AudioInputStream trimBgm(AudioInputStream bgm, long targetFrames) + throws IOException { System.out.println("Trimming BGM to " + targetFrames + " frames."); - return new AudioInputStream( - bgm, - bgm.getFormat(), - Math.min(targetFrames, bgm.getFrameLength()) - ); + return new AudioInputStream(bgm, bgm.getFormat(), Math.min(targetFrames, bgm.getFrameLength())); } - - public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames) throws IOException { + public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames) + throws IOException { // BGM 데이터 읽기 byte[] bgmData = bgm.readAllBytes(); AudioFormat format = bgm.getFormat(); @@ -73,7 +70,8 @@ public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames throw new IllegalStateException("Frames to add is zero or negative, check the input data."); } - System.out.println("Current Total Frames: " + totalFrames + ", Frames To Add: " + framesToAdd); + System.out.println( + "Current Total Frames: " + totalFrames + ", Frames To Add: " + framesToAdd); // 데이터 추가 extendedStream.write(bgmData, 0, (int) (framesToAdd * frameSize)); @@ -84,10 +82,7 @@ public static AudioInputStream extendBgm(AudioInputStream bgm, long targetFrames // 새로운 AudioInputStream 생성 return new AudioInputStream( - new ByteArrayInputStream(extendedStream.toByteArray()), - format, - totalFrames - ); + new ByteArrayInputStream(extendedStream.toByteArray()), format, totalFrames); } public static long calculateTargetFrames(AudioInputStream audioStream) throws IOException { @@ -107,25 +102,25 @@ public static long calculateTargetFrames(AudioInputStream audioStream) throws IO } // BGM 길이 조정 로직 분리 - public static AudioInputStream adjustBgmLength(AudioInputStream bgmStream, long targetFrames, long bgmFrames) throws IOException { + public static AudioInputStream adjustBgmLength( + AudioInputStream bgmStream, long targetFrames, long bgmFrames) throws IOException { return bgmFrames > targetFrames ? BgmProcessor.trimBgm(bgmStream, targetFrames) : BgmProcessor.extendBgm(bgmStream, targetFrames); } - - public static AudioInputStream mixAudio(AudioInputStream source, AudioInputStream bgm) throws IOException { + public static AudioInputStream mixAudio(AudioInputStream source, AudioInputStream bgm) + throws IOException { AudioFormat format = source.getFormat(); // 첫 번째 오디오 파일과 두 번째 오디오 파일의 길이를 얻음 byte[] buffer1 = source.readAllBytes(); byte[] buffer2 = bgm.readAllBytes(); - // 믹싱을 위한 새로운 버퍼 생성 byte[] mixedBuffer = new byte[buffer1.length]; // 두 오디오 파일을 샘플 단위로 믹싱 - for (int i = 0; i < buffer1.length; i += 2) { //16비트 기준 + for (int i = 0; i < buffer1.length; i += 2) { // 16비트 기준 // 각 버퍼에서 샘플을 가져옴 short sample1 = (short) ((buffer1[i + 1] << 8) | (buffer1[i] & 0xFF)); short sample2 = (short) ((buffer2[i + 1] << 8) | (buffer2[i] & 0xFF)); @@ -140,11 +135,9 @@ public static AudioInputStream mixAudio(AudioInputStream source, AudioInputStrea // 믹싱된 오디오 데이터로 AudioInputStream 생성 ByteArrayInputStream bais = new ByteArrayInputStream(mixedBuffer); - AudioInputStream mixedAudioStream = new AudioInputStream(bais, format, mixedBuffer.length / format.getFrameSize()); + AudioInputStream mixedAudioStream = + new AudioInputStream(bais, format, mixedBuffer.length / format.getFrameSize()); return mixedAudioStream; - } - - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java index bf92f02a..407a8b4e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/AudioProperties.java @@ -4,18 +4,17 @@ /** * @apiNote 무음구간을 포함한 오디오 병합을 위한 레코드 입니다. - * * @param audioInputStream * @param silence */ public record AudioProperties(AudioInputStream audioInputStream, float silence) { - /** * @apiNote 지정한 파라미터로 {@code AudioProperties} 를 생성합니다. * @return List */ - public static AudioProperties parsAudioProperties(AudioInputStream audioInputStream, float silence) { + public static AudioProperties parsAudioProperties( + AudioInputStream audioInputStream, float silence) { return new AudioProperties(audioInputStream, silence); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java index 4a40a7f8..9a63d161 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/Concatenator.java @@ -1,20 +1,17 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import javax.sound.sampled.AudioInputStream; /** - * {@code Concatenator} 클래스의 기본 인터페이스 입니다. - *
    + * {@code Concatenator} 클래스의 기본 인터페이스 입니다.
    * 모든 Concatenator는 이 인터페이스를 구현합니다. */ public interface Concatenator { - ByteArrayOutputStream concatenate(List audioStreams) throws IOException; void setBufferSize(int bufferSize); } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java index f59f9607..6207cf3b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/IntervalConcatenator.java @@ -1,44 +1,44 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; -import lombok.extern.log4j.Log4j2; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; - +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; /** * @apiNote 음성간 간격이 있는 오디오를 위함 병합 클래스의 인터페이스 입니다.
    - * */ - - public interface IntervalConcatenator extends Concatenator { - ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException; + ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) + throws IOException; - //공통 IntervalConcatenator에 필요한 로직을 분리 - static List prepareAudioStreams(List audioStreams, AudioFormat audioFormat) { + // 공통 IntervalConcatenator에 필요한 로직을 분리 + static List prepareAudioStreams( + List audioStreams, AudioFormat audioFormat) { List result = new ArrayList<>(); int index = 1; // 로그를 위한 인덱스 관리 for (AudioProperties audioProperties : audioStreams) { - AudioInputStream audioStream = audioProperties.audioInputStream(); // AudioProperties에서 AudioStream 추출 + AudioInputStream audioStream = + audioProperties.audioInputStream(); // AudioProperties에서 AudioStream 추출 // row audio 관련 log - System.out.printf("[prepareAudioStreams] 오디오 스트림 추가: index=%d, frameLength=%d, format=%s%n", + System.out.printf( + "[prepareAudioStreams] 오디오 스트림 추가: index=%d, frameLength=%d, format=%s%n", index, audioStream.getFrameLength(), audioStream.getFormat()); - result.add(audioProperties.audioInputStream());//오디오 스트림 추가 + result.add(audioProperties.audioInputStream()); // 오디오 스트림 추가 // 무음 구간 생성 및 추가 - AudioInputStream silenceStream = BeepMaker.makeSound(audioProperties.silence() * 1000, audioFormat); + AudioInputStream silenceStream = + BeepMaker.makeSound(audioProperties.silence() * 1000, audioFormat); // row 무음구간 관련 log - System.out.printf("[prepareAudioStreams] 무음 구간 추가: index=%d, duration=%dms, frameLength=%d%n", + System.out.printf( + "[prepareAudioStreams] 무음 구간 추가: index=%d, duration=%dms, frameLength=%d%n", index, (int) (audioProperties.silence() * 1000), silenceStream.getFrameLength()); result.add(silenceStream); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java index 48be2b48..6e3fffba 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoConcatenator.java @@ -1,12 +1,13 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; - -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import javax.sound.sampled.AudioInputStream; /** + * + * * * * @@ -28,14 +29,15 @@ public class MonoConcatenator implements Concatenator { @Override public ByteArrayOutputStream concatenate(List audioStreams) throws IOException { - boolean mono = audioStreams.stream().allMatch(as -> as.getFormat().getChannels() == 1);//모노 포맷인지 확인 + boolean mono = + audioStreams.stream().allMatch(as -> as.getFormat().getChannels() == 1); // 모노 포맷인지 확인 if (mono) { - return merge(audioStreams);//병합 + return merge(audioStreams); // 병합 } throw new IllegalArgumentException("잘못된 포맷 입니다."); } - //오디오 파일 병합 메소드 + // 오디오 파일 병합 메소드 private ByteArrayOutputStream merge(List audioStreams) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int bytesRead; @@ -49,6 +51,6 @@ private ByteArrayOutputStream merge(List audioStreams) throws @Override public void setBufferSize(int bufferSize) { - buffer = new byte[bufferSize];//버퍼 사이즈 변경 + buffer = new byte[bufferSize]; // 버퍼 사이즈 변경 } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java index 8f0d8a0c..fad20d87 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/MonoIntervalConcatenator.java @@ -1,21 +1,20 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; +import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; + import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; - -import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; /** * @apiNote 모노포맷의 무음구간을 포함한 병합에 사용되는 클래스 입니다.
    - * 오디오 파일은 병합 하려는 포맷 타입과 같거나 같아지도록 리샘플링 되어야 합니다.
    - * WAVE 파일만을 지원하며 mp3파일의 경우 {@link AudioExtensionConverter} 를 사용하여 WAVE 파일로 변환합니다. + * 오디오 파일은 병합 하려는 포맷 타입과 같거나 같아지도록 리샘플링 되어야 합니다.
    + * WAVE 파일만을 지원하며 mp3파일의 경우 {@link AudioExtensionConverter} 를 사용하여 WAVE 파일로 변환합니다. * @see AudioResample * @see AudioExtensionConverter */ @@ -34,7 +33,8 @@ public MonoIntervalConcatenator(AudioFormat audioFormat) { * @throws IOException */ @Override - public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException { + public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) + throws IOException { List list = prepareAudioStreams(audioStreams, AUDIO_FORMAT); list.add(0, BeepMaker.makeSound(start * 1000, AUDIO_FORMAT)); return super.concatenate(list); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java index 4c8c541f..b854b705 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoConcatenator.java @@ -1,21 +1,21 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; import com.oreo.finalproject_5re5_be.global.component.audio.AudioChannels; - -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import javax.sound.sampled.AudioInputStream; public class StereoConcatenator implements Concatenator { private byte[] buffer = new byte[2048]; @Override public ByteArrayOutputStream concatenate(List audioStreams) throws IOException { - boolean mono = audioStreams.stream() - .allMatch(as -> as.getFormat().getChannels() == AudioChannels.STEREO);//스테레오 포맷 확인 + boolean mono = + audioStreams.stream() + .allMatch(as -> as.getFormat().getChannels() == AudioChannels.STEREO); // 스테레오 포맷 확인 if (mono) { - return merge(audioStreams);//병합 + return merge(audioStreams); // 병합 } throw new IllegalArgumentException("잘못된 포맷 입니다."); } @@ -25,7 +25,7 @@ public void setBufferSize(int bufferSize) { buffer = new byte[bufferSize]; } - //오디오 파일 병합 메소드 + // 오디오 파일 병합 메소드 private ByteArrayOutputStream merge(List audioStreams) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int bytesRead; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java index aaabab0f..45ef16a9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/concatenator/StereoIntervalConcatenator.java @@ -1,27 +1,24 @@ package com.oreo.finalproject_5re5_be.concat.service.concatenator; +import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; + import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.global.component.audio.BeepMaker; -import lombok.extern.log4j.Log4j2; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; - -import static com.oreo.finalproject_5re5_be.concat.service.concatenator.IntervalConcatenator.prepareAudioStreams; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import lombok.extern.log4j.Log4j2; /** * @apiNote 스테레오 포맷의 무음구간을 포함한 병합에 사용되는 클래스 입니다.
    - * 오디오 파일은 병합 하려는 포맷 타입과 같거나 같아지도록 리샘플링 되어야 합니다.
    - * WAVE 파일만을 지원하며 mp3파일의 경우 {@link AudioExtensionConverter} 를 사용하여 WAVE 파일로 변환합니다. + * 오디오 파일은 병합 하려는 포맷 타입과 같거나 같아지도록 리샘플링 되어야 합니다.
    + * WAVE 파일만을 지원하며 mp3파일의 경우 {@link AudioExtensionConverter} 를 사용하여 WAVE 파일로 변환합니다. * @see AudioResample * @see AudioExtensionConverter - * */ - @Log4j2 public class StereoIntervalConcatenator extends StereoConcatenator implements IntervalConcatenator { @@ -39,19 +36,20 @@ public StereoIntervalConcatenator(AudioFormat audioFormat) { * @throws IOException */ @Override - public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) throws IOException { + public ByteArrayOutputStream intervalConcatenate(List audioStreams, float start) + throws IOException { List list = prepareAudioStreams(audioStreams, AUDIO_FORMAT); AudioInputStream initialSilenceStream = BeepMaker.makeSound(start * 1000, AUDIO_FORMAT); // 로그 추가: 무음 구간 (맨앞) 생성 - log.info("[intervalConcatenate] 맨앞 무음 구간 추가: duration={}ms, frameLength={}", - (int) (start * 1000), initialSilenceStream.getFrameLength()); - + log.info( + "[intervalConcatenate] 맨앞 무음 구간 추가: duration={}ms, frameLength={}", + (int) (start * 1000), + initialSilenceStream.getFrameLength()); list.add(0, BeepMaker.makeSound(start * 1000, AUDIO_FORMAT)); - return super.concatenate(list); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java index 74480f4c..e041223e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/AudioFileHelper.java @@ -4,14 +4,12 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.transaction.Transactional; -import org.springframework.stereotype.Component; - import java.util.List; +import org.springframework.stereotype.Component; @Component public class AudioFileHelper { - @PersistenceContext - private EntityManager entityManager; + @PersistenceContext private EntityManager entityManager; @Transactional public void batchInsert(List rows) { @@ -25,5 +23,4 @@ public void batchInsert(List rows) { entityManager.flush(); entityManager.clear(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java index 8c4fa66e..88615ca5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatRowHelper.java @@ -4,14 +4,12 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.transaction.Transactional; -import org.springframework.stereotype.Component; - import java.util.List; +import org.springframework.stereotype.Component; @Component public class ConcatRowHelper { - @PersistenceContext - private EntityManager entityManager; + @PersistenceContext private EntityManager entityManager; @Transactional public void batchInsert(List rows) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java index 796441f7..3da76704 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/helper/ConcatTabHelper.java @@ -4,13 +4,11 @@ import com.oreo.finalproject_5re5_be.concat.dto.response.ConcatTabResponseDto; import com.oreo.finalproject_5re5_be.concat.entity.BgmFile; import com.oreo.finalproject_5re5_be.concat.entity.ConcatTab; -import org.springframework.stereotype.Component; - import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; - +import org.springframework.stereotype.Component; /** * @apiNote ConcatTabService의 로직을 밖으로 분리한 클래스입니다. @@ -18,16 +16,16 @@ @Component public class ConcatTabHelper { - //ConcatTab의 구성요소를 Dto에 담아 리턴 + // ConcatTab의 구성요소를 Dto에 담아 리턴 public ConcatTabResponseDto prepareConcatTab(ConcatTab concatTab, Long memberSeq) { // 사용자 검증 if (validateMemberCurrent(concatTab, memberSeq)) { // bgmFile객체들을 그대로 프론트에게 줄 수 없으니 bgmFiles를 OriginAudioRequest(DTO)로 변환 - List bgmList = Optional.ofNullable(concatTab.getBgmFiles()) - .orElse(new ArrayList<>()).stream() - .map(this::convertToOriginAudioRequest) - .toList(); + List bgmList = + Optional.ofNullable(concatTab.getBgmFiles()).orElse(new ArrayList<>()).stream() + .map(this::convertToOriginAudioRequest) + .toList(); return ConcatTabResponseDto.builder() .tabId(concatTab.getProjectId()) @@ -39,14 +37,13 @@ public ConcatTabResponseDto prepareConcatTab(ConcatTab concatTab, Long memberSeq throw new IllegalArgumentException("사용자가 소유한 프로젝트가 아닙니다."); } - public boolean validateMemberCurrent(ConcatTab concatTab, Long memberSeq) { if (Objects.equals(concatTab.getProject().getMember().getSeq(), memberSeq)) { return true; } - throw new IllegalArgumentException("사용자가 소유한 프로젝트가 아닙니다. 소유한 사용자 : " - + concatTab.getProject().getMember()); + throw new IllegalArgumentException( + "사용자가 소유한 프로젝트가 아닙니다. 소유한 사용자 : " + concatTab.getProject().getMember()); } // BgmFile을 OriginAudioRequest로 변환 @@ -60,5 +57,4 @@ private OriginAudioRequest convertToOriginAudioRequest(BgmFile bgmFile) { .fileName(bgmFile.getFileName()) .build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java index fe277bb1..aa1b5f80 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/concat/service/lambda/LambdaConcatService.java @@ -16,13 +16,12 @@ import com.oreo.finalproject_5re5_be.concat.service.ConcatResultService; import com.oreo.finalproject_5re5_be.concat.service.MaterialAudioService; import com.oreo.finalproject_5re5_be.global.component.audio.AudioFormats; +import java.util.ArrayList; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; -import java.util.List; - @Service @RequiredArgsConstructor public class LambdaConcatService { @@ -31,18 +30,20 @@ public class LambdaConcatService { private final MaterialAudioService materialAudioService; private final RestTemplate restTemplate; - //S3 저장까지 완료된 상태 - //해야하는거 - //재료 오디오 DB 저장 - //결과 오디오 DB 저장 - //병합 결과 반환 - public List concatOnLambda(ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto audioRequests) { - LambdaConcatRequest lambdaConcatRequest = LambdaConcatRequest.builder() - .concatTabResponseDto(concatTabResponseDto) - .audioFormatDto(new AudioFormatDto(AudioFormats.STEREO_FORMAT_SR441_B16)) - .audios(audioRequests.getConcatRowRequests()) - .fileName(audioRequests.getFileName()) - .build(); + // S3 저장까지 완료된 상태 + // 해야하는거 + // 재료 오디오 DB 저장 + // 결과 오디오 DB 저장 + // 병합 결과 반환 + public List concatOnLambda( + ConcatTabResponseDto concatTabResponseDto, ConcatRowRequestDto audioRequests) { + LambdaConcatRequest lambdaConcatRequest = + LambdaConcatRequest.builder() + .concatTabResponseDto(concatTabResponseDto) + .audioFormatDto(new AudioFormatDto(AudioFormats.STEREO_FORMAT_SR441_B16)) + .audios(audioRequests.getConcatRowRequests()) + .fileName(audioRequests.getFileName()) + .build(); List list = lambdaConcatRequest(lambdaConcatRequest); @@ -52,75 +53,85 @@ public List concatOnLambda(ConcatTabResponseDto concatTabRespon } private static List getConcatResultDtos(List concatResults) { - return concatResults.stream().map(concatResult -> - ConcatResultDto.builder() - .concatResultSequence(concatResult.getConcatResultSequence()) - .audioUrl(concatResult.getAudioUrl()) - .fileName(concatResult.getFileName()) - .fileLength(concatResult.getFileLength()) - .fileSize(concatResult.getFileSize()) - .extension(concatResult.getExtension()) - .seperated(concatResult.getSeperated()) - .processId(concatResult.getProcessId()) - .build()).toList(); + return concatResults.stream() + .map( + concatResult -> + ConcatResultDto.builder() + .concatResultSequence(concatResult.getConcatResultSequence()) + .audioUrl(concatResult.getAudioUrl()) + .fileName(concatResult.getFileName()) + .fileLength(concatResult.getFileLength()) + .fileSize(concatResult.getFileSize()) + .extension(concatResult.getExtension()) + .seperated(concatResult.getSeperated()) + .processId(concatResult.getProcessId()) + .build()) + .toList(); } private List lambdaConcatRequest(LambdaConcatRequest lambdaConcatRequest) { - Object response = restTemplate.postForObject( - "https://bewpsh81xa.execute-api.ap-northeast-2.amazonaws.com/default/Test", // Lambda URL - lambdaConcatRequest, - Object.class - ); + Object response = + restTemplate.postForObject( + "https://bewpsh81xa.execute-api.ap-northeast-2.amazonaws.com/default/Test", // Lambda + // URL + lambdaConcatRequest, + Object.class); if (response == null) { throw new IllegalArgumentException("오디오 병합 실패 : 반환값이 없습니다."); } -// ObjectMapper를 사용해 JSON을 List로 변환 + // ObjectMapper를 사용해 JSON을 List로 변환 ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.convertValue(response, new TypeReference<>() { - }); + return objectMapper.convertValue(response, new TypeReference<>() {}); } - private List getConcatResults(ConcatTabResponseDto concatTabResponseDto, List list) { - //재료 오디오와 결과 저장 + private List getConcatResults( + ConcatTabResponseDto concatTabResponseDto, List list) { + // 재료 오디오와 결과 저장 /* * 결과가 여러개로 나눠져 올 가능성 있음 * 결과 하나당 재료 오디오 여러개 * List 하나는 나눠져 온 결과 오디오 하나를 변환 한 값 * */ List concatResults = new ArrayList<>(); - List> materials = list.stream().map(result -> { - ConcatResult concatResult = of(result, concatTabResponseDto); - concatResults.add(concatResult); - List processed = result.getProcessed(); - return processed.stream().map(process -> MaterialAudio.builder() - .concatResult(concatResult) - .audioFile(AudioFile.builder().audioFileSeq(process.getSeq()).build()) - .method("NORMAL").build()).toList(); - - }).toList(); + List> materials = + list.stream() + .map( + result -> { + ConcatResult concatResult = of(result, concatTabResponseDto); + concatResults.add(concatResult); + List processed = result.getProcessed(); + return processed.stream() + .map( + process -> + MaterialAudio.builder() + .concatResult(concatResult) + .audioFile( + AudioFile.builder().audioFileSeq(process.getSeq()).build()) + .method("NORMAL") + .build()) + .toList(); + }) + .toList(); materials.forEach(materialAudioService::saveMaterialAudio); return concatResults; } - public ConcatResult of(LambdaConcatResultDto concatResult, ConcatTabResponseDto concatTabResponseDto) { - ConcatResult build = ConcatResult.builder() - .concatTab(ConcatTab - .builder() - .projectId(concatTabResponseDto.getTabId()) - .build()) - .fileName(concatResult.getInfo().getFileName()) - .extension(concatResult.getInfo().getContentType()) - .fileSize(concatResult.getInfo().getContentSize()) - .fileLength(concatResult.getInfo().getContentLength()) - .audioUrl(concatResult.getS3Url()) - .processId(concatResult.getProcessId()) - .seperated(concatResult.getI()) - .build(); + public ConcatResult of( + LambdaConcatResultDto concatResult, ConcatTabResponseDto concatTabResponseDto) { + ConcatResult build = + ConcatResult.builder() + .concatTab(ConcatTab.builder().projectId(concatTabResponseDto.getTabId()).build()) + .fileName(concatResult.getInfo().getFileName()) + .extension(concatResult.getInfo().getContentType()) + .fileSize(concatResult.getInfo().getContentSize()) + .fileLength(concatResult.getInfo().getContentLength()) + .audioUrl(concatResult.getS3Url()) + .processId(concatResult.getProcessId()) + .seperated(concatResult.getI()) + .build(); return concatResultService.saveConcatResult(build); - } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java index 04e8bb10..cc77cdae 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/AudioInfo.java @@ -2,21 +2,20 @@ import com.mpatric.mp3agic.Mp3File; import com.oreo.finalproject_5re5_be.global.dto.response.AudioFileInfo; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import java.io.File; import java.util.ArrayList; import java.util.List; +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; @Slf4j @Component public class AudioInfo { - //파일 이름,길이,크기,확장자 추출 메서드 + // 파일 이름,길이,크기,확장자 추출 메서드 public AudioFileInfo extractAudioFileInfo(MultipartFile audioFile) { String fileName = audioFile.getOriginalFilename(); String fileSize = String.valueOf(audioFile.getSize()); @@ -43,8 +42,8 @@ public AudioFileInfo extractAudioFileInfo(MultipartFile audioFile) { fileLength = Math.toIntExact(getWavFileDuration(tempFile)); } - boolean delete = tempFile.delete();// 임시 파일 삭제 - if (!delete){ + boolean delete = tempFile.delete(); // 임시 파일 삭제 + if (!delete) { throw new RuntimeException("임시 파일 삭제 실패"); } } catch (Exception e) { @@ -86,24 +85,26 @@ public List extractAudioFileInfo(List audioFiles) fileLength = Math.toIntExact(getWavFileDuration(tempFile)); } - boolean delete = tempFile.delete();// 임시 파일 삭제 - if (!delete){ + boolean delete = tempFile.delete(); // 임시 파일 삭제 + if (!delete) { throw new RuntimeException("임시 파일 삭제 실패"); } } catch (Exception e) { log.error("오디오 파일 정보를 추출하는 중 오류 발생: ", e); } - audioFileInfos.add(AudioFileInfo.builder() - .name(fileName) - .size(fileSize) - .length(fileLength) - .extension(fileExtension) - .build()); + audioFileInfos.add( + AudioFileInfo.builder() + .name(fileName) + .size(fileSize) + .length(fileLength) + .extension(fileExtension) + .build()); } return audioFileInfos; } - //wav 파일 일경우 파일 길이 추출하는 메서드 + + // wav 파일 일경우 파일 길이 추출하는 메서드 private long getWavFileDuration(File wavFile) { try (AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(wavFile)) { AudioFormat format = audioInputStream.getFormat(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java index 18bce6a2..54de3754 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/ByteArrayMultipartFile.java @@ -1,10 +1,10 @@ package com.oreo.finalproject_5re5_be.global.component; -import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import org.springframework.web.multipart.MultipartFile; public class ByteArrayMultipartFile implements MultipartFile { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java index 3e1c8ca3..699b4687 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/S3Service.java @@ -7,15 +7,7 @@ import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3ObjectInputStream; import com.oreo.finalproject_5re5_be.global.component.audio.AudioExtensionConverter; -import com.oreo.finalproject_5re5_be.global.component.audio.AudioResample; import com.oreo.finalproject_5re5_be.vc.dto.request.VcUrlRequest; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import javax.sound.sampled.*; import java.io.*; import java.net.MalformedURLException; import java.net.URL; @@ -23,6 +15,12 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; +import javax.sound.sampled.*; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; @Component @Slf4j @@ -37,7 +35,6 @@ public S3Service(AmazonS3 s3Client) { @Value("${aws.s3.bucket}") private String buketName; - public String upload(MultipartFile file, String dirName) { return uploadSingleFile(file, dirName); } @@ -71,7 +68,6 @@ public List downloadFile(List vcUrlRequest) throws IOExcepti return files; } - public List upload(List files, String dirName) { if (files.isEmpty()) { throw new IllegalArgumentException("파일이 없습니다"); @@ -120,20 +116,15 @@ private String generateFileKey(String dirName, String originalFilename) { } // PutObjectRequest 생성 - private PutObjectRequest createPutObjectRequest(MultipartFile file, String key, ObjectMetadata objectMetadata) { + private PutObjectRequest createPutObjectRequest( + MultipartFile file, String key, ObjectMetadata objectMetadata) { try { - return new PutObjectRequest( - buketName, - key, - file.getInputStream(), - objectMetadata - ); + return new PutObjectRequest(buketName, key, file.getInputStream(), objectMetadata); } catch (IOException e) { throw new IllegalArgumentException("입력 파라미터에 문제가 있습니다. 파일 업로드 불가!", e); } } - /** * S3에서 파일을 다운로드하고 로컬에 저장 * @@ -177,10 +168,8 @@ private String extractFileKeyFromUrl(String url) { return "vc/src/" + url.substring(url.lastIndexOf("/") + 1); } - /** - * File folder = new File("경로") - * 파일 삭제 + * File folder = new File("경로") 파일 삭제 * * @param folder */ @@ -196,23 +185,26 @@ public void deleteFolder(File folder) { } else { // 파일 삭제 if (!file.delete()) { - log.error("파일 삭제 실패: {}" ,file.getAbsolutePath()); + log.error("파일 삭제 실패: {}", file.getAbsolutePath()); } } } } // 폴더 삭제 if (!folder.delete()) { - log.error("폴더 삭제 실패: {}" , folder.getAbsolutePath()); + log.error("폴더 삭제 실패: {}", folder.getAbsolutePath()); } } else { log.error("폴더가 존재하지 않음: {} ", folder.getAbsolutePath()); } } - - public String upload(InputStream audioInputStream, String dirName, String fileName - , long fileSize, String contentType) { + public String upload( + InputStream audioInputStream, + String dirName, + String fileName, + long fileSize, + String contentType) { if (audioInputStream == null) { throw new IllegalArgumentException("AudioInputStream이 null입니다."); } @@ -231,12 +223,12 @@ public String upload(InputStream audioInputStream, String dirName, String fileNa // S3에 업로드 요청 try (InputStream inputStream = audioInputStream) { - PutObjectRequest request = new PutObjectRequest( - buketName, // S3 버킷 이름 - key, // 저장 경로(key) - inputStream, - objectMetadata - ); + PutObjectRequest request = + new PutObjectRequest( + buketName, // S3 버킷 이름 + key, // 저장 경로(key) + inputStream, + objectMetadata); // S3 버킷에 객체 업로드 s3Client.putObject(request); @@ -248,7 +240,6 @@ public String upload(InputStream audioInputStream, String dirName, String fileNa return s3Client.getUrl(buketName, key).toString(); } - public static AudioInputStream load(String s3Url) { try { URL url = new URL(s3Url); @@ -279,12 +270,12 @@ public void deleteFile(String buketName, String key) { try { s3Client.deleteObject(buketName, key); } catch (SdkClientException e) { - throw new RuntimeException("S3 파일 삭제 요청 중 에러 발생, buketName:"+buketName+", key:"+key); + throw new RuntimeException("S3 파일 삭제 요청 중 에러 발생, buketName:" + buketName + ", key:" + key); } - } - public String uploadAudioStream(AudioInputStream audioStream, String dirName, String fileName) throws IOException { + public String uploadAudioStream(AudioInputStream audioStream, String dirName, String fileName) + throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // AudioInputStream -> ByteArrayOutputStream 변환 diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java index 8c47e9ca..4741acef 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/SqsService.java @@ -1,23 +1,23 @@ -//package com.oreo.finalproject_5re5_be.global.component; -// -//import com.amazonaws.services.sqs.AmazonSQSRequester; -//import com.fasterxml.jackson.core.JsonProcessingException; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import com.oreo.finalproject_5re5_be.global.constant.MessageType; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.stereotype.Component; -//import software.amazon.awssdk.services.sqs.SqsClient; -//import software.amazon.awssdk.services.sqs.model.Message; -//import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; -//import software.amazon.awssdk.services.sqs.model.SendMessageRequest; -// -//import java.util.HashMap; -//import java.util.Map; -//import java.util.concurrent.TimeUnit; -//import java.util.concurrent.TimeoutException; -// -//@Component -//public class SqsService { +// package com.oreo.finalproject_5re5_be.global.component; +// +// import com.amazonaws.services.sqs.AmazonSQSRequester; +// import com.fasterxml.jackson.core.JsonProcessingException; +// import com.fasterxml.jackson.databind.ObjectMapper; +// import com.oreo.finalproject_5re5_be.global.constant.MessageType; +// import org.springframework.beans.factory.annotation.Value; +// import org.springframework.stereotype.Component; +// import software.amazon.awssdk.services.sqs.SqsClient; +// import software.amazon.awssdk.services.sqs.model.Message; +// import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; +// import software.amazon.awssdk.services.sqs.model.SendMessageRequest; +// +// import java.util.HashMap; +// import java.util.Map; +// import java.util.concurrent.TimeUnit; +// import java.util.concurrent.TimeoutException; +// +// @Component +// public class SqsService { // private final SqsClient sqsClient; // private final AmazonSQSRequester amazonSQSRequester; // @@ -32,7 +32,8 @@ // this.amazonSQSRequester = amazonSQSRequester; // } // -// public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, JsonProcessingException { +// public Message sendMessage(T dto, MessageType messageType) throws TimeoutException, +// JsonProcessingException { // // 변수 설정 // // 가상 대기열 사용 // String requestQueueUrl = sqsQueueUrl + virtualQueueName; @@ -44,7 +45,8 @@ // // 메시지 속성 설정 // Map messageAttributes = new HashMap<>(); // messageAttributes.put("messageType", -// MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); +// +// MessageAttributeValue.builder().dataType("String").stringValue(messageType.getType()).build()); // // // sqs에 메세지 보내기 // SendMessageRequest sendRequest = SendMessageRequest.builder() @@ -59,4 +61,4 @@ // // return response; // } -//} +// } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java index 3de903f1..6b0a40a2 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionChecker.java @@ -7,27 +7,27 @@ * * @author K-KY * @apiNote 바이트 배열을 조작해 확장자의 시그니처와 일치 시키는 경우 True를 반환합니다.
    - * 바이트 배열이 실제 파일을 변환한 값인지, 확인하는 과정이 선행 되어야 할 수 있습니다. + * 바이트 배열이 실제 파일을 변환한 값인지, 확인하는 과정이 선행 되어야 할 수 있습니다. */ public class AudioExtensionChecker { private static final int WAV_SIGNATURE_BYTE = 4; private static final int MP3_SIGNATURE_BYTE = 2; - //wav확장자 검사 + // wav확장자 검사 public static boolean isWavExtension(File file) throws IOException { - //파일을 바이트로 읽기 + // 파일을 바이트로 읽기 try (FileInputStream fileInputStream = new FileInputStream(file)) { - byte[] buffer = new byte[WAV_SIGNATURE_BYTE]; //wav 시그니처 8글자 읽어야 하기때문에 4바이트 + byte[] buffer = new byte[WAV_SIGNATURE_BYTE]; // wav 시그니처 8글자 읽어야 하기때문에 4바이트 if (fileInputStream.read(buffer) != -1) { - String hexSignature = bytesToHex(buffer);//읽은 바이트 배열을 문자열로 변환 - fileInputStream.close();//리소스 반환 - return AudioExtensions.isWavExtension(hexSignature);//파일 검사 + String hexSignature = bytesToHex(buffer); // 읽은 바이트 배열을 문자열로 변환 + fileInputStream.close(); // 리소스 반환 + return AudioExtensions.isWavExtension(hexSignature); // 파일 검사 } } return false; } - //mp3확장자 검사 + // mp3확장자 검사 public static boolean isSupported(File file) throws IOException { try (FileInputStream fileInputStream = new FileInputStream(file)) { byte[] buffer = new byte[MP3_SIGNATURE_BYTE]; // 4글자만 읽어야 하기떄문에 2바이트로 지정 @@ -40,26 +40,27 @@ public static boolean isSupported(File file) throws IOException { return false; } - //wav확장자 검사 + // wav확장자 검사 public static boolean isWavExtension(byte[] byteArray) throws IOException { - ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);//InputStream으로 변환 + ByteArrayInputStream byteArrayInputStream = + new ByteArrayInputStream(byteArray); // InputStream으로 변환 byte[] buffer = new byte[WAV_SIGNATURE_BYTE]; - if (byteArrayInputStream.read(buffer) != -1) {//스트림에서 WAV_SIGNATURE_BYTE 만큼 읽기 - String hexSignature = bytesToHex(buffer);//읽은 buffer을 String으로 변환 - byteArrayInputStream.close();//리소스 반환 + if (byteArrayInputStream.read(buffer) != -1) { // 스트림에서 WAV_SIGNATURE_BYTE 만큼 읽기 + String hexSignature = bytesToHex(buffer); // 읽은 buffer을 String으로 변환 + byteArrayInputStream.close(); // 리소스 반환 System.out.println("hexSignature = " + hexSignature); - return AudioExtensions.isWavExtension(hexSignature);//바이트 배열 검사 + return AudioExtensions.isWavExtension(hexSignature); // 바이트 배열 검사 } return false; } - //mp3확장자 검사 + // mp3확장자 검사 public static boolean isSupported(byte[] byteArray) throws IOException { return isSupportedWav(byteArray) || isSupportedMp3(byteArray); } - //지원하는 확장자 검사 + // 지원하는 확장자 검사 public static boolean isSupportedMp3(byte[] byteArray) throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); @@ -73,7 +74,7 @@ public static boolean isSupportedMp3(byte[] byteArray) throws IOException { return false; } - //지원하는 확장자 검사 + // 지원하는 확장자 검사 public static boolean isSupportedWav(byte[] byteArray) throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray); @@ -87,7 +88,6 @@ public static boolean isSupportedWav(byte[] byteArray) throws IOException { return false; } - // 바이트 배열을 헥사 문자열로 변환 private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java index f7cff57b..c2111e95 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensionConverter.java @@ -1,35 +1,38 @@ package com.oreo.finalproject_5re5_be.global.component.audio; - -import javax.sound.sampled.*; import java.io.*; +import javax.sound.sampled.*; public class AudioExtensionConverter { private static final int DEFAULT_BIT_DEPTH = 16; public static byte[] mp3ToWav(AudioInputStream audioInputStream) { - AudioFormat baseFormat = audioInputStream.getFormat();// WAV 포맷으로 변환할 대상 포맷 설정 + AudioFormat baseFormat = audioInputStream.getFormat(); // WAV 포맷으로 변환할 대상 포맷 설정 AudioFormat decodedFormat = getDecodedFormat(baseFormat); try { AudioInputStream finalStream = getAudioInputStream(decodedFormat, audioInputStream); - ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream();//메모리에 저장할 ByteArray - AudioSystem.write(finalStream, AudioFileFormat.Type.WAVE, wavOutputStream);// 메모리 내에서 WAV 형식으로 변환 및 저장 - return wavOutputStream.toByteArray();// 바이트 배열 반환 + ByteArrayOutputStream wavOutputStream = new ByteArrayOutputStream(); // 메모리에 저장할 ByteArray + AudioSystem.write( + finalStream, AudioFileFormat.Type.WAVE, wavOutputStream); // 메모리 내에서 WAV 형식으로 변환 및 저장 + return wavOutputStream.toByteArray(); // 바이트 배열 반환 } catch (IOException e) { - throw new RuntimeException("오디오 변환에 문제가 발생 했습니다." ,e); + throw new RuntimeException("오디오 변환에 문제가 발생 했습니다.", e); } } public static byte[] mp3ToWav(File file) throws UnsupportedAudioFileException, IOException { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);// 파일을 AudioInputStream으로 읽기 + AudioInputStream audioInputStream = + AudioSystem.getAudioInputStream(file); // 파일을 AudioInputStream으로 읽기 return mp3ToWav(audioInputStream); } - public static byte[] mp3ToWav(InputStream inputStream) throws UnsupportedAudioFileException, IOException { - AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputStream);// 파일을 AudioInputStream으로 읽기 + public static byte[] mp3ToWav(InputStream inputStream) + throws UnsupportedAudioFileException, IOException { + AudioInputStream audioInputStream = + AudioSystem.getAudioInputStream(inputStream); // 파일을 AudioInputStream으로 읽기 return mp3ToWav(audioInputStream); } @@ -41,8 +44,7 @@ private static AudioFormat getDecodedFormat(AudioFormat baseFormat) { baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), - false - ); + false); } private static AudioInputStream getAudioInputStream( @@ -62,15 +64,13 @@ private static AudioInputStream getAudioInputStream( return getAudioInputStream(decodedFormat, byteArrayOutputStream); } - private static AudioInputStream getAudioInputStream(AudioFormat decodedFormat, - ByteArrayOutputStream byteArrayOutputStream) { + private static AudioInputStream getAudioInputStream( + AudioFormat decodedFormat, ByteArrayOutputStream byteArrayOutputStream) { byte[] pcmData = byteArrayOutputStream.toByteArray(); // 새로운 AudioInputStream 생성하여 길이 지정 ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(pcmData); return new AudioInputStream( - byteArrayInputStream, decodedFormat, pcmData.length / decodedFormat.getFrameSize() - ); + byteArrayInputStream, decodedFormat, pcmData.length / decodedFormat.getFrameSize()); } } - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java index 9c33e8b3..8c6e2dea 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioExtensions.java @@ -1,48 +1,45 @@ package com.oreo.finalproject_5re5_be.global.component.audio; -import lombok.Getter; - import java.util.Arrays; import java.util.List; +import lombok.Getter; /** - * @apiNote 이 클래스는 파일의 확장자(---.ext) 를 검사하는 클래스가 아닙니다. - * 파일 확장자 고유의 시그니처를 검사합니다. - * - * @see @code AudioExtensionChecker + * @apiNote 이 클래스는 파일의 확장자(---.ext) 를 검사하는 클래스가 아닙니다. 파일 확장자 고유의 시그니처를 검사합니다. + * @see @code AudioExtensionChecker * @author K-KY */ @Getter public enum AudioExtensions { - //wav파일 시그니처를 표현하기 위해 앞에 문자열을 붙임 - E_52494646("WAV"), E_FFF3("MP3"), E_FFF2("MP3"), E_FFFB("MP3"); + // wav파일 시그니처를 표현하기 위해 앞에 문자열을 붙임 + E_52494646("WAV"), + E_FFF3("MP3"), + E_FFF2("MP3"), + E_FFFB("MP3"); AudioExtensions(String signatures) { this.signatures = signatures; } - - - private final static List collect = Arrays.stream(AudioExtensions.values()).map(Enum::toString).toList(); + private static final List collect = + Arrays.stream(AudioExtensions.values()).map(Enum::toString).toList(); private final String signatures; - //파라미터가 Enum중 있는지 여부 반환 + // 파라미터가 Enum중 있는지 여부 반환 public static boolean isSupported(String signature) { return collect.contains("E_" + signature); } - //Enum의 wav 확장자 시그니처와 파라미터가 같은지 여부 반환 + // Enum의 wav 확장자 시그니처와 파라미터가 같은지 여부 반환 public static boolean isWavExtension(String signature) { return AudioExtensions.E_52494646.toString().equals("E_" + signature); } - //wav 확장자가 아니고 지원되는 확장자라면 mp3확장자 + // wav 확장자가 아니고 지원되는 확장자라면 mp3확장자 public static boolean isMp3Extension(String signature) { if (isWavExtension(signature)) { return false; } return isSupported(signature); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java index a8b5351e..9fddd4b7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFileTypeConverter.java @@ -1,23 +1,22 @@ package com.oreo.finalproject_5re5_be.global.component.audio; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.web.multipart.MultipartFile; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.web.multipart.MultipartFile; public class AudioFileTypeConverter { - //File을 MultipartFile로 변경 + // File을 MultipartFile로 변경 public static MultipartFile convertFileToMultipartFile(File file) throws IOException { try (FileInputStream inputStream = new FileInputStream(file)) { return new MockMultipartFile( - "file", // 파라미터 이름 - file.getName(), // 파일 이름 - Files.probeContentType(file.toPath()), // MIME 타입 - inputStream // 파일 내용 - ); + "file", // 파라미터 이름 + file.getName(), // 파일 이름 + Files.probeContentType(file.toPath()), // MIME 타입 + inputStream // 파일 내용 + ); } } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java index 80e9f951..cbce835a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioFormats.java @@ -3,109 +3,117 @@ import javax.sound.sampled.AudioFormat; public final class AudioFormats { - private AudioFormats() { - } - - public static final AudioFormat MONO_FORMAT_SR441_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz로 변환 - 32, // 16비트 - 1, // 모노 - 4, // 2 bytes/frame - 44100, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + private AudioFormats() {} + public static final AudioFormat MONO_FORMAT_SR441_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz로 변환 + 32, // 16비트 + 1, // 모노 + 4, // 2 bytes/frame + 44100, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat MONO_FORMAT_SR441_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz로 변환 - 16, // 16비트 - 1, // 모노 - 2, // 2 bytes/frame - 44100, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat MONO_FORMAT_SR441_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz로 변환 + 16, // 16비트 + 1, // 모노 + 2, // 2 bytes/frame + 44100, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat MONO_FORMAT_SR240_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz로 변환 - 32, // 16비트 - 1, // 모노 - 4, // 2 bytes/frame - 24000, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat MONO_FORMAT_SR240_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz로 변환 + 32, // 16비트 + 1, // 모노 + 4, // 2 bytes/frame + 24000, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat MONO_FORMAT_SR240_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz로 변환 - 16, // 16비트 - 1, // 모노 - 2, // 2 bytes/frame - 24000, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat MONO_FORMAT_SR240_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz로 변환 + 16, // 16비트 + 1, // 모노 + 2, // 2 bytes/frame + 24000, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat STEREO_FORMAT_SR441_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz로 변환 - 32, // 16비트 - 2, // 스테레오 - 8, // 4 bytes/frame - 44100, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat STEREO_FORMAT_SR441_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz로 변환 + 32, // 16비트 + 2, // 스테레오 + 8, // 4 bytes/frame + 44100, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat STEREO_FORMAT_SR441_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz로 변환 - 16, // 16비트 - 2, // 스테레오 - 4, // 4 bytes/frame - 44100, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat STEREO_FORMAT_SR441_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz로 변환 + 16, // 16비트 + 2, // 스테레오 + 4, // 4 bytes/frame + 44100, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat STEREO_FORMAT_SR240_B32 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz로 변환 - 32, // 16비트 - 2, // 스테레오 - 8, // 4 bytes/frame - 24000, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat STEREO_FORMAT_SR240_B32 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz로 변환 + 32, // 16비트 + 2, // 스테레오 + 8, // 4 bytes/frame + 24000, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat STEREO_FORMAT_SR240_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 24000, // 44.1kHz로 변환 - 16, // 16비트 - 2, // 스테레오 - 4, // 4 bytes/frame - 24000, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat STEREO_FORMAT_SR240_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 24000, // 44.1kHz로 변환 + 16, // 16비트 + 2, // 스테레오 + 4, // 4 bytes/frame + 24000, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat STEREO_FORMAT_SR480_B16 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 48000, // 44.1kHz로 변환 - 16, // 16비트 - 2, // 스테레오 - 4, // 4 bytes/frame - 48000, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat STEREO_FORMAT_SR480_B16 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 48000, // 44.1kHz로 변환 + 16, // 16비트 + 2, // 스테레오 + 4, // 4 bytes/frame + 48000, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); - public static final AudioFormat MONO_FORMAT_SR441_B8 = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz로 변환 - 8, // 16비트 - 1, // 모노 - 1, // 2 bytes/frame - 44100, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + public static final AudioFormat MONO_FORMAT_SR441_B8 = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz로 변환 + 8, // 16비트 + 1, // 모노 + 1, // 2 bytes/frame + 44100, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); public static AudioFormat customAudioFormat(int sampleRate, int channels) { if (channels != 1 && channels != 2) { @@ -114,11 +122,11 @@ public static AudioFormat customAudioFormat(int sampleRate, int channels) { return new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, sampleRate, // 44.1kHz로 변환 - 16, // 16비트 - channels, // 스테레오 - channels * 2, // 4 bytes/frame + 16, // 16비트 + channels, // 스테레오 + channels * 2, // 4 bytes/frame sampleRate, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + false // 리틀 엔디안 + ); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java index 52c33643..201401ea 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/AudioResample.java @@ -1,27 +1,26 @@ package com.oreo.finalproject_5re5_be.global.component.audio; import com.oreo.finalproject_5re5_be.concat.service.concatenator.Concatenator; -import lombok.extern.log4j.Log4j2; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; - +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import lombok.extern.log4j.Log4j2; /** * @apiNote 병합 되거나 병합되기 이전의 오디오 형식을 일치 시키기 위한 클래스 * @see Concatenator */ - @Log4j2 public class AudioResample { private final AudioFormat audioFormat; /** + * + * *
    기본 병합 클래스
    * * @@ -37,6 +36,7 @@ public class AudioResample { *
    오디오 리샘플링
    리샘플링 할 오디오 포맷 * *
    + * *

    */ public AudioResample(AudioFormat audioFormat) { @@ -44,6 +44,8 @@ public AudioResample(AudioFormat audioFormat) { } /** + * + * * * * @@ -59,21 +61,23 @@ public AudioResample(AudioFormat audioFormat) { *
    오디오 리샘플링
    리샘플링 할 오디오 포맷
    모노 44100 SampleRate의 오디오 포맷을 생성 * *
    + * *

    */ public AudioResample() { - audioFormat = new AudioFormat( - AudioFormat.Encoding.PCM_SIGNED, - 44100, // 44.1kHz로 변환 - 16, // 16비트 - 2, // 스테레오 - 4, // 2 bytes/frame - 44100, // frame rate와 샘플링 레이트 일치 - false // 리틀 엔디안 - ); + audioFormat = + new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + 44100, // 44.1kHz로 변환 + 16, // 16비트 + 2, // 스테레오 + 4, // 2 bytes/frame + 44100, // frame rate와 샘플링 레이트 일치 + false // 리틀 엔디안 + ); } - //리스트 리샘플링 + // 리스트 리샘플링 public List resample(List audioStreams) { List resampledAudioStreams = new ArrayList<>(); for (AudioInputStream audioStream : audioStreams) { @@ -82,23 +86,22 @@ public List resample(List audioStreams) { return resampledAudioStreams; } - //개별 리샘플링 + // 개별 리샘플링 public AudioInputStream resample(AudioInputStream audioStream) { return formatting(audioStream); } - //바이트 스트림 리샘플링 + // 바이트 스트림 리샘플링 public AudioInputStream resample(ByteArrayOutputStream byteArrayOutputStream) { byte[] combinedBytes = byteArrayOutputStream.toByteArray(); ByteArrayInputStream combinedByteArrayInputStream = new ByteArrayInputStream(combinedBytes); return new AudioInputStream( combinedByteArrayInputStream, audioFormat, - combinedBytes.length / audioFormat.getFrameSize() - ); + combinedBytes.length / audioFormat.getFrameSize()); } - //리샘플링 포맷 일치화 + // 리샘플링 포맷 일치화 public AudioInputStream formatting(AudioInputStream audioInputStream) { log.info("[formatting] 현재 오디오 포맷과 타겟 오디오 포맷이 일치하는지 확인 중..."); log.info("[formatting] 현재 오디오 포맷: {}", audioInputStream.getFormat()); @@ -111,7 +114,8 @@ public AudioInputStream formatting(AudioInputStream audioInputStream) { log.info("[formatting] 타겟 오디오 포맷과 일치하지 않아서 리샘플링 중..."); try { - AudioInputStream resampledStream = AudioSystem.getAudioInputStream(audioFormat, audioInputStream); + AudioInputStream resampledStream = + AudioSystem.getAudioInputStream(audioFormat, audioInputStream); log.info("[formatting] 리샘플링된 포맷: {}", resampledStream.getFormat()); return resampledStream; } catch (Exception e) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java index e0ece0ca..9acd26bb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/BeepMaker.java @@ -1,20 +1,17 @@ package com.oreo.finalproject_5re5_be.global.component.audio; - +import java.io.ByteArrayInputStream; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; -import java.io.ByteArrayInputStream; -/** - * 파라미터로 전달된 주파수의 오디오를 생성한다. - */ +/** 파라미터로 전달된 주파수의 오디오를 생성한다. */ public class BeepMaker { /** * 주어진 주파수로 지정된 길이의 비프 오디오 스트림을 생성합니다. * * @param frequency 주파수 (Hz) - * @param duration 지속 시간 (초) - * @param format 대상 오디오 포맷 + * @param duration 지속 시간 (초) + * @param format 대상 오디오 포맷 * @return 비프 오디오 스트림 */ public static AudioInputStream makeSound(int frequency, float duration, AudioFormat format) { @@ -43,17 +40,18 @@ public static AudioInputStream makeSound(int frequency, float duration, AudioFor } /** + * * * * *
    기본 병합 클래스
    * - * @param duration 지속 시간 (초) - * @param format 대상 오디오 포맷 + * @param duration 지속 시간 (초) + * @param format 대상 오디오 포맷 * @return 무음 오디오 스트림 */ - //무음 오디오 생성 + // 무음 오디오 생성 public static AudioInputStream makeSound(float duration, AudioFormat format) { return makeSound(0, duration, format); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java index 441bdccc..aed747e4 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/component/audio/SoundPlayer.java @@ -1,7 +1,7 @@ package com.oreo.finalproject_5re5_be.global.component.audio; -import javax.sound.sampled.*; import java.io.IOException; +import javax.sound.sampled.*; public class SoundPlayer { private byte[] buffer = new byte[4096]; // 오디오가 재생되는 버퍼의 크기 @@ -16,13 +16,13 @@ public class SoundPlayer { */ public void play(AudioInputStream audioInputStream) throws IOException { try { - Result result = getAudio(audioInputStream);//실행 할 수 있는 데이터로 변환 + Result result = getAudio(audioInputStream); // 실행 할 수 있는 데이터로 변환 SourceDataLine sourceDataLine = result.sourceLine(); - sourceDataLine.open(result.format());//시스템 리소스 획득 - sourceDataLine.start();//sourceLine의 IO 실행 + sourceDataLine.open(result.format()); // 시스템 리소스 획득 + sourceDataLine.start(); // sourceLine의 IO 실행 - loadBuffer(audioInputStream, sourceDataLine);//버퍼에 담아 실행 + loadBuffer(audioInputStream, sourceDataLine); // 버퍼에 담아 실행 // 재생이 완료되면 리소스 반환 sourceDataLine.drain(); @@ -34,29 +34,29 @@ public void play(AudioInputStream audioInputStream) throws IOException { } private Result getAudio(AudioInputStream audioInputStream) throws LineUnavailableException { - //AudioInputStream을 AudioFormat으로 변환 + // AudioInputStream을 AudioFormat으로 변환 AudioFormat format = audioInputStream.getFormat(); - //단일 오디오 형식을 포함하는 지정된 정보로부터 데이터 라인의 정보 객체를 구성 + // 단일 오디오 형식을 포함하는 지정된 정보로부터 데이터 라인의 정보 객체를 구성 DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); - //info에 지정된 audioFormat의 SourceDataLine 객체 획득 + // info에 지정된 audioFormat의 SourceDataLine 객체 획득 SourceDataLine sourceLine = (SourceDataLine) AudioSystem.getLine(info); return new Result(format, sourceLine); } - private void loadBuffer(AudioInputStream audioInputStream, SourceDataLine sourceLine) throws IOException { - //실제로 오디오가 실행되는 장소 + private void loadBuffer(AudioInputStream audioInputStream, SourceDataLine sourceLine) + throws IOException { + // 실제로 오디오가 실행되는 장소 while ((bytesRead = audioInputStream.read(buffer, 0, buffer.length)) != -1) { sourceLine.write(buffer, 0, bytesRead); } } - //버퍼의 크기를 변경하기 위한 세터 + // 버퍼의 크기를 변경하기 위한 세터 public void setBuffer(byte[] buffer) { this.buffer = buffer; } - private record Result(AudioFormat format, SourceDataLine sourceLine) { - } + private record Result(AudioFormat format, SourceDataLine sourceLine) {} } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java index 5502301f..2b9e84c5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/AuditorAwareImpl.java @@ -1,17 +1,16 @@ package com.oreo.finalproject_5re5_be.global.config; - import jakarta.servlet.http.HttpSession; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.AuditorAware; -import java.util.Optional; - @RequiredArgsConstructor public class AuditorAwareImpl implements AuditorAware { - //session 값 + // session 값 private final HttpSession session; - //session 값으로 memberSeq 가지고 오기 + + // session 값으로 memberSeq 가지고 오기 @Override public Optional getCurrentAuditor() { Long memberID = (Long) session.getAttribute("memberSeq"); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java index cb137fc3..a5e25425 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/JpaAuditingConfig.java @@ -9,7 +9,7 @@ @Configuration @EnableJpaAuditing public class JpaAuditingConfig { - //JPA Auditing Bean 등록 + // JPA Auditing Bean 등록 @Bean public AuditorAware auditorProvider(HttpSession session) { return new AuditorAwareImpl(session); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java b/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java index 9f3b6d57..018e7a57 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/config/MultipartFileAccepter.java @@ -11,8 +11,6 @@ public class MultipartFileAccepter implements Converter server = new ArrayList<>(); server.add(new Server().description("https Server").url("https://dev1.5re5park.site")); server.add(new Server().description("localhost").url("http://localhost:8080")); - OpenAPI info = new OpenAPI() - .components(new Components()) - .paths(getPaths()) - .servers(server) - .info(apiInfo()); + OpenAPI info = + new OpenAPI() + .components(new Components()) + .paths(getPaths()) + .servers(server) + .info(apiInfo()); return info; } @@ -37,54 +37,61 @@ private Paths getPaths() { Paths paths = new Paths(); // 로그인 API 경로 추가 - paths.addPathItem("/api/member/login", new PathItem() - .post(new Operation() - .summary("회원 로그인") - .description("스프링 시큐리티 기본 로그인 처리") - .requestBody(new RequestBody() - .required(true) - .content(new Content() - .addMediaType("application/x-www-form-urlencoded", new MediaType() - .schema(new Schema<>() - .addProperty("username", new StringSchema()) - .addProperty("password", new StringSchema()) - ) - ) - ) - ) - .responses(new ApiResponses() - .addApiResponse("200", new ApiResponse().description("로그인 성공")) - .addApiResponse("401", new ApiResponse().description("로그인 실패")) - ) - ) - ); - + paths.addPathItem( + "/api/member/login", + new PathItem() + .post( + new Operation() + .summary("회원 로그인") + .description("스프링 시큐리티 기본 로그인 처리") + .requestBody( + new RequestBody() + .required(true) + .content( + new Content() + .addMediaType( + "application/x-www-form-urlencoded", + new MediaType() + .schema( + new Schema<>() + .addProperty("username", new StringSchema()) + .addProperty("password", new StringSchema()))))) + .responses( + new ApiResponses() + .addApiResponse("200", new ApiResponse().description("로그인 성공")) + .addApiResponse("401", new ApiResponse().description("로그인 실패"))))); // 로그아웃 API 경로 추가 - paths.addPathItem("/api/member/logout", new io.swagger.v3.oas.models.PathItem() - .post(new io.swagger.v3.oas.models.Operation() - .summary("회원 로그아웃") - .description("스프링 시큐리티 기본 로그아웃 처리") - .responses(new ApiResponses() - .addApiResponse("200", new ApiResponse() - .description("로그아웃 성공") - .content(new Content() - .addMediaType("application/x-www-form-urlencoded", new MediaType() - .schema(new Schema<>().type("string").example("Logout successful")))) - ) - ) - ) - ); + paths.addPathItem( + "/api/member/logout", + new io.swagger.v3.oas.models.PathItem() + .post( + new io.swagger.v3.oas.models.Operation() + .summary("회원 로그아웃") + .description("스프링 시큐리티 기본 로그아웃 처리") + .responses( + new ApiResponses() + .addApiResponse( + "200", + new ApiResponse() + .description("로그아웃 성공") + .content( + new Content() + .addMediaType( + "application/x-www-form-urlencoded", + new MediaType() + .schema( + new Schema<>() + .type("string") + .example("Logout successful")))))))); return paths; } - - private Info apiInfo() { return new Info() .title("5re5 API Test") // API의 제목 .description("swagger 5re5 park") // API에 대한 설명 .version("1.0.0"); // API의 버전 } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java index 355bfb3c..e3860ac1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/request/SqsRequestDto.java @@ -9,5 +9,4 @@ public class SqsRequestDto { MessageType messageType; String message; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java index fc07e76f..325cd33e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/AudioFileInfo.java @@ -10,7 +10,7 @@ @AllArgsConstructor public class AudioFileInfo { private String name; - private String size; //크기 (용량) - private Integer length; // 초 단위 길이 - private String extension; //확장자 + private String size; // 크기 (용량) + private Integer length; // 초 단위 길이 + private String extension; // 확장자 } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java index 83267255..7fe20c86 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ErrorResponseDto.java @@ -1,10 +1,9 @@ package com.oreo.finalproject_5re5_be.global.dto.response; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.List; - @Getter @AllArgsConstructor public class ErrorResponseDto { @@ -31,11 +30,12 @@ public static FieldErrorDetail of(String field, String message) { } } - public static ErrorResponseDto of(int status, String message, List fieldErrors) { + public static ErrorResponseDto of( + int status, String message, List fieldErrors) { return new ErrorResponseDto(status, new Response(message, fieldErrors)); } public static ErrorResponseDto of(int status, String message) { return new ErrorResponseDto(status, new Response(message, null)); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java index dec1b8de..cc11f396 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/dto/response/ResponseDto.java @@ -9,7 +9,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor -public class ResponseDto{ +public class ResponseDto { private int status; private T response; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java b/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java index e585b1ae..adf929b8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/entity/BaseEntity.java @@ -1,6 +1,7 @@ package com.oreo.finalproject_5re5_be.global.entity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; @@ -8,8 +9,6 @@ import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import java.time.LocalDateTime; - @Getter @AllArgsConstructor(access = AccessLevel.PROTECTED) @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -26,10 +25,10 @@ public class BaseEntity { private LocalDateTime upDate; @CreatedBy - @Column(updatable = false, name ="reg_seq") + @Column(updatable = false, name = "reg_seq") private Long regSeq; @LastModifiedBy @Column(name = "up_seq") private Long upSeq; -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java index 980a6e8d..d985cd93 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/EntityNotFoundException.java @@ -5,9 +5,11 @@ public class EntityNotFoundException extends BusinessException { public EntityNotFoundException() { super(ErrorCode.ENTITY_NOT_FOUND.getMessage(), ErrorCode.ENTITY_NOT_FOUND); } + public EntityNotFoundException(String message) { super(message, ErrorCode.ENTITY_NOT_FOUND); } + public EntityNotFoundException(String message, ErrorCode errorCode) { super(message, errorCode); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java index c0d71d27..48992a32 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/ErrorCode.java @@ -29,8 +29,6 @@ public enum ErrorCode { CODE_DUPLICATED_ERROR(409, "이미 사용중인 코드명입니다. 다른 코드명을 사용해 주세요."), CODE_INVALID_INPUT_VALUE_ERROR(400, "코드 입력값이 올바르지 않습니다."), - - INVALID_INPUT_VALUE(400, " Invalid Input Value"), ENTITY_NOT_FOUND(400, " Entity Not Found"), INTERNAL_SERVER_ERROR(500, "Server Error"), @@ -52,7 +50,6 @@ public enum ErrorCode { TTS_MAKE_INVALID_PITCH(400, "허용되지 않는 TTS 음높이입니다."), TTS_MAKE_INVALID_VOLUME(400, "허용되지 않는 TTS 음량입니다."); - private final String message; private final int status; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/GlobalExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/GlobalExceptionHandler.java index 6d4babc1..1d6214b2 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/GlobalExceptionHandler.java @@ -9,11 +9,8 @@ @ControllerAdvice public class GlobalExceptionHandler { - @ExceptionHandler ( - InvalidProjectNameException.class - ) + @ExceptionHandler(InvalidProjectNameException.class) public ResponseEntity handleInvalidProjectNameException(InvalidProjectNameException ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage()); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java index 575bf326..01274adb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/global/exception/RestGlobalExceptionHandler.java @@ -14,9 +14,8 @@ public ResponseEntity> handleDataNotFoundException(DataNotFo return new ResponseDto<>(HttpStatus.NOT_FOUND.value(), ex.getMessage()).toResponseEntity(); } - @ExceptionHandler(MultipartException.class) public ResponseEntity> handleMultipartException(MultipartException ex) { return new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), ex.getMessage()).toResponseEntity(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java index 82b7995c..a1f2e63f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationFailureHandler.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.config; - import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -14,8 +13,9 @@ public class LoginAuthenticationFailureHandler implements AuthenticationFailureHandler { @Override - public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, - AuthenticationException exception) throws IOException, ServletException { + public void onAuthenticationFailure( + HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) + throws IOException, ServletException { // 로그인 실패시 처리되는 핸들러 // 로그인 실패시 로그인 페이지로 이동 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java index 2198dd8c..fa67bb4f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/LoginAuthenticationSuccessHandler.java @@ -7,6 +7,9 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -14,35 +17,41 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - // 로그인 성공시 처리되는 핸들러 @Slf4j @Component public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) throws IOException { - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - request : {} -> {} -> {}", - request.toString(), response.toString(), authentication.toString()); + public void onAuthenticationSuccess( + HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException { + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - request : {} -> {} -> {}", + request.toString(), + response.toString(), + authentication.toString()); // 로그인 성공시 유저 정보 반환 // 사용자 정보 추출 Object principal = authentication.getPrincipal(); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); Map memberInfo = new HashMap<>(); - String memberId = ""; Long memberSeq = 0L; if (principal instanceof CustomUserDetails) { - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", + principal); CustomUserDetails memberDetails = (CustomUserDetails) principal; - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberDetails : {} ", memberDetails); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberDetails : {} ", + memberDetails); Member member = memberDetails.getMember(); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - member : {} ", member.toString()); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - member : {} ", + member.toString()); memberInfo.put("seq", member.getSeq()); memberInfo.put("id", member.getId()); memberInfo.put("name", member.getName()); @@ -52,14 +61,20 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo memberSeq = member.getSeq(); } else if (principal instanceof UserDetails) { - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", principal); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - principal : {} ", + principal); UserDetails userDetails = (UserDetails) principal; - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - userDetails : {} ", userDetails); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - userDetails : {} ", + userDetails); memberInfo.put("username", userDetails.getUsername()); memberId = userDetails.getUsername(); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberId = : {} ", memberId); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - memberId = : {} ", + memberId); memberSeq = 0L; } @@ -68,13 +83,19 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 세션 조회 HttpSession session = request.getSession(true); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session = : {} ", session.toString()); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session = : {} ", + session.toString()); // 세션에 아이디 등록 session.setAttribute("memberId", memberId); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberId = : {} ", session.getAttribute("memberId")); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberId = : {} ", + session.getAttribute("memberId")); session.setAttribute("memberSeq", memberSeq); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberSeq = : {} ", session.getAttribute("memberSeq")); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - session-memberSeq = : {} ", + session.getAttribute("memberSeq")); // 로그인 성공 후 context 등록 SecurityContextHolder.getContext().setAuthentication(authentication); @@ -83,15 +104,20 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // JSON으로 응답 response.setContentType("application/json;charset=UTF-8"); - log.info("[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - response : {} ", response); + log.info( + "[LoginAuthenticationSuccessHandler] onAuthenticationSuccess - response : {} ", response); new ObjectMapper().writeValue(response.getWriter(), memberInfo); } // 쿠키 등록 // 만약 쿠키 체크가 rememberMe로 되어 있다고 가정. 이 부분 추후에 프론트랑 얘기해야함 - private void handleCookie(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) { - log.info("[LoginAuthenticationSuccessHandler] handleCookie - request : {} -> {} -> {}", request.toString(), response.toString(), authentication.toString()); + private void handleCookie( + HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + log.info( + "[LoginAuthenticationSuccessHandler] handleCookie - request : {} -> {} -> {}", + request.toString(), + response.toString(), + authentication.toString()); // Authentication에서 회원 아이디 조회 String memberId = authentication.getName(); log.info("[LoginAuthenticationSuccessHandler] handleCookie - memberId : {} ", memberId); @@ -105,10 +131,13 @@ private void handleCookie(HttpServletRequest request, HttpServletResponse respon Cookie cookie = new Cookie("memberId", memberId); log.info("[LoginAuthenticationSuccessHandler] handleCookie - cookie1 : {} ", cookie); // 쿠키 도메인 설정 - cookie.setHttpOnly(true);// HTTPS에서만 전송 - cookie.setPath("/"); // 쿠키가 모든 경로에서 유효 - response.setHeader("Set-Cookie", String.format("%s=%s; Path=/; HttpOnly; Secure; SameSite=None", - cookie.getName(), cookie.getValue())); + cookie.setHttpOnly(true); // HTTPS에서만 전송 + cookie.setPath("/"); // 쿠키가 모든 경로에서 유효 + response.setHeader( + "Set-Cookie", + String.format( + "%s=%s; Path=/; HttpOnly; Secure; SameSite=None", + cookie.getName(), cookie.getValue())); // 1일 간 유지 cookie.setMaxAge(60 * 60 * 24); log.info("[LoginAuthenticationSuccessHandler] handleCookie - cookie2 : {} ", cookie); @@ -126,6 +155,5 @@ private void handleCookie(HttpServletRequest request, HttpServletResponse respon cookie.setMaxAge(0); response.addCookie(cookie); } - } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java index d5fc6da6..64059921 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberConfig.java @@ -1,6 +1,6 @@ package com.oreo.finalproject_5re5_be.member.config; - +import java.util.Properties; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -8,12 +8,6 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; - -import java.util.List; -import java.util.Properties; @Configuration public class MemberConfig { @@ -54,7 +48,4 @@ public JavaMailSender javaMailSender() { return mailSender; } - } - - diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java index 29005d68..c1eebd3c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/config/MemberSecurityConfig.java @@ -1,87 +1,92 @@ package com.oreo.finalproject_5re5_be.member.config; -import java.util.List; -import org.apache.catalina.filters.CorsFilter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; - import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; - @Configuration @EnableWebSecurity public class MemberSecurityConfig { private final LoginAuthenticationSuccessHandler successHandler; private final LoginAuthenticationFailureHandler failureHandler; - public MemberSecurityConfig(LoginAuthenticationSuccessHandler successHandler, LoginAuthenticationFailureHandler failureHandler) { + + public MemberSecurityConfig( + LoginAuthenticationSuccessHandler successHandler, + LoginAuthenticationFailureHandler failureHandler) { this.successHandler = successHandler; this.failureHandler = failureHandler; } // SecurityFilterChain 설정 빈 등록, 추후에 적용 예정(다른 파트 작업 완료후 인증/인가 처리 적용예정) -// @Bean -// public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { -// http -// .csrf(csrf -> csrf.disable()) // csrf 비활성화 -// .authorizeHttpRequests(authorize -> authorize -// .requestMatchers("/", "/api/member/register") // 회원가입 페이지와 홈 페이지는 인증/인가 없이 접근 가능 -// .permitAll() -// .requestMatchers("/audio/**", "/project/**", "/languagecode/**", -// "/voice/**", "/style", "/vc/**", "/concat") // 그외의 페이지는 인증/인가가 필요함 -// .authenticated() -// ) -// .formLogin(formLogin -> formLogin -// .loginPage("/api/member/login") // 로그인 페이지 경로 설정 -// .successHandler(successHandler) // 로그인 성공시 처리되는 핸들러 설정 -// .failureUrl("/api/member/login") // 로그인 실패시 로그인 페이지로 이동 -// ).logout(logout -> logout -// .logoutUrl("/api/member/logout") // 로그아웃 경로 설정 -// .invalidateHttpSession(true) // 로그아웃시 세션 무효화 설정 -// .logoutSuccessUrl("/") // 로그아웃 성공시 이동할 페이지 설정 -// ); -// -// -// return http.build(); -// } -// 밑에 개발 어느정도 마무리 되면 주석처리된 부분 주석 해제하고 적용할 예정 -// .requestMatchers("/", "/member/**", "/api/member/**", "/api/member-term-condition/**", // 허용되는 URL -// "/audio/**", "/project/**", "/languagecode/**", -// "/voice/**", "/style/**", "/vc/**", "/concat/**", -// "/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html") // Swagger 관련 URL 허용 - + // @Bean + // public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + // http + // .csrf(csrf -> csrf.disable()) // csrf 비활성화 + // .authorizeHttpRequests(authorize -> authorize + // .requestMatchers("/", "/api/member/register") // 회원가입 페이지와 홈 페이지는 인증/인가 + // 없이 접근 가능 + // .permitAll() + // .requestMatchers("/audio/**", "/project/**", "/languagecode/**", + // "/voice/**", "/style", "/vc/**", "/concat") // 그외의 페이지는 인증/인가가 + // 필요함 + // .authenticated() + // ) + // .formLogin(formLogin -> formLogin + // .loginPage("/api/member/login") // 로그인 페이지 경로 설정 + // .successHandler(successHandler) // 로그인 성공시 처리되는 핸들러 설정 + // .failureUrl("/api/member/login") // 로그인 실패시 로그인 페이지로 이동 + // ).logout(logout -> logout + // .logoutUrl("/api/member/logout") // 로그아웃 경로 설정 + // .invalidateHttpSession(true) // 로그아웃시 세션 무효화 설정 + // .logoutSuccessUrl("/") // 로그아웃 성공시 이동할 페이지 설정 + // ); + // + // + // return http.build(); + // } + // 밑에 개발 어느정도 마무리 되면 주석처리된 부분 주석 해제하고 적용할 예정 + // .requestMatchers("/", "/member/**", "/api/member/**", + // "/api/member-term-condition/**", // 허용되는 URL + // "/audio/**", "/project/**", "/languagecode/**", + // "/voice/**", "/style/**", "/vc/**", "/concat/**", + // "/v3/api-docs/**", "/swagger-ui/**", + // "/swagger-ui.html") // Swagger 관련 URL 허용 // SecurityFilterChain을 빈으로 등록 @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http - .cors(cors -> cors.configurationSource(corsConfigurationSource())) // 새로운 방식으로 CORS 설정 적용 + http.cors(cors -> cors.configurationSource(corsConfigurationSource())) // 새로운 방식으로 CORS 설정 적용 .csrf(csrf -> csrf.disable()) // CSRF 비활성화 - .authorizeHttpRequests(authorize -> authorize - .anyRequest() // 개발 단계로 모든 요청 열어둠 - .permitAll() // 위 URL들은 인증 없이 접근 가능 - ) - .formLogin(formLogin -> formLogin - .loginPage("/api/member/login") // 로그인 페이지 경로 설정 - .successHandler(successHandler) // 로그인 성공 시 처리되는 핸들러 설정 - .failureHandler(failureHandler) // 로그인 실패 시 로그인 페이지로 이동 - ) - .logout(logout -> logout - .logoutUrl("/api/member/logout") // 로그아웃 경로 설정 - .invalidateHttpSession(true) // 로그아웃 시 세션 무효화 - .logoutSuccessUrl("/") // 로그아웃 성공 시 이동할 페이지 - ); + .authorizeHttpRequests( + authorize -> + authorize + .anyRequest() // 개발 단계로 모든 요청 열어둠 + .permitAll() // 위 URL들은 인증 없이 접근 가능 + ) + .formLogin( + formLogin -> + formLogin + .loginPage("/api/member/login") // 로그인 페이지 경로 설정 + .successHandler(successHandler) // 로그인 성공 시 처리되는 핸들러 설정 + .failureHandler(failureHandler) // 로그인 실패 시 로그인 페이지로 이동 + ) + .logout( + logout -> + logout + .logoutUrl("/api/member/logout") // 로그아웃 경로 설정 + .invalidateHttpSession(true) // 로그아웃 시 세션 무효화 + .logoutSuccessUrl("/") // 로그아웃 성공 시 이동할 페이지 + ); return http.build(); } - // CorsConfigurationSource 빈 등록 @Bean public CorsConfigurationSource corsConfigurationSource() { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java index 6baf3073..d684ef47 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberController.java @@ -6,7 +6,6 @@ import com.oreo.finalproject_5re5_be.member.dto.request.MemberUpdateRequest; import com.oreo.finalproject_5re5_be.member.dto.response.MemberReadResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberRegisterResponse; -import com.oreo.finalproject_5re5_be.member.dto.response.MemberResponse; import com.oreo.finalproject_5re5_be.member.service.MemberServiceImpl; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -14,14 +13,12 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -41,14 +38,14 @@ public class MemberController { @Operation(summary = "회원가입 처리") @PostMapping("/register") - public ResponseEntity register(@Valid @RequestBody MemberRegisterRequest request) { + public ResponseEntity register( + @Valid @RequestBody MemberRegisterRequest request) { // 회원가입 처리 memberService.create(request); // 회원가입 완료 응답 생성 MemberRegisterResponse response = MemberRegisterResponse.of("회원가입이 완료되었습니다"); // 응답 반환 - return ResponseEntity.ok() - .body(response); + return ResponseEntity.ok().body(response); } @Operation(summary = "이메일 인증 번호 발송 처리") @@ -57,61 +54,71 @@ public ResponseEntity verifyEmail(@RequestBody String email) { // 인증번호 생성 및 유저에게 이메일 발송 String verificationCode = memberService.sendVerificationCode(email); // 인증번호 반환 - return ResponseEntity.ok() - .body(verificationCode); + return ResponseEntity.ok().body(verificationCode); } - @Operation(summary = "회원 단순 조회 처리") @GetMapping("/read/{memberSeq}") - public ResponseEntity read(@Parameter(description = "Member 시퀀스") @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("memberSeq") Long memberSeq) { + public ResponseEntity read( + @Parameter(description = "Member 시퀀스") + @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("memberSeq") + Long memberSeq) { // 회원 조회 MemberReadResponse response = memberService.read(memberSeq); // 응답 반환 - return ResponseEntity.ok() - .body(response); + return ResponseEntity.ok().body(response); } @Operation(summary = "회원 수정 처리") @PutMapping("/{memberSeq}") - public ResponseEntity update(@Parameter(description = "Member 시퀀스") @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("memberSeq") Long memberSeq, @Valid @RequestBody - MemberUpdateRequest request) { + public ResponseEntity update( + @Parameter(description = "Member 시퀀스") + @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("memberSeq") + Long memberSeq, + @Valid @RequestBody MemberUpdateRequest request) { // 수정 처리 memberService.update(memberSeq, request); // 응답 반환 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @Operation(summary = "회원 삭제 처리") @DeleteMapping("/{memberSeq}") - public ResponseEntity remove(@Parameter(description = "Member 시퀀스") @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("memberSeq") Long memberSeq, @Valid @RequestBody MemberRemoveRequest request) { + public ResponseEntity remove( + @Parameter(description = "Member 시퀀스") + @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("memberSeq") + Long memberSeq, + @Valid @RequestBody MemberRemoveRequest request) { // 삭제 처리 memberService.remove(memberSeq, request); // 응답 반환 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @Operation(summary = "비밀번호 변경 처리") @PutMapping("/change-password/{memberSeq}") - public ResponseEntity changePassword(@Parameter(description = "Member 시퀀스") @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("memberSeq") Long memberSeq, @Valid @RequestBody MemberChangePasswordRequest request) { + public ResponseEntity changePassword( + @Parameter(description = "Member 시퀀스") + @Min(value = 1L, message = "회원의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("memberSeq") + Long memberSeq, + @Valid @RequestBody MemberChangePasswordRequest request) { // 비밀번호 변경 처리 memberService.updatePassword(memberSeq, request); // 응답 반환 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - @Operation(summary = "회원 아이디 찾기 처리") @GetMapping("/find-id/{email}") - public ResponseEntity findId(@Parameter(description = "이메일") @PathVariable("email") String email) { + public ResponseEntity findId( + @Parameter(description = "이메일") @PathVariable("email") String email) { // 아이디 찾기 처리 String id = memberService.findId(email); // 응답 반환 - return ResponseEntity.ok() - .body(id); - + return ResponseEntity.ok().body(id); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java index 46a8aec1..1e5f26e6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermConditionController.java @@ -2,30 +2,18 @@ import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermConditionRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermConditionUpdateRequest; -import com.oreo.finalproject_5re5_be.member.dto.response.ErrorResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermConditionResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermConditionResponses; -import com.oreo.finalproject_5re5_be.member.exception.MemberInvalidTermConditionException; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermsConditionNotFoundException; import com.oreo.finalproject_5re5_be.member.service.MemberTermsConditionServiceImpl; -import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; import java.util.List; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; -import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -40,87 +28,82 @@ public class MemberTermConditionController { private final MemberTermsConditionServiceImpl memberTermConditionService; - -// @Operation(summary = "회원 약관 항목 등록 처리") -// @PostMapping("/register") - public ResponseEntity register(@Valid @RequestBody MemberTermConditionRequest request) { + // @Operation(summary = "회원 약관 항목 등록 처리") + // @PostMapping("/register") + public ResponseEntity register( + @Valid @RequestBody MemberTermConditionRequest request) { // 단건 등록 처리 MemberTermConditionResponse response = memberTermConditionService.create(request); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "회원 약관 항목 여러개 등록 처리") -// @PostMapping("/register-all") - public ResponseEntity register(@Valid @RequestBody List requests) { + // @Operation(summary = "회원 약관 항목 여러개 등록 처리") + // @PostMapping("/register-all") + public ResponseEntity register( + @Valid @RequestBody List requests) { // 여러건 등록 처리 MemberTermConditionResponses response = memberTermConditionService.create(requests); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "특정 회원 약관 항목 조회") -// @GetMapping("/{condCode}") - public ResponseEntity read(@PathVariable("condCode") String condCode) { + // @Operation(summary = "특정 회원 약관 항목 조회") + // @GetMapping("/{condCode}") + public ResponseEntity read( + @PathVariable("condCode") String condCode) { // 단건 조회 처리 MemberTermConditionResponse response = memberTermConditionService.read(condCode); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "모든 회원 약관 항목 조회") -// @GetMapping("/all") + // @Operation(summary = "모든 회원 약관 항목 조회") + // @GetMapping("/all") public ResponseEntity readAll() { // 모든 조회 처리 MemberTermConditionResponses response = memberTermConditionService.readAll(); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "사용 가능한 약관 항목 조회") -// @GetMapping("/available") + // @Operation(summary = "사용 가능한 약관 항목 조회") + // @GetMapping("/available") public ResponseEntity readAvailable() { // 사용 가능한 모든 조회 처리 MemberTermConditionResponses response = memberTermConditionService.readAvailable(); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "사용 불가능한 약관 항목 조회") -// @GetMapping("/not-available") + // @Operation(summary = "사용 불가능한 약관 항목 조회") + // @GetMapping("/not-available") public ResponseEntity readNotAvailable() { // 사용 불가능한 모든 조회 처리 MemberTermConditionResponses response = memberTermConditionService.readNotAvailable(); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "특정 약관 항목 수정") -// @PatchMapping("/{condCode}") - public ResponseEntity update(@PathVariable("condCode") String condCode, @RequestBody @Valid MemberTermConditionUpdateRequest request) { + // @Operation(summary = "특정 약관 항목 수정") + // @PatchMapping("/{condCode}") + public ResponseEntity update( + @PathVariable("condCode") String condCode, + @RequestBody @Valid MemberTermConditionUpdateRequest request) { // 수정 처리 memberTermConditionService.update(condCode, request); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } -// @Operation(summary = "특정 약관 항목 삭제") -// @DeleteMapping("/{condCode}") + // @Operation(summary = "특정 약관 항목 삭제") + // @DeleteMapping("/{condCode}") public ResponseEntity remove(@PathVariable("condCode") String condCode) { // 삭제 처리 memberTermConditionService.remove(condCode); // 응답 데이터 반환 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java index 0fd03d6b..7ce20c39 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/MemberTermsController.java @@ -2,38 +2,24 @@ import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberTermUpdateRequest; -import com.oreo.finalproject_5re5_be.member.dto.response.ErrorResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponses; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermsDetailResponse; -import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermInvalidException; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermsConditionNotFoundException; -import com.oreo.finalproject_5re5_be.member.exception.MemberTermsNotFoundException; import com.oreo.finalproject_5re5_be.member.service.MemberTermsServiceImpl; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.ConstraintViolationException; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; -import java.util.List; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindingResult; -import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @Slf4j @@ -46,85 +32,86 @@ public class MemberTermsController { private final MemberTermsServiceImpl memberTermsService; -// @Operation(summary = "회원 약관 등록 처리") -// @PostMapping("/register") - public ResponseEntity register(@Valid @RequestBody MemberTermRequest request) { + // @Operation(summary = "회원 약관 등록 처리") + // @PostMapping("/register") + public ResponseEntity register( + @Valid @RequestBody MemberTermRequest request) { // 회원 약관 등록 처리 MemberTermResponse response = memberTermsService.create(request); // 등록된 회원 약관 반환 - return ResponseEntity.status(HttpStatus.CREATED) - .body(response); + return ResponseEntity.status(HttpStatus.CREATED).body(response); } -// @Operation(summary = "등록된 모든 회원 약관 조회") -// @GetMapping("/all") + // @Operation(summary = "등록된 모든 회원 약관 조회") + // @GetMapping("/all") public ResponseEntity readAll() { // 모든 회원 약관에 대해 조회 MemberTermResponses memberTermResponses = memberTermsService.readAll(); // 조회된 회원 약관을 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(memberTermResponses); + return ResponseEntity.status(HttpStatus.OK).body(memberTermResponses); } -// @Operation(summary = "등록된 모든 회원 약관 중 사용 가능한 모든 약관 조회") -// @GetMapping("/available") + // @Operation(summary = "등록된 모든 회원 약관 중 사용 가능한 모든 약관 조회") + // @GetMapping("/available") public ResponseEntity readAvailable() { // 사용 가능한 약관에 대해 조회 MemberTermResponses memberTermResponses = memberTermsService.readAvailable(); // 조회된 약관 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(memberTermResponses); + return ResponseEntity.status(HttpStatus.OK).body(memberTermResponses); } -// @Operation(summary = "등록된 모든 회원 약관 중 사용 불가능한 모든 약관 조회") -// @GetMapping("/not-available") + // @Operation(summary = "등록된 모든 회원 약관 중 사용 불가능한 모든 약관 조회") + // @GetMapping("/not-available") public ResponseEntity readNotAvailable() { // 사용 불가능한 약관에 대해 조회 MemberTermResponses memberTermResponses = memberTermsService.readNotAvailable(); // 조회된 약관 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(memberTermResponses); + return ResponseEntity.status(HttpStatus.OK).body(memberTermResponses); } -// @Operation(summary = "등록된 모든 회원 약관 중 사용 불가능한 모든 약관 조회") -// @GetMapping("/latest-available") + // @Operation(summary = "등록된 모든 회원 약관 중 사용 불가능한 모든 약관 조회") + // @GetMapping("/latest-available") public ResponseEntity readLatestAvailable() { // 가장 최근에 사용 가능한 약관 조회 MemberTermResponse response = memberTermsService.readLatestAvailable(); // 조회된 약관 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } -// @Operation(summary = "등록된 회원 약관 수정 처리") -// @PutMapping("/{termSeq}") - public ResponseEntity update(@Parameter(description = "Member Term 시퀀스") @Min(value = 1L, message = "회원 약관의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("termSeq") Long termSeq, @Valid @RequestBody MemberTermUpdateRequest request) { + // @Operation(summary = "등록된 회원 약관 수정 처리") + // @PutMapping("/{termSeq}") + public ResponseEntity update( + @Parameter(description = "Member Term 시퀀스") + @Min(value = 1L, message = "회원 약관의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("termSeq") + Long termSeq, + @Valid @RequestBody MemberTermUpdateRequest request) { // 수정 처리 memberTermsService.update(termSeq, request); // 수정 성공시 응답 반환 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } -// @Operation(summary = "등록된 회원 약관 삭제 처리") -// @DeleteMapping("/{termSeq}") - public ResponseEntity remove(@Parameter(description = "Member Term 시퀀스") @Min(value = 1L, message = "회원 약관의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") @PathVariable("termSeq") Long seq) { + // @Operation(summary = "등록된 회원 약관 삭제 처리") + // @DeleteMapping("/{termSeq}") + public ResponseEntity remove( + @Parameter(description = "Member Term 시퀀스") + @Min(value = 1L, message = "회원 약관의 시퀀스가 잘못됐습니다. 자동증분으로 관리되기 때문에 1부터 시작해야합니다.") + @PathVariable("termSeq") + Long seq) { // 삭제 처리 memberTermsService.remove(seq); // 삭제 성공시 응답 반환 - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .build(); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @Operation(summary = "특정 회원 약관 코드로 조회 처리") @GetMapping("/{termCode}") - public ResponseEntity readByTermCode(@Parameter(description = "Member Term 코드") @PathVariable("termCode") String termCode) { + public ResponseEntity readByTermCode( + @Parameter(description = "Member Term 코드") @PathVariable("termCode") String termCode) { // 특정 회원 약관 코드로 조회 MemberTermsDetailResponse response = memberTermsService.readByTermCode(termCode); // 조회된 회원 약관 반환 - return ResponseEntity.status(HttpStatus.OK) - .body(response); + return ResponseEntity.status(HttpStatus.OK).body(response); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java index 06ee943c..1bd170dd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/TestController.java @@ -1,12 +1,9 @@ package com.oreo.finalproject_5re5_be.member.controller; - import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -/** - * 로그인, 로그아웃 테스트용 임시 컨트롤러입니다. 추후 삭제될 예정입니다. - */ +/** 로그인, 로그아웃 테스트용 임시 컨트롤러입니다. 추후 삭제될 예정입니다. */ @RestController public class TestController { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java index 225c8b36..02cd2527 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/controller/advice/MemberExceptionHandler.java @@ -16,12 +16,10 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; - @Slf4j @RestControllerAdvice(basePackages = "com.oreo.finalproject_5re5_be.member.controller") public class MemberExceptionHandler { - // 회원 파트에서 RuntimeException이 발생한 경우 @ExceptionHandler(RuntimeException.class) public ResponseEntity handleRuntimeException(RuntimeException e) { @@ -29,16 +27,13 @@ public ResponseEntity handleRuntimeException(RuntimeException log.error("MEMBER : [RuntimeException] ", e); // 응답 데이터 생성 - ErrorResponseDto response = ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), - e.getMessage()); + ErrorResponseDto response = + ErrorResponseDto.of(INTERNAL_SERVER_ERROR.getStatus(), e.getMessage()); // 응답 데이터 반환 - return ResponseEntity.status(response.getStatus()) - .body(response); - + return ResponseEntity.status(response.getStatus()).body(response); } - // 회원 파트에서 BusinessException이 발생한 경우 @ExceptionHandler(BusinessException.class) public ResponseEntity handleBusinessException(BusinessException e) { @@ -46,18 +41,16 @@ public ResponseEntity handleBusinessException(BusinessExceptio log.error("MEMBER : [BusinessException] ", e); // 응답 데이터 생성 - ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), - e.getMessage()); + ErrorResponseDto response = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); // 응답 데이터 반환 - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // 회원 파트에서 MethodArgumentNotValidException이 발생한 경우 - 데이터 유효성 검증 실패 @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + public ResponseEntity handleMethodArgumentNotValidException( + MethodArgumentNotValidException e) { // 로그로 어떤 예외 클래스가 발생했는지 표시 log.error("MEMBER : [MethodArgumentNotValidException] ", e); @@ -66,43 +59,48 @@ public ResponseEntity handleMethodArgumentNotValidException(Me BindingResult result = e.getBindingResult(); // 필드 에러 리스트 형태로 변환 - List fieldErrorList = result.getFieldErrors() - .stream() - .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) - .toList(); + List fieldErrorList = + result.getFieldErrors().stream() + .map(error -> FieldErrorDetail.of(error.getField(), error.getDefaultMessage())) + .toList(); // ErrorResponseDto 생성 - ErrorResponseDto response = ErrorResponseDto.of(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), - MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), - fieldErrorList); + ErrorResponseDto response = + ErrorResponseDto.of( + MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), + MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), + fieldErrorList); // 응답 데이터 반환 - return ResponseEntity.status(response.getStatus()) - .body(response); + return ResponseEntity.status(response.getStatus()).body(response); } - // 회원 파트에서 ConstraintViolationException 발생한 경우 - 데이터베이스 제약 조건 위반할 경우 발생(JPA/Hibernate) @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity handleConstraintViolationException(ConstraintViolationException e) { + public ResponseEntity handleConstraintViolationException( + ConstraintViolationException e) { // 로그로 어떤 예외 클래스가 발생했는지 표시 log.error("MEMBER : [ConstraintViolationException] ", e); // 각 violation에 접근하여 에러 내용 상세화한 Set 생성 Set> constraintViolationSet = e.getConstraintViolations(); - List violationList = constraintViolationSet.stream() - .map(violation -> FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .toList(); + List violationList = + constraintViolationSet.stream() + .map( + violation -> + FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .toList(); // ErrorResponseDto 생성 - ErrorResponseDto response = ErrorResponseDto.of(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), - MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), - violationList); - + ErrorResponseDto response = + ErrorResponseDto.of( + MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus(), + MEMBER_INVALID_INPUT_VALUE_ERROR.getMessage(), + violationList); // 응답 데이터 반환 - return ResponseEntity.status(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus()) - .body(response); + return ResponseEntity.status(MEMBER_INVALID_INPUT_VALUE_ERROR.getStatus()).body(response); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java index 5bd1cdba..1e59986e 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/CustomUserDetails.java @@ -16,7 +16,6 @@ public CustomUserDetails(Member member) { this.member = member; } - @Override public Collection getAuthorities() { return List.of(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java index 2f6428e2..44de4994 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberChangePasswordRequest.java @@ -1,9 +1,7 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -15,9 +13,9 @@ @NoArgsConstructor public class MemberChangePasswordRequest { - @NotBlank(message = "비밀번호를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Pattern(regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", message = "비밀번호는 8~29자의 특수문자를 포함해야하며, 동일 문자 4회 이상 연속 불가합니다.") // 비밀번호 패턴 검증 + @NotBlank(message = "비밀번호를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Pattern( + regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", + message = "비밀번호는 8~29자의 특수문자를 포함해야하며, 동일 문자 4회 이상 연속 불가합니다.") // 비밀번호 패턴 검증 private String password; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java index 2d103efc..4b68d233 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRegisterRequest.java @@ -1,5 +1,6 @@ package com.oreo.finalproject_5re5_be.member.dto.request; +import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsHistory; import com.oreo.finalproject_5re5_be.member.exception.MemberMandatoryTermNotAgreedException; @@ -17,7 +18,6 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; -import com.oreo.finalproject_5re5_be.member.entity.Member; @Getter @Setter @@ -25,36 +25,41 @@ @ToString public class MemberRegisterRequest { - @NotBlank(message = "아이디를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Pattern(regexp = "^[a-zA-Z0-9]{6,20}$", message = "아이디는 6~20자의 영문 및 숫자만 허용됩니다.") // 정규식으로 아이디 패턴 검증 + @NotBlank(message = "아이디를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Pattern( + regexp = "^[a-zA-Z0-9]{6,20}$", + message = "아이디는 6~20자의 영문 및 숫자만 허용됩니다.") // 정규식으로 아이디 패턴 검증 private String id; - @NotBlank(message = "이메일을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Email(message = "유효한 이메일 형식이 아닙니다.") // 이메일 형식 검증 + @NotBlank(message = "이메일을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Email(message = "유효한 이메일 형식이 아닙니다.") // 이메일 형식 검증 private String email; - @NotBlank(message = "비밀번호를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Pattern(regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", message = "비밀번호는 8~29자의 특수문자를 포함해야하며, 동일 문자 4회 이상 연속 불가합니다.") // 비밀번호 패턴 검증 + @NotBlank(message = "비밀번호를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Pattern( + regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", + message = "비밀번호는 8~29자의 특수문자를 포함해야하며, 동일 문자 4회 이상 연속 불가합니다.") // 비밀번호 패턴 검증 private String password; - @NotBlank(message = "이름을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Pattern(regexp = "^[a-zA-Z가-힣]{1,20}$", message = "이름은 특수문자, 숫자를 포함할 수 없습니다.") // 이름 패턴 검증 + @NotBlank(message = "이름을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Pattern(regexp = "^[a-zA-Z가-힣]{1,20}$", message = "이름은 특수문자, 숫자를 포함할 수 없습니다.") // 이름 패턴 검증 private String name; - @NotBlank(message = "주소를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @NotBlank(message = "주소를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 private String normAddr; private String locaAddr; private String detailAddr; private String passAddr; private String termCode; - @NotNull(message = "필수 동의 항목이 선택되지 않았습니다.") // 필수값 검증 + + @NotNull(message = "필수 동의 항목이 선택되지 않았습니다.") // 필수값 검증 private Character chkValid; private LocalDateTime userRegDate; - @NotEmpty(message = "필수 약관 동의 항목이 비어 있습니다.") // 약관 요청 리스트가 비어 있으면 오류 - private List<@Valid MemberTermCheckOrNotRequest> memberTermCheckOrNotRequests; // 리스트의 각 항목에 대해 검증 + @NotEmpty(message = "필수 약관 동의 항목이 비어 있습니다.") // 약관 요청 리스트가 비어 있으면 오류 + private List<@Valid MemberTermCheckOrNotRequest> memberTermCheckOrNotRequests; // 리스트의 각 항목에 대해 검증 // Member 엔티티로 변환 public Member createMemberEntity() { @@ -109,7 +114,6 @@ public MemberTermsHistory createMemberTermsHistoryEntity(Member member, MemberTe LocalDateTime now = LocalDateTime.now(); LocalDateTime end = LocalDateTime.MAX; - // DATETIME 형식으로 변환하기 위한 포맷터 생성 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @@ -125,4 +129,4 @@ public MemberTermsHistory createMemberTermsHistoryEntity(Member member, MemberTe memberTermsHistory.setMember(member); return memberTermsHistory; } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java index 15ba0aa3..c7ddfed0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberRemoveRequest.java @@ -15,5 +15,4 @@ public class MemberRemoveRequest { private String code; private String detailCont; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java index 8b326c50..ff288cc3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.request; -import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -19,7 +18,6 @@ @EqualsAndHashCode // 목킹 테스트를 위해 추가 public class MemberTermConditionRequest { - @NotBlank(message = "약관 코드를 입력해주세요.") @Pattern(regexp = "^[a-zA-Z0-9]{1,20}$", message = "약관 코드는 1~20자의 영문 및 숫자만 허용됩니다.") private String condCode; @@ -35,8 +33,7 @@ public class MemberTermConditionRequest { @NotNull(message = "사용여부 항목의 내용을 입력해주세요.") private Character chkUse; - @NotNull - private Integer ord; + @NotNull private Integer ord; private String law1; private String law2; @@ -60,5 +57,4 @@ public MemberTermsCondition createMemberTermsConditionEntity() { .law3(law3) .build(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java index eebdbed9..e3f65d67 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermConditionUpdateRequest.java @@ -1,11 +1,7 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - -import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -23,7 +19,6 @@ public class MemberTermConditionUpdateRequest { @NotBlank(message = "약관 긴 내용을 입력해주세요.") private String longCont; - @NotNull(message = "약관 사용 여부를 입력해주세요.") private Character chkUse; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java index 1a9fb642..123395fd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -22,7 +21,10 @@ public class MemberTermRequest { @NotEmpty(message = "회원 약관 조건 코드는 비어 있을 수 없습니다.") @Size(min = 5, max = 5, message = "회원 약관 항목 코드는 5개여야 합니다.") - private List<@Pattern(regexp = "TERMS[0-9]{3}", message = "코드 형식은 'TERMS'로 시작하고 세 자리 숫자여야 합니다.") String> memberTermConditionCodes; + private List< + @Pattern(regexp = "TERMS[0-9]{3}", message = "코드 형식은 'TERMS'로 시작하고 세 자리 숫자여야 합니다.") + String> + memberTermConditionCodes; @NotEmpty(message = "필수 여부는 비어 있을 수 없습니다.") private List memberTermConditionMandatoryOrNot; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java index c38cff6d..140d3f82 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberTermUpdateRequest.java @@ -1,11 +1,7 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - -import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; import java.util.List; import lombok.Builder; import lombok.EqualsAndHashCode; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java index ea78cfc1..9c52a11b 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/request/MemberUpdateRequest.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.request; - import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; @@ -17,24 +16,26 @@ @EqualsAndHashCode public class MemberUpdateRequest { - @NotBlank(message = "아이디를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Pattern(regexp = "^[a-zA-Z0-9]{6,20}$", message = "아이디는 6~20자의 영문 및 숫자만 허용됩니다.") // 정규식으로 아이디 패턴 검증 + @NotBlank(message = "아이디를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Pattern( + regexp = "^[a-zA-Z0-9]{6,20}$", + message = "아이디는 6~20자의 영문 및 숫자만 허용됩니다.") // 정규식으로 아이디 패턴 검증 private String id; - @NotBlank(message = "이메일을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Email(message = "유효한 이메일 형식이 아닙니다.") // 이메일 형식 검증 + @NotBlank(message = "이메일을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Email(message = "유효한 이메일 형식이 아닙니다.") // 이메일 형식 검증 private String email; - @NotBlank(message = "비밀번호를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Pattern(regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", message = "비밀번호는 8~20자의 특수문자를 포함해야하며, 동일 문자 4회 이상 연속 불가합니다.") // 비밀번호 패턴 검증 + @NotBlank(message = "비밀번호를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Pattern( + regexp = "^(?!.*(.)\\1{3})(?=.*[!@#$%^&*()_+=-])[A-Za-z\\d!@#$%^&*()_+=-]{8,20}$", + message = "비밀번호는 8~20자의 특수문자를 포함해야하며, 동일 문자 4회 이상 연속 불가합니다.") // 비밀번호 패턴 검증 private String password; - @NotBlank(message = "이름을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 - @Pattern(regexp = "^[a-zA-Z가-힣]{1,20}$", message = "이름은 특수문자, 숫자를 포함할 수 없습니다.") // 이름 패턴 검증 + @NotBlank(message = "이름을 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @Pattern(regexp = "^[a-zA-Z가-힣]{1,20}$", message = "이름은 특수문자, 숫자를 포함할 수 없습니다.") // 이름 패턴 검증 private String name; - @NotBlank(message = "주소를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 + @NotBlank(message = "주소를 입력해주세요.") // 필수값, 빈 값은 허용하지 않음 private String normAddr; - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java index ea9c9ae9..c9d0c546 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/ErrorResponse.java @@ -14,5 +14,4 @@ public ErrorResponse(String message) { public static ErrorResponse of(String message) { return new ErrorResponse(message); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java index 9e19dd4d..2cfcb127 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberReadResponse.java @@ -4,7 +4,6 @@ import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.Setter; import lombok.ToString; @Getter @@ -21,11 +20,11 @@ public class MemberReadResponse { public static MemberReadResponse of(Member member) { return MemberReadResponse.builder() - .id(member.getId()) - .email(member.getEmail()) - .name(member.getName()) - .normAddr(member.getNormAddr()) - .detailAddr(member.getDetailAddr()) - .build(); + .id(member.getId()) + .email(member.getEmail()) + .name(member.getName()) + .normAddr(member.getNormAddr()) + .detailAddr(member.getDetailAddr()) + .build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java index 7e91412f..871dae49 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberRegisterResponse.java @@ -15,8 +15,6 @@ public class MemberRegisterResponse { // 정적 팩토리 메서드 public static MemberRegisterResponse of(String content) { - return MemberRegisterResponse.builder() - .content(content) - .build(); + return MemberRegisterResponse.builder().content(content).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java index 8428aea7..2fead2e8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberResponse.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.response; - import lombok.Builder; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java index 98e5c34e..9a2f70fe 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponse.java @@ -1,14 +1,11 @@ package com.oreo.finalproject_5re5_be.member.dto.response; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Pattern; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import lombok.ToString; @Getter @@ -40,14 +37,14 @@ public MemberTermConditionResponse(MemberTermsCondition memberTermsCondition) { public static MemberTermConditionResponse of(MemberTermsCondition memberTermsCondition) { return MemberTermConditionResponse.builder() - .condCode(memberTermsCondition.getCondCode()) - .shortCont(memberTermsCondition.getShortCont()) - .longCont(memberTermsCondition.getLongCont()) - .chkUse(memberTermsCondition.getChkUse()) - .ord(memberTermsCondition.getOrd()) - .law1(memberTermsCondition.getLaw1()) - .law2(memberTermsCondition.getLaw2()) - .law3(memberTermsCondition.getLaw3()) - .build(); + .condCode(memberTermsCondition.getCondCode()) + .shortCont(memberTermsCondition.getShortCont()) + .longCont(memberTermsCondition.getLongCont()) + .chkUse(memberTermsCondition.getChkUse()) + .ord(memberTermsCondition.getOrd()) + .law1(memberTermsCondition.getLaw1()) + .law2(memberTermsCondition.getLaw2()) + .law3(memberTermsCondition.getLaw3()) + .build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java index e49dc465..408bbbac 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermConditionResponses.java @@ -14,8 +14,8 @@ public class MemberTermConditionResponses { List memberTermConditionResponses; - public MemberTermConditionResponses(List memberTermConditionResponses) { + public MemberTermConditionResponses( + List memberTermConditionResponses) { this.memberTermConditionResponses = memberTermConditionResponses; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java index 9d81c4d2..1c609211 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponse.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.dto.response; - import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import java.time.LocalDateTime; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java index 06fd73db..5edc7f8c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermResponses.java @@ -17,5 +17,4 @@ public class MemberTermResponses { public MemberTermResponses(List memberTermResponses) { this.memberTermResponses = memberTermResponses; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java index 20706cb8..b96a36c8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/dto/response/MemberTermsDetailResponse.java @@ -1,7 +1,6 @@ package com.oreo.finalproject_5re5_be.member.dto.response; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; -import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; @@ -28,17 +27,19 @@ public class MemberTermsDetailResponse { private Character chkUse; private MemberTermConditionResponses memberTermConditionResponses; - public static MemberTermsDetailResponse of(MemberTerms terms, List memberTermConditionResponseList) { + public static MemberTermsDetailResponse of( + MemberTerms terms, List memberTermConditionResponseList) { return MemberTermsDetailResponse.builder() - .termCode(terms.getTermCode()) - .termName(terms.getName()) - .chkTerm1(terms.getChkTerm1()) - .chkTerm2(terms.getChkTerm2()) - .chkTerm3(terms.getChkTerm3()) - .chkTerm4(terms.getChkTerm4()) - .chkTerm5(terms.getChkTerm5()) - .chkUse(terms.getChkUse()) - .memberTermConditionResponses(new MemberTermConditionResponses(memberTermConditionResponseList)) - .build(); + .termCode(terms.getTermCode()) + .termName(terms.getName()) + .chkTerm1(terms.getChkTerm1()) + .chkTerm2(terms.getChkTerm2()) + .chkTerm3(terms.getChkTerm3()) + .chkTerm4(terms.getChkTerm4()) + .chkTerm5(terms.getChkTerm5()) + .chkUse(terms.getChkUse()) + .memberTermConditionResponses( + new MemberTermConditionResponses(memberTermConditionResponseList)) + .build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java index dba2c337..b81401de 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/Member.java @@ -19,7 +19,8 @@ @Entity @Table(name = "member") -@Getter @Setter +@Getter +@Setter @ToString @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -30,32 +31,43 @@ public class Member extends BaseEntity { @Column(name = "member_seq") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long seq; + @Column(name = "id", nullable = false) private String id; + @Column(name = "email", nullable = false) private String email; + @Column(name = "pwd", nullable = false) private String password; + @Column(name = "birth_date") private String birthDate; + @Column(name = "name", nullable = false) private String name; + @Column(name = "phon") private String phon; + @Column(name = "member_reg_date") private LocalDateTime memberRegDate; + @Column(name = "chk_valid", nullable = false) private Character chkValid; + @Column(name = "norm_addr") private String normAddr; + @Column(name = "pass_addr") private String passAddr; + @Column(name = "loca_addr") private String locaAddr; + @Column(name = "detail_addr") private String detailAddr; - public void update(MemberUpdateRequest request) { this.id = request.getId(); this.email = request.getEmail(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java index f89f1e17..b778a65d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberCategory.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -14,7 +13,8 @@ @Entity @Table(name = "member_category") -@Getter @Setter +@Getter +@Setter @ToString public class MemberCategory extends BaseEntity { @@ -22,8 +22,10 @@ public class MemberCategory extends BaseEntity { @Column(name = "cate_code") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long cateCode; + @Column(name = "name") private String name; + @Column(name = "comt") private String comt; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java index fd259617..ce8c465d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberChangeHistory.java @@ -18,10 +18,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_change_history") -@Getter @Setter +@Getter +@Setter @Builder @NoArgsConstructor @AllArgsConstructor @@ -42,10 +42,13 @@ public class MemberChangeHistory extends BaseEntity { @Column(name = "bef_val", nullable = false) private String befVal; + @Column(name = "aft_val", nullable = false) private String aftVal; + @Column(name = "appl_date", nullable = false) private String applDate; + @Column(name = "end_date", nullable = false) private String endDate; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java index 1912e9f0..30581ed6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberConnectionHistory.java @@ -15,10 +15,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_connection_history") -@Getter @Setter +@Getter +@Setter @ToString public class MemberConnectionHistory extends BaseEntity { @@ -33,5 +33,4 @@ public class MemberConnectionHistory extends BaseEntity { @Column(name = "conn_date", nullable = false) private LocalDateTime connDate; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java index a961a7c1..0db8882f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberDelete.java @@ -19,10 +19,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_delete") -@Getter @Setter +@Getter +@Setter @ToString @EqualsAndHashCode(callSuper = false) public class MemberDelete extends BaseEntity { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java index ffc3b7c3..02d17d35 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRoles.java @@ -16,10 +16,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_roles") -@Getter @Setter +@Getter +@Setter @ToString public class MemberRoles extends BaseEntity { @@ -34,13 +34,16 @@ public class MemberRoles extends BaseEntity { @Column(name = "name", nullable = false) private String name; + @Column(name = "detail_cont", nullable = false) private String detailCont; + @Column(name = "appl_reas", nullable = false) private String applReas; + @Column(name = "chk_use", nullable = false) private Character chkUse; + @Column(name = "appl_date", nullable = false) private LocalDateTime poliCodeRegDate; - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java index 34153cfa..962f2318 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberRolesCategory.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -14,7 +13,8 @@ @Entity @Table(name = "member_roles_category") -@Getter @Setter +@Getter +@Setter @ToString public class MemberRolesCategory extends BaseEntity { @@ -25,6 +25,7 @@ public class MemberRolesCategory extends BaseEntity { @Column(name = "name", nullable = false) private String name; + @Column(name = "comt") private String comt; } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java index eed2e037..d278154d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberState.java @@ -20,7 +20,8 @@ @Entity @Table(name = "member_state") -@Getter @Setter +@Getter +@Setter @ToString @EqualsAndHashCode(callSuper = false) public class MemberState extends BaseEntity { @@ -40,6 +41,7 @@ public class MemberState extends BaseEntity { @Column(name = "appl_date", nullable = false) private String applDate; + @Column(name = "end_date", nullable = false) private String endDate; @@ -63,8 +65,6 @@ public static MemberState of(Member member, Code code) { memberState.setApplDate(formattedDateTime); memberState.setEndDate(formattedEnd); - return memberState; - } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java index cd58ef79..889fd3a9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTerms.java @@ -10,9 +10,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; import jakarta.persistence.Table; -import jakarta.validation.constraints.Pattern; import java.time.LocalDateTime; import java.util.List; import lombok.AllArgsConstructor; @@ -23,16 +21,16 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_terms") -@Getter @Setter +@Getter +@Setter @Builder @AllArgsConstructor @NoArgsConstructor @ToString @EqualsAndHashCode(callSuper = false) -public class MemberTerms extends BaseEntity{ +public class MemberTerms extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -57,8 +55,8 @@ public class MemberTerms extends BaseEntity{ @Column(name = "chk_term_5") private Character chkTerm5; -// @Column(name = "term_end_date") -// private LocalDateTime termEndDate; + // @Column(name = "term_end_date") + // private LocalDateTime termEndDate; @Column(name = "term_reg_date", nullable = false) private LocalDateTime termRegDate; @@ -96,7 +94,8 @@ public void update(MemberTermUpdateRequest request) { this.setChkUse(chk); // 약관 필수 여부 변경 - List memberTermConditionMandatoryOrNot = request.getMemberTermConditionMandatoryOrNot(); + List memberTermConditionMandatoryOrNot = + request.getMemberTermConditionMandatoryOrNot(); this.setChkTerm1(memberTermConditionMandatoryOrNot.get(0)); this.setChkTerm2(memberTermConditionMandatoryOrNot.get(1)); this.setChkTerm3(memberTermConditionMandatoryOrNot.get(2)); @@ -108,5 +107,4 @@ public void update(MemberTermUpdateRequest request) { this.setTermRegDate(now); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java index 46c0805a..9e15dfca 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsCondition.java @@ -18,17 +18,16 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_terms_condition") -@Getter @Setter +@Getter +@Setter @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder @ToString @EqualsAndHashCode(callSuper = false) -public class MemberTermsCondition extends BaseEntity { - +public class MemberTermsCondition extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -80,7 +79,6 @@ public class MemberTermsCondition extends BaseEntity { @Column(name = "short_cont", nullable = false, length = 255) private String shortCont; - public void update(MemberTermConditionUpdateRequest updateRequest) { this.shortCont = updateRequest.getShortCont(); this.longCont = updateRequest.getLongCont(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java index 1a88b466..ec6f91bb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/entity/MemberTermsHistory.java @@ -1,7 +1,6 @@ package com.oreo.finalproject_5re5_be.member.entity; import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; -import com.oreo.finalproject_5re5_be.member.exception.MemberWrongCountTermCondition; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -11,7 +10,6 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; -import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -20,10 +18,10 @@ import lombok.Setter; import lombok.ToString; - @Entity @Table(name = "member_terms_history") -@Getter @Setter +@Getter +@Setter @ToString @NoArgsConstructor @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -39,23 +37,28 @@ public class MemberTermsHistory extends BaseEntity { @JoinColumn(name = "member_seq") private Member member; - @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "terms_seq") private MemberTerms terms; @Column(name = "hist_reg_date", nullable = false) private String histRegDate; + @Column(name = "hist_end_date", nullable = false) private String histEndDate; + @Column(name = "chk_term_1", nullable = false) private Character chkTerm1; // 'Y' or 'N' + @Column(name = "chk_term_2", nullable = false) private Character chkTerm2; + @Column(name = "chk_term_3", nullable = false) private Character chkTerm3; + @Column(name = "chk_term_4", nullable = false) private Character chkTerm4; + @Column(name = "chk_term_5", nullable = false) private Character chkTerm5; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java index baac35a3..dd172ab1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/DeletedMemberException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // 삭제 회원에 대한 요청이 들어왔을 때 발생하는 예외 public class DeletedMemberException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java index 7cb6a909..9aea3687 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedEmailException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // 중복된 이메일 등록시 발생하는 예외 public class MemberDuplicatedEmailException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java index 1852d3d0..62deb593 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberDuplicatedIdException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // 중복된 아이디 등록시 발생하는 예외 public class MemberDuplicatedIdException extends BusinessException { @@ -15,5 +14,4 @@ public MemberDuplicatedIdException() { public MemberDuplicatedIdException(String message) { super(message, MEMBER_DUPLICATED_ID_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java index d6ee111c..54d4613c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberInvalidTermConditionException.java @@ -13,5 +13,4 @@ public MemberInvalidTermConditionException() { public MemberInvalidTermConditionException(String message) { super(message, MEMBER_INVALID_TERM_CONDITION_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java index fddeae9d..01e564a9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberMandatoryTermNotAgreedException.java @@ -14,5 +14,4 @@ public MemberMandatoryTermNotAgreedException() { public MemberMandatoryTermNotAgreedException(String message) { super(message, MEMBER_MANDATORY_TERM_NOT_AGREED_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java index f5acfef5..8f7ac1d4 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundEmailException.java @@ -3,7 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // 존재하지 않는 이메일일 때 사용하는 예외 public class MemberNotFoundEmailException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java index 8e76d7bf..d9a67699 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberNotFoundException.java @@ -14,5 +14,4 @@ public MemberNotFoundException() { public MemberNotFoundException(String message) { super(message, MEMBER_NOT_FOUND_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java index add0a8cc..90589f0a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermInvalidException.java @@ -4,7 +4,6 @@ import com.oreo.finalproject_5re5_be.global.exception.BusinessException; - // 관리자가 회원 약관 등록시 잘못된 값이 입력되었을 때 발생하는 예외 public class MemberTermInvalidException extends BusinessException { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java index 4936d4bf..5292a781 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberTermsNotFoundException.java @@ -3,8 +3,6 @@ import static com.oreo.finalproject_5re5_be.global.exception.ErrorCode.*; import com.oreo.finalproject_5re5_be.global.exception.BusinessException; -import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; - // 회원 약관 정보를 찾지 못했을 때 발생하는 예외 public class MemberTermsNotFoundException extends BusinessException { @@ -16,5 +14,4 @@ public MemberTermsNotFoundException() { public MemberTermsNotFoundException(String message) { super(message, MEMBER_TERM_NOT_FOUND_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java index cfea77a3..f525cb32 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/MemberWrongCountTermCondition.java @@ -13,5 +13,4 @@ public MemberWrongCountTermCondition() { public MemberWrongCountTermCondition(String message) { super(message, MEMBER_WRONG_COUNT_TERM_CONDITION_ERROR); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java index c6519a3c..5cb31a91 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/exception/RetryFailedException.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.member.exception; -import com.oreo.finalproject_5re5_be.global.exception.BusinessException; import com.oreo.finalproject_5re5_be.global.exception.ErrorCode; // 재시도 복구에 실패했을 경우 발생하는 예외 @@ -13,4 +12,4 @@ public RetryFailedException() { public RetryFailedException(String message) { super(message); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java index 3a25345a..cd82746a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberCategoryRepository.java @@ -1,13 +1,10 @@ package com.oreo.finalproject_5re5_be.member.repository; import com.oreo.finalproject_5re5_be.member.entity.MemberCategory; -import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; -import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; public interface MemberCategoryRepository extends JpaRepository { public MemberCategory findByCateCode(Long cateCode); + public MemberCategory findByName(String name); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java index 38061dbf..1154c6d7 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberChangeHistoryRepository.java @@ -1,8 +1,8 @@ package com.oreo.finalproject_5re5_be.member.repository; import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; -import java.util.Optional; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -11,16 +11,17 @@ public interface MemberChangeHistoryRepository extends JpaRepository findLatestHistoryByIdAndCode( + @Param("memberSeq") Long memberSeq, @Param("code") String memberFiledCode); - @Query( "SELECT m FROM MemberChangeHistory m " + - "WHERE m.chngFieldCode.code = :code " + - "AND m.member.seq = :memberSeq " + - "AND m.chngHistSeq = (SELECT MAX(subM.chngHistSeq) " + - " FROM MemberChangeHistory subM " + - " WHERE subM.chngFieldCode.code = :code " + - " AND subM.member.seq = :memberSeq)") - public Optional findLatestHistoryByIdAndCode( @Param("memberSeq") Long memberSeq, @Param("code") String memberFiledCode); - @Query( "DELETE FROM MemberChangeHistory mch " + - "WHERE mch.member.seq = :memberSeq") + @Query("DELETE FROM MemberChangeHistory mch " + "WHERE mch.member.seq = :memberSeq") List findMemberChangeHistoriesByMemberSeq(Long memberSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java index 50d23692..ff10873a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberConnectionHistoryRepository.java @@ -5,10 +5,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -public interface MemberConnectionHistoryRepository extends JpaRepository { +public interface MemberConnectionHistoryRepository + extends JpaRepository { - - @Query( "DELETE FROM MemberConnectionHistory mch " + - "WHERE mch.member.seq = :memberSeq") + @Query("DELETE FROM MemberConnectionHistory mch " + "WHERE mch.member.seq = :memberSeq") List findMemberConnectionHistoriesByMemberSeq(Long memberSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java index eb773449..de35f2b9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberDeleteRepository.java @@ -3,6 +3,4 @@ import com.oreo.finalproject_5re5_be.member.entity.MemberDelete; import org.springframework.data.jpa.repository.JpaRepository; -public interface MemberDeleteRepository extends JpaRepository { - -} +public interface MemberDeleteRepository extends JpaRepository {} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java index 5e8b787d..311ec771 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberRepository.java @@ -7,25 +7,30 @@ public interface MemberRepository extends JpaRepository { - @Query( "SELECT m " + - "FROM Member m " + - "WHERE m.seq = :memberSeq " ) + @Query("SELECT m " + "FROM Member m " + "WHERE m.seq = :memberSeq ") public Member findBySeq(Long memberSeq); + public Member findByEmail(String email); + public Member findById(String id); + public boolean existsByEmail(String email); - public boolean existsById(String id); - @Query( "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + - "FROM Member m " + - "WHERE m.seq <> :memberSeq " + - "AND m.id = :id" ) - public boolean existsByIdNotContainingMemberSeq(@Param("memberSeq") Long memberSeq, @Param("id") String id); - @Query( "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + - "FROM Member m " + - "WHERE m.seq <> :memberSeq " + - "AND m.email = :email" ) - public boolean existsByEmailNotContainingMemberSeq(@Param("memberSeq")Long memberSeq, @Param("email") String email); + public boolean existsById(String id); + @Query( + "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + + "FROM Member m " + + "WHERE m.seq <> :memberSeq " + + "AND m.id = :id") + public boolean existsByIdNotContainingMemberSeq( + @Param("memberSeq") Long memberSeq, @Param("id") String id); + @Query( + "SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END " + + "FROM Member m " + + "WHERE m.seq <> :memberSeq " + + "AND m.email = :email") + public boolean existsByEmailNotContainingMemberSeq( + @Param("memberSeq") Long memberSeq, @Param("email") String email); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java index 0787b16f..0ea1cc0f 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberStateRepository.java @@ -9,17 +9,20 @@ public interface MemberStateRepository extends JpaRepository public List findAllByMemberSeq(Long seq); - @Query(value = " SELECT ms " + - " FROM MemberState ms " + - " WHERE ms.member.seq = :seq " + - " AND ms.code.code = :state ") + @Query( + value = + " SELECT ms " + + " FROM MemberState ms " + + " WHERE ms.member.seq = :seq " + + " AND ms.code.code = :state ") public List findByMemberSeq(Long seq, String state); - @Query( "SELECT ms " + - "FROM MemberState ms " + - "WHERE ms.member.seq = :memberSeq " + - "AND ms.stateSeq = (SELECT MAX(subMS.stateSeq) " + - " FROM MemberState subMS " + - " WHERE subMS.member.seq = :memberSeq)") + @Query( + "SELECT ms " + + "FROM MemberState ms " + + "WHERE ms.member.seq = :memberSeq " + + "AND ms.stateSeq = (SELECT MAX(subMS.stateSeq) " + + " FROM MemberState subMS " + + " WHERE subMS.member.seq = :memberSeq)") public MemberState findLatestHistoryByMemberSeq(Long memberSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java index 2b18950c..1aa74f12 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermConditionRepository.java @@ -4,22 +4,22 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; public interface MemberTermConditionRepository extends JpaRepository { MemberTermsCondition findMemberTermsConditionByCondCode(String condCode); - @Query( "SELECT mtc " + - "FROM MemberTermsCondition mtc " + - "WHERE mtc.chkUse = 'Y' " + - "ORDER BY mtc.ord") + @Query( + "SELECT mtc " + + "FROM MemberTermsCondition mtc " + + "WHERE mtc.chkUse = 'Y' " + + "ORDER BY mtc.ord") List findAvailableMemberTermsConditions(); - @Query( "SELECT mtc " + - "FROM MemberTermsCondition mtc " + - "WHERE mtc.chkUse = 'N' " + - "ORDER BY mtc.ord") + @Query( + "SELECT mtc " + + "FROM MemberTermsCondition mtc " + + "WHERE mtc.chkUse = 'N' " + + "ORDER BY mtc.ord") List findNotAvailableMemberTermsConditions(); - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java index 41fe6f58..524d3d38 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsHistoryRepository.java @@ -6,5 +6,4 @@ public interface MemberTermsHistoryRepository extends JpaRepository { public List findByMemberSeq(Long seq); - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java index 53a22125..f54564f3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/repository/MemberTermsRepository.java @@ -8,32 +8,32 @@ public interface MemberTermsRepository extends JpaRepository { // 사용 가능한 가장 최근 약관 조회 - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.chkUse = 'Y' " + - "AND mt.termRegDate = (SELECT MAX(mt.termRegDate) " - + "FROM MemberTerms mt " - + "WHERE mt.chkUse = 'Y')") + @Query( + "SELECT mt " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'Y' " + + "AND mt.termRegDate = (SELECT MAX(mt.termRegDate) " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'Y')") MemberTerms findTopByChkUseOrderByTermRegDateDesc(); - - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.termCode = :termCode") + @Query("SELECT mt " + "FROM MemberTerms mt " + "WHERE mt.termCode = :termCode") MemberTerms findMemberTermsByTermCode(String termCode); // 사용 가능한 약관 모두 조회 - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.chkUse = 'Y' " + - "ORDER BY mt.termRegDate DESC") + @Query( + "SELECT mt " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'Y' " + + "ORDER BY mt.termRegDate DESC") List findAvailableMemberTerms(); // 사용 불가능한 약관 모두 조회 - @Query( "SELECT mt " + - "FROM MemberTerms mt " + - "WHERE mt.chkUse = 'N' " + - "ORDER BY mt.termRegDate DESC") + @Query( + "SELECT mt " + + "FROM MemberTerms mt " + + "WHERE mt.chkUse = 'N' " + + "ORDER BY mt.termRegDate DESC") List findNotAvailableMemberTerms(); // 약관 이름으로 조회 @@ -41,6 +41,4 @@ public interface MemberTermsRepository extends JpaRepository // 약관 시퀀스로 조회 MemberTerms findMemberTermsByTermsSeq(Long termsSeq); - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java index 7accda1f..b2c41253 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberServiceImpl.java @@ -1,12 +1,14 @@ package com.oreo.finalproject_5re5_be.member.service; +import com.oreo.finalproject_5re5_be.code.entity.Code; +import com.oreo.finalproject_5re5_be.code.exeption.CodeNotFoundException; +import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.member.dto.request.MemberChangePasswordRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRegisterRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberRemoveRequest; import com.oreo.finalproject_5re5_be.member.dto.request.MemberUpdateRequest; import com.oreo.finalproject_5re5_be.member.dto.response.MemberReadResponse; -import com.oreo.finalproject_5re5_be.code.entity.Code; import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberChangeHistory; import com.oreo.finalproject_5re5_be.member.entity.MemberConnectionHistory; @@ -14,7 +16,6 @@ import com.oreo.finalproject_5re5_be.member.entity.MemberState; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsHistory; -import com.oreo.finalproject_5re5_be.code.exeption.CodeNotFoundException; import com.oreo.finalproject_5re5_be.member.exception.DeletedMemberException; import com.oreo.finalproject_5re5_be.member.exception.HumanMemberException; import com.oreo.finalproject_5re5_be.member.exception.MemberDuplicatedEmailException; @@ -26,7 +27,6 @@ import com.oreo.finalproject_5re5_be.member.exception.MemberWrongCountTermCondition; import com.oreo.finalproject_5re5_be.member.exception.RestrictedMemberException; import com.oreo.finalproject_5re5_be.member.exception.RetryFailedException; -import com.oreo.finalproject_5re5_be.code.repository.CodeRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberChangeHistoryRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberConnectionHistoryRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberDeleteRepository; @@ -93,11 +93,17 @@ public class MemberServiceImpl implements UserDetailsService { private final MemberChangeHistoryRepository memberChangeHistoryRepository; private final MemberDeleteRepository memberDeleteRepository; - - public MemberServiceImpl(MemberConnectionHistoryRepository memberConnectionHistoryRepository, MemberRepository memberRepository, MemberStateRepository memberStateRepository, - MemberTermsHistoryRepository memberTermsHistoryRepository, MemberTermsRepository memberTermsRepository, PasswordEncoder passwordEncoder, - JavaMailSender mailSender, CodeRepository codeRepository, - MemberDeleteRepository memberDeleteRepository, MemberChangeHistoryRepository memberChangeHistoryRepository) { + public MemberServiceImpl( + MemberConnectionHistoryRepository memberConnectionHistoryRepository, + MemberRepository memberRepository, + MemberStateRepository memberStateRepository, + MemberTermsHistoryRepository memberTermsHistoryRepository, + MemberTermsRepository memberTermsRepository, + PasswordEncoder passwordEncoder, + JavaMailSender mailSender, + CodeRepository codeRepository, + MemberDeleteRepository memberDeleteRepository, + MemberChangeHistoryRepository memberChangeHistoryRepository) { this.memberConnectionHistoryRepository = memberConnectionHistoryRepository; this.memberRepository = memberRepository; this.memberStateRepository = memberStateRepository; @@ -122,7 +128,10 @@ public Member create(MemberRegisterRequest request) { // 회원 약관 유효성 확인 request.checkValidTerms(); request.checkValidTermsCount(); - } catch (MemberDuplicatedEmailException | MemberDuplicatedIdException | MemberMandatoryTermNotAgreedException | MemberWrongCountTermCondition e) { + } catch (MemberDuplicatedEmailException + | MemberDuplicatedIdException + | MemberMandatoryTermNotAgreedException + | MemberWrongCountTermCondition e) { // 회원가입 처리가 불가능할 경우 컨트롤러에 비즈니스 예외 전달 throw e; } @@ -136,8 +145,7 @@ public Member create(MemberRegisterRequest request) { @Retryable( value = {RuntimeException.class}, maxAttempts = MAX_RETRY, - backoff = @Backoff(delay = RETRY_DELAY) - ) + backoff = @Backoff(delay = RETRY_DELAY)) public Member retryableCreateMember(MemberRegisterRequest request) { // 비밀번호 암호화 encodePassword(request); @@ -164,7 +172,6 @@ private void checkDuplicatedEmail(String email) { if (foundMember != null) { throw new MemberDuplicatedEmailException(); } - } // 중복된 아이디 확인 @@ -203,10 +210,12 @@ private MemberTermsHistory saveMemberTermsHistory(MemberRegisterRequest request, } // 입력 데이터로부터 회원 약관 이력 엔티티 생성 - MemberTermsHistory memberTermsHistory = request.createMemberTermsHistoryEntity(member, foundTerms); + MemberTermsHistory memberTermsHistory = + request.createMemberTermsHistoryEntity(member, foundTerms); // 회원 약관 이력 엔티티 저장 - MemberTermsHistory savedMemberTermsHistory = memberTermsHistoryRepository.save(memberTermsHistory); + MemberTermsHistory savedMemberTermsHistory = + memberTermsHistoryRepository.save(memberTermsHistory); return savedMemberTermsHistory; } @@ -227,11 +236,10 @@ private MemberState saveMemberState(Member member, String code) { return savedMemberState; } - - // 2. 로그인 : 아이디로 회원 조회하여 UserDetails 반환, 스프링 시큐리티 내부적으로 호출하여 로그인 처리 @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {; + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + ; // 아이디로 회원 조회 Member foundMember = memberRepository.findById(username); @@ -262,7 +270,7 @@ private String createVerificationCode() { StringBuilder sb = new StringBuilder(); // 6자리 랜덤 숫자 코드 생성 - for (int i=0; i<6; i++) { + for (int i = 0; i < 6; i++) { int random = (int) (Math.random() * 10); sb.append(random); } @@ -295,7 +303,6 @@ private void sendEmail(String email, String emailContent) { // 이메일 전송 실패시 예외 발생 throw new MailSendException("이메일 전송에 실패했습니다"); } - } // 4. 회원정보 상세 조회 @@ -321,7 +328,8 @@ public MemberReadResponse read(Long memberSeq) { // 조회된 회원의 상태를 확인함 // - 휴먼회원(MBS003), 제재회원(MBS007), 탈퇴회원(MBS004)일 경우 거르기 - MemberState memberState = memberStateRepository.findLatestHistoryByMemberSeq(foundMember.getSeq()); + MemberState memberState = + memberStateRepository.findLatestHistoryByMemberSeq(foundMember.getSeq()); // 휴먼 회원인지 확인 if ("MBS003".equals(memberState.getCode().getCode())) { @@ -345,29 +353,29 @@ public MemberReadResponse read(Long memberSeq) { return MemberReadResponse.of(foundMember); } - // 5. 회원정보 수정 @Transactional public void update(Long memberSeq, MemberUpdateRequest request) { // 5-1. 전달받은 데이터가 유효한지 검증한다 // 5-2. 아이디, 이메일을 수정할 경우, 다른 회원과 중복된 아이디, 이메일이 있는지 확인한다 - boolean isDuplicatedId = memberRepository.existsByIdNotContainingMemberSeq(memberSeq, request.getId()); + boolean isDuplicatedId = + memberRepository.existsByIdNotContainingMemberSeq(memberSeq, request.getId()); if (isDuplicatedId) { throw new MemberDuplicatedIdException(); } - boolean isDuplicatedEmail = memberRepository.existsByEmailNotContainingMemberSeq(memberSeq, request.getEmail()); + boolean isDuplicatedEmail = + memberRepository.existsByEmailNotContainingMemberSeq(memberSeq, request.getEmail()); if (isDuplicatedEmail) { throw new MemberDuplicatedEmailException(); } // 5-3. 회원 시퀀스로 엔티티를 조회한다 - Member foundMember = memberRepository.findById(memberSeq) - .orElseThrow(MemberNotFoundException::new); - + Member foundMember = + memberRepository.findById(memberSeq).orElseThrow(MemberNotFoundException::new); // 5-4. 어느 부분이 변경되었는지 파악하고 이력으로 기록한다 - List changeHistories = new ArrayList<>(); + List changeHistories = new ArrayList<>(); // 현재 시간과 최대 시간 세팅 LocalDateTime now = LocalDateTime.now(); @@ -380,7 +388,6 @@ public void update(Long memberSeq, MemberUpdateRequest request) { String formattedNow = now.format(formatter); String formattedEnd = end.format(formatter); - boolean isChangedId = false; boolean isChangedEmail = false; boolean isChangedPassword = false; @@ -412,35 +419,37 @@ public void update(Long memberSeq, MemberUpdateRequest request) { Code memberIdFiledCode = codeRepository.findCodeByCode("MF001"); // 회원 아이디 필드 코드 // 가장 최근 이력 시간 업데이트 - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, memberIdFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); - - - - MemberChangeHistory memberIdChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(memberIdFiledCode) - .befVal(foundMember.getId()) - .aftVal(request.getId()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, memberIdFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); + + MemberChangeHistory memberIdChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(memberIdFiledCode) + .befVal(foundMember.getId()) + .aftVal(request.getId()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); changeHistories.add(memberIdChangeHistory); } if (isChangedEmail) { Code emailFiledCode = codeRepository.findCodeByCode("MF002"); // 회원 이메일 필드 코드 - MemberChangeHistory emailChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(emailFiledCode) - .befVal(foundMember.getEmail()) - .aftVal(request.getEmail()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory emailChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(emailFiledCode) + .befVal(foundMember.getEmail()) + .aftVal(request.getEmail()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // 가장 최근 이력 시간 업데이트 - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, emailFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, emailFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); changeHistories.add(emailChangeHistory); } @@ -450,58 +459,62 @@ public void update(Long memberSeq, MemberUpdateRequest request) { String encodedPassword = passwordEncoder.encode(foundMember.getPassword()); // 가장 최근 이력 시간 업데이트 - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); - - MemberChangeHistory passwordChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(passwordFiledCode) - .befVal(foundMember.getPassword()) - .aftVal(encodedPassword) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); + + MemberChangeHistory passwordChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(passwordFiledCode) + .befVal(foundMember.getPassword()) + .aftVal(encodedPassword) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); changeHistories.add(passwordChangeHistory); } if (isChangedName) { Code nameFiledCode = codeRepository.findCodeByCode("MF004"); // 회원 이름 필드 코드 - MemberChangeHistory nameChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(nameFiledCode) - .befVal(foundMember.getName()) - .aftVal(request.getName()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory nameChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(nameFiledCode) + .befVal(foundMember.getName()) + .aftVal(request.getName()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // 가장 최근 이력 시간 업데이트 - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, nameFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, nameFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); changeHistories.add(nameChangeHistory); } if (isChangedNormAddr) { Code normAddrFiledCode = codeRepository.findCodeByCode("MF005"); // 회원 주소 필드 코드 - MemberChangeHistory normAddrChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(normAddrFiledCode) - .befVal(foundMember.getNormAddr()) - .aftVal(request.getNormAddr()) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory normAddrChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(normAddrFiledCode) + .befVal(foundMember.getNormAddr()) + .aftVal(request.getNormAddr()) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // 가장 최근 이력 시간 업데이트 - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, normAddrFiledCode.getCode()) - .ifPresent(history -> history.setEndDate(formattedNow)); + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, normAddrFiledCode.getCode()) + .ifPresent(history -> history.setEndDate(formattedNow)); changeHistories.add(normAddrChangeHistory); } - - // 5-6. 해당 엔티티를 수정한다 foundMember.update(request); @@ -512,7 +525,6 @@ public void update(Long memberSeq, MemberUpdateRequest request) { memberChangeHistoryRepository.saveAll(changeHistories); } - // 6. 회원 탈퇴(유해기간 30일 설정, 그 이후에 삭제) // (1) 삭제 처리가 요청된 회원 // - 해당 회원을 비활성 회원으로 업데이트한다 @@ -520,8 +532,8 @@ public void update(Long memberSeq, MemberUpdateRequest request) { // - 회원 삭제 유형 코드와 사유를 기록한다 public void remove(Long memberSeq, MemberRemoveRequest request) { // - 해당 회원을 조회한다 - Member foundMember = memberRepository.findById(memberSeq) - .orElseThrow(MemberNotFoundException::new); + Member foundMember = + memberRepository.findById(memberSeq).orElseThrow(MemberNotFoundException::new); // - 해당 회원을 비활성 회원으로 업데이트한다 Code removeMemberCode = codeRepository.findCodeByCode("MBS003"); // 휴먼 회원으로 등록 @@ -535,7 +547,6 @@ public void remove(Long memberSeq, MemberRemoveRequest request) { memberDeleteRepository.save(memberDelete); } - // (2) 매일 새벽 4:00 마다 삭제 회원 중 유해기간 30일이 지난 회원들을 삭제(스프링 스케쥴러 적용) // - applDate가 현재와 30일 차이 나는 회원을 대상으로 한다 // - 회원을 삭제한다 @@ -549,41 +560,50 @@ public void checkRemovedMember() { // 현재 시간 조회 LocalDateTime now = LocalDateTime.now(); - // - applDate가 현재와 30일 차이 나는 회원을 대상으로 한다 List foundAllDeletedMembers = memberDeleteRepository.findAll(); - List candidates = foundAllDeletedMembers.stream() - .filter(m -> { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - LocalDateTime applDate = LocalDateTime.parse(m.getApplDate(), formatter); - return applDate.isBefore(now.minusMonths(1)) || applDate.isEqual(now.minusMonths(1)); - }) - .toList(); + List candidates = + foundAllDeletedMembers.stream() + .filter( + m -> { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime applDate = LocalDateTime.parse(m.getApplDate(), formatter); + return applDate.isBefore(now.minusMonths(1)) + || applDate.isEqual(now.minusMonths(1)); + }) + .toList(); // 삭제 대상 회원을 반복해서 삭제 처리한다 for (MemberDelete candidate : candidates) { // - 회원을 삭제한다 - Member foundMember = memberRepository.findById(candidate.getMemberSeq()) - .orElseThrow(MemberNotFoundException::new); + Member foundMember = + memberRepository + .findById(candidate.getMemberSeq()) + .orElseThrow(MemberNotFoundException::new); memberRepository.delete(foundMember); // - 회원의 상태를 삭제한다 - List foundMemberStates = memberStateRepository.findAllByMemberSeq(candidate.getMemberSeq()); + List foundMemberStates = + memberStateRepository.findAllByMemberSeq(candidate.getMemberSeq()); memberStateRepository.deleteAll(foundMemberStates); - // - 회원의 약관 이력을 삭제한다 - List foundMemberTermsHistories = memberTermsHistoryRepository.findByMemberSeq(candidate.getMemberSeq()); + List foundMemberTermsHistories = + memberTermsHistoryRepository.findByMemberSeq(candidate.getMemberSeq()); memberTermsHistoryRepository.deleteAll(foundMemberTermsHistories); // - 회원의 접속 이력을 삭제한다 - List foundMemberConnectionsHistories = memberConnectionHistoryRepository.findMemberConnectionHistoriesByMemberSeq(candidate.getMemberSeq()); + List foundMemberConnectionsHistories = + memberConnectionHistoryRepository.findMemberConnectionHistoriesByMemberSeq( + candidate.getMemberSeq()); memberConnectionHistoryRepository.deleteAll(foundMemberConnectionsHistories); // - 회원의 변경 이력을 삭제한다 // - 회원 삭제 테이블에 처리 완료 체크표시 넣기 - List foundMemberChangeHistories = memberChangeHistoryRepository.findMemberChangeHistoriesByMemberSeq(candidate.getMemberSeq()); + List foundMemberChangeHistories = + memberChangeHistoryRepository.findMemberChangeHistoriesByMemberSeq( + candidate.getMemberSeq()); memberChangeHistoryRepository.deleteAll(foundMemberChangeHistories); // 회원 삭제 데이터 업데이트 @@ -626,23 +646,24 @@ public void updatePassword(Long memberSeq, MemberChangePasswordRequest request) String formattedEnd = end.format(formatter); // 가장 최근 이력 시간 업데이트 - memberChangeHistoryRepository.findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) + memberChangeHistoryRepository + .findLatestHistoryByIdAndCode(memberSeq, passwordFiledCode.getCode()) .ifPresent(history -> history.setEndDate(formattedNow)); - MemberChangeHistory passwordChangeHistory = MemberChangeHistory.builder() - .member(foundMember) - .chngFieldCode(passwordFiledCode) - .befVal(foundMember.getPassword()) - .aftVal(encodedPassword) - .applDate(formattedNow) - .endDate(formattedEnd) - .build(); + MemberChangeHistory passwordChangeHistory = + MemberChangeHistory.builder() + .member(foundMember) + .chngFieldCode(passwordFiledCode) + .befVal(foundMember.getPassword()) + .aftVal(encodedPassword) + .applDate(formattedNow) + .endDate(formattedEnd) + .build(); // 변경 이력 저장 memberChangeHistoryRepository.save(passwordChangeHistory); } - public String findId(String email) { // 이메일로 회원 조회 Member foundMember = memberRepository.findByEmail(email); @@ -653,5 +674,4 @@ public String findId(String email) { // 조회된 회원의 아이디 반환 return foundMember.getId(); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java index e311944f..3e03f6c8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsConditionServiceImpl.java @@ -18,16 +18,19 @@ public class MemberTermsConditionServiceImpl { private final MemberTermConditionRepository memberTermConditionRepository; - public MemberTermsConditionServiceImpl(MemberTermConditionRepository memberTermConditionRepository) { + public MemberTermsConditionServiceImpl( + MemberTermConditionRepository memberTermConditionRepository) { this.memberTermConditionRepository = memberTermConditionRepository; } + // 회원 약관 항목 CRUD // 1-1. 단건 회원 약관 항목을 등록한다 public MemberTermConditionResponse create(MemberTermConditionRequest request) { // 유효성 검증이 완료된 request로부터 엔티티를 생성한다 MemberTermsCondition memberTermsConditionEntity = request.createMemberTermsConditionEntity(); // 생성된 엔티티를 저장한다 - MemberTermsCondition savedMemberTermsCondition = memberTermConditionRepository.save(memberTermsConditionEntity); + MemberTermsCondition savedMemberTermsCondition = + memberTermConditionRepository.save(memberTermsConditionEntity); // 저장된 엔티티를 response로 변환하여 반환한다 return new MemberTermConditionResponse(savedMemberTermsCondition); } @@ -35,16 +38,16 @@ public MemberTermConditionResponse create(MemberTermConditionRequest request) { // 1-2. 여러개 회원 약관 항목을 등록한다 public MemberTermConditionResponses create(List requests) { // 유효성 검증이 완료된 requests 더미로부터 이터러블 할 수 있는 엔티티 더미를 생성한다 - Stream memberTermConditions = requests.stream() - .map(MemberTermConditionRequest::createMemberTermsConditionEntity); + Stream memberTermConditions = + requests.stream().map(MemberTermConditionRequest::createMemberTermsConditionEntity); // 해당 엔티티 더미를 모두 저장한다 - List savedMemberTermConditions = memberTermConditionRepository.saveAll(memberTermConditions::iterator); + List savedMemberTermConditions = + memberTermConditionRepository.saveAll(memberTermConditions::iterator); // 저장된 엔티티 더미를 각각 response로 변환하여 반환한다 - List memberTermCondtionsResponse = savedMemberTermConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermCondtionsResponse = + savedMemberTermConditions.stream().map(MemberTermConditionResponse::new).toList(); // 저장된 엔티티 더미를 response로 변환하여 반환한다 return new MemberTermConditionResponses(memberTermCondtionsResponse); @@ -53,10 +56,11 @@ public MemberTermConditionResponses create(List requ // 2-1. 단건 회원 약관 항목을 조회한다 public MemberTermConditionResponse read(String condCode) { // 특정 약관 항목 코드로 조회 - MemberTermsCondition foundMemberTermsCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermsCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermsCondition == null) { // 없을 경우 예외 발생 - throw new MemberTermsConditionNotFoundException(); + throw new MemberTermsConditionNotFoundException(); } // 조회된 엔티티를 response로 변환하여 반환한다 @@ -69,9 +73,8 @@ public MemberTermConditionResponses readAll() { // 모든 회원 약관 항목을 조회한다 List foundMemberTermsConditions = memberTermConditionRepository.findAll(); // 조회된 엔티티를 response로 변환하여 반환한다 - List memberTermCondtionsResponse = foundMemberTermsConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermCondtionsResponse = + foundMemberTermsConditions.stream().map(MemberTermConditionResponse::new).toList(); // 조회된 엔티티를 response로 변환하여 반환한다 return new MemberTermConditionResponses(memberTermCondtionsResponse); } @@ -80,12 +83,12 @@ public MemberTermConditionResponses readAll() { @Transactional(readOnly = true) public MemberTermConditionResponses readAvailable() { // 사용 가능한 여러개 회원 약관 항목을 조회한다 - List availableMemberTermsConditions = memberTermConditionRepository.findAvailableMemberTermsConditions(); + List availableMemberTermsConditions = + memberTermConditionRepository.findAvailableMemberTermsConditions(); // 조회된 엔티티 더미를 response로 변환하여 반환한다 - List memberTermConditionResponses = availableMemberTermsConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermConditionResponses = + availableMemberTermsConditions.stream().map(MemberTermConditionResponse::new).toList(); return new MemberTermConditionResponses(memberTermConditionResponses); } @@ -93,40 +96,39 @@ public MemberTermConditionResponses readAvailable() { @Transactional(readOnly = true) public MemberTermConditionResponses readNotAvailable() { // 사용 가능한 여러개 회원 약관 항목을 조회한다 - List availableMemberTermsConditions = memberTermConditionRepository.findNotAvailableMemberTermsConditions(); + List availableMemberTermsConditions = + memberTermConditionRepository.findNotAvailableMemberTermsConditions(); // 조회된 엔티티 더미를 response로 변환하여 반환한다 - List memberTermConditionResponses = availableMemberTermsConditions.stream() - .map(MemberTermConditionResponse::new) - .toList(); + List memberTermConditionResponses = + availableMemberTermsConditions.stream().map(MemberTermConditionResponse::new).toList(); return new MemberTermConditionResponses(memberTermConditionResponses); } // 3-1. 단건 회원 약관 항목을 수정한다 public void update(String condCode, MemberTermConditionUpdateRequest request) { // 특정 약관 항목 코드로 약과 조회 - MemberTermsCondition foundMemberTermCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermCondition == null) { // 없을 경우 예외 발생 - throw new MemberTermsConditionNotFoundException(); + throw new MemberTermsConditionNotFoundException(); } // 있을 경우 엔티티를 수정 foundMemberTermCondition.update(request); } - // 4-1. 단건 회원 약관 항목을 삭제한다 public void remove(String condCode) { // 특정 약관 항목 코드로 약관을 조회한다 - MemberTermsCondition foundMemberTermCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermCondition == null) { // 없을 경우 예외 발생 - throw new MemberTermsConditionNotFoundException(); + throw new MemberTermsConditionNotFoundException(); } // 조회된 약관을 삭제한다 memberTermConditionRepository.delete(foundMemberTermCondition); } - - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java index 51574643..7e1c5ba6 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/member/service/MemberTermsServiceImpl.java @@ -6,22 +6,18 @@ import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponse; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermResponses; import com.oreo.finalproject_5re5_be.member.dto.response.MemberTermsDetailResponse; -import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.member.entity.MemberTerms; import com.oreo.finalproject_5re5_be.member.entity.MemberTermsCondition; import com.oreo.finalproject_5re5_be.member.exception.MemberTermsConditionNotFoundException; import com.oreo.finalproject_5re5_be.member.exception.MemberTermsNotFoundException; -import com.oreo.finalproject_5re5_be.member.exception.RetryFailedException; import com.oreo.finalproject_5re5_be.member.repository.MemberTermConditionRepository; import com.oreo.finalproject_5re5_be.member.repository.MemberTermsRepository; -import jakarta.validation.constraints.Pattern; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - @Service @Transactional public class MemberTermsServiceImpl { @@ -29,22 +25,25 @@ public class MemberTermsServiceImpl { private final MemberTermsRepository memberTermsRepository; private final MemberTermConditionRepository memberTermConditionRepository; - public MemberTermsServiceImpl(MemberTermsRepository memberTermsRepository, MemberTermConditionRepository memberTermConditionRepository) { + public MemberTermsServiceImpl( + MemberTermsRepository memberTermsRepository, + MemberTermConditionRepository memberTermConditionRepository) { this.memberTermsRepository = memberTermsRepository; this.memberTermConditionRepository = memberTermConditionRepository; } - // 회원 약관 생성 public MemberTermResponse create(MemberTermRequest request) { // 약관 엔티티를 생성함 MemberTerms terms = new MemberTerms(); - List foundMemberTermConditions = findMemberTermsConditions(request.getMemberTermConditionCodes()); + List foundMemberTermConditions = + findMemberTermsConditions(request.getMemberTermConditionCodes()); // 각 코드에 맞는 회원 약관 항목들을 찾아서 리스트에 담음 // 각 약관 항목과 필수 여부를 세팅함 - List memberTermConditionMandatoryOrNot = request.getMemberTermConditionMandatoryOrNot(); + List memberTermConditionMandatoryOrNot = + request.getMemberTermConditionMandatoryOrNot(); terms.setTermCond1(foundMemberTermConditions.get(0)); terms.setChkTerm1(memberTermConditionMandatoryOrNot.get(0)); @@ -82,8 +81,6 @@ public MemberTermResponse create(MemberTermRequest request) { return new MemberTermResponse(savedMemberTerm); } - - // 회원 약관 시퀀스로 조회 public MemberTermResponse read(Long termSeq) { MemberTerms foundMemberTerm = findMemberTerm(termSeq); @@ -101,9 +98,9 @@ public MemberTermResponse readLatestAvailable() { return new MemberTermResponse(foundMemberTerms); } - /** * 밑에 코드들 중복, 추후에 리팩토링 처리[] + * * @return */ // 추후에 페이징 처리 필요 @@ -112,9 +109,8 @@ public MemberTermResponses readAll() { List foundMemberTerms = memberTermsRepository.findAll(); // 조회된 모든 엔티티를 response로 변환한다 - List memberTermResponseList = foundMemberTerms.stream() - .map(MemberTermResponse::new) - .toList(); + List memberTermResponseList = + foundMemberTerms.stream().map(MemberTermResponse::new).toList(); // 변환된 모든 response를 하나로 묶은 response에 담아서 반환한다 return new MemberTermResponses(memberTermResponseList); @@ -125,9 +121,8 @@ public MemberTermResponses readAvailable() { List foundMemberTerms = memberTermsRepository.findAvailableMemberTerms(); // 조회된 모든 엔티티를 response로 변환한다 - List memberTermResponseList = foundMemberTerms.stream() - .map(MemberTermResponse::new) - .toList(); + List memberTermResponseList = + foundMemberTerms.stream().map(MemberTermResponse::new).toList(); // 변환된 모든 response를 하나로 묶은 response에 담아서 반환한다 return new MemberTermResponses(memberTermResponseList); @@ -138,9 +133,8 @@ public MemberTermResponses readNotAvailable() { List foundMemberTerms = memberTermsRepository.findNotAvailableMemberTerms(); // 조회된 모든 엔티티를 response로 변환한다 - List memberTermResponseList = foundMemberTerms.stream() - .map(MemberTermResponse::new) - .toList(); + List memberTermResponseList = + foundMemberTerms.stream().map(MemberTermResponse::new).toList(); // 변환된 모든 response를 하나로 묶은 response에 담아서 반환한다 return new MemberTermResponses(memberTermResponseList); @@ -155,7 +149,6 @@ public void update(Long termSeq, MemberTermUpdateRequest request) { foundMemberTerms.update(request); } - // 회원 약관 삭제 public void remove(Long termSeq) { // 약관 시퀀스로 해당 약관 조회 @@ -195,14 +188,14 @@ private List findMemberTermsConditions(List condCo // 각 코드에 맞는 약관 항목을 찾아서 반환함 private MemberTermsCondition findMemberTermsCondition(String condCode) { - MemberTermsCondition foundMemberTermCondition = memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); + MemberTermsCondition foundMemberTermCondition = + memberTermConditionRepository.findMemberTermsConditionByCondCode(condCode); if (foundMemberTermCondition == null) { throw new MemberTermsConditionNotFoundException(); } return foundMemberTermCondition; } - // 특정 코드로 호원 약관 상세 조회 public MemberTermsDetailResponse readByTermCode(String termCode) { // 특정 회원 약관 코드로 조회 @@ -239,11 +232,16 @@ public MemberTermsDetailResponse readByTermCode(String termCode) { } // 응답 데이터로 전환 - MemberTermConditionResponse memberTermConditionResponse1 = MemberTermConditionResponse.of(termCond1); - MemberTermConditionResponse memberTermConditionResponse2 = MemberTermConditionResponse.of(termCond2); - MemberTermConditionResponse memberTermConditionResponse3 = MemberTermConditionResponse.of(termCond3); - MemberTermConditionResponse memberTermConditionResponse4 = MemberTermConditionResponse.of(termCond4); - MemberTermConditionResponse memberTermConditionResponse5 = MemberTermConditionResponse.of(termCond5); + MemberTermConditionResponse memberTermConditionResponse1 = + MemberTermConditionResponse.of(termCond1); + MemberTermConditionResponse memberTermConditionResponse2 = + MemberTermConditionResponse.of(termCond2); + MemberTermConditionResponse memberTermConditionResponse3 = + MemberTermConditionResponse.of(termCond3); + MemberTermConditionResponse memberTermConditionResponse4 = + MemberTermConditionResponse.of(termCond4); + MemberTermConditionResponse memberTermConditionResponse5 = + MemberTermConditionResponse.of(termCond5); // 리스트에 추가 memberTermConditionResponseList.add(memberTermConditionResponse1); @@ -254,6 +252,5 @@ public MemberTermsDetailResponse readByTermCode(String termCode) { // 응답 데이터 반환 return MemberTermsDetailResponse.of(foundMemberTerms, memberTermConditionResponseList); - } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java index dfbf209a..cc589cc3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/controller/ProjectController.java @@ -1,8 +1,6 @@ package com.oreo.finalproject_5re5_be.project.controller; -import com.google.api.Http; import com.oreo.finalproject_5re5_be.global.dto.response.ResponseDto; -import com.oreo.finalproject_5re5_be.member.dto.CustomUserDetails; import com.oreo.finalproject_5re5_be.project.dto.request.ProjectTextRequest; import com.oreo.finalproject_5re5_be.project.dto.response.ProjectResponse; import com.oreo.finalproject_5re5_be.project.service.ProjectService; @@ -10,20 +8,17 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpSession; import jakarta.validation.Valid; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - @Tag(name = "Project", description = "Project 관련 API") @RestController @Slf4j @@ -34,72 +29,56 @@ public class ProjectController { private ProjectService projectService; @Autowired - public ProjectController(ProjectService projectService){ + public ProjectController(ProjectService projectService) { this.projectService = projectService; } - @Operation( - summary = "Project 정보 검색", - description = "회원 Seq로 프로젝트 정보를 가지고옵니다." - ) + @Operation(summary = "Project 정보 검색", description = "회원 Seq로 프로젝트 정보를 가지고옵니다.") @GetMapping("") - public ResponseEntity>>> projectGet( - HttpSession session) { -// @PathVariable Long memSeq){//session memberSeq값 -// List projectResponses = + public ResponseEntity>>> projectGet(HttpSession session) { + // @PathVariable Long memSeq){//session memberSeq값 + // List projectResponses = Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectFindAll(memberSeq); List projectResponses = projectService.projectFindAll(memberSeq); - log.info("[ProjectController] projectGet - projectResponses : {} ", projectResponses.toString()); + log.info( + "[ProjectController] projectGet - projectResponses : {} ", projectResponses.toString()); - Map> map = new HashMap<>();//맵 생성 - map.put("row", Collections.singletonList(projectResponses));//row : [] 로 응답 - return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(), map)); + Map> map = new HashMap<>(); // 맵 생성 + map.put("row", Collections.singletonList(projectResponses)); // row : [] 로 응답 + return ResponseEntity.ok().body(new ResponseDto<>(HttpStatus.OK.value(), map)); } - @Operation( - summary = "Project 생성", - description = "회원 Seq로 프로젝트를 생성 합니다." - ) + @Operation(summary = "Project 생성", description = "회원 Seq로 프로젝트를 생성 합니다.") @PostMapping("") - public ResponseEntity>> projectSave( - HttpSession session){//session memberSeq값 - //project 생성 + public ResponseEntity>> projectSave( + HttpSession session) { // session memberSeq값 + // project 생성 Long projectSeq = projectService.projectSave((Long) session.getAttribute("memberSeq")); Map map = new HashMap<>(); - map.put("projectSeq", projectSeq);//프로젝트seq 응답에 추가 - map.put("msg", "프로젝트 생성 완료되었습니다.");//메시지 추가 - return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(),map)); + map.put("projectSeq", projectSeq); // 프로젝트seq 응답에 추가 + map.put("msg", "프로젝트 생성 완료되었습니다."); // 메시지 추가 + return ResponseEntity.ok().body(new ResponseDto<>(HttpStatus.OK.value(), map)); } - @Operation( - summary = "Project 이름 수정(저장)", - description = "프로젝트 Seq와 변경할 이름을 받아 수정합니다." - ) + @Operation(summary = "Project 이름 수정(저장)", description = "프로젝트 Seq와 변경할 이름을 받아 수정합니다.") @PutMapping("") public ResponseEntity> projectUpdate( - HttpSession session, - @Valid @RequestBody ProjectTextRequest request){ - projectService.projectCheck((Long) session.getAttribute("memberSeq"), request.getProSeq()); //회원의 프로젝트인지 확인 - projectService.projectUpdate(request.getProSeq(), request.getProjectName());//프로젝트 수정 + HttpSession session, @Valid @RequestBody ProjectTextRequest request) { + projectService.projectCheck( + (Long) session.getAttribute("memberSeq"), request.getProSeq()); // 회원의 프로젝트인지 확인 + projectService.projectUpdate(request.getProSeq(), request.getProjectName()); // 프로젝트 수정 return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(), - "Project 이름 변경 완료되었습니다.")); //응답 + .body(new ResponseDto<>(HttpStatus.OK.value(), "Project 이름 변경 완료되었습니다.")); // 응답 } - @Operation( - summary = "Project 삭제", - description = "프로젝트 Seq를 받아 activate 상태를 'N'으로 변경합니다." - ) + + @Operation(summary = "Project 삭제", description = "프로젝트 Seq를 받아 activate 상태를 'N'으로 변경합니다.") @DeleteMapping("") public ResponseEntity> projectDelete( - @RequestParam List proSeq, - HttpSession session){ - projectService.projectCheck((Long) session.getAttribute("memberSeq"), proSeq); //회원의 프로젝트인지 확인 - projectService.projectDelete(proSeq);//프로젝트 삭제 배열로 받음 + @RequestParam List proSeq, HttpSession session) { + projectService.projectCheck((Long) session.getAttribute("memberSeq"), proSeq); // 회원의 프로젝트인지 확인 + projectService.projectDelete(proSeq); // 프로젝트 삭제 배열로 받음 return ResponseEntity.ok() - .body(new ResponseDto<>(HttpStatus.OK.value(), - "Project 삭제 완료되었습니다."));//모두 삭제 + .body(new ResponseDto<>(HttpStatus.OK.value(), "Project 삭제 완료되었습니다.")); // 모두 삭제 } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java index c9121cbd..ccb657a8 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/dto/response/ProjectResponse.java @@ -1,8 +1,7 @@ package com.oreo.finalproject_5re5_be.project.dto.response; -import lombok.*; - import java.time.LocalDateTime; +import lombok.*; @Getter @Setter diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java index 1c53d5e1..635d7b5d 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/Project.java @@ -1,15 +1,13 @@ package com.oreo.finalproject_5re5_be.project.entity; - import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import com.oreo.finalproject_5re5_be.member.entity.Member; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.*; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; -import java.time.LocalDateTime; - @Entity @Table(name = "project") @Getter @@ -31,7 +29,7 @@ public class Project extends BaseEntity { @Builder.Default @Column(nullable = false, name = "pro_name") - private String proName="ProjectName"; + private String proName = "ProjectName"; @Column(name = "pro_cmt") private String proCmt; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java index d940af59..a823a18a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/entity/ProjectStatus.java @@ -1,18 +1,17 @@ package com.oreo.finalproject_5re5_be.project.entity; - import com.oreo.finalproject_5re5_be.code.entity.Code; import com.oreo.finalproject_5re5_be.global.entity.BaseEntity; import jakarta.persistence.*; +import java.time.LocalDateTime; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import java.time.LocalDateTime; - @Entity @Table(name = "project_status") -@Getter @Setter +@Getter +@Setter @ToString public class ProjectStatus extends BaseEntity { @@ -25,13 +24,13 @@ public class ProjectStatus extends BaseEntity { @JoinColumn(name = "pro_seq") private Project project; - /** 추후에 통합 코드 엔티티와 연관관계 맺기 **/ + /** 추후에 통합 코드 엔티티와 연관관계 맺기 * */ @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "code") private Code ccSeq; - private LocalDateTime applDate;//적용 시점일 - private LocalDateTime endDate;//적용 종료일 + private LocalDateTime applDate; // 적용 시점일 + private LocalDateTime endDate; // 적용 종료일 public void prePersist() { applDate = LocalDateTime.now(); diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java index 4c9ad7f5..19ccbb66 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/ProjectExceptionHandler.java @@ -14,17 +14,21 @@ public class ProjectExceptionHandler { @ExceptionHandler(value = Exception.class) // 어떤 예외클래스를 처리할건지 지정 public ResponseEntity> handle(Exception e, HttpServletRequest request) { - log.error("VC RestController1 내 handlerException 호출 , {} , {}", - request.getRequestURI(), e.getMessage()); + log.error( + "VC RestController1 내 handlerException 호출 , {} , {}", + request.getRequestURI(), + e.getMessage()); return ResponseEntity.badRequest() - .body(new ResponseDto<> (HttpStatus.BAD_REQUEST.value(), e.getMessage())); + .body(new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), e.getMessage())); } @ExceptionHandler(value = BusinessException.class) // 어떤 예외클래스를 처리할건지 지정 public ResponseEntity> handle2(Exception e, HttpServletRequest request) { - log.error("VC RestController2 내 handlerException 호출 , {} , {}", - request.getRequestURI(), e.getMessage()); + log.error( + "VC RestController2 내 handlerException 호출 , {} , {}", + request.getRequestURI(), + e.getMessage()); return ResponseEntity.badRequest() - .body(new ResponseDto<> (HttpStatus.BAD_REQUEST.value(), e.getMessage())); + .body(new ResponseDto<>(HttpStatus.BAD_REQUEST.value(), e.getMessage())); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/projectNotMemberException.java b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/projectNotMemberException.java index 09a9f166..e3cd5bd1 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/exception/projectNotMemberException.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/exception/projectNotMemberException.java @@ -7,6 +7,7 @@ public class projectNotMemberException extends BusinessException { public projectNotMemberException() { super(ErrorCode.HANDLE_ACCESS_DENIED.getMessage(), ErrorCode.HANDLE_ACCESS_DENIED); } + public projectNotMemberException(String message) { super(message, ErrorCode.HANDLE_ACCESS_DENIED); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java b/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java index 61a533af..2c458882 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/repository/ProjectRepository.java @@ -1,16 +1,14 @@ package com.oreo.finalproject_5re5_be.project.repository; -import com.oreo.finalproject_5re5_be.member.entity.Member; import com.oreo.finalproject_5re5_be.project.entity.Project; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface ProjectRepository extends JpaRepository { @Query("SELECT p FROM Project p JOIN p.member m WHERE m.seq = :memberSeq") List findByMemberSeq(@Param("memberSeq") Long memberSeq); -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java index a9f58844..3bc56ddb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectService.java @@ -3,23 +3,21 @@ import com.oreo.finalproject_5re5_be.project.dto.response.ProjectResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import org.springframework.validation.annotation.Validated; - import java.util.List; +import org.springframework.validation.annotation.Validated; @Validated public interface ProjectService { - /** - * 1. 프로젝트 조회 - * 2. 프로젝트 생성 - * 3. 프로젝트 이름 변경 - * 4. 프로젝트 삭제 - */ - + /** 1. 프로젝트 조회 2. 프로젝트 생성 3. 프로젝트 이름 변경 4. 프로젝트 삭제 */ List projectFindAll(Long memberSeq); + Long projectSave(Long memberSeq); - void projectUpdate(@Valid @NotNull Long projectSeq,@Valid @NotNull String projectName); + + void projectUpdate(@Valid @NotNull Long projectSeq, @Valid @NotNull String projectName); + void projectDelete(@Valid @NotNull List projectSeq); + boolean projectCheck(Long memberSeq, Long projectSeq); + boolean projectCheck(Long memberSeq, List projectSeq); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java index 68efbc03..0a2e98cb 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/project/service/ProjectServiceImpl.java @@ -11,6 +11,8 @@ import com.oreo.finalproject_5re5_be.project.repository.ProjectRepository; import com.oreo.finalproject_5re5_be.tts.repository.TtsSentenceRepository; import com.oreo.finalproject_5re5_be.vc.repository.VcRepository; +import java.util.ArrayList; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -18,9 +20,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.util.ArrayList; -import java.util.List; - @Service @Slf4j @RequiredArgsConstructor @@ -32,12 +31,14 @@ public class ProjectServiceImpl implements ProjectService { private TtsSentenceRepository ttsSentenceRepository; private VcRepository vcRepository; private ConcatTabRepository concatTabRepository; + @Autowired - public ProjectServiceImpl(ProjectRepository projectRepository, - MemberRepository memberRepository, - TtsSentenceRepository ttsSentenceRepository, - VcRepository vcRepository, - ConcatTabRepository concatTabRepository) { + public ProjectServiceImpl( + ProjectRepository projectRepository, + MemberRepository memberRepository, + TtsSentenceRepository ttsSentenceRepository, + VcRepository vcRepository, + ConcatTabRepository concatTabRepository) { this.projectRepository = projectRepository; this.memberRepository = memberRepository; this.ttsSentenceRepository = ttsSentenceRepository; @@ -45,9 +46,9 @@ public ProjectServiceImpl(ProjectRepository projectRepository, this.concatTabRepository = concatTabRepository; } - /** * 프로젝트 회원 조회 + * * @return List */ @Override @@ -56,109 +57,106 @@ public List projectFindAll(Long memberSeq) { log.info("[projectService] projectFindAll - memberSeq : {} ", memberSeq); Member member = memberFind(memberSeq); log.info("[projectService] projectFindAll - member : {} ", member.toString()); - //member 확인후 예외 던지기 -// memberSeqCheck(member.getSeq()); + // member 확인후 예외 던지기 + // memberSeqCheck(member.getSeq()); - //회원 정보로 전체 조회 - List project = projectRepository - .findByMemberSeq(member.getSeq()); + // 회원 정보로 전체 조회 + List project = projectRepository.findByMemberSeq(member.getSeq()); log.info("[projectService] projectFindAll - project : {} ", project.toString()); - //정보를 저장할 리스트 생성 + // 정보를 저장할 리스트 생성 List projectResponses = new ArrayList<>(); - //project 정보를 모두 넣고 + // project 정보를 모두 넣고 for (Project p : project) { - ProjectResponse projectResponse = ProjectResponse.builder() - .projectSeq(p.getProSeq()) - .projectName(p.getProName()) - .projectContent(p.getProName()) - .projectDate(p.getProDate()) - .projectUpdateDate(p.getProUpDate()) - .tts(ttsSentenceRepository.existsByProject_ProSeq(p.getProSeq())) - .vc(vcRepository.existsById(p.getProSeq())) - .concat(concatTabRepository.existsById(p.getProSeq())) - .projectActivate(p.getProActivate()) - .build(); + ProjectResponse projectResponse = + ProjectResponse.builder() + .projectSeq(p.getProSeq()) + .projectName(p.getProName()) + .projectContent(p.getProName()) + .projectDate(p.getProDate()) + .projectUpdateDate(p.getProUpDate()) + .tts(ttsSentenceRepository.existsByProject_ProSeq(p.getProSeq())) + .vc(vcRepository.existsById(p.getProSeq())) + .concat(concatTabRepository.existsById(p.getProSeq())) + .projectActivate(p.getProActivate()) + .build(); projectResponses.add(projectResponse); } log.info("[projectService] projectFindAll - projectResponses : {} ", projectResponses); - //Response 로 추출 + // Response 로 추출 return projectResponses; } /** * 프로젝트 생성 + * * @return Long */ @Override public Long projectSave(Long memberSeq) { - //회원정보 추출 + // 회원정보 추출 Member member = memberFind(memberSeq); memberSeqCheck(member.getSeq()); - //회원정보로 프로젝트 객체 생성 - Project project = Project.builder() - .member(member) - .build(); - //저장 + // 회원정보로 프로젝트 객체 생성 + Project project = Project.builder().member(member).build(); + // 저장 Project save = projectRepository.save(project); log.info("Save project : {}", save); - //생성된 프로젝트 ID 정보 추출 + // 생성된 프로젝트 ID 정보 추출 return save.getProSeq(); } /** * 프로젝트 업데이트 + * * @param projectSeq * @param projectName */ @Override public void projectUpdate(Long projectSeq, String projectName) { - //프로젝트 길이 제한 + // 프로젝트 길이 제한 validateProjectName(projectName); // 프로젝트 번호로 프로젝트 찾기 Project projectFind = projectFind(projectSeq); - //프로젝트 찾은 번호로 받은 프로젝트명으로 변경 - Project project = projectFind.toBuilder() - .proSeq(projectSeq) - .proName(projectName) - .build(); - //수정 + // 프로젝트 찾은 번호로 받은 프로젝트명으로 변경 + Project project = projectFind.toBuilder().proSeq(projectSeq).proName(projectName).build(); + // 수정 projectRepository.save(project); } /** * 프로젝트 삭제(수정) + * * @param projectSeq */ @Override @Transactional public void projectDelete(List projectSeq) { - //리스트로 받은 프로젝트 번호를 조회 + // 리스트로 받은 프로젝트 번호를 조회 for (int i = 0; i < projectSeq.size(); i++) { Project projectFind = projectFind(projectSeq.get(i)); - //프로젝트들의 상태를 N으로 변경 - Project project = projectFind.toBuilder() - .proSeq(projectSeq.get(i)) - .proActivate('N') - .build(); - //저장 + // 프로젝트들의 상태를 N으로 변경 + Project project = projectFind.toBuilder().proSeq(projectSeq.get(i)).proActivate('N').build(); + // 저장 projectRepository.save(project); } } /** * 회원의 프로젝트인지 확인 단일 + * * @param memberSeq * @param projectSeq * @return */ @Override public boolean projectCheck(Long memberSeq, Long projectSeq) { - log.info("[projectService] projectcheck - memberSeq, projectSeq : {} | {}",memberSeq, projectSeq); + log.info( + "[projectService] projectcheck - memberSeq, projectSeq : {} | {}", memberSeq, projectSeq); Project project = projectFind(projectSeq); - log.info("[projectService] projectcheck - project : {} ",project.toString()); + log.info("[projectService] projectcheck - project : {} ", project.toString()); Long seq = project.getMember().getSeq(); - log.info("[projectService] projectcheck - seq : {} ",seq); - if(seq.equals(memberSeq)){ + log.info("[projectService] projectcheck - seq : {} ", seq); + if (seq.equals(memberSeq)) { return true; } throw new projectNotMemberException(); @@ -166,16 +164,20 @@ public boolean projectCheck(Long memberSeq, Long projectSeq) { /** * 회원의 프로젝트인지 확인 여러개 + * * @param memberSeq * @param projectSeq * @return */ @Override - public boolean projectCheck(Long memberSeq, List projectSeq){ - log.info("[projectService] projectCheck - memberSeq, projectSeq : {} , {} ", memberSeq, projectSeq.toString()); + public boolean projectCheck(Long memberSeq, List projectSeq) { + log.info( + "[projectService] projectCheck - memberSeq, projectSeq : {} , {} ", + memberSeq, + projectSeq.toString()); for (Long pro : projectSeq) { boolean b = projectCheck(memberSeq, pro); - log.info("[projectService] projectCheck - boolean : {} ",b); + log.info("[projectService] projectCheck - boolean : {} ", b); } return true; } @@ -187,18 +189,20 @@ private void validateProjectName(String projectName) { } } - private Project projectFind(Long seq){ - return projectRepository.findById(seq) + private Project projectFind(Long seq) { + return projectRepository + .findById(seq) .orElseThrow(() -> new IllegalArgumentException("project not found")); } - private Member memberFind(Long seq){ - return memberRepository.findById(seq) - .orElseThrow( - () -> new IllegalArgumentException("Member not found")); + + private Member memberFind(Long seq) { + return memberRepository + .findById(seq) + .orElseThrow(() -> new IllegalArgumentException("Member not found")); } - private void memberSeqCheck(Long seq){ - if(seq == null){ + private void memberSeqCheck(Long seq) { + if (seq == null) { throw new MemberNotFoundException(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java index 01cc2625..89dab664 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/AudioConfigGenerator.java @@ -7,16 +7,15 @@ public class AudioConfigGenerator { // Google TTS AudioConfig 정책 - private final static double MAX_SPEED = 4.0; - private final static double MIN_SPEED = 0.25; - private final static double MAX_PITCH= 20.0; - private final static double MIN_PITCH = -20.0; - private final static double MAX_VOLUME = 16.0; - private final static double MIN_VOLUME = -96.0; + private static final double MAX_SPEED = 4.0; + private static final double MIN_SPEED = 0.25; + private static final double MAX_PITCH = 20.0; + private static final double MIN_PITCH = -20.0; + private static final double MAX_VOLUME = 16.0; + private static final double MIN_VOLUME = -96.0; // 샘플링 레이트는 44100으로 고정(내부 결정) - private final static int SAMPLING_RATE = 44100; - + private static final int SAMPLING_RATE = 44100; // 음성 속도, 피치, 볼륨 값을 받아 AudioConfig 객체로 생성하는 메서드 public static AudioConfig generate() { @@ -50,19 +49,18 @@ private static boolean validPitch(double pitch) { // 볼륨 값 검증 private static boolean validVolume(double volume) { - return volume > MIN_VOLUME && volume < MAX_VOLUME ; + return volume > MIN_VOLUME && volume < MAX_VOLUME; } - private static void checkParams(double speed, double pitch, double volume) { - if( !vaildSpeed(speed)) { + if (!vaildSpeed(speed)) { throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_SPEED); } - if( !validPitch(pitch)) { + if (!validPitch(pitch)) { throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_FAILED_ERROR); } - if(!validVolume(volume) ) { + if (!validVolume(volume)) { throw new TtsMakeInvalidParamException(ErrorCode.TTS_MAKE_INVALID_VOLUME); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java index 8a9ef73a..bebb2b00 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSConfig.java @@ -3,12 +3,11 @@ import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.texttospeech.v1.TextToSpeechClient; import com.google.cloud.texttospeech.v1.TextToSpeechSettings; +import java.io.IOException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; -import java.io.IOException; - @Configuration public class GoogleTTSConfig { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java index 29ccdf30..63cca642 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/GoogleTTSService.java @@ -10,11 +10,10 @@ @Service public class GoogleTTSService { - @Autowired - TextToSpeechClient ttsClient; + @Autowired TextToSpeechClient ttsClient; public byte[] make(SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig) { - if(checkInvalidParams(input, voice, audioConfig)) { + if (checkInvalidParams(input, voice, audioConfig)) { throw new InvalidTTSParamException("TTS 요청 파라미터가 부족합니다"); } @@ -25,20 +24,20 @@ public byte[] make(SynthesisInput input, VoiceSelectionParams voice, AudioConfig ByteString audioContents = response.getAudioContent(); return audioContents.toByteArray(); - } - - public MultipartFile makeToMultipartFile(SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig, String ttsFileName) { + public MultipartFile makeToMultipartFile( + SynthesisInput input, + VoiceSelectionParams voice, + AudioConfig audioConfig, + String ttsFileName) { byte[] result = make(input, voice, audioConfig); - return new ByteArrayMultipartFile( - result, ttsFileName + ".wav", "audio/wav" - ); + return new ByteArrayMultipartFile(result, ttsFileName + ".wav", "audio/wav"); } // tts 생성에 필요한 파라미터들 null 아닌지 검사 - private boolean checkInvalidParams(SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig) { + private boolean checkInvalidParams( + SynthesisInput input, VoiceSelectionParams voice, AudioConfig audioConfig) { return input == null || voice == null || audioConfig == null; } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java index 929e388e..aba5e5df 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/SynthesisInputGenerator.java @@ -9,12 +9,10 @@ public class SynthesisInputGenerator { // 텍스트 값을 전달 받아 SynthesisInput 객체를 만드는 메서드 public static SynthesisInput generate(String text) { - if(checkInvalidText(text)) { + if (checkInvalidText(text)) { throw new InvalidTTSParamException("text 값이 유효하지 않습니다."); } - return SynthesisInput.newBuilder() - .setText(text) - .build(); + return SynthesisInput.newBuilder().setText(text).build(); } // 텍스트 길이 검증 메서드 diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java index 2e125040..b54c9f36 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/client/VoiceParamsGenerator.java @@ -7,8 +7,9 @@ public class VoiceParamsGenerator { // 언어 코드, 보이스명, 성별 값을 가지고 VoiceSelectionParmas 객체 생성 - public static VoiceSelectionParams generate(String languageCode, String voiceName, String gender) { - if(checkParamsNull(languageCode, voiceName, gender)) { + public static VoiceSelectionParams generate( + String languageCode, String voiceName, String gender) { + if (checkParamsNull(languageCode, voiceName, gender)) { throw new InvalidTTSParamException("보이스 객체 생성을 위한 파라미터가 부족합니다."); } @@ -26,7 +27,6 @@ private static SsmlVoiceGender convertToSsmlVoiceGender(String gender) { } catch (IllegalArgumentException e) { throw new InvalidTTSParamException("SsmlVoiceGender 객체로 변환할 수 없는 성별 값 입니다."); } - } // 파라미터값 null 아닌지 검증 diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java index 7fe4509f..6470bebf 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/LanguageController.java @@ -29,9 +29,7 @@ public ResponseEntity> getLanguageList() { // 언어 전체 조회 결과 가져오기 LanguageListDto languageList = languageService.getLanguageList(); - return ResponseEntity - .status(HttpStatus.OK) + return ResponseEntity.status(HttpStatus.OK) .body(new ResponseDto<>(HttpStatus.OK.value(), languageList)); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java index d700ecda..aa14ff06 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/StyleController.java @@ -12,16 +12,15 @@ import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.constraints.NotNull; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - @Slf4j @Tag(name = "TTS-Voice", description = "Voice의 Style 관련 API") @RestController @@ -40,9 +39,11 @@ public StyleController(StyleService styleService) { public ResponseEntity runtimeExceptionHandler(RuntimeException e) { log.error("[RuntimeException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); - return ResponseEntity - .status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), + ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) .body(errorResponseDto); } @@ -50,24 +51,30 @@ public ResponseEntity runtimeExceptionHandler(RuntimeException public ResponseEntity ttsExceptionHandler(BusinessException e) { log.error("[BusinessException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); - return ResponseEntity - .status(e.getErrorCode().getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(errorResponseDto); } @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e) { + public ResponseEntity constraintViolationExceptionHandler( + ConstraintViolationException e) { Set> constraintViolations = e.getConstraintViolations(); - List fieldErrors = constraintViolations.stream() - .map(violation -> ErrorResponseDto.FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .collect(Collectors.toList()); - - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INVALID_INPUT_VALUE.getStatus(), ErrorCode.INVALID_INPUT_VALUE.getMessage(), fieldErrors); - return ResponseEntity - .status(ErrorCode.INVALID_INPUT_VALUE.getStatus()) - .body(errorResponseDto); + List fieldErrors = + constraintViolations.stream() + .map( + violation -> + ErrorResponseDto.FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .collect(Collectors.toList()); + + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); + return ResponseEntity.status(ErrorCode.INVALID_INPUT_VALUE.getStatus()).body(errorResponseDto); } @Operation(summary = "voice 스타일 전체 조회") @@ -77,23 +84,19 @@ public ResponseEntity> getStyleList() { // 스타일 전체 조회 결과 가져오기 StyleListDto styleListDto = styleService.getStyleList(); - return ResponseEntity - .status(HttpStatus.OK) + return ResponseEntity.status(HttpStatus.OK) .body(new ResponseDto<>(HttpStatus.OK.value(), styleListDto)); } @Operation(summary = "언어 코드로 voice가 있는 style만 조회") - @Parameter(name="languagecode", description = "언어 코드명을 작성해주세요") + @Parameter(name = "languagecode", description = "언어 코드명을 작성해주세요") @GetMapping("/search") public ResponseEntity> getStyleListByLang( - @RequestParam("languagecode") @NotNull String langCode - ) { + @RequestParam("languagecode") @NotNull String langCode) { // langCode로 목소리가 존재하는 스타일 조회 결과 가져오기 StyleListDto styleListDto = styleService.getStyleListByLang(langCode); - return ResponseEntity - .status(HttpStatus.OK) + return ResponseEntity.status(HttpStatus.OK) .body(new ResponseDto<>(HttpStatus.OK.value(), styleListDto)); } - } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java index e575d4b5..ca7e2796 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/TtsController.java @@ -35,7 +35,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.bind.annotation.SessionAttribute; @Slf4j @Tag(name = "TTS", description = "TTS 관련 API") @@ -48,8 +47,10 @@ public class TtsController { private final TtsMakeService ttsMakeService; private final ProjectService projectService; - public TtsController(TtsSentenceService ttsSentenceService, TtsMakeService ttsMakeService, - ProjectService projectService) { + public TtsController( + TtsSentenceService ttsSentenceService, + TtsMakeService ttsMakeService, + ProjectService projectService) { this.ttsSentenceService = ttsSentenceService; this.ttsMakeService = ttsMakeService; this.projectService = projectService; @@ -59,103 +60,113 @@ public TtsController(TtsSentenceService ttsSentenceService, TtsMakeService ttsMa public ResponseEntity runtimeExceptionHandler(RuntimeException e) { log.error("[RuntimeException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of( - ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), - ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); - return ResponseEntity - .status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), + ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + .body(errorResponseDto); } - // BusinessException 처리 @ExceptionHandler(BusinessException.class) public ResponseEntity ttsExceptionHandler(BusinessException e) { log.error("[BusinessException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(e.getErrorCode().getStatus(), - e.getMessage()); - return ResponseEntity - .status(e.getErrorCode().getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(errorResponseDto); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity methodArgumentNotValidExceptionHandler( - MethodArgumentNotValidException e) { + MethodArgumentNotValidException e) { log.error("[MethodArgumentNotValidException]", e); // bindingResult에 에러가 있는 경우 if (e.getBindingResult().hasErrors()) { // fieldErrors 생성 - List fieldErrors = e.getBindingResult() - .getFieldErrors().stream() - .map(error -> ErrorResponseDto.FieldErrorDetail.of(error.getField(), - error.getDefaultMessage())) - .toList(); + List fieldErrors = + e.getBindingResult().getFieldErrors().stream() + .map( + error -> + ErrorResponseDto.FieldErrorDetail.of( + error.getField(), error.getDefaultMessage())) + .toList(); // errorResponseDto 생성 - ErrorResponseDto errorResponseDto = ErrorResponseDto.of( - ErrorCode.INVALID_INPUT_VALUE.getStatus(), - ErrorCode.INVALID_INPUT_VALUE.getMessage(), fieldErrors); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); - return ResponseEntity - .status(HttpStatus.BAD_REQUEST) - .body(errorResponseDto); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponseDto); } // bindingResult에 에러가 없는 경우 - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(HttpStatus.BAD_REQUEST.value(), - "Invalid Request"); - return ResponseEntity - .status(HttpStatus.BAD_REQUEST) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(HttpStatus.BAD_REQUEST.value(), "Invalid Request"); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponseDto); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity constraintViolationExceptionHandler( - ConstraintViolationException e) { + ConstraintViolationException e) { Set> constraintViolations = e.getConstraintViolations(); - List fieldErrors = constraintViolations.stream() - .map(violation -> ErrorResponseDto.FieldErrorDetail.of( - violation.getPropertyPath().toString(), violation.getMessage())) - .toList(); - - ErrorResponseDto errorResponseDto = ErrorResponseDto.of( - ErrorCode.INVALID_INPUT_VALUE.getStatus(), ErrorCode.INVALID_INPUT_VALUE.getMessage(), - fieldErrors); - return ResponseEntity - .status(ErrorCode.INVALID_INPUT_VALUE.getStatus()) - .body(errorResponseDto); + List fieldErrors = + constraintViolations.stream() + .map( + violation -> + ErrorResponseDto.FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .toList(); + + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); + return ResponseEntity.status(ErrorCode.INVALID_INPUT_VALUE.getStatus()).body(errorResponseDto); } @Operation(summary = "TTS 문장 생성 요청") @PostMapping("/sentence") public ResponseEntity> registerSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody TtsSentenceRequest createRequest, - HttpSession session) { - //회원의 정보인지 확인 + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody + TtsSentenceRequest createRequest, + HttpSession session) { + // 회원의 정보인지 확인 Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 문장 생성 TtsSentenceDto response = ttsSentenceService.addSentence(proSeq, createRequest); - return ResponseEntity - .status(HttpStatus.CREATED) - .body(new ResponseDto<>(HttpStatus.CREATED.value(), response)); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new ResponseDto<>(HttpStatus.CREATED.value(), response)); } @Operation(summary = "TTS 문장 수정 요청") @PutMapping("/sentence/{tsSeq}") public ResponseEntity> updateSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "TTS 문장 ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, - @Parameter(description = "tts 문장 수정 요청 body") @Valid @RequestBody TtsSentenceRequest updateRequest, - HttpSession session) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "TTS 문장 ID") + @Min(value = 1L, message = "tsSeq is invalid") + @PathVariable + Long tsSeq, + @Parameter(description = "tts 문장 수정 요청 body") @Valid @RequestBody + TtsSentenceRequest updateRequest, + HttpSession session) { // 회원의 정보인지 확인 Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); @@ -164,70 +175,80 @@ public ResponseEntity> updateSentence( ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); // 문장 수정 - TtsSentenceDto response = ttsSentenceService.updateSentence(proSeq, tsSeq, - updateRequest); + TtsSentenceDto response = ttsSentenceService.updateSentence(proSeq, tsSeq, updateRequest); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } - @Operation(summary = "TTS 현재 상태 저장 (저장 및 수정)", description = "TTS 문장 저장 시 정렬을 합니다. 순서 정보가 null 인 경우는 전부 뒤로 보낼 것이며, null 인 객체간의 순서는 보장되지 않습니다.") + @Operation( + summary = "TTS 현재 상태 저장 (저장 및 수정)", + description = + "TTS 문장 저장 시 정렬을 합니다. 순서 정보가 null 인 경우는 전부 뒤로 보낼 것이며, null 인 객체간의 순서는 보장되지 않습니다.") @PostMapping("/batch") public ResponseEntity> batchSave( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody TtsSentenceBatchRequest batchRequest, - HttpSession session) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "tts 문장 생성 요청 body") @Valid @RequestBody + TtsSentenceBatchRequest batchRequest, + HttpSession session) { // 회원의 정보인지 확인 Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) - ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, - batchRequest.getSentenceList()); + ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, batchRequest.getSentenceList()); // 문장 생성 및 수정 - TtsSentenceListDto response = ttsSentenceService.batchSaveSentence(proSeq, - batchRequest); + TtsSentenceListDto response = ttsSentenceService.batchSaveSentence(proSeq, batchRequest); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } @Operation(summary = "TTS 문장 조회 요청") @GetMapping("/sentence/{tsSeq}") public ResponseEntity> getSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "TTS 문장 ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "TTS 문장 ID") + @Min(value = 1L, message = "tsSeq is invalid") + @PathVariable + Long tsSeq) { // 문장 조회 TtsSentenceDto response = ttsSentenceService.getSentence(proSeq, tsSeq); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } @Operation(summary = "프로젝트 TTS 조회") @GetMapping("") public ResponseEntity> getSentenceList( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq) { // 프로젝트 TTS 조회 TtsSentenceListDto response = ttsSentenceService.getSentenceList(proSeq); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), response)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), response)); } @Operation(summary = "TTS 생성 요청", description = "TTS 문장을 저장한 후 수행해주세요!") @GetMapping("/sentence/{tsSeq}/maketts") public ResponseEntity> makeTts( - @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq, - @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, - HttpSession session) { + @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable + Long tsSeq, + @Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq, + HttpSession session) { // 회원의 정보인지 확인 Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); @@ -238,49 +259,50 @@ public ResponseEntity> makeTts( // tts 생성 TtsSentenceDto ttsSentenceDto = ttsMakeService.makeTts(tsSeq); - return ResponseEntity - .status(HttpStatus.CREATED) - .body( - new ResponseDto<>( - HttpStatus.CREATED.value(), - ttsSentenceDto - ) - ); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new ResponseDto<>(HttpStatus.CREATED.value(), ttsSentenceDto)); } -// @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") -// @GetMapping("/sentence/{tsSeq}/maketts/multi") -// public ResponseEntity> makeTtsMuti( -// @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) @PathVariable Long tsSeq -// ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq -// , @SessionAttribute(value = "memberSeq") Long memberSeq -// ) { -// -// // 회원의 정보인지 확인 -// projectService.projectCheck(memberSeq, proSeq); -// -// // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) -// ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); -// -// // tts 생성 -// TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); -// -// return ResponseEntity -// .status(HttpStatus.CREATED) -// .body( -// new ResponseDto<>( -// HttpStatus.CREATED.value(), -// ttsMakeResult -// ) -// ); -// } + // @Operation(summary = "TTS 생성 요청(큐 작업)", description = "TTS 문장을 저장한 후 수행해주세요!") + // @GetMapping("/sentence/{tsSeq}/maketts/multi") + // public ResponseEntity> makeTtsMuti( + // @Parameter(description = "TTS Sentence ID (문장 식별 번호)") @Min(value = 1L) + // @PathVariable Long tsSeq + // ,@Parameter(description = "Project ID") @Min(value = 1L) @PathVariable Long proSeq + // , @SessionAttribute(value = "memberSeq") Long memberSeq + // ) { + // + // // 회원의 정보인지 확인 + // projectService.projectCheck(memberSeq, proSeq); + // + // // 해당 문장을 소유한 멤버인지 확인 (문장 수정 권한 확인) + // ttsSentenceService.checkSentenceWithMember(memberSeq, proSeq, tsSeq); + // + // // tts 생성 + // TtsSentenceDto ttsMakeResult = ttsMakeService.makeTtsMulti(tsSeq); + // + // return ResponseEntity + // .status(HttpStatus.CREATED) + // .body( + // new ResponseDto<>( + // HttpStatus.CREATED.value(), + // ttsMakeResult + // ) + // ); + // } @Operation(summary = "TTS 문장 삭제 요청") @DeleteMapping("/sentence/{tsSeq}") public ResponseEntity> deleteSentence( - @Parameter(description = "Project ID") @Min(value = 1L, message = "projectSeq is invalid") @PathVariable Long proSeq, - @Parameter(description = "TTS 문장 ID") @Min(value = 1L, message = "tsSeq is invalid") @PathVariable Long tsSeq, - HttpSession session) { + @Parameter(description = "Project ID") + @Min(value = 1L, message = "projectSeq is invalid") + @PathVariable + Long proSeq, + @Parameter(description = "TTS 문장 ID") + @Min(value = 1L, message = "tsSeq is invalid") + @PathVariable + Long tsSeq, + HttpSession session) { // 회원의 정보인지 확인 Long memberSeq = (Long) session.getAttribute("memberSeq"); projectService.projectCheck(memberSeq, proSeq); @@ -294,8 +316,7 @@ public ResponseEntity> deleteSentence( // 응답 메시지 String message = response ? "삭제 성공" : "삭제 실패"; - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>(HttpStatus.OK.value(), message)); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), message)); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java index 69ae9775..136dec33 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/controller/VoiceController.java @@ -12,16 +12,15 @@ import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.constraints.NotNull; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - @Tag(name = "TTS-Voice", description = "Voice 관련 API") @Slf4j @RestController @@ -39,9 +38,11 @@ public VoiceController(VoiceService voiceService) { public ResponseEntity runtimeExceptionHandler(RuntimeException e) { log.error("[RuntimeException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); - return ResponseEntity - .status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INTERNAL_SERVER_ERROR.getStatus(), + ErrorCode.INTERNAL_SERVER_ERROR.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) .body(errorResponseDto); } @@ -49,41 +50,46 @@ public ResponseEntity runtimeExceptionHandler(RuntimeException public ResponseEntity ttsExceptionHandler(BusinessException e) { log.error("[BusinessException]", e); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); - return ResponseEntity - .status(e.getErrorCode().getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of(e.getErrorCode().getStatus(), e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(errorResponseDto); } @ExceptionHandler(ConstraintViolationException.class) - public ResponseEntity constraintViolationExceptionHandler(ConstraintViolationException e) { + public ResponseEntity constraintViolationExceptionHandler( + ConstraintViolationException e) { Set> constraintViolations = e.getConstraintViolations(); - List fieldErrors = constraintViolations.stream() - .map(violation -> ErrorResponseDto.FieldErrorDetail.of(violation.getPropertyPath().toString(), violation.getMessage())) - .collect(Collectors.toList()); + List fieldErrors = + constraintViolations.stream() + .map( + violation -> + ErrorResponseDto.FieldErrorDetail.of( + violation.getPropertyPath().toString(), violation.getMessage())) + .collect(Collectors.toList()); - ErrorResponseDto errorResponseDto = ErrorResponseDto.of(ErrorCode.INVALID_INPUT_VALUE.getStatus(), ErrorCode.INVALID_INPUT_VALUE.getMessage(), fieldErrors); - return ResponseEntity - .status(ErrorCode.INVALID_INPUT_VALUE.getStatus()) - .body(errorResponseDto); + ErrorResponseDto errorResponseDto = + ErrorResponseDto.of( + ErrorCode.INVALID_INPUT_VALUE.getStatus(), + ErrorCode.INVALID_INPUT_VALUE.getMessage(), + fieldErrors); + return ResponseEntity.status(ErrorCode.INVALID_INPUT_VALUE.getStatus()).body(errorResponseDto); } // 보이스 조건 조회 컨트롤러 - @Operation(summary = "언어코드, 스타일명으로 목소리 조회", description = "DB에 저장된 언어 코드, 스타일 명을 쿼리스트링으로 반드시 전달해야합니다.") + @Operation( + summary = "언어코드, 스타일명으로 목소리 조회", + description = "DB에 저장된 언어 코드, 스타일 명을 쿼리스트링으로 반드시 전달해야합니다.") @GetMapping("") public ResponseEntity> getVoiceList( - @Parameter(description = "언어 코드(언어 식별 번호가 아닙니다)") @RequestParam("languagecode") @NotNull String langCode, - @Parameter(description = "스타일명(스타일 식별 번호가 아닙니다)") @RequestParam("stylename") @NotNull String styleName - ) { + @Parameter(description = "언어 코드(언어 식별 번호가 아닙니다)") @RequestParam("languagecode") @NotNull + String langCode, + @Parameter(description = "스타일명(스타일 식별 번호가 아닙니다)") @RequestParam("stylename") @NotNull + String styleName) { // 보이스 조회 결과 가져오기 VoiceListDto voiceListDto = voiceService.getVoiceList(langCode, styleName); - return ResponseEntity - .status(HttpStatus.OK) - .body(new ResponseDto<>( - HttpStatus.OK.value(), - voiceListDto - )); + return ResponseEntity.status(HttpStatus.OK) + .body(new ResponseDto<>(HttpStatus.OK.value(), voiceListDto)); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java index 7eaf8414..5420cef9 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/external/common/TtsSentenceDto.java @@ -1,6 +1,5 @@ package com.oreo.finalproject_5re5_be.tts.dto.external.common; - import com.oreo.finalproject_5re5_be.tts.entity.TtsSentence; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java index bb7bc0a2..7bca916a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAttributeInfo.java @@ -21,36 +21,45 @@ public class TtsAttributeInfo { @NotNull(message = "volume 는 필수 입력값입니다.") @Min(value = -10, message = "volume 는 -10이상 부터 설정할 수 있습니다.") @Max(value = 10, message = "volume 는 10이하 까지 설정할 수 있습니다.") - private Integer volume; // 음성 크기 + private Integer volume; // 음성 크기 @Schema(description = "음성 속도", example = "1.0") @Positive(message = "speed 는 0.25이상 부터 설정할 수 있습니다.") // 양수 허용 - private Float speed; // 음성 속도 + private Float speed; // 음성 속도 @Schema(description = "시작 음성 높낮이", example = "0") @Min(value = -20, message = "stPitch 는 -20이상 부터 설정할 수 있습니다.") @Max(value = 20, message = "stPitch 는 20이하 까지 설정할 수 있습니다.") - private Integer stPitch; // 시작 음성 높낮이 + private Integer stPitch; // 시작 음성 높낮이 @Schema(description = "감정 구분", example = "neutral") - private String emotion; // 감정 구분 + private String emotion; // 감정 구분 @Schema(description = "감정 강도", example = "100") - private Integer emotionStrength; // 감정 강도 + private Integer emotionStrength; // 감정 강도 @Schema(description = "샘플 속도", example = "16000") - private Integer sampleRate; // 샘플 속도 + private Integer sampleRate; // 샘플 속도 @Schema(description = "음색", example = "0") - private Integer alpha; // 음색 + private Integer alpha; // 음색 @Schema(description = "마지막 음성 높낮이", example = "0") - private Float endPitch; // 마지막 음성 높낮이 + private Float endPitch; // 마지막 음성 높낮이 @Schema(description = "오디오 파일 포맷", example = "wav") - private String audioFormat; // 오디오 파일 포맷 + private String audioFormat; // 오디오 파일 포맷 - public static TtsAttributeInfo of(Integer volume, Float speed, Integer stPitch, String emotion, Integer emotionStrength, Integer sampleRate, Integer alpha, Float endPitch, String audioFormat) { + public static TtsAttributeInfo of( + Integer volume, + Float speed, + Integer stPitch, + String emotion, + Integer emotionStrength, + Integer sampleRate, + Integer alpha, + Float endPitch, + String audioFormat) { return TtsAttributeInfo.builder() .volume(volume) .speed(speed) diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java index ae3b503b..0053e0fa 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsAudioFileInfo.java @@ -8,10 +8,10 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder public class TtsAudioFileInfo { - private Long ttsAudioSeq; // TTS 오디오 파일 식별번호 - private String audioUrl; // 오디오 파일 경로 - private Character downloadYn; // 다운로드 가능 여부 - private Character audioPlayYn; // 재생 가능 여부 + private Long ttsAudioSeq; // TTS 오디오 파일 식별번호 + private String audioUrl; // 오디오 파일 경로 + private Character downloadYn; // 다운로드 가능 여부 + private Character audioPlayYn; // 재생 가능 여부 public static TtsAudioFileInfo of(TtsAudioFile ttsAudioFile) { // null check diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java index 70ee3fc2..76186a2a 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchInfo.java @@ -3,10 +3,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.oreo.finalproject_5re5_be.global.constant.BatchProcessType; import com.oreo.finalproject_5re5_be.tts.dto.response.SentenceInfo; -import com.oreo.finalproject_5re5_be.tts.exception.InValidRequestException; import jakarta.validation.constraints.NotNull; import lombok.*; -import org.springframework.web.bind.MethodArgumentNotValidException; @Getter @Setter(AccessLevel.PRIVATE) @@ -15,17 +13,14 @@ public class TtsSentenceBatchInfo { BatchProcessType batchProcessType; - @NotNull - SentenceInfo sentence; + @NotNull SentenceInfo sentence; @JsonCreator - public static TtsSentenceBatchInfo of(BatchProcessType batchProcessType, - SentenceInfo sentenceInfo) { + public static TtsSentenceBatchInfo of( + BatchProcessType batchProcessType, SentenceInfo sentenceInfo) { TtsSentenceBatchInfo ttsSentenceBatchInfo = new TtsSentenceBatchInfo(); ttsSentenceBatchInfo.setBatchProcessType(batchProcessType); ttsSentenceBatchInfo.setSentence(sentenceInfo); return ttsSentenceBatchInfo; } - - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java index 0e191e8f..0d98bcc3 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceBatchRequest.java @@ -5,14 +5,13 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import java.util.ArrayList; +import java.util.List; import java.util.stream.Collectors; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - @Getter @NoArgsConstructor @AllArgsConstructor @@ -25,9 +24,10 @@ public class TtsSentenceBatchRequest { public List sortSentenceList() { // 정렬 - List sortedSentencelist = sentenceList.stream() - .sorted(new TtsSentenceComparator()).collect( - Collectors.toCollection(ArrayList::new)); + List sortedSentencelist = + sentenceList.stream() + .sorted(new TtsSentenceComparator()) + .collect(Collectors.toCollection(ArrayList::new)); // 정렬 순서 수정 for (int orderIndex = 0; orderIndex < sortedSentencelist.size(); orderIndex++) { @@ -36,8 +36,9 @@ public List sortSentenceList() { // orderIndex 순서로 수정 SentenceInfo withOrderSentence = SentenceInfo.withOrder(sentenceInfo, orderIndex); // orderIndex 순서로 수정된 SentenceInfo 로 TtsSentenceBatchInfo 생성 - TtsSentenceBatchInfo withOrderBatchInfo = TtsSentenceBatchInfo.of( - sortedSentencelist.get(orderIndex).getBatchProcessType(), withOrderSentence); + TtsSentenceBatchInfo withOrderBatchInfo = + TtsSentenceBatchInfo.of( + sortedSentencelist.get(orderIndex).getBatchProcessType(), withOrderSentence); // orderIndex 순서로 수정된 TtsSentenceBatchInfo 로 변경 sortedSentencelist.set(orderIndex, withOrderBatchInfo); } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java index 73e56f25..890336dd 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/request/TtsSentenceRequest.java @@ -22,16 +22,17 @@ public class TtsSentenceRequest { @Schema(description = "텍스트 내용", example = "안녕하세요") @NotBlank(message = "text is required") - private String text; // 텍스트 내용 + private String text; // 텍스트 내용 @Schema(description = "표시 순서", example = "1") - private Integer order; // 표시 순서 + private Integer order; // 표시 순서 @Schema(description = "옵션 정보") @Valid private TtsAttributeInfo attribute; // 옵션 정보 - public static TtsSentenceRequest of(Long voiceSeq, String text, Integer order, TtsAttributeInfo attribute) { + public static TtsSentenceRequest of( + Long voiceSeq, String text, Integer order, TtsAttributeInfo attribute) { return TtsSentenceRequest.builder() .voiceSeq(voiceSeq) .text(text) @@ -39,6 +40,4 @@ public static TtsSentenceRequest of(Long voiceSeq, String text, Integer order, T .attribute(attribute) .build(); } - - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java index 716ef660..443c630c 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageDto.java @@ -24,5 +24,4 @@ public static LanguageDto of(Language language) { .regionName(language.getRegionName()) .build(); } - -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java index b43e173e..4bcd54ec 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/LanguageListDto.java @@ -1,13 +1,12 @@ package com.oreo.finalproject_5re5_be.tts.dto.response; import com.oreo.finalproject_5re5_be.tts.entity.Language; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - @Getter @Builder @NoArgsConstructor @@ -15,14 +14,9 @@ public class LanguageListDto { private List languageList; - public static LanguageListDto of(List languageList) { - List list = languageList.stream() - .map(LanguageDto::of) - .toList(); + List list = languageList.stream().map(LanguageDto::of).toList(); - return LanguageListDto.builder() - .languageList(list) - .build(); + return LanguageListDto.builder().languageList(list).build(); } } diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java index 4a1566bd..a1dc37f0 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/SentenceInfo.java @@ -15,14 +15,14 @@ @Builder public class SentenceInfo { private Long tsSeq; // 행 id - private Long voiceSeq; // 목소리 id - private String text; // 텍스트 내용 + private Long voiceSeq; // 목소리 id + private String text; // 텍스트 내용 @Min(value = 0) - private Integer order; // 표시 순서 + private Integer order; // 표시 순서 private TtsAttributeInfo ttsAttributeInfo; // 옵션 정보 - private TtsAudioFileInfo ttsAudioFileInfo; // TTS 오디오 정보 + private TtsAudioFileInfo ttsAudioFileInfo; // TTS 오디오 정보 public static SentenceInfo of(TtsSentence ttsSentence) { diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java index 1482100a..8464ae80 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleDto.java @@ -24,4 +24,4 @@ public static StyleDto of(Style style) { .desc(style.getDescription()) .build(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java index 073bbd79..ca8dcbd5 100644 --- a/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java +++ b/src/main/java/com/oreo/finalproject_5re5_be/tts/dto/response/StyleListDto.java @@ -1,13 +1,12 @@ package com.oreo.finalproject_5re5_be.tts.dto.response; import com.oreo.finalproject_5re5_be.tts.entity.Style; +import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.List; - @Getter @Builder @NoArgsConstructor @@ -16,12 +15,8 @@ public class StyleListDto { private List styleList; public static StyleListDto of(List