[Spring Data JPA] JpaRepository
포스트
취소

[Spring Data JPA] JpaRepository

기존 JPA의 Repository

  • 기존에 JPA만 사용할 때 Repository를 작성하면 다음과 같이 작성했다.
  • 기능 자체에는 문제가 없지만 개발하는 서비스의 수가 많아지다 보면 그만큼 동일한 유형의 코드가 많이 반복되게 된다.
@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){
		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();
	}

    //...
}

JpaRepository?

  • 기존 JPA만 사용할 때 Repository를 만들 때 비슷한 유형의 코드들이 반복되는 것을 막고자 Spring Data JPA는 JpaRepository라는 인터페이스를 만들어냈다.
  • 해당 인터페이스는 Spring Data JPA에서 기본적으로 제공하는 기능으로 JpaRepository를 상속받은 인터페이스를 사용한다면 기존에 반복되는 유형의 코드들을 생성하지 않아도 된다.
  • 이전 문단의 예시는 다음과 같이 줄일 수 있다.
@Repository
public interface MemberRepository extends JpaRepository<Member, Long>{

}
  • 왜 작업할 게 이것밖에 없지 의문이 들 수 있지만 정말 이게 끝이다.
  • 실제로 아래 코드로 테스트를 돌려보면 정상적으로 동작한다.
@Autowired
MemberRepository memberRepository;

@Test
public void testMember() {
    Member member = new Member("memberA");
    Member savedMember = memberRepository.save(member);
    
    Member findMember = memberRepository.findById(savedMember.getId()).get();
    
    assertThat(findMember.getId()).isEqualTo(member.getId());
    assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
    assertThat(member).isEqualTo(findMember);
}

제네릭 타입

  • T
    • 엔티티
  • ID
    • 엔티티의 식별자 타입
  • S
    • 엔티티와 그 자식 타입

주요 메소드

  • save(S)
    • 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.
  • delete(T)
    • 엔티티 하나를 삭제한다.
    • 내부에서 EntityManager.remove()를 호출한다.
  • findById(ID)
    • 엔티티 하나를 조회한다.
    • 내부에서 EntityManager.find()를 호출한다.
  • getOne(ID)
    • 엔티티를 프록시로 조회한다.
    • 내부에서 EntityManager.getReference()를 호출한다.
  • findAll(…)
    • 모든 엔티티를 조회한다.
    • 정렬이나 페이징 조건을 파라미터로 제공할 수 있다.

매우 다양한 기능

  • 위에 소개한 메소드말고도 기본적인 CRUD 관련 기능에 Flush 기능도 있다.

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.