JPA

스프링 데이터 JPA - 다양한 쿼리 기능

Rudtjs 2022. 6. 21. 19:18

스프링 데이터 JPA란?

Spring data JPA는 Spring Framework에서 JPA를 편리하게 사용할 수 있게 지원해주는 프로젝트입니다. Spring Data JPA는 공통 인터페이스를 적용시키기만 해도 내부에서 자동으로 구현체를 생성해줍니다. 

 

 

공통 인터페이스 적용

public interface MemberRepository extends JpaRepository<Member, Long> {
	...
}
  • 인터페이스를 생성한 후 JpaRepository <엔티티 타입, 식별자 타입> 인터페이스를 상속받는다.
  • JpaRepository 인터페이스는 공통 CRUD를 제공한다.

공통 메서드 제공

 

 

쿼리 메소드 기능

 

메소드  이름으로 쿼리 생성

List<Member> findByMemberGreaterThan(String username, int age);

 

스프링 데이터 JPA는  메소드 이름을 분석해서 JPQL을 생성하고 실행해준다. 하지만 필터 조건에 없는 메소드는 실행시킬 수 없다.

자세한 내용은 아래 링크를 참고하자.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

Named 쿼리

1. @NamedQuery 어노테이션으로 미리 정의

@Entity
@Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of={"id","username","age","team"}) 
@NamedQuery(
        name = "Member.findByUsername",
        query = "select m from Member m where m.username =:username"
)
public class Member {
		...
}

 

2. 스프링 데이터 jpa로 호출하기

@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);

스프링 데이터 JPA는 “도메인 클래스 + . + 메서드이름)” 으로 파싱 해서 네임드 쿼리를 찾아서 실행.

Entity에 쿼리가 많이 쌓인다는 단점과 Entity에 역활에서도 벗아 나기 때문에 Named쿼리 방식은 잘 사용하지 않습니다.

@Query를 Repository에 정의하기

@Query("select m from Member m where m.username= :username and m.age = :age")
List<Member> finduser(@Param("username") String username, @Param("age") int age);

실행 시점에서 문법 오류를 발견할 수 있다.

 

 

DTO로 직접 조회

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

new 명령어를 사용해서 DTO를 직접 조회한다.

 

 

파라미터로 바인딩

SELECT m FROM Member m WHERE m.username = ?0 // 위치 기반
SELECT m FROM Membeer m WHERE m.username = :name // 이름 기반

@Query("select m from Member m where m.username = :name")
Member findMembers(@Param("name") String username);
  • 스프링 데이터 JPA는 2가지 방법으로 파라미터 바인딩을 지원한다.(위치, 이름)
  • 자바 8 버전 이상부터는 컴파일러에 -parameters 옵션을 설정하면 @Param을 생략해도 동작이 된다.

 

김영한 선생님 JPA 강의

 

실전! 스프링 데이터 JPA - 인프런 | 강의

스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.

www.inflearn.com

'JPA' 카테고리의 다른 글

스프링 데이터 JPA - 다양한 기능2  (0) 2022.07.05
스프링 데이터 JPA - 다양한 기능들  (0) 2022.06.26
JPA 영속성 컨텍스트란?  (0) 2022.06.15
JPA를 사용해야 하는 이유  (0) 2022.06.14