Spring & Spring Boot

[ Spring-Boot ] @ControllerAdice 사용하여 예외처리 하기 2편

사과씨앗 2021. 5. 19. 17:47
728x90
반응형

이전 글에 이어서 진행하겠습니다.

 

예외 처리 시 throw를 이용하여 전달해 줄 객체를 만들어 주겠습니다. 

 

먼저 AbstractBaseException 추상 클래스를 만들어 줍시다. 

 

//예외처리를 하기 위해 RuntimeException 을 상속받아 줍니다.
public abstract class AbstractBaseException extends RuntimeException {

    private static final long serialVersionUID = 8342235231880246631L;

    //만들어둔 예외 코드사용을 위해 선언
    protected BaseResponseCode responseCode;

    //message 에 사용할 매개변수를 담을 배열 선언
    protected Object[] args;

    public AbstractBaseException() {
    }

    public AbstractBaseException(BaseResponseCode responseCode) {
        this.responseCode = responseCode;
    }

    public BaseResponseCode getResponseCode() {
        return responseCode;
    }

    public Object[] getArgs() {
        return args;
    }


}

 

그다음 AbstractBaseException를 상속받는 BaseException 클래스를 생성하여 줍시다. 

 

public class BaseException extends AbstractBaseException {

    private static final long serialVersionUID = 8342235231880246631L;

    public BaseException() {
    }


    public BaseException(BaseResponseCode responseCode, String[] args) {
        this.responseCode = responseCode;
        this.args = args;
    }

}

 

이제 Controller에서 예외 상황을 만들어 줍니다. ( 해당 부분은 자신의 Controller 상황에 맞게 사용해 주세요 ^^ )

BaseException 사용하여 예외를 던져 줍니다.

   // 제목 필수 체크
        if(StringUtils.isEmpty(parameter.getTitle())){
            throw new BaseException(BaseResponseCode.VALIDATE_REQUIRED, new String[] {"title","제목"});
        }
        // 내용 필수 체크
        if(StringUtils.isEmpty(parameter.getContents())){
            throw new BaseException(BaseResponseCode.VALIDATE_REQUIRED, new String[] {"contents","내용"});
        }

 

이제 마지막으로 컨트롤러에서 발생한 예외를 받아줄  BaseControllerAdvice 클래스를 만들어 줍시다.

 

/**
 * @Controller 즉, 전역에서 발생할 수 있는 예외를 잡아 처리해주는 annotation 이다.
 *
 */
@ControllerAdvice
public class BaseControllerAdvice {

    //webConfiguration 에서 만들어 둔 messageSource 빈 사용 
    @Autowired
    private MessageSource messageSource;

    @ExceptionHandler(value = {BaseException.class}) //예외처리 내용을 담아준 클래스를 지정
        @ResponseStatus(HttpStatus.OK) // 어떠한 통신 상태값에서 받을지 설정
        @ResponseBody
    private BaseResponse<?> handleBaseException(BaseException e, WebRequest request){
        //BaseResponse 미리 만들어 놓은 응답 클래스를 사용하여 메시지를 전달 하여 준다. 
        //e.getResponseCode().name() = 메시지 프로퍼티 파일에 있는 code 를 찾는 매개변수       
        //e.getArgs() = 메세지에 넣어줄 매개변수 
        return new BaseResponse<String>(e.getResponseCode(), messageSource.getMessage(e.getResponseCode().name(),e.getArgs(),null));
    }

 

위처럼 작성하여 주시면 Controller에서 던져준 예외상황이 해당 클래스로 넘어오게 되고 설정한 값에 맞게 

코드와 메시지를 반환여 줍니다.

 

Swagger를 통하여 확인해 보면

{
  "code": "VALIDATE_REQUIRED",
  "message": "title(제목) 필드는 필수로 입력하셔야 합니다."
}

위처럼 미리 만들어 놓은 코드와 message를 반환하여 주는 것을 확인할 수 있습니다.

 

감사합니다 ^^ 

 

참고 영상 : https://www.inflearn.com/course/backend-%EC%86%A1%EC%9E%90%EB%B0%94#

 

[무료] 자바 스프링부트 활용 웹개발 실무용 - 인프런 | 강의

실무자가 사용하는 자바 웹개발 Spring Boot, Vue.JS 기초 설정 ~ 공통 설계까지 간단하게 동영상보고 해보며 배우기, 📣 공지사항• 해당 강의의 1강은 볼륨이 다소 작으니 수강 시 참고 부탁드립니

www.inflearn.com

 

728x90
반응형