From d25be84a6cea7a1d2dc6e364f66d6f7086dbe539 Mon Sep 17 00:00:00 2001 From: MIN Date: Fri, 12 Dec 2025 15:34:53 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor=20:=20=EC=96=B4=EB=93=9C=EB=AF=BC?= =?UTF-8?q?=20=EB=AC=B8=EC=A0=9C=20=EC=B6=94=EA=B0=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../problemmanagement/problem/ProblemAdminController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/presentation/problemmanagement/problem/ProblemAdminController.java b/src/main/java/org/ezcode/codetest/presentation/problemmanagement/problem/ProblemAdminController.java index 4f130703..f494d43f 100644 --- a/src/main/java/org/ezcode/codetest/presentation/problemmanagement/problem/ProblemAdminController.java +++ b/src/main/java/org/ezcode/codetest/presentation/problemmanagement/problem/ProblemAdminController.java @@ -41,7 +41,7 @@ public class ProblemAdminController { @Operation(summary = "문제 등록", description = "문제를 등록합니다.") @ApiResponse(responseCode = "201", description = "문제 생성 성공") public ResponseEntity createProblem( - @RequestPart @Valid ProblemCreateRequest request, + @RequestPart("request") @Valid ProblemCreateRequest request, @RequestPart(value = "image", required = false) MultipartFile image, @AuthenticationPrincipal AuthUser user ) { @@ -56,7 +56,7 @@ public ResponseEntity createProblem( @ApiResponse(responseCode = "200", description = "문제 수정 성공") public ResponseEntity modifyProblem( @PathVariable Long problemId, - @RequestPart @Valid ProblemUpdateRequest request, + @RequestPart("request") @Valid ProblemUpdateRequest request, @RequestPart(value = "image", required = false) MultipartFile image ) { problemService.modifyProblem(problemId, request, image); From ac680586078d50e5529a174144651b8494b396ed Mon Sep 17 00:00:00 2001 From: MIN Date: Fri, 26 Dec 2025 11:52:20 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor=20:=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=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 --- .../problem/dto/request/ProblemUpdateRequest.java | 8 ++++---- .../application/problem/service/ProblemService.java | 4 ++++ .../domain/problem/service/ProblemDomainService.java | 5 +++-- .../infrastructure/s3/exception/code/S3ExceptionCode.java | 3 ++- .../application/problem/service/ProblemServiceTest.java | 4 ++-- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/application/problem/dto/request/ProblemUpdateRequest.java b/src/main/java/org/ezcode/codetest/application/problem/dto/request/ProblemUpdateRequest.java index 9b566844..87be4cb5 100644 --- a/src/main/java/org/ezcode/codetest/application/problem/dto/request/ProblemUpdateRequest.java +++ b/src/main/java/org/ezcode/codetest/application/problem/dto/request/ProblemUpdateRequest.java @@ -1,6 +1,6 @@ package org.ezcode.codetest.application.problem.dto.request; -import java.util.List; +import java.util.Map; import org.ezcode.codetest.domain.problem.model.entity.Problem; import org.ezcode.codetest.domain.problem.model.enums.Difficulty; @@ -11,9 +11,9 @@ public record ProblemUpdateRequest( - // 리스트 이므로, [] 대괄호 사용 - @Schema(description = "카테고리", example = "FOR_BEGINNER") - List categories, + // Map으로 묶여있으니 {} 중괄호 사용 + @Schema(description = "카테고리 코드 식별자(영어) / 한글 이름", example = "FOR_BEGINNER : 입문자용") + Map categories, @Schema(description = "제목", example = "A+B") String title, diff --git a/src/main/java/org/ezcode/codetest/application/problem/service/ProblemService.java b/src/main/java/org/ezcode/codetest/application/problem/service/ProblemService.java index e37dc7dc..008872a9 100644 --- a/src/main/java/org/ezcode/codetest/application/problem/service/ProblemService.java +++ b/src/main/java/org/ezcode/codetest/application/problem/service/ProblemService.java @@ -190,6 +190,10 @@ private void updateProblemImage(Problem problem, MultipartFile newImage) { @Transactional public void addImageToExistingProblem(Long problemId, MultipartFile imageFile) { + if (imageFile == null || imageFile.isEmpty()) { + throw new S3Exception(S3ExceptionCode.S3_FILE_EMPTY); + } + Problem problem = problemDomainService.getProblem(problemId); // 1. S3 업로드 diff --git a/src/main/java/org/ezcode/codetest/domain/problem/service/ProblemDomainService.java b/src/main/java/org/ezcode/codetest/domain/problem/service/ProblemDomainService.java index 1d0c5f1f..dfc63a6a 100644 --- a/src/main/java/org/ezcode/codetest/domain/problem/service/ProblemDomainService.java +++ b/src/main/java/org/ezcode/codetest/domain/problem/service/ProblemDomainService.java @@ -48,11 +48,12 @@ public List getProblemsCategoryList(List problem) { return problemCategoryRepository.findByProblemIdsIn(problemIds); } - public void updateCategoryAndSearchEngine(Problem problem, List categories) { + public void updateCategoryAndSearchEngine(Problem problem, Map categories) { problemCategoryRepository.deleteAllByProblemId(problem.getId()); - List categoryList = categoryRepository.findAllByCategoryCodeIn(categories); + List codes = new ArrayList<>(categories.keySet()); + List categoryList = categoryRepository.findAllByCategoryCodeIn(codes); List problemCategories = categoryList.stream() .map(cat -> ProblemCategory.from(problem, cat)) diff --git a/src/main/java/org/ezcode/codetest/infrastructure/s3/exception/code/S3ExceptionCode.java b/src/main/java/org/ezcode/codetest/infrastructure/s3/exception/code/S3ExceptionCode.java index 991d48e8..dc4217e5 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/s3/exception/code/S3ExceptionCode.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/s3/exception/code/S3ExceptionCode.java @@ -13,7 +13,8 @@ public enum S3ExceptionCode implements ResponseCode { S3_UPLOAD_FAILED(false, HttpStatus.INTERNAL_SERVER_ERROR, "S3 이미지 업로드 중 오류가 발생 했습니다."), S3_INVALID_FILE_TYPE(false, HttpStatus.BAD_REQUEST, "이미지 파일만 업로드할 수 있습니다."), S3_DELETE_FAILED(false, HttpStatus.INTERNAL_SERVER_ERROR, "S3 이미지 삭제 중 오류가 발생 했습니다."), - S3_FILE_TOO_LARGE(false, HttpStatus.BAD_REQUEST, "파일 크기가 허용 범위를 초과했습니다."); + S3_FILE_TOO_LARGE(false, HttpStatus.BAD_REQUEST, "파일 크기가 허용 범위를 초과했습니다."), + S3_FILE_EMPTY(false, HttpStatus.BAD_REQUEST, "업로드할 이미지 파일이 없습니다."); private final boolean success; diff --git a/src/test/java/org/ezcode/codetest/application/problem/service/ProblemServiceTest.java b/src/test/java/org/ezcode/codetest/application/problem/service/ProblemServiceTest.java index fae34356..9329ea9b 100644 --- a/src/test/java/org/ezcode/codetest/application/problem/service/ProblemServiceTest.java +++ b/src/test/java/org/ezcode/codetest/application/problem/service/ProblemServiceTest.java @@ -163,13 +163,13 @@ void modifyProblem() { when(problemDomainService.getProblem(1L)).thenReturn(problem); when(updateRequest.title()).thenReturn("새 제목"); - when(updateRequest.categories()).thenReturn(List.of("MATH")); + when(updateRequest.categories()).thenReturn(Map.of("MATH", "수학")); // when problemService.modifyProblem(1L, updateRequest, null); // then verify(problem).update(any(), any(), any(), any(), any(), any(), any()); - verify(problemDomainService).updateCategoryAndSearchEngine(problem, List.of("MATH")); + verify(problemDomainService).updateCategoryAndSearchEngine(problem, Map.of("MATH", "수학")); } @Test