오늘 알게된 것을 정리해보겠다.
자바의 예외처리 방식,
자바 로그,
JPA로 들어가기 위한 ORM까지.
내가 이해한 것을 잠깐 적어보고자 한다.
예외를 처리하기 위해 @ExceptionHandler를 사용한다.
해당 어노테이션을 메서드 위에 붙이면, 원하는 예외를 받아서 해당 메서드처럼 해결하겠다..라는 말이다.
해당 어노테이션은 Controller 에 작성해야 한다!
이 컨트롤러 안에서 이 예외가 발생하면, 나 이 메소드를 호출할거야!!
로 동작한다.
그럼 다른 컨트롤러에서 써도 이 에러를 잡아줄까? 답은 NO이다.
그러나 당연하게도(?) 같은 예외를 똑같이 처리하려는 니즈가 생겼다.;..
그래서 전체적으로 에러를 처리해줄 수 있는 @ControllerAdvice가 만들어졌다.
400 BAD Request
2024-07-25T09:55:43.156+09:00 WARN 10120 ---
[hot] [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver :
Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException:
Failed to convert value of type 'java.lang.String' to required type 'int';
For input string: "NoRoom"]
--- 근데 그러면 같은 예외상황을 RestController, @RestControllerAdvice 모두 명시하면 어떤게 우선될까?
내 감은 RestController에 명시한 메서드일것 같다.
로그 레벨과 관련하여 이 글을 읽게 되었다.
서버관리자를 하면서 로그의 중요성을 '엄청나게' 느끼게 되었고, 로그 메세지 레벨의 정도?에 대한 고민을 하게 됐다.
내 시스템에 치명적일 수 있는 로그는 어떤 상황에서 어떤 게 있을까? ... 를 생각해보게 되어서고, 저 글이 도움 됐다. GOOOOOOOOOOOOD
java에 Logger라는 라이브러리가 존재한다.
@RestControllerAdvice
public class GlobalExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler
public void catchNotFoundException(NotFoundException e){
logger.error("exception : ", e);
}
}
이런 식으로 사용한다.
그러나 항상 private final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
로그를 사용하고 싶은 클래스의 필드에 해당 문구를 작성해주는게 귀찮으므로,,
이를 쉽게 통합해준 것이 @Slf4j이다. 위 코드를 아래와 같이 작성할 수 있다.
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler
public void catchNotFoundException(NotFoundException e){
log.error("Exception : ", e);
}
}