에러란 시스템에 비정상적인 상황이 생겼을 때 발생하며 메모리 부족(OutOfMemoryError)이나 스택오버플로우(StackOverflowError) 같은 에러가 존재한다. 개발자가 미리 예측할 수 없는 문제이다.
예외는 사용자의 잘못된 조작이나 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류이다. 예외는 예외처리를 통해 프로그램이 종료되지 않고 정상적으로 작동되게 만들 수 있다.
RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스로 파일이나 클래스명을 잘못 입력했을 때의 FileNotFoundException, ClassNotFoundException 등이 있다.
RuntimeException의 하위 클래스를 의미하며, 실행 중에 발생할 수 있는 예외를 의미한다. 배열의 범위를 벗어나거나, 값이 null인 참조변수를 참조할 때 ArrayIndexOutOfBoundsException, NullPointerException 등이 있다.
Error | Checked Exception | Unchecked Exception | |
---|---|---|---|
확인 시점 | 실행시 | 컴파일시 | 실행시 |
발생 이유 | 시스템의 비정상적인 상황 발생 | 주로 외부의 영향으로 발생 | 주로 개발자의 실수에 의해 발생 |
처리 여부 | 불가능 | 명시적 처리 강제 | 명시적 처리 강제 X |
기본 트랜젝션 여부 | Rollback | Non-Rollback | Rollback |
Spring @Transactional은 기본적으로 Checked Exception을 Non-Rollback한다. 하지만 Checked Exception이라고 무조건 Non-Rollback이 아니라 Rollback을 발생시킬 수 있다.
// FileNotFoundException은 rollback
@Transactional(rollbackFor = FileNotFoundException.class)
// 여러개의 예외를 rollback 한다.
@Transactional(rollbackFor = {FileNotFoundException.class, ClassNotFoundException.class})
try{
// 로직
} catch(FileNotFoundException e) {
throw new RuntimeException("UnChecked Exception");
}