1. 스프링 데이터 JPA란?
스프링 데이터 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트로 JPA 기반 데이터 접근 계층을 쉽게 구현할 수 있도록 도와줍니다. CRUD를 처리하기 위한 공통 인터페이스를 제공하고 생산성을 높이기 위한 다양한 기능을 제공합니다.
2. 스프링 데이터 JPA 사용법
gradle 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
public interface ProductRepository extends JpaRepository<Product, Long> {
}
스프링 데이터 JPA는 리포지토리를 개발할 때 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가
구현체를 동적으로 생성해 스프링 빈으로 등록해줍니다. => 개발자는 직접 구현 클래스를 만들지 않아도 된다.
인터페이스를 상속 받고 제너릭에 <해당 엔티티, 식별자>를 지정해주면 JpaRepository의 다양한 기능들을 사용할 수 있습니다.
JpaRepository의 메소드 ex)
save(S) : 새로운 엔티티는 저장(Insert)하고 이미 있는 엔티티는 수정(Update)
delet(T) : 엔티티 하나를 삭제
findAll() : 모든 엔티티를 조회
등등의 다양한 기능들을 제공합니다.
쿼리 메소드 기능
public interface ProductRepository extends JpaRepository<Product, Long> {
Optional<Product> findByProductName(String productName);
}
SELECT p FROM Product p WHERE p.productName = ?1
스프링 데이터 JPA는 메소드 이름만으로 쿼리를 생성해줍니다.
해당 인터페이스에 메소드만 선언해주면 메소드 이름을 분석해 적절한 JPQL 쿼리를 생성해서 실행합니다.
메소드 이름으로 쿼리를 생성할 때에는 정해진 규칙에 따라서 메소드 이름을 지어야 합니다.
https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html
JPA Query Methods :: Spring Data JPA
By default, Spring Data JPA uses position-based parameter binding, as described in all the preceding examples. This makes query methods a little error-prone when refactoring regarding the parameter position. To solve this issue, you can use @Param annotati
docs.spring.io
@Query 어노테이션
복잡한 쿼리가 필요할 경우 @Query 어노테이션을 사용해 직접 JPQL 또는 네이티브 쿼리를 작성할 수 있습니다.
위치 기반 바인딩
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username = ?1")
Member findByUsername(String username);
}
파라미터 바인딩 방식
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query("select m from Member m where m.username = :name")
Member findByUsername(@Param("name") String username);
}
파라미터 바인딩 방식을 사용하면 코드 가독성이 높아지고, 파라미터가 추가되거나 순서가 변경되어도 문제가 발생하지 않아 주로 사용됩니다.
이외에도 페이징 정렬 등 다양한 기능들을 제공하는데 앞으로 차차 포스팅을 통해 해당 기능들을 사용하는 방법에 대해 알아보도록 하겠습니다.
'Backend > JPA' 카테고리의 다른 글
[JPA] 트랜잭션 범위의 영속성 컨텍스트 (0) | 2024.06.18 |
---|---|
[JPA] 프록시, 지연로딩, 즉시로딩은 무엇인가? (0) | 2024.06.17 |
[JPA] 영속성 컨텍스트 (0) | 2023.07.24 |
[JPA] JPA란 무엇일까? (0) | 2023.07.17 |
[JPA] @JpaDataTest에서 Auditing 기능 사용하기 (0) | 2023.06.23 |