[JPA] JPQL vs. Native Query

Kim jisu·2024년 10월 9일

spring

목록 보기
1/5

Spring Data JPA를 사용하다 보면, JPQL(Java Persistence Query Language)과 Native Query 중 어느 것을 선택해야 할지 고민하는 경우가 많습니다. 각각의 장단점과 언제 사용하는 것이 좋은지 알아보겠습니다.

1. JPQL (Java Persistence Query Language)

JPQL은 Java Persistence API의 쿼리 언어로, 엔티티 객체를 대상으로 쿼리를 작성할 수 있습니다. SQL과 유사하지만, JPA 엔티티와 객체 지향 모델에 초점을 맞춘 것이 특징입니다. 기본적으로 JPA 엔티티를 통해 데이터베이스와 상호작용하며, 데이터베이스 독립적인 코드 작성이 가능합니다.

장점

  1. 엔티티 중심의 객체지향 쿼리: JPQL은 JPA 엔티티를 기반으로 쿼리를 작성합니다. 이는 객체지향적인 접근 방식을 제공하여, 엔티티 간의 관계를 쉽게 다룰 수 있습니다. 코드를 읽고 유지보수하기가 훨씬 수월하죠.
  2. 데이터베이스 독립성: JPQL은 특정 데이터베이스에 종속되지 않습니다. 이로 인해 데이터베이스를 변경하더라도 쿼리의 호환성을 유지할 수 있어, 유연한 개발이 가능합니다.
  3. 자동 매핑 지원: JPQL은 결과를 엔티티로 자동 매핑해 주므로, 개발자가 수동으로 매핑을 처리할 필요가 없습니다.

단점

  1. 복잡한 쿼리 작성의 어려움: JPQL은 기본적으로 JPA 엔티티를 기반으로
    하다 보니, 복잡한 서브쿼리나 데이터베이스 특화 기능을 사용하기 어려운 경우가 있습니다.
  2. 성능 최적화의 한계: 특정 데이터베이스의 기능을 활용하거나 성능 최적화를 극대화하는 데에는 제한적일 수 있습니다.

언제 사용해야 할까?

객체 지향적인 데이터 접근을 선호할 때
데이터베이스 독립성을 유지하고 싶을 때
엔티티 간의 관계를 활용한 간단한 쿼리를 작성할 때

2. Native Query

Native query는 SQL을 그대로 사용하는 방식입니다. 즉, JPA가 아닌 순수 SQL 문을 직접 사용하여 데이터베이스와 상호작용합니다. 이는 JPQL로는 해결하기 어려운 복잡한 쿼리나 데이터베이스의 특정 기능을 활용해야 할 때 유용합니다.

장점

  1. 복잡한 쿼리 작성 가능: SQL을 그대로 사용할 수 있어 복잡한 조인이나 서브쿼리도 자유롭게 작성할 수 있습니다.
  2. 직접적인 성능 튜닝: 데이터베이스의 특성을 이해하고 있다면, Native Query를 통해 성능 최적화된 쿼리를 작성할 수 있습니다.
    3. DB 기능 활용: 특정 DB의 고유한 기능을 필요로 하는 경우, Native Query는 이를 쉽게 활용할 수 있는 방법입니다.

단점

  1. 데이터베이스 종속성: 특정 데이터베이스에 맞춰 작성된 쿼리는 다른 데이터베이스로 변경할 때 큰 리스크가 될 수 있습니다.
    2. 가독성 저하: SQL 쿼리가 길어지거나 복잡해지면, 코드의 가독성이 떨어져 유지보수가 어려워질 수 있습니다.
  2. 결과 매핑의 수동 처리: 쿼리 결과를 엔티티로 매핑할 때 개발자가 직접 처리해야 하는 경우가 많습니다.

언제 사용해야 할까?

복잡한 쿼리가 필요할 때
특정 DB의 고유한 기능을 활용해야 할 때
데이터베이스 성능 최적화가 중요한 상황일 때

3. JPQL vs. Native Query: 어떤 것을 선택해야 할까?

두 방식의 선택은 프로젝트 상황에 따라 달라집니다.
프로젝트에서 자산 요약을 업데이트하는 로직을 생각해 봅시다. 이 작업에서는 자산 요약을 업데이트하기 위해 여러 개의 서브쿼리가 필요합니다.

JPQL을 사용해야 하는 경우

엔티티 간의 연관관계를 이용해 객체 중심의 설계를 유지하고자 한다면, JPQL을 사용해 다음과 같이 데이터 처리 로직을 작성할 수 있습니다:

@Query("SELECT SUM(b.amount) FROM Bond b WHERE b.member = :member")
Long sumBondAmount(@Param("member") Member member);
  1. 간단한 조회나 CRUD 작업이 주를 이루는 경우
  2. 데이터베이스가 변경될 가능성이 높고, 데이터베이스 독립성을 유지하고자 할 때
  3. JPA의 객체지향적인 접근 방식을 최대한 활용하고 싶을 때

Native Query를 사용해야 하는 경우

복잡한 로직을 단순화하고 성능을 극대화하려면 native query가 유리할 수 있습니다.

@Modifying
@Transactional
@Query(value = "UPDATE asset_summary ...", nativeQuery = true)
void updateAssetSummaryByUid(@Param("uid") int uid);
  1. 복잡한 계산이나 서브쿼리가 필요한 경우
  2. 성능을 극대화해야 하거나 데이터베이스에 특화된 기능을 사용해야 할 때
  3. 데이터베이스가 변경될 가능성이 낮고, 특정 DB에 최적화된 코드를 작성할 수 있을 때

결론

일반적인 경우에는 JPQL로 개발을 시작하고, 특정 성능 최적화가 필요하거나 복잡한 쿼리가 필요할 때는 Native Query로 전환하는 것이 좋은 전략입니다.

profile
Dreamer

0개의 댓글