인프런 커뮤니티 질문&답변
역할과 구현
해결된 질문
작성
·
437
4
안녕하세요. 방학기간을 통해 스프링에 대해 공부하고 있는 대학생입니다. 다름이 아니라 스프링 핵심원리 강의에서 역할과 구현을 분리하라고 배웠습니다.
그래서 만약 '회원 저장소'를 만든다고 하면
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를 사용하면서 역할과 구현을 구분할 수 있을까요?
퀴즈
56%나 틀려요. 한번 도전해보세요!
순수 JPA 리포지토리 구현과 비교했을 때, Spring Data JPA 사용의 주요 장점은 무엇일까요?
복잡한 SQL 쿼리를 직접 작성할 필요가 전혀 없습니다.
기본적인 CRUD 작업을 위한 구현 코드를 직접 작성할 필요가 없습니다.
트랜잭션 관리를 수동으로 처리하여 더 세밀한 제어가 가능합니다.
엔티티의 변경 감지(Dirty Checking) 기능이 새롭게 추가됩니다.
답변 1
1
김영한
지식공유자
안녕하세요. 가짜님 좋은 질문입니다.
이것은 사실 트레이드 오프 입니다.
스프링 데이터 JPA가 제공하는 이미 인터페이스에 정의된 편리한 기능을 그대로 가져다 쓸 수 있는 장점이 있으면서 동시에 역할과 구현이라는 유연함을 어느정도 포기해야 합니다.
그래도 할 수 있는 방법이 있는데요.
스프링 데이터 JPA를 전혀 의존하지 않는 MemberRepository 인터페이스를 만들고
MyMemberRepositoryImpl implement MemberRepository 구현체를 만들고
MyMemberRepositoryImpl 구현체에서 스프링 데이터 JPA를 의존해서 사용하는 방법입니다.
그러니까 SpringDataJpaMemberRepository(스프링 데이터 JPA) 라는 인터페이스를 만들고 가져다 사용하는 것이지요.
예제 코드는 다음과 같습니다.
class MyMemberRepositoryImpl implement MemberRepository {
SpringDataJpaMemberRepository repository;
}
감사합니다.






답변 감사합니다. 언제나 질문에 성실히 답해주셔서 감사합니다.