diff --git a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java index 17891f7..c512686 100644 --- a/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java +++ b/order-service/src/main/java/com/justpickup/orderservice/domain/order/web/OrderController.java @@ -30,7 +30,7 @@ public class OrderController { private final OrderService orderService; @GetMapping("/orderMain") - public ResponseEntity orderMain(@Valid OrderController.OrderMainRequest orderMainRequest) { + public ResponseEntity orderMain(@Valid OrderMainRequest orderMainRequest) { List orderDto = orderService.findOrderMain(orderMainRequest.convertOrderTimeToLocalDate()); @@ -45,7 +45,8 @@ public class OrderController { @Data @NoArgsConstructor @AllArgsConstructor static class OrderMainRequest { // yyyy-mm-dd 형태를 가지는 패턴 조사 - @Pattern(regexp = "^(19|20)\\d{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[0-1])$") + @Pattern(regexp = "^(19|20)\\d{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[0-1])$", + message = "YYYY-MM-DD 형식에 맞게 작성되지 않았습니다.") private String orderTime; public LocalDate convertOrderTimeToLocalDate() { diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/exception/CustomException.java b/order-service/src/main/java/com/justpickup/orderservice/global/exception/CustomException.java new file mode 100644 index 0000000..bcf00ab --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/exception/CustomException.java @@ -0,0 +1,14 @@ +package com.justpickup.orderservice.global.exception; + +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException { + + private ErrorEnum errorEnum; + + protected CustomException(ErrorEnum errorEnum) { + super(errorEnum.getMessage()); + this.errorEnum = errorEnum; + } +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/exception/ErrorEnum.java b/order-service/src/main/java/com/justpickup/orderservice/global/exception/ErrorEnum.java new file mode 100644 index 0000000..c769488 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/exception/ErrorEnum.java @@ -0,0 +1,17 @@ +package com.justpickup.orderservice.global.exception; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum ErrorEnum { + + NOT_EXIST_ORDER(HttpStatus.CONFLICT, "존재하지 않은 주문입니다."); + + private final HttpStatus httpStatus; + private final String message; +} diff --git a/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java b/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..eaefdb3 --- /dev/null +++ b/order-service/src/main/java/com/justpickup/orderservice/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,73 @@ +package com.justpickup.orderservice.global.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @ExceptionHandler(CustomException.class) + public ResponseEntity customExceptionHandler(CustomException ce) { + ErrorEnum errorEnum = ce.getErrorEnum(); + + log.warn("##################################################"); + log.warn("## CustomException = {}", errorEnum); + log.warn("##################################################"); + + HttpStatus errorHttpStatus = errorEnum.getHttpStatus(); + + return ResponseEntity.status(errorHttpStatus) + .body(new ErrorBody(errorEnum.getMessage(), errorHttpStatus.getReasonPhrase())); + } + + @ExceptionHandler(BindException.class) + public ResponseEntity bindExceptionHandler(BindException exception) { + return getValidationErrorBody(exception); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) { + return getValidationErrorBody(exception); + } + + private ResponseEntity getValidationErrorBody(BindException exception) { + BindingResult bindingResult = exception.getBindingResult(); + + StringBuilder builder = new StringBuilder(); + bindingResult.getFieldErrors() + .forEach(fieldError -> { + builder.append("["); + builder.append(fieldError.getField()); + builder.append("](은)는 "); + builder.append(fieldError.getDefaultMessage()); + builder.append(" 입력된 값: ["); + builder.append(fieldError.getRejectedValue()); + builder.append("]"); + }); + + ErrorBody errorBody = new ErrorBody(builder.toString(), HttpStatus.BAD_REQUEST.getReasonPhrase()); + + log.warn("##################################################"); + log.warn("## getValidationErrorBody = {}", errorBody); + log.warn("##################################################"); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(errorBody); + } + + @Data @NoArgsConstructor @AllArgsConstructor + static class ErrorBody { + private String message; + private String httpStatus; + } +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/global/exception/CustomException.java b/store-service/src/main/java/com/justpickup/storeservice/global/exception/CustomException.java new file mode 100644 index 0000000..0bada04 --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/global/exception/CustomException.java @@ -0,0 +1,14 @@ +package com.justpickup.storeservice.global.exception; + +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException { + + private ErrorEnum errorEnum; + + protected CustomException(ErrorEnum errorEnum) { + super(errorEnum.getMessage()); + this.errorEnum = errorEnum; + } +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/global/exception/ErrorEnum.java b/store-service/src/main/java/com/justpickup/storeservice/global/exception/ErrorEnum.java new file mode 100644 index 0000000..6759adc --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/global/exception/ErrorEnum.java @@ -0,0 +1,17 @@ +package com.justpickup.storeservice.global.exception; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum ErrorEnum { + + NOT_EXIST_ITEM(HttpStatus.CONFLICT, "존재하지 않은 상품입니다."); + + private final HttpStatus httpStatus; + private final String message; +} diff --git a/store-service/src/main/java/com/justpickup/storeservice/global/exception/GlobalExceptionHandler.java b/store-service/src/main/java/com/justpickup/storeservice/global/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..6ccca44 --- /dev/null +++ b/store-service/src/main/java/com/justpickup/storeservice/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,74 @@ +package com.justpickup.storeservice.global.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @ExceptionHandler(CustomException.class) + public ResponseEntity customExceptionHandler(CustomException ce) { + ErrorEnum errorEnum = ce.getErrorEnum(); + + log.warn("##################################################"); + log.warn("## CustomException = {}", errorEnum); + log.warn("##################################################"); + + HttpStatus errorHttpStatus = errorEnum.getHttpStatus(); + + return ResponseEntity.status(errorHttpStatus) + .body(new ErrorBody(errorEnum.getMessage(), errorHttpStatus.getReasonPhrase())); + } + + @ExceptionHandler(BindException.class) + public ResponseEntity bindExceptionHandler(BindException exception) { + return getValidationErrorBody(exception); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) { + return getValidationErrorBody(exception); + } + + private ResponseEntity getValidationErrorBody(BindException exception) { + BindingResult bindingResult = exception.getBindingResult(); + + StringBuilder builder = new StringBuilder(); + bindingResult.getFieldErrors() + .forEach(fieldError -> { + builder.append("["); + builder.append(fieldError.getField()); + builder.append("](은)는 "); + builder.append(fieldError.getDefaultMessage()); + builder.append(" 입력된 값: ["); + builder.append(fieldError.getRejectedValue()); + builder.append("]"); + }); + + ErrorBody errorBody = new ErrorBody(builder.toString(), HttpStatus.BAD_REQUEST.getReasonPhrase()); + + log.warn("##################################################"); + log.warn("## getValidationErrorBody = {}", errorBody); + log.warn("##################################################"); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(errorBody); + } + + @Data @NoArgsConstructor @AllArgsConstructor + static class ErrorBody { + private String message; + private String httpStatus; + } + +} diff --git a/user-service/src/main/java/com/justpickup/userservice/global/exception/CustomException.java b/user-service/src/main/java/com/justpickup/userservice/global/exception/CustomException.java new file mode 100644 index 0000000..a625942 --- /dev/null +++ b/user-service/src/main/java/com/justpickup/userservice/global/exception/CustomException.java @@ -0,0 +1,14 @@ +package com.justpickup.userservice.global.exception; + +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException { + + private ErrorEnum errorEnum; + + protected CustomException(ErrorEnum errorEnum) { + super(errorEnum.getMessage()); + this.errorEnum = errorEnum; + } +} diff --git a/user-service/src/main/java/com/justpickup/userservice/global/exception/ErrorEnum.java b/user-service/src/main/java/com/justpickup/userservice/global/exception/ErrorEnum.java new file mode 100644 index 0000000..51bbc06 --- /dev/null +++ b/user-service/src/main/java/com/justpickup/userservice/global/exception/ErrorEnum.java @@ -0,0 +1,17 @@ +package com.justpickup.userservice.global.exception; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum ErrorEnum { + + NOT_EXIST_USER(HttpStatus.CONFLICT, "존재하지 않은 사용자입니다."); + + private final HttpStatus httpStatus; + private final String message; +} diff --git a/user-service/src/main/java/com/justpickup/userservice/global/exception/GlobalExceptionHandler.java b/user-service/src/main/java/com/justpickup/userservice/global/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..35aa653 --- /dev/null +++ b/user-service/src/main/java/com/justpickup/userservice/global/exception/GlobalExceptionHandler.java @@ -0,0 +1,74 @@ +package com.justpickup.userservice.global.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @ExceptionHandler(CustomException.class) + public ResponseEntity customExceptionHandler(CustomException ce) { + ErrorEnum errorEnum = ce.getErrorEnum(); + + log.warn("##################################################"); + log.warn("## CustomException = {}", errorEnum); + log.warn("##################################################"); + + HttpStatus errorHttpStatus = errorEnum.getHttpStatus(); + + return ResponseEntity.status(errorHttpStatus) + .body(new ErrorBody(errorEnum.getMessage(), errorHttpStatus.getReasonPhrase())); + } + + @ExceptionHandler(BindException.class) + public ResponseEntity bindExceptionHandler(BindException exception) { + return getValidationErrorBody(exception); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) { + return getValidationErrorBody(exception); + } + + private ResponseEntity getValidationErrorBody(BindException exception) { + BindingResult bindingResult = exception.getBindingResult(); + + StringBuilder builder = new StringBuilder(); + bindingResult.getFieldErrors() + .forEach(fieldError -> { + builder.append("["); + builder.append(fieldError.getField()); + builder.append("](은)는 "); + builder.append(fieldError.getDefaultMessage()); + builder.append(" 입력된 값: ["); + builder.append(fieldError.getRejectedValue()); + builder.append("]"); + }); + + ErrorBody errorBody = new ErrorBody(builder.toString(), HttpStatus.BAD_REQUEST.getReasonPhrase()); + + log.warn("##################################################"); + log.warn("## getValidationErrorBody = {}", errorBody); + log.warn("##################################################"); + + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(errorBody); + } + + @Data @NoArgsConstructor @AllArgsConstructor + static class ErrorBody { + private String message; + private String httpStatus; + } +}