본문 바로가기
Java/ORM

JAVA ORM - Spring Data JPA(JpaRepository의 주요 메서드, 쿼리 메서드)

by 티코딩 2024. 8. 21.

우리가 spring data jpa를 사용함으로써 JpaRepository의 메서드들을 이용해 쉽게쉽게 사용할 수 있다고 했다.

그 메서드들에 대해 알아보자.

 

public interface JpaRepository<T, ID> extends ListCrudRepository<T, ID>, ListPagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {

 

JpaRepository는 ListCrudRepository, ListPagingAndSortingRepository, QueryByExampleExecutor를 상속받는다.

public interface ListCrudRepository<T, ID> extends CrudRepository<T, ID>
public interface ListPagingAndSortingRepository<T, ID> extends PagingAndSortingRepository<T, ID>

CrudRepository, PaginAndSortingRepository는 둘다 Repository라는 인터페이스를 확장한다.

@Indexed
public interface Repository<T, ID> {

}

 

CrudRepository 인터페이스

 

  • <S extends T> S save(S entity): 엔티티를 저장(삽입 또는 업데이트)함.
  • Optional<T> findById(ID id): 주어진 ID로 엔티티를 찾는다.
  • boolean existsById(ID id): 주어진 ID로 엔티티가 존재하는지 확인함.
  • Iterable<T> findAll(): 모든 엔티티를 조회한다.
  • Iterable<T> findAllById(Iterable<ID> ids): 주어진 ID들의 엔티티를 모두 조회한다.
  • long count(): 모든 엔티티의 개수를 반환한다.
  • void deleteById(ID id): 주어진 ID의 엔티티를 삭제한다.
  • void delete(T entity): 주어진 엔티티를 삭제한다.
  • void deleteAll(Iterable<? extends T> entities): 주어진 엔티티들을 모두 삭제한다.
  • void deleteAll(): 모든 엔티티를 삭제한다.

PagingAndSortingRepository 인터페이스

  • Iterable<T> findAll(Sort sort): 주어진 정렬 기준으로 모든 엔티티를 조회함.
  • Page<T> findAll(Pageable pageable): 페이징 정보를 사용하여 엔티티를 조회함.

JpaRepository 인터페이스

  • <S extends T> List<S> saveAll(Iterable<S> entities): 여러 엔티티들을 한 번에 저장함.
  • void flush(): 현재 영속성 컨텍스트에 있는 변경 사항들을 데이터베이스에 즉시 반영함.
  • <S extends T> S saveAndFlush(S entity): 엔티티를 저장하고 즉시 플러시함.
  • List<T> findAll(): 모든 엔티티를 리스트로 조회함.
  • List<T> findAll(Sort sort): 주어진 정렬 기준으로 모든 엔티티를 리스트로 조회함.
  • List<T> findAllById(Iterable<ID> ids): 주어진 ID들의 엔티티들을 리스트로 조회함.
  • <S extends T> List<S> saveAllAndFlush(Iterable<S> entities): 여러 엔티티들을 저장하고 즉시 플러시함.
  • <S extends T> long count(Example<S> example): 주어진 예제를 만족하는 엔티티의 개수를 반환함.
  • <S extends T> boolean exists(Example<S> example): 주어진 예제를 만족하는 엔티티가 존재하는지 확인함.

 

쿼리 메서드

위와 같이 기본으로 제공하는 메서드들 말고 spirng data jpa에서는 더욱 편리한 기능을 제공해준다.

위의 제공되는 메서드들로는 예를들어 Member의 username으로 member를 찾을 수 없지만, List<Member> findByUsername(String username);

이렇게만 코드를 넣어도 바로 사용이 가능해진다. 이건 바로 "쿼리 메서드" 라는기능인데,

쿼리 메서드는 Spring Data JPA가 리포지토리 인터페이스에 정의된 메서드 이름을 분석하여 자동으로 쿼리를 생성하는 기능이다.

쿼리 메서드는 보통 findBy, readBy, getBy, queryBy 등의 접두어로 시작하고, 뒤이어 엔티티 필드 이름을 붙이고, 조건을 지정하는 키워드(And, Or, Between, LessThan, GreaterThan, Like, In, OrderBy 등)를 사용하면 된다.

 

멤버 엔티티에 만약 username대신 nickname이라는 컬럼이 있다 가정하면, findByNickName();

email로 찾고싶다면, findByEmail();하면 바로 사용가능한 메서드가 된다.

만약, 쿼리메서드로 구현하기 힘든 쿼리는 @Query를 사용해 Jpql을 써주면 된다.

@Query(value = "SELECT * FROM users WHERE last_name = ?1", nativeQuery = true)
List<User> findByLastNameNative(String lastName);

 

*주의*

엔티티의 필드명이 변경될땐, 무조건 레포지토리의 메서드명도 바꿔야한다!

Username --> NickName;

Page<Member> findByUsername(String username, Pageable pageable);
:
:
V
Page<Member> findByNickName(String nickname, Pageable pageable);

 

 

DTO 조회

DTO를 직접 조회할때는 맨위에 패키지 루트를 Jpql에 정확히 기입해야한다.

com 안썼다가 자꾸 MemberDto를 못찾겠다해서 뭐지뭐지 하고 페치조인도해보고 별의별거 다 해보다가 이것때문이라 좀 시간좀 버렸다..

    @Query("select new com.study.data_jpa.dto.MemberDto(m.id, m.username, t.name) from Member m join m.team t")
    List<MemberDto> findMemberDto();

Dto를 찾을땐 꼭 new 를 써서 생성자의 순서대로 파라미터를 불러오자.