본문 바로가기
JAVA/JPA

인프런 김영한의 JPA 1화

by PlusUltraCode 2024. 7. 18.
 

JPA Transactional 처리와 성능

JPA에서 트랜잭션 내에서 엔티티를 조회하는 방법에 대해 설명하겠습니다.

  1. Member m1 = jpa.find(memberID);
    • jpa.find(memberID)는 데이터베이스에 SQL 쿼리를 실행하여 Member 엔티티를 조회합니다. 이때 SQL 쿼리가 실행되고 결과가 반환됩니다.
  2. 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차 캐시에서 데이터를 반환하여 성능을 향상시킵니다.
  • 지연 로딩: 실제 사용 시점에 연관된 데이터를 로딩하여 불필요한 데이터 로딩을 피합니다.
  • 즉시 로딩: 연관된 데이터를 한꺼번에 로딩하여 조회 성능을 높이지만, 불필요한 데이터 로딩이 발생할 수 있습니다.