본문 바로가기
개발/백엔드

spring boot - 공통 api 에러 처리

by codeStudyCafe 2024. 11. 22.

공통 Api를 만들었을 때 에러를 어떻게 처리해야 할지 어려운 경우가 있습니다. 이때 exceptionHandler로 해결을 할 수 있습니다.

에러코드

에러가 나는 경우에 대해서 오류를 내려줘야 합니다. 지금은 코드가 몇 개 없지만 나중을 위해 enum으로 만들어 두도록 하겠습니다. 로그인이 필요한 기능인데 로그인하지 않은 경우 내려주는 코드를 만들어 줍니다.

 

httpStatusCode : 실제로 내려주는 에러 코드
errorCode : 임의로 지정해 준 코드
description : 에러 설명

 

쓰기 편하게 인터페이스도 만들어 줍니다.

 

그리고 인터페이스를 상속받습니다.

 

이제 result 부분을 꾸며주겠습니다. 인터페이스를 받고 code롸 description을 출력합니다.

 

"오류"만 내려주면 조금 슬프니 저희가 원하는 문구도 넣어줍니다.

 

이제 Api쪽 코드를 수정해 줍니다. result를 받는 경우와 errorCodeIfs를 받는 경우입니다.

 

throwable과 message를 받는 경우도 처리해 줍니다.

 

예외 처리

유저가 로그인을 했는지 아닌지를 체크하는 Api가 있다고 해봅시다.

 

만약 로그인을 했다면 Api <UserDTO>를 내려주면 됩니다. 하지만 유저가 없다면 Api에 에러 코드를 넣어 보내야 합니다. 이렇게 작성하는 경우 리턴 형식이 맞지 않습니다.

 

저희는 커스텀 에러를 만들어 해결할 것입니다. 이 서버에서 나는 모든 에러를 한 곳에 모아주는 클래스를 하나 만듭니다.

@Slf4j : 로그 출력
@RestControllerAdvice : Controller들에 대한 전역 예외 처리를 제공하는 어노테이션
@Order : 예외 핸들러의 우선순위. MAX_VALUE의 경우 가장 우선순위가 낮음
@ExceptionHandler(value = Exception.class) : 어떤 예외를 처리할 것인지. Exception.class의 경우 모든 예외를 처리

 

그러면 모든 에러에 대해 다음과 같이 리턴이 됩니다. ErrorCode.SERVER_ERROR는

SERVER_ERROR(500 , 500, "서버 에러"),

enum을 가지고 있습니다.

 

이렇게 하면 예상하지 못한 모든 에러에 대해서는 Api 형식에 맞추어 줄 수 있습니다.하지만 항상 모든 에러에 대해서 "500, 서버 에러, 오류"를 내려주게 되겠지요. 저희가 원하는 대로 이 결과를 커스텀해 주도록 바꿔 봅시다.

 

runtimeException을 상속받습니다. 그럼 throw new ApiException(); 같은 형식으로 에러를 발생시킬 수 있습니다. 여기서 생성자에 ErrorCodeIfs를 넣어주면 원하는 결과를 리턴할 수 있습니다.

에러 잡기

에러를 발생시키는 것을 했지만 그 에러를 잡을 수 있어야 합니다. GlobalExceptionHandler에서 했던 것 처럼 말이죠. 그렇지 않으면 열심히 값을 넘겨줬지만 그냥 globalExceptionHandler만 실행됩니다.

 

globalExceptionHandler와 비슷하게 ApiExceptionHandler를 하나 만들어 줍니다. order를 MIN_VALUE로 하고 ApiException을 받는 경우 실행되도록 해줍니다.

 

이렇게 하면 에러를 커스텀할 수 있습니다.

'개발 > 백엔드' 카테고리의 다른 글

spring boot - 공통 api 만들기  (0) 2024.11.15
spring boot - 비동기 작업 처리  (0) 2024.11.08
spring boot - DTO  (0) 2024.10.15
spring boot - intercepter  (2) 2024.09.28
spring boot - 1 : N 관계 만들기  (0) 2024.09.25