Search
Duplicate

공통 인터페이스 기능

순수 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 ) 조건을 파라미터로 제공 가능하다.