[java] 자바 ORM에서의 네이티브 쿼리와 JPQL의 차이

ORM(Object-Relational Mapping)은 자바 애플리케이션과 데이터베이스 간의 상호작용을 쉽게 만들어주는 기술입니다. ORM을 사용할 때, 네이티브 쿼리(native query)와 JPQL(Java Persistence Query Language)은 데이터 조회와 조작을 위한 두 가지 주요한 방법입니다. 이 글에서는 네이티브 쿼리와 JPQL의 차이를 살펴보겠습니다.

1. 네이티브 쿼리

네이티브 쿼리는 데이터베이스에 특정한 SQL 쿼리를 직접 작성하여 사용하는 방식입니다. 즉, 네이티브 쿼리는 데이터베이스 벤더가 제공하는 SQL 언어를 그대로 사용합니다.

예를 들어, Hibernate ORM에서 네이티브 쿼리를 실행할 때에는 createNativeQuery 메서드를 사용하고, 결과를 매핑할 엔티티 클래스를 지정해야 합니다. 하지만 네이티브 쿼리를 사용할 경우, 데이터베이스 벤더에 종속적인 SQL을 직접 작성해야 하며, 이는 이식성을 저하시킬 수 있습니다.

String nativeQuery = "SELECT * FROM users WHERE age > 25";
List<User> users = entityManager.createNativeQuery(nativeQuery, User.class).getResultList();

2. JPQL

JPQL은 엔티티를 대상으로 하는 객체지향 쿼리 언어입니다. 데이터베이스 벤더에 독립적이며, 엔티티와 필드를 대상으로 쿼리를 작성할 수 있어 유지보수 및 이식성 면에서 강점을 가지고 있습니다.

JPQL을 사용할 때에는 createQuery 메서드를 사용하고, JPQL 쿼리 문자열을 전달해야 합니다. JPQL은 엔티티와 엔티티 간의 관계를 고려하여 쿼리를 작성하므로, 객체지향 프로그래밍의 이점을 살려 유연하고 강력한 쿼리를 작성할 수 있습니다.

TypedQuery<User> query = entityManager.createQuery(
    "SELECT u FROM User u WHERE u.age > 25",
    User.class
);
List<User> users = query.getResultList();

3. 결론

네이티브 쿼리와 JPQL은 각각 장단점을 가지고 있습니다. 네이티브 쿼리는 데이터베이스에 직접 접근하여 SQL을 사용하므로 성능 측면에서 강점을 가지고 있지만, 이식성이 떨어지고 유지보수가 어려울 수 있습니다. 반면 JPQL은 엔티티와 필드를 대상으로 쿼리를 작성하므로 객체지향적이고 이식성이 뛰어나지만, 복잡한 쿼리에 대한 처리는 느릴 수 있습니다.

따라서, 프로젝트의 요구사항과 상황에 맞게 적절한 방법을 선택하여 사용해야 합니다.

참고문헌: