작성
·
721
0
위에 질문과 답변을 봤을때는 엔티티매니저가 달라도 트랜잭션이 같으면 같은 영속성컨텍스트를 사용한다고 되어있습니다.
하지만 이 부분이 실제로 어떻게 이뤄질 수 있는것인지 이해되지 않습니다. 코드로 어떻게 되어져 있는지 찾아볼 수 있을까요?
제가 찾아본 내용으로는 SessionImpl이라는 엔티티매니저 구현체에 아래 처럼 엔티티매니저를 넣어서 영속성컨텍스트를 생성하는 코드를 볼 수 있었습니다. 그럼 영속성 컨텍스트는 따로 만들어지는게 아닌가? 라는 생각도 하게되었습니다.
protected StatefulPersistenceContext createPersistenceContext() {
return new StatefulPersistenceContext( this );
}
트랜잭션에 따라 영속성 컨텍스트가 공유되고 스레드마다 영속성 컨텍스트가 어떻게 나눠질 수 있는지 궁금합니다.
그리고 영속성컨텍스트는 프록시라도 Bean으로 등록되는데 실제 동작을 하는건 원본객체일테고 그럼 그 객체이 있는 영속성컨텍스트를 공유하게 되는것은 아닌가? 의문이 들었습니다.
질문을 정리하겠습니다.
트랜잭션에 따라 영속성 컨텍스트가 어떻게 공유될 수 있나요?(확인할 수 있는코드나 기술이 있다면 말씀해주시면 감사하겠습니다.)
Bean으로 등록된 엔티티매니저가 다른 상태를 유지할 수 있는 방법이 무엇인가요? 프록시라해도 원본객체를 통해 동작하는게 아닌가요?
영속성컨텍스트는 프록시라도 Bean으로 등록되는데 실제 동작을 하는건 원본객체일테고 그럼 그 객체이 있는 영속성컨텍스트를 공유하게 되는것은 아닌가요?
바보같은 질문일 수 있지만 답변해주시면 너무 감사하겠습니다.
답변 2
0
안녕하세요. YOGURT님
이 내용을 확실히 이해하려면 프록시와 쓰레드 로컬에 대해서 이해해야 합니다.
스프링 핵심 원리 고급편에서 해당 내용을 다루고 있으니 공부해보시면 원리가 이해가 되실거에요.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요. 영속성 컨텍스트에 대한 질문이 있군요.
영속성 컨텍스트는 JPA에서 엔티티를 영구 저장하고 관리하는 작업을 수행하는 공간입니다. 영속성 컨텍스트는 엔티티 매니저(Entity Manager)와 관련이 있으며, 엔티티 매니저는 영속성 컨텍스트를 생성하여 사용합니다.
영속성 컨텍스트는 기본적으로 트랜잭션 범위(Transaction Scope)에서 동작합니다. 같은 트랜잭션 내에서는 동일한 엔티티 매니저가 영속성 컨텍스트를 공유하고, 엔티티의 변경을 관리합니다.
영속성 컨텍스트는 스레드마다 독립적으로 생성되며, 스레드 간에 공유되지 않습니다. 따라서 개별 스레드에서 동작하는 엔티티 매니저는 각자 독립된 영속성 컨텍스트를 가지게 됩니다.
또한, 영속성 컨텍스트에 등록된 엔티티는 프록시가 될 수도 있고, 일반적인 Java Bean 객체일 수도 있습니다. 프록시 객체는 실제 동작을 하는 원본 객체에 대한 참조를 갖고 있으며, 해당 원본 객체가 속한 영속성 컨텍스트를 공유합니다.
즉, 같은 영속성 컨텍스트 내에서는 엔티티 객체나 프록시 객체 모두 동일한 영속성 컨텍스트를 공유합니다.
하지만 서로 다른 트랜잭션에서는 각각 독립된 영속성 컨텍스트가 생성되며, 영속성 컨텍스트간의 데이터 공유는 이뤄지지 않습니다.
이렇게 트랜잭션 범위 내에서 동일한 영속성 컨텍스트를 공유하고, 스레드 간에는 독립적으로 영속성 컨텍스트가 생성되는 원리로 동작합니다.
더 궁금한 점이 있으시면 언제든지 물어보세요. 좋은 하루 되세요~!