안녕하세요. 방학기간을 통해 스프링에 대해 공부하고 있는 대학생입니다. 다름이 아니라 스프링 핵심원리 강의에서 역할과 구현을 분리하라고 배웠습니다.
그래서 만약 '회원 저장소'를 만든다고 하면
pubic interface MemberRepository{
void save(Member member);
Member findById(Long memberId);
}
을 만들고 필요한 구현체를 따로 만들었습니다.
메모리를 이용한다면
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member> store = new HashMap<>();
@Override public void save(Member member) {
store.put(member.getId(), member);
}
@Override public Member findById(Long memberId) {
return store.get(memberId);
}
}
이런 식으로 만들고, 만약 JPA를 이용한다면
public class MemberJpaRepository implements MemberRepository {
@PersistenceContext
private EntityManager em;
public void save(Member member) {
em.persist(member);
}
public Member findById(Long id) {
Member member = em.find(Member.class, id);
return member;
}
}
이런 식으로 만들어서 사용했습니다.
여기서 스프링데이터JPA를 사용하기 위해선 인터페이스에 JpaRepository를 상속받아야하는데
그러면 기존에 있던 MemberRepository에 상속받아서 사용하면 되나요?
그런데 MemberRepository에서 JpaRepository를 상속받게 되면 기존에 MemberRepository 구현체들이 JpaRepository까지 모두 구현해야하는 문제가 있고, MemberReposity에서 사용하는 메소드 이름과 JpaRepository에서 사용하는 메소드 이름이 같으면 MemberRepository를 주입받아 사용하는 다른 클래스에도 문제가 발생했습니다.
이래저래 글이 길었지만 그래서 어떻게 스프링데이터 JPA를 사용하면서 역할과 구현을 구분할 수 있을까요?
답변 감사합니다. 언제나 질문에 성실히 답해주셔서 감사합니다.