LECTURE/JPA
Spring data JPA
heywoo
2023. 4. 14. 09:03
Spring data JPA
1. 스프링 데이터 JPA(Spring Data JPA) 개요
1-1. 스프링 데이터 JPA란?
- Spring 프레임워크에서 JPA를 편리하게 사용할 수 있도록 제공하는 Spring Data 모듈 중 하나이다.
- JPA를 추상화시킨 Repository라는 인터페이스를 사용하고 쿼리메소드(Query Method)를 호출하는 것만으로 손쉽게 SQL문을 생성할 수 있다.
find, persist, remove
1-2. 스프링 데이터 JPA의 특징
- Spring 및 JPA기반의 Repository 구축을 위해 인터페이스와 쿼리메소드를 제공한다.
- Querydsl 쿼리 지원 및 이에 따른 안전한 JPA 쿼리를 처리해 준다.
- pagination을 지원한다.
- Spring Data Jpa를 사용하면 JPA에서 사용했던 기존의 EntityManagerFactory, EntityManager, EntityTransaction같은 객체가 필요 없다.
1-3. Repository 인터페이스
1-3-1. Spring Data JPA의 Repository 인터페이스 상속구조
- Repository 인터페이스 상속 구조
- 인터페이스 종류 및 설명인터페이스 설명
Repository 따로 기능은 없다. CrudRepository 주로 CRUD 기능을 제공한다.. PagingAndSortingRepository 검색 및 검색 결과를 페이징 처리하고자 할 경우 사용한다. JpaRepository 영속성 컨텍스트 플러시 및 배치에서 레코드 삭제와 같은 일부 JPA 관련 추가 방법들을 제공한다. 최종적으로 상속함
1-3-2. Repository 인터페이스의 메소드
- 주로 CrudRepository 인터페이스가 제공하는 메소드를 사용하게 된다.
- 메소드 종류 및 설명제공 메소드 설명
long count() 모든 엔티티의 개수 리턴 void delete(ID) 식별 키를 통한 삭제 void delete(Iterable) 주어진 모든 엔티티 삭제 boolean exist(ID) 식별 키를 가진 엔티티가 존재 하는지 확인 findAllById(ID) 모든 엔티티 목록 리턴 Iterable findAll(Iterble) 해당 식별 키를 가진 엔티티 목록 리턴 Optional findById(ID) 해당 식별 키에 해당하는 단일 엔티티 리턴 saveAll 여러 엔티티들을 한 번에 등록, 수정 <S extends T>S save<S entity> 하나의 엔티티를 등록, 수정
1-4. 쿼리 메소드(Query Methods)
1-4-1. 쿼리 메소드란?
- JPQL을 메소드로 대신 처리할 수 있도록 제공하는 기능이다.
- 메소드의 이름으로 필요한 쿼리를 만들어주는 기능으로 "find + 엔티티 이름 + By + 변수 이름"과 같이 네이밍 룰만 알면 사용 가능하다. ex) findMenuByCode(): Menu 엔티티에서 Code 속성에 대해 조건처리하여 조회한다. -> 엔티티 제네릭 선언하면 생략이 가능하다
- 엔티티 이름을 생략하고 쓸 수도 있는데 이는 해당 Repository 인터페이스의 제네릭에 해당하는 엔티티를 자동으로 인식하기 때문이다. ex) Repository 인터페이스가 JpaRepository<Menu, Integer>를 상속받고 있다면, findByCode(): Menu 엔티티에서 Code 속성에 대해 조건처리하여 조회한다.
1-4-2. 쿼리 메소드 유형
- 다양한 쿼리 메소드 형태를 위한 키워드와 예시 및 생성되는 SQL
키워드 쿼리 메소드 형태 예시 생성 SQL
And | findByCodeAndName | where x.code =?1 and x.name = ?2 |
Or | findByCodeOrName | where x.code =?1 or x.name = ?2 |
Between | findByPriceBetween | where x.price between ?1 and ?2 |
LessThan | findByPriceLessThan | where x.price < ?1 |
LessThanEqual | findByPriceLessThanEquals | where x.price <= ?1 |
GreaterThan | findByPriceGreaterThan | where x.price > ?1 |
GreaterThanEqual | findByPriceGreaterThanEqual | where x.price >= ?1 |
After | findByDateAfter | where x.date > ?1 |
Before | findByDateBefore | where x.date < ?1 |
IsNull | findByNameIsNull | where x.name is null |
IsNotNull, NotNull | findByName(Is)NotNull | where x.name is not null |
Like | findByNameLike | where x.name like ?1 |
NotLike | findByNameNotLike | where x.name not like ?1 |
StartingWith | findByNameStartingWith | where x.name like ?1 |
EndingWith | findByNameEndingWith | where x.name like '%' |
Containing | findByNameContainign | where x.name like '%' |
OrderBy | findByPriceOrderByCodeDesc | where x.price = ?1 order by x.code desc |
Not | findByNameNot | where x.name <> ?1 |
In | findByNameIn(Collection names) | where x.name in ?1 |