서비스 계층은 가급적 특정 구현 기술에 의존하지 않고, 순수하게 유지하는 것이 좋다.
이렇게 하려면 예외에 대한 의존도 함께 해결해야한다.
예를 들어서 서비스가 처리할 수 없는
SQLException
에 대한 의존을 제거하려면 어떻게 해야할까?
서비스가 처리할 수 없으므로 리포지토리가 던지는 SQLException
체크 예외를 런타임 예외로 전환해서 서비스 계층에 던지자. 이렇게 하면 서비스 계층이 해당 예외를 무시할 수 있기 때문에, 특정 구현 기술에 의존하는 부분을 제거하고 서비스 계층을 순수하게 유지할 수 있다.
지금부터 코드로 이 방법을 적용해보자.
먼저 MemberRepository
인터페이스도 도입해서 구현 기술을 쉽게 변경할 수 있게 해보자.
인터페이스 도입 그림
MemberService
는 MemberRepository
인터페이스에만 의존하면 된다.MemberService
코드의 변경 없이 구현 기술을 변경할 수 있다.MemberRepository 인터페이스
package hello.jdbc.repository;
import hello.jdbc.domain.Member;
public interface MemberRepository {
Member save(Member member);
Member findById(String memberId);
void update(String memberId, int money);
void delete(String memberId);
}
특정 기술에 종속되지 않는 순수한 인터페이스이다. 이 인터페이스를 기반으로 특정 기술을 사용하는 구현체를 만들면 된다.
체크 예외와 인터페이스
잠깐? 기존에는 왜 이런 인터페이스를 만들지 않았을까?
→ 사실 다음과 같은 문제가 있기 때문에 만들지 않았다.
→ 왜냐하면 SQLException
이 체크 예외이기 때문이다.
여기서 체크 예외가 또 발목을 잡는다.
체크 예외를 사용하려면 인터페이스에도 해당 체크 예외가 선언 되어 있어야 한다.
예를 들면 다음과 같은 코드가 된다.