티스토리 뷰

반응형

Transaction 범위 영속성 컨텍스트, 준영속 상태

 스프링 컨테이너는 트랜젝션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다.

한마디로 트랜잭션 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻이다.

트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다.

그리고 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다.

트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다.

여러 스레드에서 동시에 요청이 와서 같은 엔티티 매니저를 사용해도 트랜잭션에 따라 접근하는 영속성 컨텍스트가 다르다.

스프링이나 J2EE 컨테이너의 가장 큰 장점은 트랜잭션과 복잡한 멀티 스레드 상황을 컨테이너가 처리해준다는 점이다.
따라서 개발자는 싱글 스레드 애플리케이션처럼 단순하게 개발할 수 있고, 결과적으로 비즈니스 로직 개발에 집중할 수 있다.

준영속 상태.

조회한 엔티티가 서비스와 레포지토리 계층에서는 영속성 컨텍스트에 관리되면서 영속 상태를 유지하지만 컨트롤러나 뷰 같은 프리젠테이션 계층에서는 준영속 상태가 된다.

이럴때, 지연로딩으로 선언한 부분을 불러오게되면 에러가 발생된다.
(org.hibernate.LazyInitializationException예외)

준영속 상태와 변경 감지.

변경 감지 기능은 영속성 컨텍스트가 살아 있는 서비스 계층(트랜젝션 범위)까지만 동작하고 영속성 컨텍스트가 종료된 프리젠테이션 계층에서는 동작하지 않는다.

보통 변경 감지 기능은 서비스 계층에서 비즈니스 로직을 수행하면서 발생.
단순히 데이터만 보여주는 프리젠테이션 영역에서는 변경 할 이유가 없음.

반응형

'Study > JPA' 카테고리의 다른 글

하이버네이트 2차 캐시  (0) 2019.04.10
1차 캐시 와 2차 캐시  (1) 2019.04.10
@Version  (0) 2019.04.10
낙관적 락, 비관적 락  (0) 2019.04.10
준영속 상태에서의 지연 로딩 문제 해결 방법  (0) 2019.04.10