Computer Science/JPA

JPA(Entity, 영속성, 플러시, DB스키마 자동생성)

suleesulee 2021. 8. 5. 00:27

JPA를 사용하면 업데이트 쿼리를 commit 전에 알아서 날려줌

EntityManager는 쓰레드간 공유가 되지 않음, JPA의 모든 수정은 트랜잭션안에서 실행됨

JPQL: 객체를 대상으로한 객체지향쿼리, 설정에 따라 각 방언(MySql, MariaDB 등..) 변경해서 검색함

       Table이 아닌 Entity 대상으로 검색

 

(JPQL: Entity 대상 Query, SQL: DBTable 대상 Query)

persistence.xml이 있어야 함

 

JPA 가장 중요한 2가지

1. 객체와 관계형 DB의 맵핑

2. 영속성 컨텍스트(Entity를 영구저장하는 환경, 논리적 개념, Entity Manager를 통해 영속성 Context에 접근)

 

Entity의 생명주기

-비영속 : 객체를 생성, 셋팅한 상태

-영속 : EntityManager에 객체를 저장(영속상태라고 쿼리가 바로 날아가는게 아니라 transaction이 일어날때 날아감)

-준영속: detached

-삭제: 객체를 삭제

 

영속성 Context의 이점

-Entity조회, 1차 캐시 : 검색시 DB를 먼저 뒤지는게 아니라 1차 캐시부터 조회, 캐시에 없다면 DB에서 찾은 후 1차캐시에 저장후 반환. 찰나의 순간이라 성능부분의 효과가 미미

-영속 Entity의 동일성 보장

-Transaction을 지원하는 쓰기 지연: 쓰기 지연 SQL 저장소라는 것을 가지고 있고 transaction commit시 Query가 전송됨

-변경감지: Entity와 snapshot을 비교, 변경사항이 생기면 쓰기지연SQL저장소에 Update Query작성

-지연로딩

 

플러시(flush) : 영속성 Context의 변경내용을 DB에 반영

플러시 발생: 변경감지, 수정된 Entity를 쓰기지연SQL저장소에 등록, 쓰기지연 SQL저장소의 Query를 DB에 전달(등록, 수정, 삭제)

 

플러시 방법

1. em.flush()사용 (직접호출)

2. Transaction Commit(자동호출)

3. JPQL 쿼리 실행(자동호출)

영속성 Context를 비우는게 아니다.

영속성 Context를 DB에 동기화 시킴

Transaction이라는 작업단위가 중요 --> Commit 직전에 동기화 

 

플러시 모드 옵션 

-왠만하면 건들지마라

 

준영속상태

영속상태의 Entity가 영속성Context에서 분리(Detached)

em.detach({entity})

 

엔티티 맵핑

- 객체 테이블 맵핑 @Entity, @ Table

@Entity -> JPA가 관리 테이블과 매핑할 객체는 필수, 기본 생성자 필수

@Table -> Entity와 매핑할 테이블을 지정

- 필드와 컬럼 @Column

- 기본키 @Id

- 연관관계 @ManytoOne @JoinColumn

 

DB스키마 자동생성

- DDL을 어플리케이션 실행시점에 자동실팽

- Table중심 X  객제중심 O

- DB방언을 활용해 DB에 맞는 DDL 생성

- 이렇게 생성한 DDL은 개발에서만 사용, 운영이나 테스트에서는 사용하지 말 것

- 모든 DDL생성기능은 DDL 생성에만 사용되고 JPA에 실질적인 영향을 주지 않는다.

 

* h2 ddl

        create: 기존 Table 삭제 후(Drop) 다시 생성

        create-drop: create와 같지만 마지막에 Drop

        update: 변경점만 반영(운영하는 DB에서 이거 사용하면 난리남)

        validate: Entity와 Table이 정상 매핑되었나 확인