순수 JPA기반 리포지토리 만들기
→ 우선 순수한 JPA기반 리포지토리를 만들어 볼 것입니다.
→ 기본 CRUD 기능을 구현할 것입니다.
1.
Create(저장)
public void save(Member member){em.persist(member);}
Java
복사
2.
Read(조회)
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();
}
Java
복사
3.
Update(변경 → 변경감지 사용)
•
JPA에서 변경은 따로 메서드를 이용해서 하지 않는다. 변경감지를 이용하면 트랜잭션내에서 객체으 속성이 변경되면 트랜잭션 종료 전 JPA에서는 변경 감지를 하여 업데이트를 해준다.
4.
Delete(삭제)
public void delete(Long id){
Member findMember = em.find(Member.class, id);
em.remove(findMember);
}
Java
복사
테스트해보기
Code
공통 인터페이스 설정
1.
JavaConfig 설정
•
프로젝트명Application.java 파일에 basePackages 설정
@Configuration
@EnableJpaRepositories(basePackages = "jpabook.jpashop.repository")
public class AppConfig {}
Java
복사
•
스프링 부트 사용 시 @EnableJpaRepositories(basePackages="jpabook.jpashop.repository")
를 따로 작성해줄 필요가 없고 굳이 다른 Config 클래스를 사용할 때 작성해준다.
2. Spring data JPA가 구현 클래스 대신 생성
•
개발자가 Interface만 선언해주면 Spring data가 자동으로 구현클래스를 만들어서 사용한다.
◦
Ex: xxxRepository.save() , find(), findAll() ...
xxxRepository.getClass() → class com.sun.proxy.$ProxyXXX
•
@Repository 어노테이션 생략 가능
◦
컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리
◦
JPA예외를 스프링 예외로 변환하는 과정도 자동으로 처리
공통 인터페이스 적용
→ 순수 JPA로 구현한 MemberJpaRepository 대신 스프링 데이터 JPA가 제공하는 공통 인터페이스 사용
•
스프링 데이터 JPA기반 MemberRepository
package study.querydsl.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import study.querydsl.entity.Member;
import java.util.List;
public interface MemberRepository extends JpaRepository<Member, Long> {
//select m from Member m where m.username = ?;
List<Member> findByUsername(String username);
}
Java
복사
•
MemberRepository 테스트 코드
Code
공통 인터페이스 분석
•
JpaRepository 인텊이스: 공통 CRUD 제공
→Ex: find, findAll, save, delete ...
•
제네릭은 <엔티티 타입 , 식별자 타입> 설정
public interface ExampleRepository extends JpaRepository<Entity, PrimityType>{}
Java
복사
공통 인터페이스 구성
주의사항
•
T findOne(ID) → Optional<T> findById(ID) 로 변경되었다.
제네릭 타입
•
T :엔티티
•
ID : 엔티티의 식별자 타입
•
S : 엔티티와 그 자식 타입
주요 메서드
•
save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.
•
delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출
•
findById(ID) : 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출
•
getOne(ID) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출
•
findAll(...) : 모든 엔티티를 조회한다. 정렬(Sort )이나 페이징( Pageable ) 조건을 파라미터로 제공 가능하다.