1. 오류(Error)
- 시스템 자원 부족이나 하드웨어적 문제, 시스템 충돌 등의 프로그램 외적인 요인으로 발생
- 오류를 코드상에서 handling할 방법은 없으며 예측 또한 어려움
- StackOverFlow, OutOfMemory 등의 오류는 간접적인 예방은 가능
- Java의 에러는 java.lang.Error 패키지로 정의
2. 예외(Exception)
- 잘못된 코드, 즉 개발자의 실수로 인해 발생하는 문제
- 적절한 예외처리(try, catch 등 사용)나 디버깅 등을 통해 수정 가능
- 개발자가 직접 정의할 수도 있으며 로직 흐름상 의도적으로 발생시킬 수도 있음
- Java의 예외는 java.lang.Exception 패키지로 정의
- Checked Exception
- Runtime Exception과 그 하위 Exception 클래스를 제외한 모든 Exception
- 컴파일 타임에 정적으로 예외를 처리했는지 확인
- 트랜잭션에서 Checked Exception이 발생해도 롤백은 되지않음
=> 트랜잭션의 롤백은 기본적으로 Unchekced Exception을 대상으로함
- Unchecked Exception
- RuntimeException과 그 하위 클래스에 속하는 Exception
- 컴파일 타임에는 예외 처리 여부를 확인하지 않음(명시적으로 예외처리를 강제하지 않음)
- 트랜잭션에서 발생시 롤백이 됨
- 무분별한 throws의 사용은 위험
- throws를 사용하여 예외를 호출한 메소드에게 넘기는 방식은 편리하지만 위험
- 예외가 정확히 어디에서 발생했는지 추적하는데 어려움이 발생할 수 있음
- 코드의 가독성이 떨어짐
- 호출한 메소드가 예외를 적절히 처리할 수 있을 경우에만 사용하는 것이 좋음