@RestControllerAdvice를 이용한 예외처리 예

Kim Dong Kyun·2022년 12월 25일
5

Today I learned

목록 보기
23/43
post-thumbnail

개요

@RestControllerAdvice 소개

@RestControllerAdvice 어노테이션은 전역 예외처리를 가능하게 해준다. 간략히 요약한 방법은

  1. 익셉션핸들러 클래스에 @RestControllerAdvice 어노테이션을 달아준다.

  2. 클래스 안에 매서드를 만드는데, 그 매서드에는 @ExceptionHandler 어노테이션을 붙이고, 어떤 익셉션에 대해 처리할건지 패러미터로 전달한다(.class형태로).

잠깐, .class 랑 .getClass랑 뭐가 달라? 둘 다 쓸 수 있지 않나?

.class vs .getClass 설명

  1. 이런 흐름으로 특정 throwable한 exception들은 저 @ExceptionHandler로 관리할 수 있다.

그러면 어떻게 되는데?

위 사진처럼 log형태로 찍게 되면

위 사진과 같이 IllegalArgumentExeception 전부 다 우리가 설정해두었던 log로 찍히게 된다.

(log.warn(e.getMessage()) -> IllegalArgumentExeception("e.getMessage() 안에 들어갈 메시지이다") 와 같은 형태.


그러면 개인 과제/팀 과제에서 어떤 형식으로 써볼까?

앞으로 과제에서 익셉션 핸들링을 하고싶다. 어떤 형식으로 메시지를 줘야 맞을까 고민했는데, 다른 분들이 본인들이 사용한 방법을 보여주셔서 한번 여기에 적어봤다.


정규님 코드

슈퍼 친절한 정규님이 기꺼이 코드를 보여주셔서 실어본다.

스파르타 과제의 명세상 400으로 status를 찍어줘야 하기 때문에, 400으로 고정한 모습. 특이한점은 ResponseEntity<StatustResponseDto.> 를 사용해서 리턴하는 모습. 포스트맨을 사용해 Json타입으로 반환받기 위해 여러 과정을 걸치셨다. 특히 headers.setContentType~ 아래 부분이 굉장히 신기하다.

setContentType에 대한 설명!

그런데, setContentType 안할순 없을까?...궁금하다.
헤더의 역할이 뭐길래 Header를 설정하면 Type, Subtype이 가능한걸까?
위에놈들은 다음시간에!


기억해야 할 점.

  • 전역 에러 처리, .class와 .getClass의 차이!

  • 어떻게 처리해야 더 깔끔한 익셉션핸들링이 될까? 명세의 내용을 최대한 깔끔하게 표현해주는 걸 고민해야 한다.

0개의 댓글