TIL

4장 예외

4.1 사라진 SQLException

예외가 발생하고 catch 블록으로 잡는 것까지는 좋으나 무시하는 것은 정말 위험한 일이다. 프로그램에 예외가 발생했는데 무시하고 넘어가는 일이기 때문이다.

try {
		if (pstmt != null) {
			pstmt.close();
		}
		} catch (SQLException ignored) {
		}
		try {
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException ignored) {
		}
}

모든 예외는 적절하게 복구되든지 아니면 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보돼야 한다.

4.1.2 예외의 종류와 특징

체크 예외의 불필요성을 주장하는 사람들이 늘어갔는데 이는 예외 처리의 강제 때문에 catch, throws를 남발하는 코드가 생기기 때문이기도 하다.

최근에 새로 등장하는 자바 표준 API에는 언체크 예외만 쓰는 경향이 있다.

4.1.3 예외 처리 방법

런타임 예외의 보편화

체크 예외는 catchtrhows를 강제하기 때문에 개발자의 실수를 방지하기 위한 배려라고 볼 수도 있지만 실제로는 예외를 제대로 다루고 싶지 않을 만큼 짜증나게 만드는 원인이 되기도 한다.

자바가 처음 만들어질 때 많이 사용되던 독립형 애를리케이션에서는 통제 불가한 예외라도 애플리케이션 작업을 중단시키지 않고 상황을 복구해야 했다. 하지만 자바 엔터프라이즈 서버 환경은 다르다. 하나의 요청 중에 예외가 발생하면 해당 작업만 중단시키면 그만이다. (각 요청이 독립적인 작업이기 때문)

자바의 환경이 서버로 이동하면서 체크 예외의 활용도와 가치는 점점 떨어지기 때문에 대응 불가한 체크 예외는 빨리 런타임 예외로 전환해서 던지는 게 낫다.

애플리케이션 예외

애플리케이션 자체의 로직에 의해 의도적으로 발생시키고, 무엇인가 조치를 취하도록 요구하는 예외도 있는데 이를 애플리케이션 예외라고 한다.

4.15 SQLException은 어떻게 됐나?

SQLException은 복구 가능한 예외인가? 99% 확률로 복구 방버비 없다.

스프링 JdbcTemplate은 예외 전환 기법을 사용하여 DataAccessException을 던지도록 하고 있다.