You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
#️⃣ 목차
1️⃣ 체크 예외 활용
언제 체크 예외를 쓰는지, 언체크예외를 쓰는지, 기본 원칙 2가지
체크 예외 문제점
Repository 는 DB에 접근해서 데이터를 저장하고 관리한다. 위의 그림에서는
SQLException체크 예외를 던진다.NetworkClient는 외부 네트워크에 접속해서 어떤 기능을 처리하는 객체이다. 여기서ConnectException체크 예외를 던진다.서비스는 Repository 와
NetworkClient를 둘 다 호출한다.SQLException과ConnectException을 처리해야 한다.ConnectException처럼 연결이 실패하거나SQLException처럼 데이터베이스에서 발생하는 문제들은 대부분 애플리케이션 로직에서 처리할 방법이 없다.서비스는
SQLException과ConnectException을 처리할 수 없으므로 둘 다 밖으로 던진다.컨트롤러도 두 예외를 처리할 방법이 없다.
웹 애플리케이션이라면 서블릿의 오류 페이지나 또는 스프링 MVC가 제공하는
ControllerAdvice에서 이런 예외를 공통으로 처리한다.체크 예외 문제점 - 코드 - CheckedAppTest
logic() throws SQLException, ConnectException을 선언했다.request() throws SQLException, ConnectException을 선언했다.위의 예시는 2가지 문제점이 존재한다.
1. 복구 불가능한 예외
SQLException은 데이터베이스에서 무언가 문제 (SQL 문법 오류, 데이터베이스 자체 오류 ..) 가 있어서 발생하는 예외이므로 대부분 복구가 불가능하다. 특히 대부분의 서비스나 컨트롤러는 문제를 해결할 수 없다.ControllerAdvice를 사용하면 이런 부분을 깔끔하게 공통으로 해결할 수 있다.2. 의존 관계에 대한 문제
throws를 통해 던지는 예외를 선언해야 한다.java.sql.SQLException을 의존하기 때문이다.SQLException이 아니라 예를 들어JPAException으로 예외가 변경된다면 모든 서비스, 컨트롤러의 코드를JPAException에 의존하도록 고쳐야하는 문제점이 있다.📍 정리
throws Exception
throws SQLException이 아니라throws Exception처럼 최상위 예외를 던질 수도 있다. 그러나 모든 체크 예외를 다 밖으로 던지는 문제가 발생한다.Exception자체를 밖으로 던지는 것은 좋지 않은 방법이다.2️⃣ 언체크 예외 활용
런타임 예외 사용
SQLExceptino을 런타임 예외인RuntimeSQLException으로 변환했다.ConnectException대신에RuntimeConnectException을 사용하도록 바꾸었다.런타임 예외이기 때문에 서비스, 컨트롤러는 해당 예외들을 처맇라 수 없다면 별도의 선언 없이 그냥 두면 된다.
런타임 예외 사용 변환 - 코드 - UncheckedAppTest
SQLException이 발생하면 런타임 예외인RuntimeSQLException으로 전환해서 예외를 던진다.NetworkClient는 단순히 기존 체크 예외를RuntimeConnectException이라는 런타임 예외가 발생하도록 코드를 바꾸었다.런타임 예외 구현 기술 변경 시 파급 효과
📍 정리
throws에 예외를 계속 붙여야 했다.throws 런타임예외를 남겨서 중요한 예외를 인지할 수 있게 해준다.런타임 예외 문서화 예시
JPA Entity Manager

스프링 JdbcTemplate

3️⃣ 예외 포함과 스택 트레이스
예외를 전환할 때는 꼭 기존 예외를 포함해야 한다. 그렇지 않으면 스택 트레이스를 확인할 때 심각한 문제가 발생한다.
로그를 출력할 때 마지막 파라미터에 예외를 넣어주면 로그에 스택 트레이스를 출력할 수 있다.
log.info("message={}", "message" , ex)여기에서 마지막에ex를 전달하는 것을 확인할 수 있다. 이렇게하면 스택 트레이스에 로그를 출력할 수 있다.log.info("ex", ex)지금 예에서는 파라미터가 없기 때문에, 예외만 파라미터에 전달하면 스택트레이스를 로그에 출력할 수 있다.System.out에 스택 트레이스를 출력하려면e.printStackTrace()를 사용하면 된다.기존 예외를 포함하는 경우
예외를 전환할 때는 꼭 !! 기존 예외를 포함하자.
🔗 출처
김영한 - 스프링 DB 1편 - 데이터 접근 핵심 원리
All reactions