[JPA] JpaRepository

컴공생의 코딩 일기·2023년 2월 1일
0

JPA

목록 보기
9/14
post-thumbnail
post-custom-banner

JpaRepository는 인터페이스이며 공통 CRUD를 제공해준다.

직접 구현한 Repository

@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();
    }

}

JpaRepository를 사용한 인터페이스

public interface MemberRepository extends JpaRepository<Member, Long> {
}

JpaRespotirory를 사용하면 기존에 직접 구현 했던 코드를 더 이상 구현할 필요가 없어진다.

공통 인터페이스 구성

JpaRepository 분석

public interface JpaRepository<T, ID extends Serializable>
 extends PagingAndSortingRepository<T, ID>
{
 ...
}
  • @Repository 어노테이션 생략 가능하다.
  • JpaRepository 인터페이스: 공통 CRUD를 제공한다.
  • 제네릭: <엔티티 타입, 식별자 타입> 설정 예) 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) 조건을 파라미터로 제공할 수 있다.
profile
더 좋은 개발자가 되기위한 과정
post-custom-banner

0개의 댓글