-
[김영한 스프링] 21. 자바 예외 이해 - 예외 포함과 스택 트레이스Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2024. 1. 1. 03:31
예외 포함과 스택 트레이스
예외를 전환할 때는 꼭! 기존 예외를 포함해야 한다. 그렇지 않으면 스택 트레이스를 확인할 때 심각한 문제가 발생한다.
package hello.jdbc.exception.basic; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThatThrownBy; @Slf4j public class UnCheckedAppTest { @Test void printEx() { Controller controller = new Controller(); try { controller.requset(); } catch (Exception e) { // e.printStackTrace(); log.info("ex", e); } } @Test void unchecked() { Controller controller = new Controller(); assertThatThrownBy(() -> controller.requset()).isInstanceOf(Exception.class); } static class Controller { Service service = new Service(); public void requset() { service.logic(); } } static class Service { Repository repository = new Repository(); NetworkClient networkClient = new NetworkClient(); public void logic() { repository.call(); networkClient.call(); } } static class NetworkClient { public void call() { throw new RuntimeConnectException("연결 실패"); } } 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 RuntimeConnectException extends RuntimeException { public RuntimeConnectException(String message) { super(message); } } static class RuntimeSQLException extends RuntimeException { public RuntimeSQLException(Throwable cause) { super(cause); } } }
- 로그를 출력할 때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.
- 예) log.info("message={}", "message", ex), 여기에서 마지막에 ex를 전달하는 것을 확인할 수 있다. 이렇게 하면 스택 트레이스에 로그를 출력할 수 있다.
- 예) log.info("ex", ex) 지금 예에서는 파라미터가 없기 때문에, 예외만 파라미터에 전달하면 스택 트레이스를 로그에 출력할 수 있다.
- System.out에 스택 트레이스를 출력하려면 e.printStackTrace()를 사용하면 된다.
- 실무에서는 항상 로그를 사용해야 한다는 점을 기억하자.
기존 예외를 포함하는 경우
예외를 포함해서 기존에 발생한 java.sql.SQLException과 스택 트레이스를 확인할 수 있다.
기존 예외를 포함하지 않는 경우
package hello.jdbc.exception.basic; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThatThrownBy; @Slf4j public class UnCheckedAppTest { @Test void printEx() { Controller controller = new Controller(); try { controller.requset(); } catch (Exception e) { // e.printStackTrace(); log.info("ex", e); } } @Test void unchecked() { Controller controller = new Controller(); assertThatThrownBy(() -> controller.requset()).isInstanceOf(Exception.class); } static class Controller { Service service = new Service(); public void requset() { service.logic(); } } static class Service { Repository repository = new Repository(); NetworkClient networkClient = new NetworkClient(); public void logic() { repository.call(); networkClient.call(); } } static class NetworkClient { public void call() { throw new RuntimeConnectException("연결 실패"); } } static class Repository { public void call() { try { runSQL(); } catch (SQLException e) { throw new RuntimeSQLException(); } } public void runSQL() throws SQLException { throw new SQLException("ex"); } } static class RuntimeConnectException extends RuntimeException { public RuntimeConnectException(String message) { super(message); } } static class RuntimeSQLException extends RuntimeException { public RuntimeSQLException() { } public RuntimeSQLException(Throwable cause) { super(cause); } } }
예외를 포함하지 않아서 기존에 발생한 java.sql.SQLException과 스택 트레이스를 확인할 수 없다. 변환한 RuntimeSQLException부터 예외를 확인할 수 있다. 만약 실제 DB에 연동했다면 DB에서 발생한 예외를 확인할 수 없는 심각한 문제가 발생한다.
출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Spring > 스프링 DB 1편 - 데이터 접근 핵심 원리' 카테고리의 다른 글
[김영한 스프링] 23. 자바 예외 이해 - 데이터 접근 예외 직접 만들기 (1) 2024.01.02 [김영한 스프링] 22. 자바 예외 이해 - 체크 예외와 인터페이스 & 런타임 예외 적용 (2) 2024.01.02 [김영한 스프링] 20. 자바 예외 이해 - 체크, 언체크 예외 활용 (2) 2024.01.01 [김영한 스프링] 19. 자바 예외 이해 - 체크, 언체크 예외 기본 이해 (0) 2023.12.30 [김영한 스프링] 18. 자바 예외 이해 - 예외 계층 & 예외 기본 규칙 (1) 2023.12.29 - 로그를 출력할 때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.