Chap10 -1

이 글은 김영한님의 jpa책을 보고 공부한 흔적입니다.

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를 우회하여 데이터베이스에 접근하는 메소드를 호출할 때마다 영속성 컨텍스트를 플러시하면 깔끔히 해결 할 수 있다.

Last updated