지연 로딩
💡지연로딩을 사용하기 위해서는 영속성 컨테스트가 필요 → 해당하는 메소드에 Transaction 환경 설정 → 성능을 높이기 위해 readOnly = true 옵션을 걸음
1. 지연 로딩(Lazy Loading)을 사용하려면 영속성 컨텍스트가 필요
- 지연 로딩은 객체를 실제로 사용할 때까지 데이터를 로딩하지 않는 방식
- JPA에서는 이 방식이 영속성 컨텍스트(Persistence Context)에서 관리되는 엔티티 객체에 대해 적용
- 영속성 컨텍스트가 엔티티를 관리하는 동안에만 지연 로딩이 정상적으로 작동
- 즉, 트랜잭션 범위 내에서 엔티티를 로딩해야 하므로 영속성 컨텍스트가 필요
2. 해당하는 메소드에 Transaction 환경 설정
- 지연 로딩은 영속성 컨텍스트가 활성화되어야 하므로, 트랜잭션 범위 내에서 동작함
- 이를 위해 해당 메소드에서 트랜잭션을 설정해야 하며, 보통 @Transactional 어노테이션을 사용하여 트랜잭션 환경을 설정
- 트랜잭션이 활성화되면 JPA가 영속성 컨텍스트를 관리하면서, 객체를 실제로 사용할 때 관련된 데이터를 지연 로딩할 수 있게 됨
3. 성능을 높이기 위해 readOnly = true 옵션을 걸음
- @Transactional 어노테이션에 readOnly = true 옵션을 설정하면, 이 메소드 내에서 데이터 변경을 하지 않는다고 JPA에게 알려줌
- 이는 성능 최적화에 도움이 될 수 있다
- readOnly = true 설정이 있으면, JPA는 내부적으로 객체 상태 변경을 추적하지 않으며, 데이터베이스에서 데이터를 읽는 작업만 수행하게 됨(읽기 전용 작업)
- 이렇게 하면, 일부 데이터베이스나 JPA 구현체에서 더 효율적인 쿼리 실행 계획을 수립할 수 있으며, 불필요한 엔티티 상태 변경 감지 작업을 건너뛰므로 성능이 향상 됨
영속성 컨텍스트
- JPA에서 엔티티 객체를 관리하는 일종의 "객체 저장소"
- JPA는 영속성 컨텍스트를 통해 데이터베이스와 객체 간의 동기화를 관리하고, 이를 통해 객체의 상태를 추적하여 데이터베이스의 상태를 일관되게 유지
영속성 컨텍스트의 주요 개념
- 엔티티 관리즉, 데이터베이스에서 조회한 엔티티 객체를 영속성 컨텍스트가 관리하고, 이 객체가 변경되면 트랜잭션 커밋 시 변경된 내용을 데이터베이스에 반영
- 데이터베이스에 저장된 엔티티 객체를 관리
- 트랜잭션 범위예를 들어, 트랜잭션이 시작되면 영속성 컨텍스트가 만들어지고, 트랜잭션이 끝나면 영속성 컨텍스트가 종료되며 그동안의 변경 사항을 데이터베이스에 반영
- 보통 트랜잭션 범위 내에서 생성됨
- 엔티티 상태 관리
- 새로운 상태 (New): 데이터베이스에 저장되지 않은 상태.
- 영속 상태 (Managed): 영속성 컨텍스트에 의해 관리되는 상태. 데이터베이스에 반영된 상태입니다.
- 준영속 상태 (Detached): 영속성 컨텍스트와 연결이 끊어진 상태.
- 삭제 상태 (Removed): 삭제된 상태로, 트랜잭션이 커밋되면 데이터베이스에서 삭제됩니다.
- 엔티티 객체는 4가지 상태를 가질 수 있음
- 지연 로딩(Lazy Loading)이 기능은 영속성 컨텍스트가 관리하는 동안에만 동작
- 연관된 엔티티를 실제로 사용할 때까지 데이터베이스에서 데이터를 조회하지 않고, 객체를 사용하는 시점에 로딩
- 1차 캐시 (First-Level Cache):동일한 엔티티를 두 번 조회해도 데이터베이스에서 다시 조회하지 않고, 1차 캐시에서 바로 가져오기 때문에 성능이 향상됨
- 1차 캐시를 사용하여 데이터베이스에서 조회한 엔티티 객체를 메모리에 저장
영속성 컨텍스트의 역할
- 데이터베이스와 객체의 동기화예를 들어, 엔티티 객체의 필드가 변경되면 영속성 컨텍스트는 이를 추적하여 트랜잭션 커밋 시 데이터베이스에 반영
- 애플리케이션의 객체 모델과 데이터베이스의 레코드 간의 변화를 동기화 함
- 트랜잭션 범위 내에서 엔티티 관리:이를 통해 데이터베이스의 일관성을 유지
- 트랜잭션 내에서 객체의 상태를 추적하고, 트랜잭션이 끝날 때까지 해당 객체의 변경사항을 기록.
요약
- 영속성 컨텍스트는 JPA에서 엔티티 객체를 관리하는 메모리 내 저장소
- 트랜잭션 범위 내에서 엔티티의 상태를 추적하고, 이를 데이터베이스에 반영
- 영속성 컨텍스트는 1차 캐시를 사용하여 동일한 엔티티에 대한 여러 번의 데이터베이스 조회를 방지