스프링 데이터 JPA를 사용하는 가장 단순한 방법은 JpaRepository 인터페이스를 상속받는 것이다.
제네릭에 엔티티 클래스와 엔티티 클래스의 식별자 타입을 지정하면 된다.
//JpaRepository 공통 기능 인터페이스public interface JpaRepository<T, ID extends Serializable> extends PaginAndSortRepository<T, ID>{ ...}//JpaRepository를 사용하는 인터페이스public interface MemberRepository extends JpaRepository<Member, Long>{}
JpaRepository<Member, Long> 부분에 회원 엔티티와 식별자 타입을 지정했다.
이제부터 회원 리포지토리는 JpaRepository 인터페이스가 제공하는 다양한 기능을 사용할 수 있다.
JpaRepository
의 계층 구조

윗 부분에 스프링 데이터 모듈이 있고 그 안에 Repository, CrudRepository, PagingAndSortingRepository가 있는데 스프링 데이터 프로젝트가 공통으로 사용하는 인터페이스다.
스프링 데이터 JPA가 제공하는 JpaRepository 인터페이스는 추가로 JPA에 특화된 기능을 제공한다.
JpaRepository 인터페이스를 상속받으면 사용할 수 있는 주요 메소드
T는 엔티티, ID는 엔티티의 식별자 타입, S는 엔티티와 그 자식 타입 - save(S) : 새로운 엔티티는 저장하고 이미 있는 엔티티는 수정한다. - delete(T) : 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove()를 호출한다. - findOne(ID) : 엔티티 하나는 조회한다. 내부에서 EntityManager.find()를 호출한다. - getOne(ID) : 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference()를 호출한다. - findAll(...) : 모든 엔티티를 조회한다. 정렬이나 페이징 조건을 파라미터로 제공할 수 있다.
save(S)는 엔티티에 식별자 값이 없으면(null) 새로운 엔티티로 판단해서 EntityManager.persist()를 호출하고,
식별자 값이 있으면 이미 있는 엔티티로 판단해서 EntityManager.merge()를 호출한다.
필요하면 스프링 JPA 기능을 확장해서 신규 엔티티 판단 전략을 변경할 수 있다.