2025/02/22 5

트랜잭션의 EntityManager 관리방법과 Bean으로 주입받는 EntityManger의 관리방식

1. 트랜잭션의 EntityManager 관리방법서비스 단에 @Transactional이 붙은 메서드 호출이 되면 Spring AOP 프록시가 요청을 가로채고, TransactionIntercepter를 호출한다.이 TransactionIntercepter에는 invoke 메서드가 위와 같이 구현되어 있다. 내부적으로 invokeWithinTrasaction 메서드를 실행시키고 이 내부를 들여다 보면위와 같은 코드가 들어있다.위 코드는 내부적으로 TransactionManager를 사용하며, jpa의 경우 JpaTransactionManager를 사용한다.그리고 JpaTransactionManager는 내부적으로 트랜잭션을 시작하기 위해 doGetTransaction() 메서드를 호출한다. doGetTr..

Spring 2025.02.22

EntityManagerFactory, EntityManager, 영속성 컨텍스트와 영속성 컨텍스트의 특징

[목차]EntityManagerFactory란?EntityManager란?영속성 컨텍스트란?영속성 컨텍스트의 생명주기영속성 컨텍스트의 주기능영속성 컨텍스트의 특징트랜잭션 안이 아니면 영속성 컨텍스트로 관리되지 않는다.영속성 컨텍스트는 Map으로 관리되며 key는 기본키를 사용한다. [본론]EntityManagerFactory란?EntityManagerFactory란 EntityManager를 생성하는 역할을 한다.Spring Application이 실행될 때 딱 한번만 생성되며, 이 후 EntityManager가 필요하면 같은 EntityManagerFactory를 사용하여 생성한다.딱 한 번만 생성하는 이유는 생성비용이 크기 때문이다.한 EntityManagerFactory는 여러 EntityManag..

Spring 2025.02.22

영속성 컨텍스트의 1차 캐시는 어떻게 저장될까?

영속성 컨텍스트의 1차 캐시1차 캐시는 Map 형태로 관리된다.이는 Hibernate의 PersistenceContext 의 구현체인 StatefulPersistenceContext 에서 찾아볼 수 있다.entitiesByKey 필드 등을 보면 PK를 Key로 Object(엔티티)를 value로 관리하는 것을 볼 수 있다. 그리고 이 Key는 기본키를 저장한다따라서 findById가 호출되면 내부적으로 우선 Map을 확인해 엔티티가 존재하는 지 확인하며, 있으면 Map에서 반환한다. 없으면 DB를 조회하여 Map 저장하고 엔티티를 반환한다. 만약 findByName() 등을 통해 조회하면 Name은 기본키가 아니므로 DB에서 조회해오게 된다. DB에서 조회해온 후에는 조회한 ID를 통해 같은 엔티티가 영..

Spring 2025.02.22

@Transactional 내에서가 아니여도 OSIV가 on이면 조회한 데이터들이 같은 영속성 컨텍스트를 공유하는 이유

[서론]스프링에서는 트랜잭션이 시작되면 AOP 코드에 따라 내부적으로 EntityManager를 사용해 영속성컨텍스트를 만들어, 한 트랜잭션 내에서는 같은 영속성컨텍스트를 공유하게 끔 동작합니다. 진짜 그럴까 테스트해보면, 종종 @Transactional이 붙지 않았는데도 데이터들이 한 영속성 컨텍스트에서 공유되는 것을 볼 수 있습니다. 예를 들어 다음과 같이 id가 1인 객체를 두 번조서론]스프링에서는 트랜잭션이 시작되면 AOP 코드에 따라 내부적으로 EntityManager를 사용해 영속성컨텍스트를 만들어, 한 트랜잭션 내에서는 같은 영속성컨텍스트를 공유하게 끔 동작합니다.   진짜 그럴까 테스트해보면, 종종 @Transactional이 붙지 않았는데도 데이터들이 한 영속성 컨텍스트에서 공유되는 것을..

Spring 2025.02.22