JPA 요소
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() |
- deleteById() vs delete()
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
- CrudRepository 인터페이스
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) | 주어진 엔티티를 모두 저장한다. |
Query Method
- Spring Data JPA에서 메서드 형식으로 제공하는 쿼리 호출
- 쿼리 메서드 지원 키워드(Supported Keywords inside method names)
Keywordsamplequery
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(?) |
'Java 관련 > JPA' 카테고리의 다른 글
JPA - JPQL과 Criteria 쿼리 (0) | 2021.11.17 |
---|---|
JPA - 엔티티 매핑 (0) | 2021.11.17 |
JPA - 엔티티 매니저와 트랜잭션 (0) | 2021.11.17 |
JPA에 기반한 비즈니스로직 중심의 S/W 개발 (0) | 2021.11.17 |
[JPA] Entity 객체 생명주기(Lifecycle)와 Persistence Context (0) | 2020.09.07 |
[JPA] @ManyToMany, N:M 관계 매핑 (0) | 2020.09.07 |
[JPA] @OneToMany / @ManyToOne, 1:N / N:1 관계 매핑 (0) | 2020.09.07 |
[JPA] @OneToOne, 1:1 관계 매핑 (0) | 2020.09.07 |