카테고리 없음

스프링부트(SpringBoot)- 예외처리 @RestControllerAdvice

정데브 2023. 11. 5. 20:33

코드를 작성하다보면 다양한 예외상황이 생기게된다.

 

예전 Spring 프로젝트를 할 당시에 예외처리는 try-catch로 예상가능한 예외에 대해서만 처리해줬던 기억이있다.

해당 로직에 대해서 각각 예외를 처리해주다보면 코드가 길어지고 보기 불편해진다. 이러한 문제점을 spring boot강의를 보던 중에 @RestControllerAdvice를 통해서 개별적인 예외나 글로벌적인 예외처리가 가능해진다는것을 배우게되었다.

 

 

@ RestControllerAdvice를 통한 예외를 처리하기 전에 해당 예외를 어떠한 형식으로 클라이언트 단에 도달할 것인지를 먼저 설정해주었다.

 

앞으로 클라이언트에 전달될 Data의 형식이다

resultCode, resultMessage, data형식으로 동일한 응답을 내려주기위해 설정해준다.

 

 

 

주고 받을 데이터는 user의 데이터로 다음과 같다.

+ Builder 사용

 

 

컨트롤러의 로직은 다음과같다.

클라이언트에서 보낸  user의 id가 일치하는 사람의 정보를 다시 보내주는 로직으로 구현되었다.

 

 

받아온 userId의 값이 현재 생성되어있는 userList의 들어있는 값과 일치하다면 findFirst().get()을 통해 하나의 값을 가져온다. 해당 값이 존재할 경우 data의 user의 정보를 담아 response값으로 리턴해준다.

 

 

여기서 정확한 정보를 보낸다면 정상적으로 처리되는 것을 확인할 수 있다. 

 

만약 없는 유저라면?? 이때 필요한것이 예외처리이다.

 

userList에는 11번에 해당하는 id가 존재하지않는다.

 

 

이러한 경우해 아래 데이터를 가져올려 get()을 처리할때 다음과 같은 에러가 발생한다. 

 

 

 

자 그럼 해당 에러를 잡아보도록하자!

 

 

@RestControllerAdvice를 통해서 전역적으로 예외를 처리할 수 있는 어노테이션을 입력해준다.

 

@ExceptionHandler통해서 value값에 NoSuchElementException.class를 지정해줘서 데이터가 없는 경우에 발생했던 특정 에러를 지정해서 사용해줬다.

 

위에서 정의했던 result값으로 해당 데이터를 보내줘야하기때문에 해당 예외에 대해서는 HttpStatus.NOT_FOUND 에 대한 값을 넣어서 리턴해주었다.

 

해당 코드를 실행할 경우 데이터 없는 예외를 처리한 결과는 다음과 같다.

 

이러한 특정예외 뿐만아니라 어떤한 예외가 발생할지 모르는 상황에서는 글로벌 예외처리로 @ExceptionHandler의 값을 Exception.calss로 지정하여 사용가능하다.