애플리케이션을 실행할 때 발생할 수 있는 예외는 크게 두가지로 나눌 수 있다.
- Checked Exception : 발생한 예외를 Catch 하여 체크한 뒤 해당 예외에 대한 구체적인 처리를 해주어야하는 예외
ex. ClassNotFoundException - Unchecked Exception : 해당 예외에 대한 처리를 할 필요가 없는 예외
ex. NullPointerException, ArrayIndexOutOfBoundsException
보통 개발자가 코드를 잘못 작성해서 발생하는 예외는 unchecked Exception가 많으며 RuntimeException을 상속받은 예외이다.
❯ 예외 던지기(throw)
개발자가 필요에 의해 예외를 던져야(발생시켜야)하는 경우가 있다.
예를들어 특정 정보를 DB에서 조회하고자할때 만약 DB에 해당 자료가 없다면 정보가 없다는 예외를 발생시켜서 클라이언트에게 알려줄 수 있다.
서비스 계층에서 예외를 던지면 서비스 계층의 해당 메서드를 사용하고있는쪽으로 예외가 전달된다.
즉, API 계층인 Controller의 핸들러 메서드쪽으로 예외가 던져진다.
그런데 예외들을 모아서 Exception Advice 에서 모아서 처리하도록 공통화 해두었으므로 서비스 계층에서 발생한 예외 역시 Exception Advice 에서 처리하면 된다.
❯ 사용자 정의 예외 (Custom Exception)
애플리케이션에서 발생할 수 있는 예외의 종류는 다양하므로 예외가 발생했을 때 예외 정보를 명확히 얻는것이 예외 해결에 유리하다.
이 때 사용가능한 것이 사용자 정의 예외이다.
예를 들어 런타임시 발생할 수 있는 오류를 enum으로 정의해두면 다양한 유형의 예외를 enum에 추가하면서 효율적으로 사용할 수 있다.
import lombok.Getter;
public enum ExceptionCode {
MEMBER_NOT_FOUND(404, "Member Not Found");
@Getter
private int status;
@Getter
private String message;
ExceptionCode(int status, String message) {
this.status = status;
this.message = message;
}
}
이렇게 발생할 수 있는 오류의 내용을 정의해두고 아래와 같이 RuntimeException을 상속받은 사용자 정의 예외 클래스를 생성하여 활용할 수 있다.
import lombok.Getter;
public class BusinessLogicException extends RuntimeException {
@Getter
private ExceptionCode exceptionCode; // 위에서 정의한 ExceptionCode를 필드로 갖는다.
public BusinessLogicException(ExceptionCode exceptionCode) {
super(exceptionCode.getMessage()); // 상위 클래스인 RuntimeException의 생성자로 예외 메세지 전달
this.exceptionCode = exceptionCode;
}
}
이렇게 던져진 사용자 정의 예외 (BusinessLogicException)를 Exception Advice에서 처리해주면 된다.
스프링 공부를 하면서 가장 재미있다고 느낀 날이었다.
발생할 수 있는 예외를 생각해보고 예외별로 어떤 조치가 취해져야하는지 혹은 어떤 형태로 리턴되어야하는지
작성하는 과정이 꽤 재밌었다. 특히 코드를 한줄한줄 바꿀때마다 결과가 다르게 나오는걸 보면서 신기하기도 했다.
내일부터 시작될 데이터 관련 내용도 재밌게 따라갈 수 있으면 좋겠다! 😋
'부트캠프 개발일기 > Spring MVC' 카테고리의 다른 글
47일차: Spring MVC(데이터 액세스 계층) (0) | 2023.04.19 |
---|---|
46일차: Spring MVC(JDBC, Spring Data JDBC) (0) | 2023.04.18 |
44일차: Spring MVC(예외처리) (0) | 2023.04.14 |
43일차: Spring MVC(서비스 계층, Mapper) (0) | 2023.04.13 |
42일차: Spring MVC(DTO) (0) | 2023.04.12 |