JPA 요소

2021. 10. 5. 01:45 Java 관련/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) 주어진 엔티티를 모두 저장한다.

참조 사이트 - docs.spring.io

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(?)