# Chap10 -1

JPA Chap 10-1 객체지향 쿼리 언어

### 객체지향 쿼리 소개

EntityManager.find() 메소드를 사용하면 식별자로 엔티티 하나를 조회할 수 있다.

이 조회는 하나를 조회할 뿐 다수를 조회할 때는 어렵다.

왜냐면 하나씩 검색해서 모든 회원 엔티티를 메모리에 올려두기는 힘들기 때문이다.

이 문제를 해결하기 위해서 나온것이 바로 JPQL이다.

**JPQL의 특징이란?**

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

  즉 엔티티 객체를 대상으로 하는 객체지향 쿼리이고, 조회한 결과로 엔티티 객체를 생성해서 반환한다.

**객체지향 쿼리 종류**

* JPQL
* Criteria 쿼리
* 네이티브 SQL
* QueryDSL
* JDBC 직접 사용, MyBatis 같은 SQL 매퍼 프레임워크 사용

**JPQL이란?**

* 엔티티 객체를 조회하는 객체지향 쿼리다.
* JPQL은 SQL을 추상화해서 특정 데이터베이스에 의존하지 않는다.
* JPQL은 SQL보다 간결하다.

**Creteria 쿼리란?**

* 문자가 아닌 query.select (m) .where(...)처럼 프로그래밍 코드로 JPQL을 작성할 수 있다.
* 컴파일 시점에 오류를 발견할 수 있다.
* IDE를 사용하면 코드 자동완성을 지원한다.
* 동적 쿼리를 작성하기 편하다.
* 모든 장점을 상쇄할 정도로 복잡하고 장황하다. 사용하기가 불편한 건 물론이고 Criteria로 작성한 코드도 한눈에 들어오지 않는다는 단점이 있다.

**QueryDSL 이란?**

* JPQL 빌더 역활을 한다.
* 코드기반이면서 단순하고 사용하기 쉽다.

**네이티브 SQL 이란?**

* SQL은 지원하지만 JPQL이 지원하지 않는 기능이 있을때 네이티브 SQL을 사용한다.
* 특정 데이터베이스에 의존하는 SQL을 작성해야 한다.
* 데이터베이스를 변경하면 네이티브 SQL도 수정해야 한다.

**JDBC 직접 사용, 마이바티스 같은 SQL 매퍼 프레임워크 사용**

* JDBC 커넥션에 직접 접근하고 싶으면 JPA는 JDBC 커넥션을 획득하는 API를 제공하지 않으므로 JPA 구현체가 제공하는 방법을 사용해야 한ㄷ,
* JDBC나 마이바티스를 JPA와 함께 사용하면 영속성 컨텍스트를 적절한 시점에 강제로 플러시 해야한다.
* JPA를 우회해서 SQL을 실행하기 직전에 영속성 컨텍스트를 수동으로 플러시해서 데이터베이스와 영속성 컨텍스트를 동기화하면 된다.
* 스프링 프레임워크를 사용하면 JPA와 마이바티스를 손쉽게 통합할 수 있다.
* 스프링 프레임워크의 AOP를 적절히 활용해서 JPA를 우회하여 데이터베이스에 접근하는 메소드를 호출할 때마다 영속성 컨텍스트를 플러시하면 깔끔히 해결 할 수 있다.
