스프링 DB 1편(데이터 접근 핵심 원리)

Ch05. 자바 예외 이해 - 예외 포함과 스택 트레이스

webmaster 2022. 4. 30. 11:33
728x90

예외를 전환할 때는 꼭! 기존 예외를 포함해야 한다. 그렇지 않으면 스택 트레이스를 확인할 때 심각한 문제가 발생한다.

PrintEx Test

@Test
public void printEx() {
    Controller controller = new Controller();
    try {
        controller.request();
    }catch (Exception e){
        //e.printStackTrace();
        log.info("ex", e);
    }
}
  • 로그를 출력할 때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.
    • 예) log.info("message={}", "message", ex) , 여기에서 마지막에 ex를 전달하는 것을 확인할 수 있다. 이렇게 하면 스택 트레이스에 로그를 출력할 수 있다.
    • 예) log.info("ex", ex) 지금 예에서는 파라미터가 없기 때문에, 예외만 파라미터에 전달하면 스택 트레이스를 로그에 출력할 수 있다.
  • System.out 에 스택 트레이스를 출력하려면 e.printStackTrace() 를 사용하면 된다. 실무에서는 항상 로그를 사용해야 한다는 점을 기억하자

예외 전환

static class Repository {

    public void call() {
        try {
            runSQL();
        }catch (SQLException e){
            //throw new RuntimeSQLException(e); //런타임 예외로 변환해서 던진다.
            throw new RuntimeSQLException();
            //원인을 넘겨주지 않는다면 어떤 이유로 예외가 발생한줄 알 수가 없다
            //EX) SQLException 이 발생해도, 어떤 SQL이 잘못 실행됫는지 알 수가 없다.
            //예외를 전환 할 떄는 꼭 예외를 전달해 주어야한다.
        }
    }
    public void runSQL() throws SQLException {
        throw new SQLException("ex");
    }
}

예외를 전달 X

11:25:23.043 [Test worker] INFO hello.jdbc.exception.basic.UnCheckedAppTest - ex
hello.jdbc.exception.basic.UnCheckedAppTest$RuntimeSQLException: null
	at hello.jdbc.exception.basic.UnCheckedAppTest$Repository.call(UnCheckedAppTest.java:62)
	at hello.jdbc.exception.basic.UnCheckedAppTest$Service.logic(UnCheckedAppTest.java:43)
	at hello.jdbc.exception.basic.UnCheckedAppTest$Controller.request(UnCheckedAppTest.java:33)
	at hello.jdbc.exception.basic.UnCheckedAppTest.printEx(UnCheckedAppTest.java:21)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
....
  • 예외를 포함하지 않아서 기존에 발생한 java.sql.SQLException 과 스택 트레이스를 확인할 수 없다.
  • 변환한 RuntimeSQLException 부터 예외를 확인할 수 있다. 만약 실제 DB에 연동했다면 DB에서 발생한 예외를 확인할 수 없는 심각한 문제가 발생한다.

예외 전달

11:32:04.670 [Test worker] INFO hello.jdbc.exception.basic.UnCheckedAppTest - ex
hello.jdbc.exception.basic.UnCheckedAppTest$RuntimeSQLException: java.sql.SQLException: ex
	at hello.jdbc.exception.basic.UnCheckedAppTest$Repository.call(UnCheckedAppTest.java:62)
	at hello.jdbc.exception.basic.UnCheckedAppTest$Service.logic(UnCheckedAppTest.java:43)
	at hello.jdbc.exception.basic.UnCheckedAppTest$Controller.request(UnCheckedAppTest.java:33)
	at hello.jdbc.exception.basic.UnCheckedAppTest.printEx(UnCheckedAppTest.java:21)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
...
Caused by: java.sql.SQLException: ex
	at hello.jdbc.exception.basic.UnCheckedAppTest$Repository.runSQL(UnCheckedAppTest.java:70)
	at hello.jdbc.exception.basic.UnCheckedAppTest$Repository.call(UnCheckedAppTest.java:60)
	... 86 common frames omitted
  • 마지막에 실제 발생한 예외를 포함하고 있기에 오류를 확인할 수 있다.
  • 예외를 포함해서 기존에 발생한 java.sql.SQLException 과 스택 트레이스를 확인할 수 있다.
728x90