본문 바로가기
관리자

Programming-[Backend]/Spring

[TIL] 커스텀 Exception 만들기 : @ExceptionHandler, @ResponseStatus, @RestControllerAdvice, super()

728x90
반응형

1. 목적과 상황

클라이언트에서 온 HttpRequest에 대해서 Exception을 통해 Http status와 Json 코드를 HttpResponse로 반환하고자 한다. 다음 코드와 같이 특정 엔티티 객체를 찾고자 했는데, 못찾았을 경우 orElseThrow()를 통해 특정 Exception을 반환하는 상황이다.

 

XxxEntity xxxEntity = xxxRepository.findById(id)
    .orElseThrow(() -> new CustomException("xxx.error.not.found"));

 

CustomException은 여러가지 Exception들을 한 번에 모아놓고 @RestControllerAdvice로 처리하는 클래스 파일 내부에 정의한다.

 

@Slf4j
@RestControllerAdvice
@RequiredArgsConstructor
public class CustomExceptionAdvice
  ...
  @ExceptionHandler(CustomException.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  public CustomMsg customMsgException(WebRequest req, CustomException exception) {
  log.error("custom error caused!", exception);
    String message = messageSource.getMessage(exception.getFail(), null, LocaleContextHolder.getLocale());
    return new CustomMsg(message);
  ...
}

여기서 ExceptionHandler는 정의하는 클래스에 정의된 내용대로 reponse 객체를 보내고, http status는 HttpStatus.BAD_REQUEST인 400을 보내도록 한다.

 


 

2. Exception 작성

적용하고자 하는 CustomException 파일을 작성한다. RuntimeException을 상속받도록 하고, String fail 필드 및 생성자를 작성해준다.

public class CustomException extends RuntimeException {
 
  private final String fail;
 
  public CustomException(String fail) {
    super();
    this.fail = fail;
  }

  public CustomException(String fail, String message){
    super(message);
    this.fail = fail;
  }
}

 

이 내용은 사실 RuntimeException 파일과 같은 형태인데, super()만 추가해주는 것이다.

 

 


 

3. Super() 키워드 사용

 

CustomException의 생성자를 호출하면, 부모 객체인 RuntimeException의 생성자를 '먼저' 실행하게 된다. 따라서 super() 및 super(message)는 부모의 생성자를 호출하는 코드라고 할 수 있다.

 

상세한 내용은 아래 참조 1)에서 찾아볼 수 있다. 참조 내용에 따르면, 기본 생성자인 super()는 굳이 호출하지 않아도 될 것 같다.

 

 


 

4. 참조

1) 프로그래머스 - 자바 입문 - super와 부모생성자

https://programmers.co.kr/learn/courses/5/lessons/192

728x90
반응형