안녕하세요!
키크니 개발자 입니다. 🦒
처음 프로젝트를 셋팅하고 개발하기 전에 공통 Response를 구성하고, Exception Handler 설정을 하는데 이 부분에 대해 기록하면 좋을 것 같아 글로 남깁니다! 😁
Spring Boot 프로젝트를 처음 생성하게 되면,
아래와 같이 공통 Response 데이터를 설정해줍니다.
Response.class
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class Response<T> {
private String resultCode;
private T result;
public static <T> Response<T> success() {
return new Response<T>("SUCCESS", null);
}
public static <T> Response<T> success(T result) {
return new Response<T>("SUCCESS", result);
}
public static Response<Void> error(String resultCode) {
return new Response<Void>(resultCode, null);
}
}
Exception을 공통으로 처리해주기 위해서는 보통 @RestControllerAdvice를 사용합니다.
해당 어노테이션을 붙이고, Exception마다 핸들러 해주게 되면 Exception이 발생했을 때 처리해준대로 결과값을 반환하게 됩니다.
GlobalControllerAdvice.class
import com.dev.patientpractice.dto.response.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class GlobalControllerAdvice {
@ExceptionHandler(ApplicationCustomException.class) // (1)
public ResponseEntity<?> applicationCustomExceptionHandler(ApplicationCustomException e) {
log.error("Error occurs {}", e.toString());
return ResponseEntity.status(e.getErrorCode().getHttpStatus())
.body(Response.error(e.getErrorCode().name(), e.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<?> exceptionHandler(Exception e) {
log.error("Error occurs {}", e.toString());
return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getHttpStatus())
.body(Response.error(ErrorCode.INTERNAL_SERVER_ERROR.name(), ErrorCode.INTERNAL_SERVER_ERROR.getMessage()));
}
}
(1) : Exception을 커스텀했습니다. 에러코드와 메세지는 Enum에서 관리하게 됩니다.
ErrorCode.class
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;
@Getter
@AllArgsConstructor
public enum ErrorCode {
INVALID_PARAMETER(HttpStatus.BAD_REQUEST, "파라미터 유효성 에러"),
INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "내부 시스템 에러");
private HttpStatus httpStatus;
private String message;
}
CustomApplicationException.class
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class ApplicationCustomException extends RuntimeException {
private ErrorCode errorCode;
private String message;
public ApplicationCustomException(ErrorCode errorCode) {
this.errorCode = errorCode;
}
@Override
public String getMessage() {
if (message == null) {
return errorCode.getMessage();
} else {
return String.format("%s. %s", errorCode.getMessage(), message);
}
}
}
위와 같이 공통 Response와 Exception을 관리하게 되면 공통적인 포맷으로 결과값을 확인하기 편합니다!
더 좋은 의견있으면 댓글로 주시면 감사하겠습니다. 😁
References
- 패스트캠퍼스 : 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring)
반응형
'개발공부 > SPRING' 카테고리의 다른 글
[Spring Batch] @JobScope, @StepScope (0) | 2023.06.06 |
---|---|
[Spring Batch] Quartz의 개념과 예시 (0) | 2023.06.05 |
[Spring Batch] Spring Batch 개념 (2) | 2023.06.04 |
[Mockito] @Mock @ InjectMocks @MockBean @Spy @SpyBean 비교 (0) | 2023.02.13 |
[Spring] 비동기 프로그래밍 & ThreadPoolExecutor - 실습 (0) | 2023.01.09 |