refactor(order, store, user): 전역 에러 핸들링 리팩토링

- Result 클래스를 통해 성공, 에러 반환 처리
- ErrorEnum 삭제
This commit is contained in:
bum12ark
2022-02-04 16:31:40 +09:00
parent 80fbbc8fea
commit f5bc04fd53
22 changed files with 226 additions and 167 deletions

View File

@@ -39,7 +39,7 @@ public class OrderController {
.collect(Collectors.toList());
return ResponseEntity.status(HttpStatus.OK)
.body(new Result<>("OK", orderMainResponses));
.body(Result.createSuccessResult(orderMainResponses));
}
@Data @NoArgsConstructor @AllArgsConstructor

View File

@@ -0,0 +1,11 @@
package com.justpickup.orderservice.global.client.exception;
import com.justpickup.orderservice.global.exception.CustomException;
import org.springframework.http.HttpStatus;
public class FeignClientException extends CustomException {
public FeignClientException(HttpStatus status, String message) {
super(status, message);
}
}

View File

@@ -0,0 +1,38 @@
package com.justpickup.orderservice.global.client.exception;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.justpickup.orderservice.global.dto.Result;
import feign.Response;
import feign.codec.ErrorDecoder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
@RequiredArgsConstructor
@Slf4j
public class FeignClientExceptionErrorDecoder implements ErrorDecoder {
private final ObjectMapper objectMapper;
@Override
public Exception decode(String methodKey, Response response) {
String message = null;
if (response.body() != null) {
try {
Result result = objectMapper.readValue(response.body().asInputStream(), Result.class);
message = result.getMessage();
} catch (IOException e) {
String catchErrorMessage = "Error Deserializing response body from failed feign request response.";
log.warn(methodKey + catchErrorMessage, e);
return new FeignClientException(HttpStatus.INTERNAL_SERVER_ERROR, "고객센터로 문의해주세요.");
}
}
return new FeignClientException(HttpStatus.INTERNAL_SERVER_ERROR, message);
}
}

View File

@@ -0,0 +1,5 @@
package com.justpickup.orderservice.global.dto;
public enum Code {
SUCCESS, ERROR
}

View File

@@ -1,11 +1,36 @@
package com.justpickup.orderservice.global.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data @NoArgsConstructor @AllArgsConstructor
@Data @NoArgsConstructor
public class Result<T> {
private Code code;
private String message;
private T data;
@Builder
public Result(Code code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public static Result createErrorResult(String message) {
return Result.builder()
.code(Code.ERROR)
.message(message)
.data(null)
.build();
}
// 해당 <T> 는 클래스의 T와 다름
public static <T> Result createSuccessResult(T data) {
return Result.builder()
.code(Code.SUCCESS)
.message("")
.data(data)
.build();
}
}

View File

@@ -1,14 +1,17 @@
package com.justpickup.orderservice.global.exception;
import com.justpickup.orderservice.global.dto.Result;
import lombok.Getter;
import org.springframework.http.HttpStatus;
@Getter
public class CustomException extends RuntimeException {
private ErrorEnum errorEnum;
private HttpStatus status;
private Result errorResult;
protected CustomException(ErrorEnum errorEnum) {
super(errorEnum.getMessage());
this.errorEnum = errorEnum;
protected CustomException(HttpStatus status, String message) {
this.status = status;
this.errorResult = Result.createErrorResult(message);
}
}

View File

@@ -1,17 +0,0 @@
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;
}

View File

@@ -1,8 +1,6 @@
package com.justpickup.orderservice.global.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.justpickup.orderservice.global.dto.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -17,30 +15,25 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<ErrorBody> customExceptionHandler(CustomException ce) {
ErrorEnum errorEnum = ce.getErrorEnum();
public ResponseEntity customExceptionHandler(CustomException ce) {
HttpStatus status = ce.getStatus();
Result errorResult = ce.getErrorResult();
log.warn("##################################################");
log.warn("## CustomException = {}", errorEnum);
log.warn("##################################################");
HttpStatus errorHttpStatus = errorEnum.getHttpStatus();
return ResponseEntity.status(errorHttpStatus)
.body(new ErrorBody(errorEnum.getMessage(), errorHttpStatus.getReasonPhrase()));
return ResponseEntity.status(status)
.body(errorResult);
}
@ExceptionHandler(BindException.class)
public ResponseEntity<ErrorBody> bindExceptionHandler(BindException exception) {
public ResponseEntity bindExceptionHandler(BindException exception) {
return getValidationErrorBody(exception);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorBody> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) {
public ResponseEntity methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException exception) {
return getValidationErrorBody(exception);
}
private ResponseEntity<ErrorBody> getValidationErrorBody(BindException exception) {
private ResponseEntity getValidationErrorBody(BindException exception) {
BindingResult bindingResult = exception.getBindingResult();
StringBuilder builder = new StringBuilder();
@@ -55,19 +48,8 @@ public class GlobalExceptionHandler {
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);
.body(Result.createErrorResult(builder.toString()));
}
@Data @NoArgsConstructor @AllArgsConstructor
static class ErrorBody {
private String message;
private String httpStatus;
}
}