집돌이 공대남 IT

JPA 프로그래밍 마스터하기! 초급부터 전문가까지 실습을 통한 학습(4) 본문

IT/웹개발

JPA 프로그래밍 마스터하기! 초급부터 전문가까지 실습을 통한 학습(4)

집공이 2023. 8. 17. 12:00

JPA 고급: 쿼리 최적화와 고급 기능

안녕하세요! 공대남입니다.

이전 글들에서는 JPA의 기본 원리와 사용 방법, 그리고 엔티티 관리에 대해 살펴보았습니다. 이번에는 좀 더 깊게 파고들어 JPA의 고급 기능과 성능 최적화 방법에 대해 이야기해보려 합니다.

1. JPQL과 Query 메소드

JPA는 데이터베이스 쿼리를 작성하기 위한 자체 쿼리 언어인 JPQL(Java Persistence Query Language)을 제공합니다. JPQL은 SQL과 비슷하지만, 데이터베이스 테이블 대신 엔티티 객체를 대상으로 작동합니다.

예를 들어, 이름이 'John'인 모든 사용자를 찾는 쿼리는 다음과 같이 작성할 수 있습니다:

List<User> users = em.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class)
        .setParameter("name", "John")
        .getResultList();

이 외에도, 스프링 데이터 JPA를 사용하면 인터페이스에 메소드를 선언함으로써 쿼리를 생성할 수 있습니다. 이를 Query 메소드라 합니다. 이 방식은 코드를 간결하게 만들고, 쿼리를 자동으로 생성해주므로 복잡한 쿼리 작성을 피할 수 있습니다.

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}

 

2. 성능 최적화

데이터베이스 작업은 애플리케이션의 성능에 큰 영향을 미칩니다. JPA를 사용하면, LAZY 로딩, EAGER 로딩 등의 전략을 사용해 필요한 데이터만 로딩할 수 있습니다. 이를 통해 불필요한 데이터베이스 액세스를 줄이고 애플리케이션의 성능을 향상시킬 수 있습니다.

 

JPA에서는 엔티티의 상태를 관리하는 1차 캐시와 쿼리 결과를 재활용하는 2차 캐시 기능을 제공하여 성능을 최적화합니다.

1차 캐시는 EntityManager가 관리하는 엔티티의 캐시이며, 트랜잭션 범위에서만 유효합니다.

반면 2차 캐시는 애플리케이션의 범위에서 유효하여 여러 트랜잭션과 스레드에서 재사용할 수 있는 데이터를 캐싱합니다.

하지만 이 기능들을 사용할 때에는 주의가 필요합니다. 캐시를 사용하면 데이터베이스와 애플리케이션 간의 동기화 문제가 발생할 수 있으며, LAZY 로딩을 사용하면 N+1 문제와 같은 성능 이슈가 발생할 수 있습니다. 따라서 이러한 기능을 사용할 때에는 상황에 따라 적절한 전략을 선정해야 합니다.

다음에는 JPA와 Spring Data JPA의 연계, 그리고 실무에서 JPA를 사용할 때의 팁과 주의사항에 대해 알아보겠습니다. 그럼 이번에도 즐겁게 코딩하세요!