[JPA & Hibernate] Spring Data JPA

원알렉스·2020년 8월 23일
0

JPA

목록 보기
13/16
post-thumbnail

깃허브 소스코드
Udemy 강의영상

🚀 스프링 데이터 JPA란?

스프링 데이터 JPA는 데이터 액세스 개발을 할 때 구현 클래스 없이 인터페이스만 선언해도 개발을 완료할 수 있도록 도와주는 라이브러리입니다.

✔ 인터페이스 선언하기

  • JpaRepository를 상속받고 제네릭 타입에는 <엔티티 클래스, 식별자 타입>을 지정해줍니다.
  • 기본적인 CRUD 기능은 모두 제공해줍니다.
    • T는 엔티티, ID는 엔티티의 식별자 타입, S는 엔티티와 그 자식 엔티티를 의미합니다.
    • save(S): 새로운 엔티티를 저장, 해당 엔티티에 아이디가 존재한다면 수정
    • delete(T): 해당 엔티티 삭제, 내부에서 entityManager.remove() 호출
    • findById(ID): 해당 아이디를 가지는 엔티티 조회, 내부에서 entityManager.find() 호출
    • findAll(...): 모든 엔티티를 조회, 파라미터로 Sort 또는 Pageable 사용 가능
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
    ...
}

✔ 쿼리 메소드 선언하기

쿼리 메소드는 메소드 이름만으로 쿼리를 생성하는 기술입니다. 인터페이스에 메소드만 선언하면 해당 메소드의 이름으로 JPQL 쿼리를 생성해줍니다.

메소드 이름으로 쿼리 생성

예시 : Optional<Course> findByName(String name);

리턴타입 접두어 {도입부} By 프로퍼티 {(And, Or) 조건식} {정렬조건}

  • 리턴타입: List<Entity>, Entity, Optional<Entity>, Page<Entity>
  • 접두어: find, get, count, delete
  • 도입부: Distinct, First, Top
  • 프로퍼티: 해당 엔티티의 프로퍼티
  • 조건식: IgnoreCase, Between, GreaterThan, LessThan, Like, Contains
  • 정렬조건: OrderBy(프로퍼티) Asc/Desc

✔ NamedQuery 선언하기

엔티티에 @NamedQuery 정의

@Entity
@Table(name = "users")
@NamedQuery(
    name = "User.findByUsername",
    query = "SELECT U FROM User U WHERE U.username = :username"
)
public class User {
    ...
}

기존의 JPA만을 사용해서 NamedQuery 호출

@Repository
public class UserRepository {
    
    @Autowired
    private EntityManager entityManager;
    
    public List<User> findByUsername(String username) {
        return entityManager
                .createNamedQuery("User.findByUsername", User.class)
                .setParameter("username", username)
                .getResultList();
    }
    ...
}

스프링 데이터 JPA를 사용해서 NamedQuery 호출

@Param 어노테이션으로 파라미터를 바인딩 할 수 있습니다.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    
    List<User> findByUsername(@Param("username") String username);
    ...
}

✔ @Query 어노테이션으로 쿼리 생성

기본적으로 JPQL로 쿼리를 인식합니다. 여기서 NativeQuery를 사용하고 싶다면 nativeQuery = true로 설정하면 됩니다. 그리고 NamedQuery를 사용하고 싶다면 name = {쿼리이름}을 지정하면 됩니다.

@Query(value = "SELECT U FROM User U WHERE U.username = ?1")
List<User> findByUsername(@Param("username") String username);
@Query(value = "SELECT U FROM users U WHERE U.username = ?0", nativeQuery = true)
List<User> findByUsername(@Param("username") String username);
@Query(name = "User.findByUsername")
List<User> findByUsername(@Param("username") String username);
profile
Alex's Develog 🤔

0개의 댓글