영속성 컨텍스트에 대해 질문이 있습니다.
868
작성한 질문수 30
위에 질문과 답변을 봤을때는 엔티티매니저가 달라도 트랜잭션이 같으면 같은 영속성컨텍스트를 사용한다고 되어있습니다.
하지만 이 부분이 실제로 어떻게 이뤄질 수 있는것인지 이해되지 않습니다. 코드로 어떻게 되어져 있는지 찾아볼 수 있을까요?
제가 찾아본 내용으로는 SessionImpl이라는 엔티티매니저 구현체에 아래 처럼 엔티티매니저를 넣어서 영속성컨텍스트를 생성하는 코드를 볼 수 있었습니다. 그럼 영속성 컨텍스트는 따로 만들어지는게 아닌가? 라는 생각도 하게되었습니다.
protected StatefulPersistenceContext createPersistenceContext() {
return new StatefulPersistenceContext( this );
}
트랜잭션에 따라 영속성 컨텍스트가 공유되고 스레드마다 영속성 컨텍스트가 어떻게 나눠질 수 있는지 궁금합니다.
그리고 영속성컨텍스트는 프록시라도 Bean으로 등록되는데 실제 동작을 하는건 원본객체일테고 그럼 그 객체이 있는 영속성컨텍스트를 공유하게 되는것은 아닌가? 의문이 들었습니다.
질문을 정리하겠습니다.
트랜잭션에 따라 영속성 컨텍스트가 어떻게 공유될 수 있나요?(확인할 수 있는코드나 기술이 있다면 말씀해주시면 감사하겠습니다.)
Bean으로 등록된 엔티티매니저가 다른 상태를 유지할 수 있는 방법이 무엇인가요? 프록시라해도 원본객체를 통해 동작하는게 아닌가요?
영속성컨텍스트는 프록시라도 Bean으로 등록되는데 실제 동작을 하는건 원본객체일테고 그럼 그 객체이 있는 영속성컨텍스트를 공유하게 되는것은 아닌가요?
바보같은 질문일 수 있지만 답변해주시면 너무 감사하겠습니다.
답변 2
1
안녕하세요, 인프런 AI 인턴이에요. 영속성 컨텍스트에 대한 질문이 있군요.
영속성 컨텍스트는 JPA에서 엔티티를 영구 저장하고 관리하는 작업을 수행하는 공간입니다. 영속성 컨텍스트는 엔티티 매니저(Entity Manager)와 관련이 있으며, 엔티티 매니저는 영속성 컨텍스트를 생성하여 사용합니다.
영속성 컨텍스트는 기본적으로 트랜잭션 범위(Transaction Scope)에서 동작합니다. 같은 트랜잭션 내에서는 동일한 엔티티 매니저가 영속성 컨텍스트를 공유하고, 엔티티의 변경을 관리합니다.
영속성 컨텍스트는 스레드마다 독립적으로 생성되며, 스레드 간에 공유되지 않습니다. 따라서 개별 스레드에서 동작하는 엔티티 매니저는 각자 독립된 영속성 컨텍스트를 가지게 됩니다.
또한, 영속성 컨텍스트에 등록된 엔티티는 프록시가 될 수도 있고, 일반적인 Java Bean 객체일 수도 있습니다. 프록시 객체는 실제 동작을 하는 원본 객체에 대한 참조를 갖고 있으며, 해당 원본 객체가 속한 영속성 컨텍스트를 공유합니다.
즉, 같은 영속성 컨텍스트 내에서는 엔티티 객체나 프록시 객체 모두 동일한 영속성 컨텍스트를 공유합니다.
하지만 서로 다른 트랜잭션에서는 각각 독립된 영속성 컨텍스트가 생성되며, 영속성 컨텍스트간의 데이터 공유는 이뤄지지 않습니다.
이렇게 트랜잭션 범위 내에서 동일한 영속성 컨텍스트를 공유하고, 스레드 간에는 독립적으로 영속성 컨텍스트가 생성되는 원리로 동작합니다.
더 궁금한 점이 있으시면 언제든지 물어보세요. 좋은 하루 되세요~!
0
안녕하세요. YOGURT님
이 내용을 확실히 이해하려면 프록시와 쓰레드 로컬에 대해서 이해해야 합니다.
스프링 핵심 원리 고급편에서 해당 내용을 다루고 있으니 공부해보시면 원리가 이해가 되실거에요.
감사합니다.
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
22
2
inheritance startegy 선택시 고려사항
0
22
1
Entity 동등성 비교
0
18
1
실무 조언 관련 질문입니다.
0
44
1
H2데이터베이스 파일 생성
0
56
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
52
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
51
1
JPQL 메소드와 락
0
55
1
Delivery @OneToOne
0
60
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
92
2
UnsupportedOperationException 발생
0
86
3
H2 Database 연결이 안됩니다.
0
92
2
연관관계 매핑 질문드립니다.
0
85
2
h2데이터베이스 실행오류
0
107
2
persistence.xml
0
106
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
80
1
영속성 컨텍스트
0
65
1
JPA 프록시
0
94
1
Native Query와 MyBatis
0
68
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
85
1
임베디드 타입 예시 코드 관련 질문
0
114
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
94
3
인텔리제이 패키지 커서 단축키 질문
0
108
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
143
1





