본문 바로가기

Spring/JPA & Hibernate

JPA

반응형

엔티티 메니저 -> 내부적으로 DB 커넥션 이용-> 영속성 컨텍스트 유지

엔티티 메니저 안에 영속성 컨텍스트가 존재

 

영속성 컨테스트 란?

엔티티를 영구 저장하는 환경

논리적 개념. 

 

persist : 디비에 저장하는 것이 아니라 영속성 컨텍스트에 저장한다.!!

 

엔티티 생명주기

- 비영속: 새로운 상태
  객체만 생성한 상태. JPA와 관계 없는 상태

 

- 영속: 영속성 컨택스트에 의해 관리되는 상태

  entity.persist(member); // member 객체를 영속성 컨텍스트에 등록한 상태 // 사실은 디비에 저장되지 않는 상태

  디비 query는 트렌젝션 커밋할 때 ..

  

- 준영속

  em.detatch()

 

- 삭제

  em.remove()

 

영속성 컨텍스트가 존재하면, ?? 쿼리, 캐싱의 이점을 얻을 수 있다.

 

엔티티 조회, 내부에 1차 캐시가 존재

key: @id,

value: entity 객체

1. 상태로 저장되어 있음, 이를 조회하면, 디비에서 찾는 게 아니라, 1차 캐시에서 조회..

2. 1차 캐시에 없다면, 디비에서 조회.

3. 1차 캐시에 조회한 객체 저장,

4. 반환

 

영속성 컨택스트는 트렌젝션 단위로 만들고, 종료되면 영속성 컨택스트는 삭제한다.

즉, 하나의 트렌젝션 안에서만 유용

(2차 캐시 : 애플리케이션 안에서의 캐싱)

 

영속 엔티티의 동일성을 보장해준다. (1차 캐시가 있기 때문)

1차 캐시로반복가능한 앍가 둥급의 트렌잭션 격리 수준을 디비 기준이 아닌 

 

쓰기 지연(쓰기지연 sql 저장소)

변경을 하면, 1차 캐시에 저장,

그 객체를 바탕으로 sql 생성,

생성한 sql은 쓰기지연 sql 저장소에 쌓고,

커밋하는 순간에 db에 반영

 

기본 생성자 필요

 

버퍼링 기능

디비에 커밋하기 직전에 최적화를 수행할 수 있다.

jdbc 배치! 라고도 함. 이는 hibernate에서는 옵션이다. 설정 파일에 hibernate.jdbc.batch.size 로 지정.

마이바티스를 사용해서 내가 모아서 한번에 넣는 로직을 고민하지 않아도 된다.

 

JPA의 목적은 자바 컬렉션 다루듯 데이터를 다루고 싶다는 것

따라서 변경된 것을 다시 저장하는 코드를 구현하지 않는다.

자동으로 업데이트 쿼리 침

 

엔티티 수정/ 변경 감지

flush 가 들어오면 엔티티랑 스냅샷 비교

스냅샷: 첫 상태를 저장해 둠

 

플러시

영속성 컨택스트(쓰기 지연 sql 저장소)의 변경 내용을 데이터베이스에 반영, 1차 캐치는 유지

플러시 발생

- em.flush() 호출 시 // 강제 자동 호출

- tx commit 시

- jpql 쿼리 실행 시 (최신 데이터를 반영해야 하기에, 무조건쿼뭐리 실행 전에 반영)

(db isolation, commited : 커밋된것만 읽음)

 

 

영속->준영속 상태로 돌아가는 경우

1. 특정 엔티티 만 제거: 영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 상태 // em.detach -> 더 이상 jpa가 관리 안함

2. 모든 영속성 컨텍스트 초기화 // em.clear()

 

엔티티 맵핑

HOW 객체와 rdb와의 맵핑??

객체와 테이블 : @Entity @Table

필드와 컬럼 : @Column

기본키 : @Id

연관관계 맵핑 : @ManyToOne, @JoinVColumn

 

@Entity가 붙은 엔티티는 jpa가 관리하는 class

기본생성자 필요

final class, enum, interface X

저장할 필드에는 final 사용하면 X

 

DDL (local에서만 써야,,,)

애플리케이션 로딩 시점에 테이블 자동 생성

create 객체 중심!! 객체에 맞춰 create sql 생성해 줌

update 필드 추가는 칼럼 자동 생성, 삭제는 안해 줌

validate 엔티티와 칼럼 정상 맵핑 가능한 지 체크해서 맵핑 안될 시에 에러

jpa 실행에 영향을 주지 않음

 

권장

개발 서버 create or update

테스트 서버 update or validate // 여러 개발자가 사용하는 데, create하면 데이터 다 날아감,,,

스테이징이나 운영 서버 validate or none

 

필드와 컬럼 맵핑

java enum type : @enumereated // varchar로 생성

time : @TemporalType (Tim, Date, Timstamp)

varchar보다 큰 데이터 : @Lab  // clob으로 생성

@Transient // db에 반영 안하고 메모리에서만 쓰겠다.

@Column 

  - name

  -  insertable, updatable 추가/변경 시에 반영하니?

  - nullable (default true) 

  - unique 

  - columnDefinition

  - length

  - 

 

enum 타입 쓸 때 주의사항

기본: ordinal

 

 

 

 

 

 

반응형

'Spring > JPA & Hibernate' 카테고리의 다른 글

JPA Example  (0) 2019.12.18
h2 database 사용하기  (0) 2019.12.17
고급 매핑  (0) 2019.12.17
연관관계 맵핑  (0) 2019.11.21
Spring JPA  (0) 2019.10.18