[23강]
스프링 데이터 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 = ?
이 코드를 실행시켜준다.