From c5e672fdaf1ca84d4e2462846f72a5ba2409eba5 Mon Sep 17 00:00:00 2001 From: HongGit Date: Tue, 1 Oct 2024 21:04:45 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT/#22]=20=EB=B9=88=EA=B0=92=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 +++ .../server/controller/OrdersController.java | 3 ++- .../rootandfruit/server/dto/OrderRequestDto.java | 10 +++++++--- .../com/rootandfruit/server/dto/ProductDto.java | 5 +++++ .../com/rootandfruit/server/dto/RecipientDto.java | 15 +++++++++++++-- .../server/global/common/ResponseDto.java | 1 + .../global/exception/GlobalExceptionHandler.java | 8 ++++++++ .../global/exception/ResponseDtoAdvice.java | 2 ++ 8 files changed, 41 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index cbb26c1..a899a99 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,9 @@ dependencies { // JPA implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + // Validation + implementation 'org.springframework.boot:spring-boot-starter-validation' + // WEB implementation 'org.springframework.boot:spring-boot-starter-web' diff --git a/src/main/java/com/rootandfruit/server/controller/OrdersController.java b/src/main/java/com/rootandfruit/server/controller/OrdersController.java index 4c77193..56c5354 100644 --- a/src/main/java/com/rootandfruit/server/controller/OrdersController.java +++ b/src/main/java/com/rootandfruit/server/controller/OrdersController.java @@ -5,6 +5,7 @@ import com.rootandfruit.server.dto.OrderRequestDto; import com.rootandfruit.server.dto.OrderResponseDto; import com.rootandfruit.server.service.OrdersService; +import jakarta.validation.Valid; import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; @@ -27,7 +28,7 @@ public class OrdersController implements OrdersControllerDocs { @PostMapping("order") public ResponseEntity order( - @RequestBody OrderRequestDto orderRequestDto + @Valid @RequestBody OrderRequestDto orderRequestDto ) { return ResponseEntity.ok(ordersService.order(orderRequestDto)); } diff --git a/src/main/java/com/rootandfruit/server/dto/OrderRequestDto.java b/src/main/java/com/rootandfruit/server/dto/OrderRequestDto.java index e3a14ed..04fe742 100644 --- a/src/main/java/com/rootandfruit/server/dto/OrderRequestDto.java +++ b/src/main/java/com/rootandfruit/server/dto/OrderRequestDto.java @@ -1,13 +1,17 @@ package com.rootandfruit.server.dto; -import jakarta.persistence.Column; -import java.time.LocalDate; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import java.util.List; public record OrderRequestDto( + @NotBlank(message = "발신자명은 필수입니다.") String senderName, + @NotBlank(message = "발신자 전화번호는 필수입니다.") String senderPhone, boolean isMarketingConsent, - List recipientInfo + @NotEmpty(message = "수신자 정보는 빈 값일 수 없습니다.") + @Valid List recipientInfo ) { } diff --git a/src/main/java/com/rootandfruit/server/dto/ProductDto.java b/src/main/java/com/rootandfruit/server/dto/ProductDto.java index 2c89c71..1a0f75d 100644 --- a/src/main/java/com/rootandfruit/server/dto/ProductDto.java +++ b/src/main/java/com/rootandfruit/server/dto/ProductDto.java @@ -1,7 +1,12 @@ package com.rootandfruit.server.dto; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + public record ProductDto( + @NotNull(message = "상품ID는 null값일 수 없습니다.") Long productId, + @NotBlank(message = "상품명은 빈 값일 수 없습니다.") String productName, int productCount ) { diff --git a/src/main/java/com/rootandfruit/server/dto/RecipientDto.java b/src/main/java/com/rootandfruit/server/dto/RecipientDto.java index f2b48db..e6421ea 100644 --- a/src/main/java/com/rootandfruit/server/dto/RecipientDto.java +++ b/src/main/java/com/rootandfruit/server/dto/RecipientDto.java @@ -1,15 +1,26 @@ package com.rootandfruit.server.dto; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; import java.util.List; public record RecipientDto( + @NotBlank(message = "수신자명은 필수입니다.") String recipientName, + @NotBlank(message = "수신자 전화번호는 필수입니다.") String recipientPhone, + @NotBlank(message = "수신자 주소는 필수입니다.") String recipientAddress, + @NotBlank(message = "수신자 상세주소는 필수입니다.") String recipientAddressDetail, + @NotBlank(message = "수신자 우편번호는 필수입니다.") String recipientPostCode, - List productInfo, + @NotEmpty(message = "상품정보는 빈 값일 수 없습니다.") + @Valid List productInfo, + @NotNull(message = "배송날짜는 null값일 수 없습니다.") LocalDate deliveryDate ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/rootandfruit/server/global/common/ResponseDto.java b/src/main/java/com/rootandfruit/server/global/common/ResponseDto.java index fee4ad0..e338bf4 100644 --- a/src/main/java/com/rootandfruit/server/global/common/ResponseDto.java +++ b/src/main/java/com/rootandfruit/server/global/common/ResponseDto.java @@ -16,4 +16,5 @@ public static ResponseDto success(final T data) { public static ResponseDto fail(ErrorType errorType) { return new ResponseDto<>(errorType.getCode(), null, errorType.getMessage()); } + } diff --git a/src/main/java/com/rootandfruit/server/global/exception/GlobalExceptionHandler.java b/src/main/java/com/rootandfruit/server/global/exception/GlobalExceptionHandler.java index eabe1a3..5356b44 100644 --- a/src/main/java/com/rootandfruit/server/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/rootandfruit/server/global/exception/GlobalExceptionHandler.java @@ -15,4 +15,12 @@ public ResponseEntity handleBusinessException(CustomException e) { .status(e.getErrorType().getHttpStatus()) .body(e.getErrorType()); } + + // valid에서 발생한 예외 + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + return ResponseEntity + .status(e.getStatusCode()) + .body(ErrorType.INVALID_HTTP_REQUEST_ERROR); + } } diff --git a/src/main/java/com/rootandfruit/server/global/exception/ResponseDtoAdvice.java b/src/main/java/com/rootandfruit/server/global/exception/ResponseDtoAdvice.java index f658865..c19762c 100644 --- a/src/main/java/com/rootandfruit/server/global/exception/ResponseDtoAdvice.java +++ b/src/main/java/com/rootandfruit/server/global/exception/ResponseDtoAdvice.java @@ -12,6 +12,8 @@ @RestControllerAdvice( basePackages = "com.rootandfruit.server" ) + +// TODO: 구현을 숨기고 이해를 어렵게한다는 이유로 곧 disable될 예정 public class ResponseDtoAdvice implements ResponseBodyAdvice { @Override