Replies: 3 comments
|
수고하셨습니다 ! |
0 replies
|
수고하셨습니당~~ |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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️⃣ 체크 예외와 인터페이스
서비스 계층은 특정 구현 기술에 의존하지 않고 순수하게 유지하는 것이 좋다.
서비스는
SQLException을 처리할 수 없으므로 리포지토리가 던지는SQLException체크 예외를 런타임 예외로 전환해서 서비스 계층에 던지자.이렇게 하면 서비스 계층이 해당 예외를 무시할 수 있기 때문에, 특정 구현 기술에 의존하는 부분을 제거하고 서비스 계층을 순수하게 유지할 수 있다.
인터페이스 도입
MemberService는MemberRepository인터페이스에만 의존하면 된다.MemberService코드의 변경 없이 구현 기술을 변경할 수 있다.MemberRepository 인터페이스
체크 예외 코드에 인터페이스 도입 시 문제점 -인터페이스
기존에 이런 인터페이스를 만들지 않았던 이유는
SQLException때문이다.체크 예외를 사용하려면 인터페이스에도 해당 체크 예외가 선언 되어 있어야 한다.
인터페이스의 메서드에
throws SQLException이 있어야 하기 때문에 기존에 인터페이스를 만들지 않았다.체크 예외 코드에 인터페이스 도입 시 문제점 - 구현 클래스
인터페이스의 구현체가 체크 예외를 던지려면, 인터페이스 메서드에 먼저 체크 예외를 던지는 부분이 선언 되어 있어야 한다. 그래야 구현 클래스의 메서드도 체크 예외를 던질 수 있다.
참고로 구현 클래스의 메서드에 선언할 수 있는 예외는 부모 타입에서 던진 예외와 같거나 하위타입이어야 한다.
특정 기술에 종속되는 인터페이스
구현 기술을 쉽게 변경하기 위해서 인터페이스를 도입하더라도
SQLException과 같은 특정 구현 기술에 종속적인 체크 예외를 사용하게 되면 인터페이스에도 해당 예외를 포함해야 한다.인터페이스를 만드는 목적은 구현체를 쉽게 변경하기 위함인데, 이미 인터페이스가 특정 구현 기술에 오염되었기 때문에 JDBC 가 아닌 다른 기술로 변경한다면 인터페이스 자체를 변경해야 한다.
런타임 예외와 인터페이스
2️⃣ 런타임 예외 적용
예외 변환
기존 예외를 생성자를 통해서 포함하고 있는 것을 확인할 수 있다. 예외는 원인이 되는 예외를 내부에 포함할 수 있는데 꼭 이렇게 작성해야 한다. 그래야 예외를 출력했을 때 원인이 되는 기존 예외도 함께 확인할 수 있다.
MyDbException이 내부에SQLException을 포함하고 있다고 이해하면 된다.⭐
throw new MyDbException()처럼 기존 예외를 무시하고 작성하면 절대 안된다.SQLException에서 문법 오류가 발생했다면 그 부분을 확인할 방법이 없게 된다.MemberServiceV4
📍 정리
남은 문제
지금은
MyDbException예외만 넘어오기 때문에 특정한 예외를 구분하지 못한다.특정 상황에 예외를 잡아서 복구하고 싶을 때 예외를 구분해서 처리하는 문제가 남아있다.
3️⃣ 데이터 접근 예외 직접 만들기
SQLException을 던진다. 그리고SQLException에는 데이터베이스가 제공하는errorCode가 들어있다.데이터베이스 오류 코드 그림
서비스 계층에서는 예외 복구를 위해 키 중복 오류를 확인할 수 있어야 한다. 그래야 새로운 ID를 만들어서 다시 저장을 시도할 수 있기 때문이다. 이러한 과정이 바로 예외를 확인해서 복구하는 과정이다.
리포지토리는
SQLException을 서비스 계층에 던지고 서비스 계층은 이 예외의 오류 코드를 확인해서 키 중복 오류(23505) 인 경우 새로운 ID를 만들어서 다시 저장하면 된다.그러나
SQLException을 서비스 계층으로 던지면 다시 동일한 문제가 발생할 수 있기 때문에MyDuplicateKeyException이라는 예외로 변환해서 던지면 된다.리포지토리 중요한 부분
e.getErrorCode() == 23505: 오류 코드가 키 중복 오류(23505) 인 경우MyDuplicateKeyException을 새로 만들어서 서비스 계층에 던진다.MyDbException을 던진다.서비스 중요한 부분
MyDuplicateKeyException예외가 올라오면 이 예외를 잡는다.generateNewId(memberId)로 새로운 ID 생성을 시도한다. 그리고 다시 저장한다. (예외를 복구하는 부분)MyDbException) 면 로그만 남기고 다시 예외를 던진다.📍 정리
SQLException을 특정 기술에 의존하지 않는 직접 만든 예외인MyDuplicateKeyException으로 변환할 수 있었다.MyDuplicateKeyException을 사용해서 문제를 복구하고, 서비스 계층의 순수성도 유지할 수 있었다.남은 문제
🔗 출처
김영한 - 스프링 DB 1편 - 데이터 접근 핵심 원리
All reactions