Anoi 2023. 2. 6. 01:29

스프링 데이터 JPA

스프링 부트와 JPA만 사용해도 개발 생산성이 증가하고, 개발해야할 코드도 확연히 줄어든다. 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있다. 그리고 반복 개발해 온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다.

 

앞의 JPA 설정을 그대로 사용한다.

 

먼저 repository - SpringDataJpaMemberRepository를 만든다.

SpringDataJpaMemberRepository.class

1
2
3
4
5
6
7
8
9
10
11
import hello.hellospring2.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
 
import java.util.Optional;
 
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
    //Member, Member의 pk 데이터타입
 
    @Override
    Optional<Member> findByName(String name);
}
cs

이 코드가 전부다.

왜 findByName만 있는지는 밑에서 설명하겠다.

JpaRepository<엔티티 클래스 이름, ID의 필드 타입>

인터페이스가 JpaRepository를 상속 받고 있으면 자동으로 구현체를 만들어준다.

그리고 자동으로 빈으로 등록해준다.

우리는 받아다 쓰면 된다.

 

실행하기 위해 SpringConfig에서도 할 일이 있다.

 

    private final MemberRepository memberRepository;

    @Autowired
    public SpringConfig(MemberRepository memberRepository) {
           this.memberRepository = memberRepository;
    }

 

스프링 컨테이너에서 MemberRepository를 찾는데 등록해둔 게 없으나 SpringDataJpaMemberRepository가 있다.

인터페이스만 만들어두고 JpaRepository를 상속받으면 스프링 데이터 jpa가 구현체를 만들어내고 빈으로 등록하니까 우리가 memberRepository로 인젝션 받을 수 있다.

 

스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD
  • findByName() , findByEmail() 처럼 메서드 이름 만으로 조회 기능 제공
  • 페이징 기능 자동 제공

우리가 상속하고 있는 JpaRepository에 들어가보면 findAll(), findById(), save()등 다 제공하고 있다.

개발자들이 공통적으로 쓸만한 메소드들을 모두 제공하고 있어서 바로 쓸 수 있는데

아이디(pk)가 아닌 이름이나 이메일로 조회를 하려는 경우는 특수한 경우라서 JpaRepository에도 없다.

그런 경우는 findBy__라는 패턴으로 메소드를 만들어주면 된다.

 

Optional<Member> findByName(String name) 

-> JPQL : select m from Member m where m.name = ?

이 코드를 실행시켜준다.