정구리의 우주정복

[Spring] 커스텀 에러 정의, 공통화 , HttpStatus 보여주기 (BaseException 정의하기) 본문

JAVA/STUDY

[Spring] 커스텀 에러 정의, 공통화 , HttpStatus 보여주기 (BaseException 정의하기)

Jungry_ 2024. 6. 22. 16:31
반응형

 

 

커스텀 에러를 정의해서 쓰고싶은데

에러 발생시 모든 에러들이 500으로 나오고, error 메세지도 내가 원하는대로 출력되지 않는다 ㅜㅜ !! 콘솔에서만 메세지가 나온다 ㅠㅠ

내가 원하는건 이런게 아니야 ~!

 

알아보도록하자

 

이것을 알기 위해선

이전에 쓴 Exception 과 RuntimeException 에 대한 글을 보고 오면 좋을듯 !

https://j-ungry.tistory.com/391

 

[Spring] Exception, RuntimeException 상속에 대해 (Checked Exception, Unchecked Exception 이란 ?)

예외처리를 위해 Exception 을 정의하던 중 왜 RuntimeException 을 상속받는지 궁금해져버렸다 ! 자바는 예외를 크게 두종류인Checked Exception, Unchecked Exception 으로 분류할 수 있다 Checked Exception 컴파일

j-ungry.tistory.com

 

 

 

 

 

 

  1. RuntimeException 을 상속받는 BaseException 을 새로 정의
  2. CustomExceptionHandler 를 정의해서 status, body 를 사용해 status 코드와 body 에 들어갈 내용을 커스텀하게 지정해준다
  3. 내가 쓰고싶은 CustomException 을 정의해준다 (이번 게시글에서는 RecommendNotFoundException 이라는 이름으로 정의)
  4. test 진행

코드를 보면서 조금 더 설명을 적어보도록 하겠다

 

  1. RuntimeException 을 상속받는 BaseException 을 새로 정의
@Getter
public class BaseException extends RuntimeException {

    private final HttpStatus status;
    private final String message;

    public BaseException(String message, HttpStatus status) {
        this.status = status;
        this.message = message;
    }
}

 

RuntimeException 을 상속받으며 HttpStatus 와 message 를 가지고 있는 BaseException 을 정의해줬다 

나중에 404인지, 500인지 등등 알기 위해서 HttpStatus 를 받도록 만들어주었음

 

 

   2. CustomExceptionHandler 를 정의해서 status, body 를 사용해 status 코드와 body 에 들어갈 내용을 커스텀하게 지정해준다

 

@RestControllerAdvice
public class CustomExceptionHandler {

    @ExceptionHandler(BaseException.class)
    public ResponseEntity<ErrorResponse> baseHandler(BaseException e) {
        System.out.println("work");
        return ResponseEntity.status(e.getStatus()).body(this.makeErrorResponse(e));
    }

    private ErrorResponse makeErrorResponse(BaseException e) {
        return new ErrorResponse(e);
    }
}

 

 

@ControllerAdvice 는 전역적으로 ExceptionHandler 를 적용해주기 위해 사용을 한다 그 중에서도 

@RestControllerAdvice 는 JSON 형태로 응답을 내려준다

 

@ExceptionHandler 를 사용해서 핸들링하고자 하는 Exception 을 정의한다 

내가 핸들링 하고싶은건 BaseException 뿐이므로 저렇게 넣었다

 

return 값에 ResponseEntity.status(e.getStatus()).body(this.makeErrorResponse(e));

를 사용해서 status 를 지정해주고 Body에 값들도 쏙쏙 넣어줬다

 

아마 RestControllerAdvice 를 사용했기 때문에 body 에 대한 결과를 JSON 으로 받아볼 수 있을것으로 기대된다

 

@Getter
@Setter
public class ErrorResponse {

    private final HttpStatus status;
    private final String message;

    public ErrorResponse(BaseException e) {
        this.status = e.getStatus();
        this.message = e.getMessage();
    }
}

 

ErrorResponse 는 간단하게 정의했다

   

 

   3. 내가 쓰고싶은 CustomException 을 정의해준다 (이번 게시글에서는 RecommendNotFoundException 이라는 이름으로 정의)

public class RecommendNotFoundException extends BaseException {
    public RecommendNotFoundException(String message, HttpStatus httpStatus) {
        super(message, httpStatus);
    }

    public RecommendNotFoundException(String message) {
        super(message, HttpStatus.NOT_FOUND);
    }
}

 

Exception 을 정의해준다 이번에는 HttpStatus 를 받아오거나, 받지 않은 경우 HttpStatus.NOT_FOUND 를 넣어주게끔 만들어보았다

 

   4. test 해보기

 

/**
 * id 에 해당하는 게시글 조회
 *
 * @param id 게시글의 id
 * @return id 에 해당하는 게시글
 */
public RecommendResponse getRecommend(String id) {
    Recommend recommend = recommendRepository.findById(id)
            .orElseThrow(() -> new RecommendNotFoundException("ERROR: Cannot found id", HttpStatus.NOT_FOUND));
    return RecommendMapper.toDto(recommend);
}

 

이렇게 작성해보았다

 

status 는 404 , status 와 message 는 Json 형태로 잘 출력되는것을 볼 수 있다 ! 와 샌즈 ~

 

이제 나도 커스텀한 exception 을 정의해서 사용하는 girl 이 되어버림 ~

반응형
Comments