JPA 요소
- 엔티티(Entity)
- 데이터베이스에서 지속적으로 저장된 데이터를 자바 객체에 매핑한 것
- 메모리 상에 자바 객체의 인스턴스 형태로 존재하며 EntityManager에 의해 데이터베이스의 데이터와 동기화된다.
- 엔티티 매니저(Entity Manager)
- 필요에 따라 Entity와 데이터베이스의 데이터를 동기화한다.
- EntityManager에서 제공하는 Entity 조작 API를 이용해 Entity에 대해 CRUD 작업을 할 수 있다.
- 영속성 컨텍스트(Persistence context)
- 영속성 영구적으로 저장하는 환경이다.
- 엔티티를 저장하거나 검색할 때 엔티티 관리자는 영속성 컨텍스트에서 엔티티를 저장하고 관리한다.
- 영속성 컨텍스트에 접근하거나 관리를 하려면 엔티티 매니저를 통해야 한다.
엔티티 상태
상태 |
설명 |
비영속(new/transient) |
영속성 컨텍스트와 관련이 없는 상태 |
영속(managed) |
영속성 컨텍스트에 저장된 상태 |
준영속(detached) |
영속성 컨텍스트에 저장되었다가 분리된 상태 |
삭제(removed) |
영속성 컨텍스트에서 삭제된 상태 |
영속성 전이(persistence cascade)
- 엔티티의 영속성 상태 변화를 연관된 엔티티에도 함께 적용하는 것
- 엔티티를 저장할 때 연관된 엔티티도 함께 저장하고 엔티티를 삭제할 때 연관된 엔티티도 함께 삭제하는 것
JPA 메서드
기능 설명 |
Method |
목록조회 |
findAll() |
상세조회 |
findById() |
수정 |
findById() -> optional.isPresent() -> optional.get() -> repository.save() |
삭제 |
deleteById() or findById() -> delete() |
전체삭제 |
deleteAll() |
JPA Annotation
어노테이션 |
설명 |
@Entity |
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. |
@Entity가 붙은 클래스는 JPA가 관리하는 것으로 엔티티라 부른다. |
|
@Table |
@Table은 엔티티와 매핑할 테이블을 지정한다. |
생략하면 매핑할 엔티티 이름을 테이블 이름으로 사용한다. |
|
name 속성을 이용해서 테이블 이름을 지정할 수 있다. |
|
@Id |
@Id는 기본 키(Primary Key)를 매핑한다. |
@GeneratedValue |
DB의 식별 컬럼을 사용해서 식별자를 생성하기 위한 어노테이션 |
@Column |
@Column은 객체 필드를 테이블 컬럼에 매핑한다. |
@Enumerated |
열거 타입에 대한 매핑을 설정할 수 있다. |
@Temporal |
java.util.Date 타입을 매핑하는 경우 사용 |
@CreationTimeStamp |
엔티티 생성 시 시점의 날짜 데이터를 기록 |
@UpdateTimeStamp |
엔티티가 업데이트 되는 시점의 날짜 데이터를 기록 |
Spring Data JPA
Interface CrudRepository<T,ID> extends Repository<T,ID>
메서드 |
설명 |
long count() |
사용 가능한 엔티티 수를 반환한다. |
void delete(T entity) |
주어진 엔티티를 삭제한다. |
void deleteAll() |
저장소에서 관리하는 모든 엔티티를 삭제한다. |
void deleteAll(Iterable<? extends T> entities) |
주어진 엔티티를 삭제한다. |
void deleteById(ID id) |
주어진 ID를 가진 엔티티를 삭제한다. |
boolean existsById(ID id) |
주어진 ID를 가진 엔티티가 존재하는 지 여부를 반환한다. |
Iterable findAll() |
T 타입의 모든 인스턴스를 반환한다. |
Iterable findAllById(Iterable ids) |
주어진 ID를 가진 T 타입의 모든 인스턴스를 반환한다. |
Optional findById(ID id) |
ID로 엔티티를 검색한다. |
S save(S entity) |
주어진 엔티티를 저장한다. |
Iterable saveAll(Iterable entities) |
주어진 엔티티를 모두 저장한다. |
참조 사이트 - docs.spring.io
Query Method
- Spring Data JPA에서 메서드 형식으로 제공하는 쿼리 호출
- 쿼리 메서드 지원 키워드(Supported Keywords inside method names)
Keyword |
sample |
query |
And |
findByLastnameAndFirstname |
where lastname = ? and firstname = ? |
Or |
findByLastnameOrFirstname |
where lastname or firstname = ? |
Is, Equals |
findByFirstname, findByFirstnameIs, findByFirstnameEquals |
where firstname = ? |
Between |
findByStartDateBetween |
where startDate between ? and ? |
LessThan |
findByAgeLessThan |
where age < ? |
LessThanEqual |
findByAgeLessThanEqual |
where age <= ? |
GreaterThan |
findByAgeGreaterThan |
where age > ? |
GreaterThanEqual |
findByAgeGreaterThanEaual |
where age >= ? |
After |
findByStartDateAfter |
where startDate > ? |
Before |
findByStartDateBefore |
where startDate < ? |
IsNull, Null |
findByAge(is)Null |
where age is null |
IsNotNull, NotNull |
findByAge(is)NotNull |
where age not null |
Like |
findByFirstnameLike |
where firstname like ? |
NotLike |
findByFirstnameNotLike |
where firstname not like ? |
StartingWith |
findByFirstnameStartingWith |
where firstname like ? |
(parameter bound with appended %) |
|
|
EndingWith |
findByFirstnameEndingWith |
where firstname like ? |
(parameter bound prepended in %) |
|
|
Containing |
findByFirstnameContaing |
where firstname like ? |
(parameter bound wrapped in %) |
|
|
OrderBy |
findByAgeOrderByLastnameDesc |
where age = ? order by lastname desc |
Not |
findByLastnameNot |
where lastname <> ? |
In |
findByAgeIn(Collection ages) |
where age in ? |
NotIn |
findByAgeNotIn(Collection ages) |
where age not in ? |
True |
findByActiveTrue() |
where active = true |
False |
findByActiveFalse() |
where active = false |
IgnoreCase |
findByFirstnameIgnoreCase |
where UPPER(firstname) = UPPER(?) |