Spring DB : 예외 포함과 StackTrace

    이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. 

    예외 전환 시, 기존 예외

    체크 예외를 런타임 예외로 바꾼다면, 반드시 기존 예외를 포함해야한다. 기존 예외를 포함하지 않으면 Stack Trace에서 어떤 문제 때문에 실제 예외가 발생했는지 확인할 수 있는 방법이 없어진다. 

     

    코드 실습 (StackTraceTest.java)

    체크 예외를 런타임 예외로 변경할 때, 체크 예외를 런타임 예외로 반드시 한번 더 감싸준다. 그렇게 해야지만 StackTrace에서 예외 히스토리를 정상적으로 확인할 수 있다. 

    Repository

    static class Repository{
        public void call() {
            try {
                runSQL();
            }catch (SQLException e){
                // 예외를 포함한다 → StackTrace 정상 출력됨.
                throw new RuntimeSQLException(e);
            }
        }
    
        private void runSQL() throws SQLException {
            throw new SQLException("ex");
        }
    }
    • 반드시 RuntimSQLException(e)를 통해 한번 더 예외를 감싸준다. 이렇게 설정해야지, StackTrace에서 정상적인 값을 볼 수 있다. 

     

    테스트 코드

    @Test
    void printEx() {
        Controller controller = new Controller();
    
        try {
            controller.request();
        } catch (Exception e) {
            log.info("ex",e);
        }
    
    }

     

    실행 결과

    StackTrace 정상 출력

    체크 예외를 포함해서 던져준다면, 위 이미지처럼 StackTrace가 정상적으로 출력되는 것을 볼 수 있다. 무슨 말이냐면 RuntimeSQLException이 발생했는데, 얘는 최초에 SQLException 때문에 발생했다는 것을 잘 보여준다.

    StackTrace 미출력

    반면에 제대로 Exception을 감싸지 않았다면, 다음과 같이 StackTrace에서 최초 원인이 되는 Exception이 무엇인지 확인할 수 없는 문제가 발생한다. 

     

    정리

    • 체크 예외에서 새로운 예외로 감싸서 변경해줄 때는, 반드시 기존의 예외를 감싸서 던져줘야한다.
    • 그렇지 않을 경우, StackTrace에서 최초 예외가 발생한 이유를 확인할 수 없게 된다. 

    댓글

    Designed by JB FACTORY