
JpaRepository는 인터페이스이며 공통 CRUD를 제공해준다.
@Repository
@RequiredArgsConstructor
public class TeamJpaRepository {
private final EntityManager em;
public Team save(Team team){
em.persist(team);
return team;
}
public void delete(Team team){
em.remove(team);
}
public List<Team> findAll(){
return em.createQuery("select t from Team t", Team.class)
.getResultList();
}
public Optional<Team> findById(Long id){
return Optional.ofNullable(em.find(Team.class, id));
}
public long count(){
return em.createQuery("select count(t) from Team t", Long.class)
.getSingleResult();
}
}
public interface MemberRepository extends JpaRepository<Member, Long> {
}
JpaRespotirory를 사용하면 기존에 직접 구현 했던 코드를 더 이상 구현할 필요가 없어진다.

public interface JpaRepository<T, ID extends Serializable>
extends PagingAndSortingRepository<T, ID>
{
...
}
JpaRepository<Member, Long>T findOne(ID) -> Optional<T> findById(ID) 변경boolean exists(ID) -> boolean existsById(ID) 변경T: 엔티티ID: 엔티티의 식별자 타입S: 엔티티의 그 자식 타입save(S): 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합한다.delete(T): 엔티티 하나를 삭제한다. 내부에서 EntityManager.remove() 호출findById(ID): 엔티티 하나를 조회한다. 내부에서 EntityManager.find() 호출getOne(ID): 엔티티를 프록시로 조회한다. 내부에서 EntityManager.getReference() 호출findAll(...): 모든 엔티티를 조회한다. 정렬(Sort)이나 페이징(Pageable) 조건을 파라미터로 제공할 수 있다.