정구리의 우주정복
[Spring] 커스텀 에러 정의, 공통화 , HttpStatus 보여주기 (BaseException 정의하기) 본문
[Spring] 커스텀 에러 정의, 공통화 , HttpStatus 보여주기 (BaseException 정의하기)
Jungry_ 2024. 6. 22. 16:31
커스텀 에러를 정의해서 쓰고싶은데
에러 발생시 모든 에러들이 500으로 나오고, error 메세지도 내가 원하는대로 출력되지 않는다 ㅜㅜ !! 콘솔에서만 메세지가 나온다 ㅠㅠ
내가 원하는건 이런게 아니야 ~!
알아보도록하자
이것을 알기 위해선
이전에 쓴 Exception 과 RuntimeException 에 대한 글을 보고 오면 좋을듯 !
https://j-ungry.tistory.com/391
- RuntimeException 을 상속받는 BaseException 을 새로 정의
- CustomExceptionHandler 를 정의해서 status, body 를 사용해 status 코드와 body 에 들어갈 내용을 커스텀하게 지정해준다
- 내가 쓰고싶은 CustomException 을 정의해준다 (이번 게시글에서는 RecommendNotFoundException 이라는 이름으로 정의)
- test 진행
코드를 보면서 조금 더 설명을 적어보도록 하겠다
- 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 이 되어버림 ~
'JAVA > STUDY' 카테고리의 다른 글
[Spring] Exception, RuntimeException 상속에 대해 (Checked Exception, Unchecked Exception 이란 ?) (4) | 2024.06.10 |
---|---|
[Spring] 컨트롤러에서 엔티티를 반환해도 될까? (2) | 2024.05.31 |
[Spring] @Entity 사용시 @NoArgsConstructor 를 쓰는 이유 (0) | 2024.05.29 |
[Spring] 라이브러리 (1) | 2024.02.03 |
[Spring] Autoconfiguration 만들어보기 (3) | 2023.07.09 |