
먼저 Java Exception에 대해 알아보자.
이전에 자바 강의(자바의 정석 기초편)를 들으며 정리해두었던 내용이다..

try {
...
} catch (ExceptionA | ExceptionB e) {
...
}try {
...
} catch (ExceptionA | ExceptionB e) {
...
} finally {
...
}https://mangkyu.tistory.com/205
ControllerAdvice에 대한 설명은 해당 블로그에서 자세히 설명하고 있어 참조하였다.
@Log4j2
@RestControllerAdvice
public class GlobalExceptionHandler {
// DB 관련 에러
@ExceptionHandler(DataAccessException.class)
public ResponseEntity<?> handleDataAccessException(DataAccessException e) {
log.error("[USER ERROR] {}, {}", ResponseCode.USER_DATA_ACCESS_ERROR.getCode(), e.getMessage());
return ResponseEntity
.internalServerError()
.body(MessageResponse.of(ResponseCode.USER_DATA_ACCESS_ERROR));
}
// 파라미터 유효성 검증 에러
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleValidationExceptions(MethodArgumentNotValidException e) {
log.error("[USER ERROR] {}, {}", ResponseCode.USER_REQUEST_PARAM_INVALID.getCode(), e.getMessage());
List<String> errors = e.getBindingResult()
.getFieldErrors()
.stream()
.map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
.toList();
return ResponseEntity
.badRequest()
.body(MessageResponse.of(ResponseCode.USER_REQUEST_PARAM_INVALID, errors));
}
// 사용자 에러
@ExceptionHandler(UserException.class)
public ResponseEntity<?> handleUserException(UserException e) {
log.error("[USER ERROR] {}, {}", e.getResponseCode().getCode(), e.getMessage());
return ResponseEntity
.badRequest()
.body(MessageResponse.of(e.getResponseCode()));
}
}
@PostMapping
public ResponseEntity<?> join(
@Valid @RequestBody JoinRequest request) {
Boolean isExists = userService.isExistUser(request.getUsername());
if (isExists) {
throw new UserException(ResponseCode.USER_ALREADY_EXIST);
}
UserEntity newUser = userService.join(request);
return ResponseEntity
.status(HttpStatus.CREATED)
.body(MessageResponse.success(newUser));
}
@Getter
@RequiredArgsConstructor
public enum ResponseCode {
SUCCESS(0,"Success"),
FAIL(-1,"Fail"),
// 1xxx: User Exceptions
USER_REQUEST_PARAM_INVALID(-1000, "User Request Parameter Invalid"),
USER_ALREADY_EXIST(-1001, "User Already Exist"),
USER_NOT_FOUND(-1002, "User Not Found"),
USER_DATA_ACCESS_ERROR(-1003, "User Data Access Error"),
;
private final int code;
private final String message;
}
현재 GlobalExceptionHandler에서 에러 처리를 하며 로그를 출력하고 있다.
이 부분을 Spring AOP를 활용하여 로깅시스템을 구현해보려 한다.