강의 수강 중 작성한 노트에서 내용을 발췌, 이응수 강사님 강의 의 노트와 이미지를 참조하고 있습니다.
스스로 이해를 위해 직접 쓴 문장들의 경우 정확성이 떨어질 수 있다는 점 참고 부탁드립니다.
Checked
예외클래스 만들기: Exception 클래스를 상속받는다.
Unchecked
예외클래스 만들기: RuntimeException 클래스를 상속받는다.
작성방법
public class HtaException extends RuntimeException {
private static final long serialVersionUID = 9175601348921699186L;
public HtaException(String message) {
super(message);
}
public HtaException(String message, Throwable cause) {
super(message, cause);
}
}
💡 serialVersionUID
Serializable
인터페이스의 구현 클래스에는serialVersionUID
가 정의되어있어야 한다. 없다고 컴파일 에러가 생기지는 않지만, 이는 클래스의 식별번호로서 네트워크로 객체를 주고받을 때 주로 사용된다.
- 정의하는 목적
- 설계도에 대한 빠른 식별
- 다시 컴파일하더라도 식별번호가 달라지지 않도록 해서 같은 설계도를 다른 것으로 인식하지 않도록 함.
💡 예외클래스 생성의 의미
Exception
클래스는
- String값을 받아서 메시지로 저장하는 생성자
- Throwable 구현 객체를 받아서 원인이 되는 예외를 저장하는 생성자 를 가지고 있다.
Exception
또는RuntimeException
클래스를 상속받은사용자정의 예외클래스
또한 자바 라이브러리의 다른 예외클래스처럼
메시지와 원인이 되는 예외 객체를 저장할 수 있게 하기 위하여 정의한다.
이 생성 과정을 통해 예외의 내용이 정해지는 것이 아니다.
이는 기본적으로 예외 객체를 만들고, 내용을 저장해 사용할 수 있도록 하는 클래스의 생성 방법이다.
💡 예외의 변환
사용자정의 예외클래스는unchecked
로 한다. checked라면 또 이 클래스에서 예외처리를 해야 하므로. 여러 예외를 같은 ‘사용자정의 예외클래스’로 묶어서 전달시키는 것이 목적이다.
try {
예외발생이 예상되는 코드 // SQLException 이 발생예상됨
} catch (SQLException e) {
throw new 사용자정의예외클래스("메세지", e);
}
public class CommonUtils {
public static int stringToInt(String text) {
if (text == null) {
// 사용자 정의 예외객체 발생시키기
throw new HtaException("text는 null일 수 없습니다.");
}
if (text.isBlank()) {
// 사용자 정의 예외객체 발생시키기
throw new HtaException("Text가 빈 문자열이거나 공백문자입니다.");
}
try {
int value = Integer.parseInt(text);
return value;
} catch (NumberFormatException ex) {
// 예외의 변환
// Integer.parseInt()메소드가 발생시킨 NumberFormatException을 catch에서 잡고, 대신 HtaException을 발생시키기
throw new HtaException("text에 숫자가 아닌 문자가 포함되어 있습니다.", ex);
}
}
}
💡 예외를 발생시키는 것 자체가 메소드 블록 내의 ‘빠른 종료’를 시킨다.
따라서 값을 반환하는 메소드에서 값 반환 대신 예외를 발생시켜도 컴파일 오류는 아니다.
그러나 if문 내에서 예외를 발생시킨다면, if문이 false일 경우-반환값이 없을 경우-도 고려해야 한다.
(if문 내에서 예외 발생, if문 밖에서 아무것도 반환하지 않는다면 오류)
어플리케이션 개발 시 표현계층 / 서비스계층 / 영속화계층
세 계층으로 나누어 개발하는데,
업무로직을 수행하는 서비스계층
(Service 클래스)에서 수행과정 중 업무로직에 위배되는 상황이 발생하면 예외를 발생시킨다.
영속화계층
(DAO클래스, Repository클래스)는 특별한 업무로직을 수행하지 않고 업무로직 수행에 필요한 데이터엑세스 작업을 지원한다.
발생한 예외는 최종적인 위치인 표현 계층
(Controller 클래스) 에서 일괄적으로 처리한다. 그 전까지는 계속해서 위임시킨다.