20240725 Today I Learn

froajnzd·2024년 7월 25일
0

activity

목록 보기
3/3
post-thumbnail

오늘 알게된 것을 정리해보겠다.

자바의 예외처리 방식,

자바 로그,

JPA로 들어가기 위한 ORM까지.

내가 이해한 것을 잠깐 적어보고자 한다.

자바의 예외처리 방식

예외를 처리하기 위해 @ExceptionHandler를 사용한다.
해당 어노테이션을 메서드 위에 붙이면, 원하는 예외를 받아서 해당 메서드처럼 해결하겠다..라는 말이다.

해당 어노테이션은 Controller 에 작성해야 한다!
이 컨트롤러 안에서 이 예외가 발생하면, 나 이 메소드를 호출할거야!!
로 동작한다.

그럼 다른 컨트롤러에서 써도 이 에러를 잡아줄까? 답은 NO이다.

그러나 당연하게도(?) 같은 예외를 똑같이 처리하려는 니즈가 생겼다.;..
그래서 전체적으로 에러를 처리해줄 수 있는 @ControllerAdvice가 만들어졌다.

  • @ControllerAdvice 나 @RestControllerAdvice를 사용해야 한다.
    그러나 @ControllerAdvice는 RequestBody를 날려줄 수 없다(아래와 같은 convert 오류가 발생한다)
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에 명시한 메서드일것 같다.

로그 레벨 & 로거

  • TRACE - 중요도가 매우 낮은 정보
  • DEBUG - 진행 상황 체크 (중요도, 심각도 낮은 정보)
  • INFO - 진행 상황
  • WARN - 잠재적으로 유해한 이벤트
  • ERROR - 오류 이벤트 (치명적인지 여부는 상관 없음)

로그 레벨과 관련하여 이 글을 읽게 되었다.

서버관리자를 하면서 로그의 중요성을 '엄청나게' 느끼게 되었고, 로그 메세지 레벨의 정도?에 대한 고민을 하게 됐다.

내 시스템에 치명적일 수 있는 로그는 어떤 상황에서 어떤 게 있을까? ... 를 생각해보게 되어서고, 저 글이 도움 됐다. GOOOOOOOOOOOOD

Logger

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);
    }
}
profile
Hi I'm 열쯔엉

0개의 댓글