
Throwable : 최상위 예외. 하위에 Exception 과 Error 가 있음.Error : 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외. 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안된다.Throwable 예외도 잡으면 안되는데, 앞서 이야기한 Error 예외도 함께 잡을 수 있기 때문. 애플리케이션 로직은 이런 이유로 Exception 부터 필요한 예외로 생각하고 잡으면 된다.Exception : 체크 예외Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외. RuntimeException 은 예외로 한다. RuntimeException : 언체크 예외, 런타임 예외 RuntimeException 과 그 자식 예외는 모두 언체크 예외이다.예외 처리

예외 던짐

예외 2가지 기본 규칙
Exception, RuntimeException 상속 받아 예외를 만들 수 있음. throws예외를 필수로선언해야 함. RuntimeException과 그 하위 예외는 언체크 예외로 분류.throws를 생략 가능. 
리포지토리는 DB에 접근해서 데이터를 저장하고 관리한다. 여기서는 SQLException 체크 예외를 던짐.
NetworkClient 는 외부 네트워크에 접속해서 어떤 기능을 처리하는 객체. ConnectException 체크 예외 던짐
서비스는 리포지토리와 NetworkClient를 둘다 호출
SQLException 과 ConnectException를 모두 처리해야함.서비스는 SQLException 과 ConnectException를 처리할 수 없으므로 둘다 밖으로 던짐.
method() throws SQLException, ConnectException와 같이 선언 해야함.컨트롤러도 두 예외를 처리할 방법이 없음.
method() throws SQLException, ConnectException와 같이 선언 해야함.웹 애플리케이션이라면 서블릿의 오류 페이지나, 또는 스프링 MVC가 제공하는 ControllerAdvice에서 이런 예외를 공통으로 처리.
정리
SQLException의 경우 SQL 문법, 데이터베이스 자체, 서버가 중간에 다운등의 문제가 있을 수 있음. 이런 문제는 서비스나 컨트롤러가 해결할 수가 없음. 서블릿 필터, 스프링 인터셉터, 스프링의 ControllerAdvice를 사용해 공통으로 해결 SQLException는 java.sql.SQLException에 의존함.
SQLException -> RuntimeSQLException으로 전환해서 예외를 던짐 
//기존 예외 포함
public void call() {
try {
runSQL();
} catch (SQLException e) {
throw new RuntimeSQLException(e); //기존 예외(e) 포함
}
}
//기존 예외 미포함
public void call() {
try {
runSQL();
} catch (SQLException e) {
throw new RuntimeSQLException();
}
}