728x90

@Transactional 어노테이션을 사용하면 왜 org.hibernate.LazyInitializationException이 발생하지 않는지 이해하기 위해서는 영속성 컨텍스트와 지연 로딩에 대한 이해가 필요하다고 하며 GPT가 알려준 내용이다.

1. 영속성 컨텍스트 (Persistence Context):
영속성 컨텍스트는 JPA가 엔티티를 관리하는 데 사용되는 메모리 내의 작업 영역입니다.
영속성 컨텍스트에는 엔티티의 상태를 추적하고 캐싱하여 성능을 최적화하는 역할이 있습니다.


2. 지연 로딩 (Lazy Loading):
JPA에서는 특정 연관 관계를 지연 로딩으로 설정할 수 있습니다. 이는 연관된 엔티티가 실제로 필요할 때까지 데이터베이스에서 로딩을 지연시키는 메커니즘입니다.
지연 로딩은 프록시 객체를 사용하여 구현되는데, 프록시는 실제 엔티티의 참조를 가지고 있지 않고, 필요할 때만 데이터베이스에서 실제 엔티티를 로딩합니다.


3. @Transactional의 영향:
@Transactional 어노테이션이 붙은 메소드 내에서 JPA 트랜잭션이 시작됩니다.
트랜잭션이 활성화된 동안 영속성 컨텍스트가 열려 있으며, 지연 로딩이 필요한 엔티티를 사용할 때 트랜잭션 범위 내에서 해당 엔티티를 로딩할 수 있습니다.


트랜잭션이 종료될 때, JPA는 영속성 컨텍스트를 플러시하고, 이때 지연 로딩된 엔티티를 올바르게 초기화합니다.따라서 @Transactional 어노테이션이 붙은 메소드에서는 LazyInitializationException이 발생하지 않습니다. 트랜잭션 내에서 필요한 엔티티를 사용할 때 JPA는 해당 엔티티를 로딩하고, 트랜잭션이 종료될 때 올바르게 초기화되어 예외가 발생하지 않게 됩니다.


영속성 컨텍스트

영속성 컨텍스트(Persistence Context)는 JPA(Java Persistence API)에서 엔티티 객체를 관리하는 환경을 나타냅니다. 영속성 컨텍스트는 엔티티의 생명주기를 관리하고, 데이터베이스와의 상호 작용을 담당하여 개발자가 데이터베이스와 직접 상호 작용하는 부분을 줄이는데 도움을 줍니다.

엔티티의 생명주기 관리:
새로운 엔티티가 생성되면 영속성 컨텍스트에 저장(영속 상태)됩니다.
영속성 컨텍스트에 있는 엔티티는 데이터베이스에 저장되거나 조회될 때까지 관리됩니다.
데이터베이스에서 조회한 엔티티는 영속성 컨텍스트에 저장되어 메모리에 유지됩니다.
엔티티의 상태 변화는 자동으로 감지되고, 해당 상태 변경은 데이터베이스에 자동으로 반영됩니다.

캐싱:
영속성 컨텍스트는 조회한 엔티티를 캐시에 저장하여 동일한 엔티티를 여러 번 조회할 때 데이터베이스에 다시 가지 않고 캐시된 엔티티를 반환합니다.
이는 성능 향상에 기여하며, 반복적인 조회에서 데이터베이스 부하를 줄일 수 있습니다.

Dirty Checking(더티 체킹):
영속성 컨텍스트는 엔티티의 변경 사항을 추적하고, 트랜잭션이 커밋될 때 변경된 엔티티를 자동으로 데이터베이스에 반영합니다.
이를 통해 개발자는 명시적으로 업데이트 쿼리를 작성하지 않아도 됩니다.

지연 로딩(Lazy Loading):
연관된 엔티티가 실제로 필요한 시점까지 데이터베이스에서 로딩되지 않고, 처음 접근할 때 로딩됩니다.
이는 성능 향상에 도움을 주며, 모든 연관된 엔티티를 한 번에 로딩하는 것을 방지합니다.
영속성 컨텍스트는 JPA에서 제공하는 표준 기능이며, 이를 통해 객체 지향 프로그래밍과 관계형 데이터베이스 간의 매핑 작업을 보다 편리하게 수행할 수 있습니다.

 

아직은 조금 어렵다... 하지만 반복해서 보다 보면 조금은 깨달음을 얻겠지.

무엇보다 영속성 컨텍스트에서 발생하는 지연로딩을 Transactional 어노테이션을 이용하면 해결할 수 있다는 것이 이번 테스트에서의 성과라고 생각한다.

728x90

'개발자 공부' 카테고리의 다른 글

Java Equals와 hashcode  (0) 2024.01.04
NCP 사용법 - 서버 생성  (0) 2023.12.20
쿠키 & 세션  (1) 2023.11.20
Javascript, HTML, CSS  (0) 2023.11.03
TDD, Github flow  (0) 2023.10.31

+ Recent posts