집돌이 공대남 IT

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

IT/웹개발

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

집공이 2023. 9. 4. 12:00

JPA 성능 최적화 이해와 실습

안녕하세요, JPA 여행을 계속 이어가는 집돌이 공대남입니다.

이번 포스트에서는 JPA 성능 최적화에 대해 알아보도록 하겠습니다.

쿼리 최적화를 위한 기본 원칙

우선 JPA에서 성능을 최적화하기 위한 가장 기본적인 원칙은 다음과 같습니다.

  1. 필요한 데이터만 조회합니다. 불필요한 데이터를 조회하게 되면 네트워크 용량을 낭비하고, 애플리케이션에서 그 데이터를 처리하는데 CPU 자원이 낭비됩니다.
  2. 필요한 시점에 데이터를 조회합니다. 데이터를 미리 조회해 두었다가 나중에 사용하게 되면, 그 사이에 데이터가 변경될 수 있으므로 최신 상태를 반영하지 못할 수 있습니다.
  3. 한 번에 가능한 한 많은 데이터를 조회합니다. 데이터베이스에서 데이터를 조회할 때는 네트워크 비용이 크게 발생하므로, 가능한 한 한 번의 조회로 필요한 모든 데이터를 가져오는 것이 효율적입니다.

이런 원칙을 지키기 위해서는 어떻게 해야 할까요? JPA에서는 다음과 같은 기법들을 활용하여 성능을 최적화할 수 있습니다.

 

JPA 성능 최적화 기법

  1. 페치 조인(Fetch Join): 페치 조인을 사용하면 연관된 엔티티들을 한 번의 SQL 쿼리로 함께 조회할 수 있습니다. 이는 SQL의 JOIN과 비슷하지만, JPA에서는 연관된 엔티티들을 실제 엔티티 객체로 변환하여 제공합니다.
  2. 프로젝션(Projection): 프로젝션을 사용하면 필요한 엔티티의 일부만 조회할 수 있습니다. 이를 통해 불필요한 데이터의 조회를 최소화하고 성능을 향상시킬 수 있습니다.
  3. 캐시 활용: JPA는 1차 캐시와 2차 캐시를 지원합니다. 1차 캐시는 영속성 컨텍스트가 관리하는 캐시이며, 2차 캐시는 여러 영속성 컨텍스트가 공유하는 캐시입니다. 캐시를 활용하면 데이터베이스 액세스를 줄이고 성능을 향상시킬 수 있습니다.

정말 매 과정마다 최적화를 계속 적고 있습니다. 많이 연습해보시라고 매 적었습니다~

이러한 성능 최적화 기법을 어떻게 활용하는지 실습을 통해 알아봅시다.

실습: JPA 성능 최적화

다음 코드는 페치 조인과 프로젝션을 활용하여 성능을 최적화한 예입니다.

public class BookRepositoryCustomImpl implements BookRepositoryCustom {
    @PersistenceContext
    private EntityManager em;

    @Override
    public List<BookDto> findDtoByGenre(Genre genre) {
        JPAQueryFactory query = new JPAQueryFactory(em);
        QBook book = QBook.book;

        List<BookDto> results = query.select(Projections.constructor(BookDto.class, book.title, book.author.name, book.genre, book.price))
                                     .from(book)
                                     .join(book.author)
                                     .where(book.genre.eq(genre))
                                     .fetch();

        return results;
    }
}

이 코드에서 주목할 점은 다음과 같습니다:

  1. Projections.constructor()를 사용해 프로젝션을 적용합니다. 이를 통해 BookDto 객체를 생성하면서 필요한 데이터만 조회합니다.
  2. join() 메소드를 사용해 페치 조인을 적용합니다. 이를
  3. 통해 Book 엔티티와 연관된 Author 엔티티를 한 번의 쿼리로 함께 조회합니다.

이러한 방식을 사용하면 필요한 데이터만 한 번의 쿼리로 효율적으로 조회할 수 있습니다.

다음 포스트에서는 캐시를 활용한 성능 최적화에 대해 알아보도록 하겠습니다. 감사합니다!