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
'스프링 DB 1편(데이터 접근 핵심 원리)' 카테고리의 다른 글
| Ch06. 스프링과 문제 해결(예외 처리, 반복) - 런타임 예외 적용 (0) | 2022.05.01 |
|---|---|
| Ch06. 스프링과 문제 해결(예외 처리, 반복) - 체크 예외와 인터페이스 (0) | 2022.05.01 |
| Ch05. 자바 예외 이해 - 언체크 예외 활용 (0) | 2022.04.30 |
| Ch05. 자바 예외 이해 - 체크 예외 활용 (0) | 2022.04.30 |
| Ch05. 자바 예외 이해 - 언체크 예외 기본 이해 (0) | 2022.04.30 |