nu_s

[Spring Data JPA] 스프링 데이터 JPA 🍀 본문

Spring Data JPA

[Spring Data JPA] 스프링 데이터 JPA 🍀

woochii 2023. 11. 20. 23:59
728x90
반응형

JPA

  • 지금까지 우리가 JPA를 사용하던 방식이다.
  • EntityManager를 주입받아 엔티티를 영속성 컨텍스트에 관리할 수 있다.
  • 지금도 편리해 보이지만 스프링 데이터 JPA를 사용하면 더 편리하게 코드를 작성할 수 있다.

 

스프링 데이터 JPA

  • 스프링 데이터 JPA는 JPA를 사용할 때 반복되는 코드를 자동화 해준다.
  • 스프링 데이터 JPA는 JpaRepository라는 인터페이스를 제공하는데, 여기에 기본적인 CRUD 기능이 모두 제공된다.

MemberRepository

// JpaRepository<T, ID>
public interface MemberRepository extends JpaRepository<Member, Long> {
}
  • T는 엔티티, ID는 엔티티의 식별자 타입을 넣어주면 된다.

MemberRepositoryTest

@SpringBootTest
@Transactional
@Rollback(false)
class MemberRepositoryTest {

    @Autowired MemberRepository memberRepository;

    @Test
    public void testMember() {}
}

  • MemberRepository의 부모인 JpaRepository에는 이런 다양한 메서드들이 있다.
  • 잘 보면 JPA에서 우리가 지금까지 사용해왔던 메서드와 이름이 같은 것을 볼 수 있다.
  • 즉, 우리는 JpaRepository만 상속받으면 구현하지 않고도 위의 메서드들을 사용해 영속성 컨텍스트를 관리할 수 있다.

 

참고

  • findById()라는 메서드는 존재하지만 만약 Id가 아닌 이름으로 조회를 하고싶을 땐 어떻게 해야할까?

MemberRepository

public interface MemberRepository extends JpaRepository<Member, Long> {
    
    List<Member> findByName(String name);
}
  • findByName()이라는 선언부를 만들어주면 끝이다.
  • 구현부를 만들어 줄 필요가 없다.
  • 그 이유는 다음과 같다.
    • 스프링 데이터 JPA에는 규칙이 있다.
    • 메서드의 이름을 분석을 한다.
    • findByName 이라는 메서드가 있다면 'findBy'와 'Name'으로 분리를 한 뒤 JPQL 쿼리를 자체적으로 실행한다.
    • "select m from Member m where m.name = :name"
    • 이것을 "쿼리 메서드"라고 한다.
  • 개발자는 인터페이스만 만들면 된다. 구현체는 스프링 데이터 JPA가 애플리케이션 실행 시점에 주입해준다.

 

JpaRepository의 주요 메서드

주요 메서드 기능
save(S) 새로운 엔티티는 저장하고, 이미 있는 엔티티는 병합한다.
delete(T) 엔티티를 하나 삭제한다. 내부에서 EntityManager.remove() 호출
findById(ID) 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출
getOne(ID) 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출
findAll() 모든 엔티티를 조회한다. 정렬(Sort)이나 페이징(Pageable) 조건을 파라미터로 제공할 수 있다.
  • findById(ID)의 경우 반환 타입은 Optional<T>이다.

 

주의

  • 스프링 데이터 JPA는 스프링과 JPA를 활용해서 많은 편리한 기능들을 제공한다.
  • 그러나 스프링 데이터 JPA는 JPA를 사용해서 이런 기능을 제공할 뿐이다.
  • 가장 중요한 것은 JPA를 잘 이해하는 것이다.

출처 : 인프런 실전! 스프링 데이터 JPA

728x90
반응형