Java, Spring에서는 많은 Exception객체를 기본으로 제공한다.
하지만, 이런 객체들을 실무에서 그대로 쓰기에는 뭔가 아쉽다.
그래서 결국 애플리케이션에 딱 맞는 Exception을 만들 필요가 생기게 된다.
그래~서 이번 글에서는 커스텀한 Exception을 만드는 방법을 알아보도록 하겠다 🔥
그리고 Lombok에서 제공하는 @StandardException
어노테이션으로 간편하게 커스텀 예외를 만드는 방법도 알아보겠다.
Exception을 만들기 위해서는 2가지 규칙만 따라주면 된다.
Java의 예외의 종류와 구조가 궁금하다면, 이 글을 참고하자.
내가 새롭게 만들 예외가 Checked 예외인지 Unchecked 예외인지 판단한 후에 Checked예외라면, Exception
을 상속받고 Unchecked예외라면 RuntimeException
을 상속받아서 구현하자.
상황에 따라서 다르겠지만 기본적으로 아래의 4종류의 생성자를 구현해주면 모든 상황에서 사용이 가능하다.
(반드시 4가지 모두 구현해야하는 것은 아니고, 필요한 것만 구현해도 괜찮다.)
위에서 이야기한대로 나만의 예외를 만든다면, 이렇게 될 것이다.
public class ExampleException extends RuntimeException {
public ExampleException() {
super();
}
public ExampleException(String message) {
super(message);
}
public ExampleException(Throwable cause) {
super(cause);
}
public ExampleException(String message, Throwable cause) {
super(message, cause);
}
}
사실상 RuntimeException
과 같은 기존의 예외에 껍데기만 씌운거라고 보면 될 것이다.
실무에서는 이런 예외들을 훨씬 많이 만들게 될 것인데, 그럴 때마다 위와 같은 동일한 코드와 작업을 해주는 것은... 귀찮다 🤭
그래~서 Lombok에서는 아주 편리한 어노테이션을 제공한다.
(Lombok이 궁금하다면 이 글을 참고하자.)
Lombok에서 제공하는 @StandardException을 쓰면, 기본적인 예외처리용 생성자 4가지를 모두 만들어준다. 즉, 위의 코드를 아래와 같이 아주 심플하게 사용할 수 있게 된다.
@StandardException
public class ExampleException extends Exception {}
Java의 예외를 상속받아서 생성자를 만들려고 보면, 이렇게 protected
생성자가 하나 보인다.
3번째 인자는 Suppressed exception으로 사용할지의 여부를 의미하고, 4번째 인자는 Stack trace를 출력할지를 선택하는 값이다. (공식문서)
💡 Suppresed exception?
무시가능한 예외를 의미한다.try-catch-finally
구문에서 try부분에서 suppressed예외가 발생했고, finally에서 또 다른 예외가 발생했다면 try에서 발생한 예외는 무시된다.