✔ 깃허브 소스코드
✔ Udemy 강의영상
스프링 데이터 JPA는 데이터 액세스 개발을 할 때 구현 클래스 없이 인터페이스만 선언해도 개발을 완료할 수 있도록 도와주는 라이브러리입니다.
JpaRepository
를 상속받고 제네릭 타입에는 <엔티티 클래스, 식별자 타입>
을 지정해줍니다.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
정의
@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);
...
}
기본적으로 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);