실전! 스프링 데이터 JPA

Ch02. 공통 인터페이스 기능 - 순수 JPA 기반 리포지토리 만들기

webmaster 2021. 12. 25. 15:35
728x90
  • Spring DATA JPA는 결국 JPA를 알아야지 한계 없이 사용할 수가 있다.

MemberJpaRepository 구현

@Repository
public class MemberJpaRepository {

    @PersistenceContext
    private EntityManager em;

    public Member save(Member member){
        em.persist(member);
        return member;
    }

    public Member find(Long id){
        return em.find(Member.class,id);
    }
    public void delete(Member member){
        em.remove(member);
    }
    public List<Member> findAll(){
        //JPQL
        return em.createQuery("select m from Member m",Member.class)
                .getResultList();
    }
    public Optional<Member> findById(Long id){
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }
    public long count(){
        return em.createQuery("select count(m) from Member m",Long.class)
                .getSingleResult();//단건 조회
    }

}
  • 수정 기능 같은 경우 변경 감지를 통해 Transaction이 종료될 때, 바뀐 부분을 알아서 update를 해주기 때문에 사용하지 않아도 된다.

TeamRepository 구현

@Repository
public class TeamRepository {
    @PersistenceContext
    private EntityManager em;
    //Member Repository랑 CRUD가 비슷하다.
    //타입만 다르다.
    public Team save(Team team){
        em.persist(team);
        return team;
    }
    public void delete(Team team){
        em.remove(team);
    }
    public List<Team> findAll(){
        return em.createQuery("select t from Team t",Team.class)
                .getResultList();
    }
    public Optional<Team> findById(Long id){
        Team team = em.find(Team.class,id);
        return Optional.ofNullable(team);
    }
    public long count(){
        return em.createQuery("select count(t) from Team t",Long.class)
                .getSingleResult();
    }
}

 

  • 구현을 해보니 실제 타입만 다르고 공통적으로 사용되는 부분이 많이 존재한다.

Test

@Test
@Rollback(value = false)
public void basicCRUD(){
    Member member1 = new Member("member1");
    Member member2 = new Member("member2");
    memberJpaRepository.save(member1);
    memberJpaRepository.save(member2);
    //단건 조회 검증
    Member findMember1 = memberJpaRepository.findById(member1.getId()).get();
    Member findMember2 = memberJpaRepository.findById(member2.getId()).get();
    assertThat(findMember1).isEqualTo(member1);
    assertThat(findMember2).isEqualTo(member2);

    findMember1.setUsername("member1!!!!");

    /*
    //리스트 조회 검증
    List<Member> all = memberJpaRepository.findAll();
    assertThat(all.size()).isEqualTo(2);

    //카운트 검증
    long count = memberJpaRepository.count();
    assertThat(count).isEqualTo(2);

    //삭제 검증
    memberJpaRepository.delete(member1);
    memberJpaRepository.delete(member2);

    long deletedCount = memberJpaRepository.count();
    assertThat(deletedCount).isEqualTo(0);
     */
}

 

728x90