Exception

minnseong·2022년 5월 11일
0

자바 예외 계층

Error 는 메모리의 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구할 수 없는 시스템 예외다. 개발자는 이 예외를 잡으려고 하면 안된다. Exception 은 체크 예외와 언체크 예외로 나눌 수 있다. 언체크 예외는 RuntimeException을 상속한 것을 말하며, 체크 예외는 이외의 예외를 말한다.

체크 예외

체크 예외는 Exception 하위 자식 중 RuntimeException을 제외한 예외를 말한다. 체크 예외는 반드시 예외를 처리하는 코드를 함께 작성해야 한다. 예외를 처리하기 위해서 catch를 통해 예외를 잡거나, 예외를 처리할 수 없는 경우 예외를 밖으로 던지는 throws를 반드시 선언해주어야 한다. 그렇지 않으면 컴파일 오류가 발생한다. 따라서 컴파일러를 통해 개발자의 실수로 예외를 누락하지 않도록 하는 장점이 있지만, 모든 체크 예외를 명시적으로 처리해줘야하며, 의존관계에 따른 단점도 있다.

언체크 예외

언체크 예외는 RuntimeException와 그 하위 예외를 말하며, 런타임 예외라고 부르기도 한다. 체크 예외와 예외를 처리하는 방법은 동일하지만 예외를 잡아서 처리할 수 없을 때, 예외를 밖으로 던지는 throws 예외를 생략할 수 있다. 따라서 언체크 예외는 개발자가 실수로 예외를 누락할 수 있지만, 예외를 밖으로 던질 때 throws 예외를 생략 가능하며 예외의 의존관계를 참조하지 않아도 되는 장점이 있다.

체크 예외와 언체크 예외의 차이는 예외를 던지는 상황에서 throws 예외를 반드시 선언해야하는가, 생략 가능한가이다.

체크 예외 문제점


데이터 베이스에 문제가 있어 SQLExcepion이 발생한다면, 이 예외는 서비스나 컨트롤러에서 복구할 수 없기 때문에 예외를 공통 처리하는 부분까지 전달되어야 한다. 또한 SQLException은 체크 예외이기 때문에 서비스와 컨트롤러 메서드에 명시적으로 throws SQLException이 선언되어 있어야 한다. SQLException는 JDBC 기술의 예외이며, 서비스와 컨트롤러는 java.sql.SQLException을 의존하게 된다. 향후에 JDBC 기술이 다른 DB 기술로 변경된다면, SQLException 또한 다른 예외로 변경해야 한다. 서비스와 컨트롤러 입장에서는 어짜피 본인이 처리할 수 없는 예외에 불필요한 의존해야 하는 문제가 생긴다.

따라서 체크 예외를 언체크 예외로 전환하여 예외를 던져야 한다.

    static class Repository {
        public void call() {
            try {
                runSQL();
            } catch (SQLException e) {
                throw new RuntimeSQLException(e);
            }
        }

        public void runSQL () throws SQLException {
            throw new SQLException("ex");
        }
    }

    static class RuntimeSQLException extends RuntimeException {
        public RuntimeSQLException(Throwable cause) {
            super(cause);
        }
    }

Repository.call() 호출시 runSQL 메서드가 호출되어 SQLException을 발생한다. 이때 catch문을 통해 SQLException을 던지는 것이 아닌 RuntimeSQLException으로 변경하여 언체크 예외를 던지도록 한다. 이 때 throw new RuntimeSQLException(e); 와 같이 반드시 기존 예외를 포함하여 던져야 한다. 체크 예외를 언체크 예외로 전환함으로써, 컨트롤러와 서비스에서 throws 예외를 생략할 수 있어 해당 예외에 대한 의존관계가 발생하지 않는다.


참고 자료

https://www.inflearn.com/course/스프링-db-1/dashboard
http://plus4070.github.io/nhn%20entertainment%20devdays/2017/01/22/Exception
https://mangkyu.tistory.com/152

0개의 댓글