참고
순수 JPA기반 리포지토리 만들기
NOTE
기존의 JPA기반 레포지토리를 만들어보자!
•
기본적인 CRUD 구현
JPA기반 CRUD 리포지토리
NOTE
MemberJpaRepository
전체코드
1. Create
public Member save(Member member) {
em.persist(member);
return member;
}
Java
복사
2. Read
// 1개 조회
public Optional<Member> findById(Long id){
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
// 여러개 조회
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
// 데이터 개수 조회
public long count(){
return em.createQuery("select count(m) from Member m", Long.class)
.getSingleResult();
}
Java
복사
3. Update(변경 → 변경감지 사용)
•
JPA변경은 따로 메서드를 사용하지 않는다.
•
JPA에서는 EntityManager가 Entity의 수정을 감지하고 자동으로 반영해준다.
4. Delete
public void delete(Member member) {
em.remove(member);
}
Java
복사
스프링 데이터 JPA
NOTE
스프링 데이터 JPA는 자바의 기본 프록시 기술을 사용하여 프록시 객체를 자동으로 주입해준다!
우리가 직접 구현 클래스를 생성하지 않아도 자동으로 만들어줌!
•
구현 인터페이스에서 JpaRepository를 상속받으면 스프링 데이터 JPA가 자동으로 구현클래스를 만들어서 사용한다!
•
@Repository 어노테이션 생략 가능
◦
컴포넌트 스캔을 스프링 데이터 JPA가 자동으로 처리한다.
◦
JPA예외를 스프링 예외로 변환하는 과정도 처리해준다.
공통 인터페이스 적용
NOTE
순수 JPA로 구현한 MemberJpaRepository 대신 스프링 데이터 JPA가 제공하는 공통 인터페이스 사용!
MemberRepository
public interface MemberRepository extends JpaRepository<Member, Long> {}
Java
복사
이렇게만 적어두면 JPA기반으로 했던 레포지토에 있던 기능이 대부분 사용가능함
공통 인터페이스 분석
NOTE
JpaRepository 인터페이스
•
공통 CRUD 메서드 제공 ( find, findAll, save, delete ..)
•
제네릭은 <엔티티 타입, 식별자 타입> 설정
공통 인터페이스 구성
•
제네릭 타입
◦
T : 엔티티
◦
ID : 엔티티의 식별자 타입
◦
S : 엔티티와 그 자식 타입
주요 메서드
•
save(S)
◦
새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다
•
delete(T)
◦
엔티티 하나를 삭제한다.
◦
내부에서 EntityManager.remove() 호출
•
findById(ID)
◦
엔티티 하나를 조회한다.
◦
내부에서 EntityManager.find() 호출
•
getOne(ID)
◦
엔티티를 프록시로 조회한다.
◦
내부에서 EntityManager.getReference() 호출
•
findAll(..)
◦
모든 엔티티를 조회한다.
◦
정렬이나 페이징 조건을 파라미터로 제공 가능하다.