JPA Transactional 처리와 성능
JPA에서 트랜잭션 내에서 엔티티를 조회하는 방법에 대해 설명하겠습니다.
- Member m1 = jpa.find(memberID);
- jpa.find(memberID)는 데이터베이스에 SQL 쿼리를 실행하여 Member 엔티티를 조회합니다. 이때 SQL 쿼리가 실행되고 결과가 반환됩니다.
- Member m2 = ~~~;
- 트랜잭션 내에서 동일한 memberID로 두 번째 조회를 할 경우, JPA는 이미 첫 번째 조회 시에 가져온 Member 엔티티를 캐시에 저장합니다. 두 번째 조회는 SQL 쿼리를 실행하지 않고, JPA의 1차 캐시에서 데이터를 반환합니다.
- 따라서 m1 == m2는 true가 됩니다. 이는 동일한 트랜잭션 내에서 동일한 엔티티를 조회했기 때문입니다.
트랜잭션 커밋과 Batch 시스템
- JPA는 트랜잭션이 커밋될 때까지 SQL 쿼리를 모아서 한 번에 실행합니다. 이는 배치 시스템처럼 동작하여 성능을 향상시킵니다.
- transactional.commit()가 실행될 때, JPA는 지금까지 모아둔 모든 SQL 쿼리를 한꺼번에 실행하여 데이터베이스와 동기화합니다.
지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)
지연 로딩 (Lazy Loading)
- 지연 로딩은 연관된 엔티티를 실제로 사용할 때 데이터베이스에서 조회하는 방식입니다.
- 예를 들어, member.get~~ 메소드를 호출할 때 연관된 엔티티를 로딩합니다.
- 이는 불필요한 데이터를 미리 조회하지 않음으로써 성능을 최적화할 수 있습니다.
즉시 로딩 (Eager Loading)
- 즉시 로딩은 엔티티를 조회할 때 연관된 모든 엔티티를 한꺼번에 조인하여 가져오는 방식입니다.
- 이는 연관된 데이터를 미리 모두 로딩하므로 조회 시점에서 한 번의 SQL 쿼리로 모든 데이터를 가져올 수 있습니다.
- 그러나 불필요한 데이터를 모두 로딩하게 되어 성능에 영향을 줄 수 있습니다.
요약
- 트랜잭션 내 캐시: 동일 트랜잭션 내에서 동일 엔티티를 조회하면, JPA는 1차 캐시에서 데이터를 반환하여 성능을 향상시킵니다.
- 지연 로딩: 실제 사용 시점에 연관된 데이터를 로딩하여 불필요한 데이터 로딩을 피합니다.
- 즉시 로딩: 연관된 데이터를 한꺼번에 로딩하여 조회 성능을 높이지만, 불필요한 데이터 로딩이 발생할 수 있습니다.
'JAVA > JPA' 카테고리의 다른 글
인프런 JPA 6화 다양한 연관관계 매핑 "김영한 강사" -PlusUltraCode- (0) | 2024.07.20 |
---|---|
인프런 JPA 5화 연관관계 매핑 기초 "김영한 강사" -PlusUltraCode- (0) | 2024.07.20 |
인프런 JPA 4화 필드 컬럼 "김영한 강사" -PlusUltraCode- (1) | 2024.07.19 |
인프런 JPA 3화 영속성 컨텍스트 "김영한 강사" -PlusUltraCode- (0) | 2024.07.19 |
인프런 JPA 2화 생성,삭제,수정 "김영한 강사" -PlusUltraCode- (0) | 2024.07.19 |