Programming/Spring

[Spring JPA] 영속성 컨텍스트

주죵 2022. 4. 24. 18:54
728x90
반응형

* 혼자서 공부하다 끄적이는 내용이며 정확성 매우 떨어집니다. 틀린것에 대한 지적은 너무나 감사합니다

영속성 컨텍스트

컨텍스트 : 프레임워크에서 컨테이너들이 관리하고 있는 내용. Spring에선 Spring bean들을 loading 및 관리를 스프링 컨텍스트에서 함

영속성(Persistence) : 사라지지 않고 지속적으로 존재하는것. 메모리에 존재하는 데이터는 보통 서비스가 종료되면 사라진다.  보통 영구적 보관을 위해 수행된 서비스는 대부분 파일이나 DB에 저장된다

-> 영속성 컨텍스트 : 데이터를 영속화하는 컨테이너가 영속성 컨텍스트를 사용하여 데이터를 영속화한다.

Java에선 일반적으로 META-INF아래 persistence.xml에 영속성 컨텍스트를 설정하여 사용함.

물론 spring boot + spring-jpa를 사용한다면 application.yml(혹은 properties)에서 쉽게 설정 가능하다.

 

 

EntityManager

java 영속성 컨텍스트내에서 Entity관리는 EntityManager를 통해 이뤄짐. EntityManager는 JPA에서 정의된 기본 인터페이스. jpa에서 쿼리 수행을 할때 내부적 실제동작은 EntityManager를 이용해 실행됨. (Spring Data Jpa 에서 제공하지 않는 기능 사용이나 별도 커스터마이징 이슈가 있을땐 해당 인터페이스를 직접 받아 처리할수 있음.)

EntityManager cache(jpa 1차캐시)

영속성컨텍스트 내에서 EntityManager cache를 이용해 id값으로 조회할땐 직접 db 조회없이 캐시기반으로 결과 리턴이 가능함.( jpa 1차캐시라고 함.)

jpa특성상 id값에 대한 조회가 자주 일어나게 되므로 1차캐시가 동작하면 조회성능이 올라감. 이런 캐시기능으로 영속성 컨텍스트내에서 transaction당 정보를 가지고 있다가 최종적인 db작업때 merge하여 한번의 커밋으로 처리함.  이런 영속성 컨텍스트내의 cache를 잘 이해하면 효율적 jpa 사용이 가능하며 물론 원하는 시점에 flush처리하며 의도적으로 영속화 시킬수도 있음. 실제로 영속성 캐시로 인해 트랜잭션이 db와 동기화 되지 않아서 시점에 따라 db와 컨텍스트 사이에 차이가 발생할수 있으므로 기본적 개념이해해야 혼동안할수 있음. 

flush가 반영되는 시점은 아래정도로 정리할수 있음.

- 의도적으로 소스상에서 flush 호출되는 경우

- transaction이 끝나서 해당 쿼리가 commit되는 경우

- 복잡한 jpql 쿼리가 수행되는 경우

 

generate-ddl vs ddl-auto

모두 db 초기화 옵션이며 유사한점이 많지만 차이점이 있다. (이건 더 자세히 서칭해볼필요는 있어보임)

generate-ddl : 구현체와 상관없이 자동화된 ddl사용할수 있도록 설정

hibernate.ddl-auto : generate-ddl 보다 우선적. hibernate에서 제공하는 더 세밀한 옵션.

728x90

'Programming > Spring' 카테고리의 다른 글

[Spring JPA] Transactional Manager  (0) 2022.05.12
[Spring JPA] Entity lifecycle  (0) 2022.04.25
SpringData JPA 기초  (0) 2022.02.23
[Spring boot] Spring Boot란  (0) 2021.06.20
[Spring] Spring MVC  (1) 2021.03.18