커스텀 예외를 작성하던 중 Error와 Exception 용어를 혼용하며 사용하는 내 모습을 보며..
문뜩 두 용어를 한 번 제대로 정리해서 구분해야겠다라는 생각이 들었다.
Error(오류):
시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제
개발자가 미리 예측하여 방지할 수 없다.
Exception(예외):
개발자가 구현한 로직에서 발생한 실수 또는 사용자의 영향에 의해 발생하는 문제
개발자가 미리 예측하여 방지할 수 있기에 상황에 맞게 예외 처리를 해줘야한다.
오류
Error 객체의 상속 구조를 보면 Throwable과 Object를 상속받고 있음을 알 수 있습니다.
여기서 좀 알만한 Error는 이 정도인 것 같습니다.
- StackOverFlowError : 호출의 깊이가 깊어지거나 재귀가 무한정 반복되어 stack overflow 발생 시 던져지는 오류
- OutOfMemoryError: 메모리 부족으로 더이상 객체를 할당할 수 없을 때 던져지는 오류
- NoSuchFieldError: 개체의 필드 또는 클래스의 정적 필드에 접근하려 하지만 해당 필드가 없을 때 던져지는 오류
개발자가 미리 오류를 대처하기엔 힘듭니다.
실제 우리가 신경써야할 부분은 예외 처리이기에 예외 처리에 조금 더 포커스를 맞춰보겠습니다.
예외
Exception도 Error와 마찬가지로 Throwable과 Object를 상속받고 있음을 알 수 있습니다.
- IllegalArgumentException: 부적절한 인자를 받았을 때 발생하는 예외
- IndexOutOfBoundsException: 리스트형 객체에서 선언되지 않은 요소를 get하는 경우에 발생하는 예외
- NullPointerException: 객체가 필요한 경우인데 프로그램이 null을 사용하려고 시도할 경우 발생하는 예외
여기서 핵심은, 예외는 개발자가 직접 던질 수 있다.
즉, 예외를 던짐으로써 개발자가 직접 관리할 수 있다.
Checked Exception VS Unchecked Exception
1주차 데브코스 특강에서 배운 걸 복습할 겸 해당 내용도 추가해볼까 한다.
Checked Exception
Checked Exception은 Compile Exception이라고도 하며, 컴파일 할 때 예외에 대한 처리를 강제해야 한다.
대표적으로 Exception이 checked exception이며, 만약 throws 또는 try-catch를 해주지 않는다면
must be caught or declared to be thrown을 하라는 에러가 발생한다.
public class CheckedException extends Exception {
}
public void throwsCheckedExceptionMethod() throws CheckedException {
throw new CheckedException();
}
public void tryCatchCheckedExceptionMethod() {
try {
throw new CheckedException();
} catch (CheckedException e) {
// 예외에 대한 적절한 처리
e.printStackTrace();
}
}
Unchecked Exception
Unchecked Exception은 컴파일 할 때 예외에 대한 처리를 강제하지 않는다.
그렇기에 굳이 throws나 try-catch를 해줄 의무가 있지는 않다.
public class UncheckedException extends RuntimeException {
}
public void throwsUncheckedExceptionMethod() {
throw new UncheckedException();
}
public void tryCatchUncheckedExceptionMethod() {
throw new UncheckedException();
}
해당 두 예외의 차이점은 예외에 대한 처리 강제 말고도 하나가 더 있다.
바로, Rollback 차이 여부이다.
Spring에서는 @Transactional 이라는 Annotation을 활용해 트랜잭션 관리를 한다.
여기서, 모든 Exception 타입이 아닌 Unchecked Exception만 rollback 시킨다.
왜 그럴까?
CheckedException은 컴파일할 때 강제로 예외를 처리해줘야하기 때문에 개발자가 어느정도 예상하고 있는 에러이다.
반대로 UncheckedException은 예상치 못한 예외이기에, 해당 경우에 rollback을 시켜주지 않을까 싶다.
'대외활동 > 프로그래머스 데브코스 백엔드 5기' 카테고리의 다른 글
백엔드 데브코스 3, 4개월차 회고 - 최종 프로젝트 전 마음가짐 (1) | 2024.02.08 |
---|---|
백엔드 데브코스 2개월차 회고 - 봄(스프링) (0) | 2023.11.15 |
백엔드 데브코스 1개월차 회고 - 낯선 환경 (4) | 2023.10.12 |
Scanner.nextLine의 버퍼 관련 문제 해결(도서관리 과제) (1) | 2023.10.05 |
프로그래머스 데브코스 백엔드 5기 합격 수기 (0) | 2023.09.08 |