[SpringBoot] 객체지향 쿼리 언어

·2023년 9월 9일

객체지향 쿼리 언어 소개

JPA는 다양한 쿼리 방법을 지원한다.

  • JPQL
  • JPA Criteria
  • QueryDSL
  • 네이티브 SQL
  • JDBC API 직접 사용, MyBatis, SpringJDBCTemplate 함께 사용

가장 단순한 조회 방법 → EntityManager.find(), 객체 그래프 탐색(a.getB().getC())

JPQL

  • JPA를 사용하면 엔티티 객체를 중심으로 개발을 한다
  • 문제는 검색 쿼리
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 한다.
  • 모든 DB 데이터를 객체로 변환해서 검새하는 것은 불가능하다.
  • 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건(WHERE 와 같은)이 포함된 SQL이 필요하다.
  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
  • SQL과 문법이 유사하고, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등을 지원한다.
  • JPQL은 엔티티 객체를 대상으로 쿼리를 날린다.
  • SQL은 데이터베이스 테이블을 대상으로 쿼리를 날린다.

JPQL은 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리로 SQL을 추상화해서 특정 데이터베이스 SQL에 의존을 하지 않는다. JPQL을 한마디로 정의하면 객체 지향 SQL이다.

그런데, JPQL은 사실상 String이다 보니 동적 쿼리를 작성하기 어렵다는 문제가 발생한다.

이를 해결하기 위한 방법중 하나는 Criteria를 사용하는 것이다.

Criteria

Criteria는 문자가 아닌 자바코드로 JPQL을 작성할 수 있어 동적 쿼리를 작성할 수 있다. JPA의 공식 기능으로 JPQL의 빌더 역할을 하지만, 너무 복잡하고 실용성이 없다는 치명적인 단점이 있다. 그래서 Criteria 대신에 QueryDSL을 사용하는 것을 권장한다.

QueryDSL

QueryDSL은 마찬가지로 문자가 아닌 자바코드로 JPQL을 작성할 수 있고 JPQL의 빌더 역할을 한다. 컴파일 시점에 문법 오류(오타)를 찾을 수 있고, 동적 쿼리 작성이 편리하면서 단순하고 쉬워 실무 사용을 권장한다.

네이티브 SQL

네이티브 SQL은 JPA가 제공하는 SQL을 직접 사용하는 기능이다. JPQL로 해결할 수 없는 특정 데이터베이스에 의존적인 기능으로 오라클의 CONNECT BY나 특정 DB만 사용하는 SQL 힌트 같은 거에 사용할 수 있다.

JDBC 직접 사용, SpringJdbcTemplate 등

JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, 마이바티스 등을 함께 사용하는 것도 가능하다. 단, 영속성 컨텍스트를 적절한 시점에 강제로 플러시 해줘야 한다.

결론적으론 90퍼센트는 JPQL이나 QueryDSL을 사용한다.

profile
고민0

0개의 댓글