-
#실전 2 - 9 스프링 데이터 JPA 소개SPRING-BOOT 2021. 3. 12. 15:11
스프링 데이터 JPA 소개
· https://spring.io/projects/spring-data-jpa
Spring Data JPA
Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use dat
spring.io
스프링 데이터 JPA는 JPA를 사용할 때 지루하게 반복하는 코드(save, find, findAll ...)를 자동화 해준다. 이미 라이브러리는 포함되어 있다. 기존의 MemberRepository 를 스프링 데이터 JPA로 변경해보자.
필수 라이브러리 추가
MemberRepository
최초
package jpabook.jpashop.repository; import jpabook.jpashop.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; public interface MemberRepository extends JpaRepository<Member,Long> { //JpaRepository<type,pk type> }
interface만 생성해도 다른곳에서 문제가 발생하지않는다 왜나하면 JpaRepository를 가보면
사람이 생각할 수 있는것이 공통로 다만들어져있다.
구현체를 Spring bean이 injection해야하지 않나? 라고 생각할 법도 한데. 구현체를 스프링데이터 JPA가 알아서 다 만들어서 넣어준다.
repository를 만드는 공수가 줄어든데 그렇지만 해결이 안되는것도있다.
findByName같은것 이것은 공통할수 있는것 인터페이스에 선언해놓고 사용하기 애매하다 findByName으로할지 findByUserName으로 할지 모르기때문이다. 그래서 직접 만들어 줘야한다.
public interface MemberRepository extends JpaRepository<Member,Long> {//JpaRepository<type,pk type> //이걸 JPQL로 구현할 필요가없다. 시그니처를 보고 알아서 해결해준다. //여기는 룰이있는데 findBy + Name을 하게되면 //select m from Member m where m.name = ? 이라고 알아서 짜버린다. Name을보고 만들기 떄문에 name이 중요하다 List<Member> findByName(String name); }
JPQL로 구현할 필요가없다. 시그니처를 보고 알아서 해결해준다.
여기는 룰이있는데 findBy + Name을 하게되면 select m from Member m where m.name = ? 이라고 알아서 짜버린다. Name을보고 만들기 떄문에 name이 중요하다package jpabook.jpashop.repository; import jpabook.jpashop.domain.Member; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import java.util.List; @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member); } public Member findOne(Long id) { return em.find(Member.class, id); } public List<Member> findAll() { return em.createQuery("select m from Member m", Member.class) .getResultList(); } public List<Member> findByName(String name) { return em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name", name) .getResultList(); } }
스프링 데이터 JPA 적용
package jpabook.jpashop.repository; import jpabook.jpashop.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface MemberRepository extends JpaRepository<Member, Long> { List<Member> findByName(String name); }
findOne() → findById()로 변경해야 한다
· 스프링 데이터 JPA는 JpaRepository 라는 인터페이스를 제공하는데, 여기에 기본적인 CRUD 기능이 모두 제공된다.
(일반적으로 상상할 수 있는 모든 기능이 다 포함되어 있다.)
· findByName 처럼 일반화 하기 어려운 기능도 메서드 이름으로 정확한 JPQL 쿼리를 실행한다.
· select m from member m where m.name = :name
· 개발자는 인터페이스만 만들면 된다. 구현체는 스프링 데이터 JPA가 애플리케이션 실행시점에 주입해준다.
스프링 데이터 JPA는 스프링과 JPA를 활용해서 애플리케이션을 만들때 정말 편리한 기능을 많이 제공한다. 단순히 편리함을 넘어서 때로는 마법을 부리는 것 같을 정도로 놀라운 개발 생산성의 세계로 우리를 이끌어 준다.
하지만 스프링 데이터 JPA는 JPA를 사용해서 이런 기능을 제공할 뿐이다. 결국 JPA 자체를 잘 이해하는 것이 가장 중요하다.
'SPRING-BOOT' 카테고리의 다른 글
#RedirectAttributes로 화면에 일회성 msg 전달 (0) 2021.05.07 실전 2 - 10 QueryDSL 소개 (0) 2021.03.12 #실전2 - 8 OSIV와 성능 최적화 (0) 2021.03.12 #실전2 - 7 컬렉션 조회 최적화 (0) 2021.03.09 #실전2 - 6 지연 로딩과 조회 성능 최적화 (0) 2021.03.08