Post

[Spring Data JPA] 공통 인터페이스

📌 들어가며

이번 글에서는 순수 JPA와 Spring Data JPA의 Repository 코드 차이를 비교한다. Spring Data JPA가 얼마나 많은 코드를 줄여주는지 확인해보자.


1. 순수 JPA — 직접 구현

기존 JPA는 @RepositoryEntityManager로 CRUD를 일일이 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Repository
public class MemberJpaRepository {
    @PersistenceContext
    private EntityManager em;

    public Member save(Member member) { em.persist(member); return member; }
    public void delete(Member member) { em.remove(member); }
    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class).getResultList();
    }
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(em.find(Member.class, id));
    }
    public long count() {
        return em.createQuery("select count(m) from Member m", Long.class).getSingleResult();
    }
}

2. Spring Data JPA — 인터페이스만

1
2
public interface MemberRepository extends JpaRepository<Member, Long> {
}

💡 이게 끝이다! 추상 메소드조차 없는데 어떻게 save(), findAll()이 동작할까? Spring이 JpaRepository를 상속한 인터페이스의 구현체를 자동으로 만들어주기 때문이다. (프록시로 구현 클래스를 생성해 주입)

1
2
3
4
5
순수 JPA (수십 줄)         Spring Data JPA (1줄)
@Repository class {        interface extends JpaRepository {
  save, delete, findAll,       }  ← 구현은 스프링이 자동 생성
  findById, count ...
}
항목순수 JPASpring Data JPA
구현직접 작성자동 생성
코드량수십 줄1줄
EntityManager직접 다룸감춰짐

3. 테스트로 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberRepositoryTest {
    @Autowired MemberRepository memberRepository;

    @Test
    public void testMember() {
        Member member = new Member("memberB");
        Member savedMember = memberRepository.save(member);        // 자동 구현된 save
        Member findMember = memberRepository.findById(savedMember.getId()).get();
        assertThat(findMember).isEqualTo(member);
    }
}

빈 인터페이스만으로 save, findById가 정상 동작한다.


📝 정리

1
2
3
4
JPA vs Spring Data JPA
├─ 순수 JPA    @Repository + EntityManager로 직접 구현
├─ Data JPA    JpaRepository 상속만 (스프링이 자동 구현)
└─ 원리        상속 인터페이스의 구현체를 프록시로 자동 생성
개념한 줄 정의
JpaRepository공통 CRUD를 제공하는 인터페이스
자동 구현스프링이 구현체를 프록시로 생성

핵심은 “Spring Data JPA가 인터페이스 구현체를 자동으로 만들어준다”는 것이다. 순수 JPA의 반복적인 Repository 코드가 단 한 줄로 사라지는 것이 이 프레임워크의 가장 큰 매력이다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.