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