본문 바로가기
프로그래밍/Back-end

JPA QueryDSL 네이티브SQL JDBC MyBatis

by @GodWin 2024. 10. 18.

-

 

-
안녕하세요? 오늘은 JPA의 다양한 쿼리 방법에 대해서 알아보도록 하겠습니다.

 



JPA에서는,
JPQL 
JPQ Criteria
QueryDSL 
네이티브 SQL
JDBC 직접 사용
(MyBatis, SpringJdbcTemplate ...)
등등 다양한 쿼리 방법을 지원합니다.

그 중에서, JPQL에 대해서, 다뤄보도록 하겠습니다.

JQPL 

: JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
: SQL과 문법이 유사 (SELECT / FROM / WHERE / GROUP BY / HAVING / JOIN)

: JPQL은 엔티티 객체  대상으로 쿼리 (SQL은 데이터 베이스 테이블을 대상으로 쿼리)
: 가장 단순한 조회 방법

: 특정 DB SQL에 의존하지 않음
: JPA를 사용하면, 엔티티 객체를 중심으로 개발 필요

: 문자가 아닌 자바코드로 SQL 작성 가능
: JPA 공식 기능


샘플 코드)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

em.createQuery(
  qlString: "select e From 엔티티 e where 조건",
  엔티티.class
).getResultList();

tx.commit();



 문제는 개발쿼리(동적쿼리)
> 검색을 할 때에도, 테이블이 아닌, 엔티티 대상으로 검색 필요
>> 모든 DB 데이터를 객체로 변환해서 검색 불가능
>>> App이 필요한 데이터만 DB에서 불러오려면 결국 검색조건이 포함된 SQL이 필요

 

JQPL Criteria

 

: JPQL을 사용하면서,
동적 쿼리를 조금 더 편리하게 쓰기 위해 사용
: 자바 코드로 SQL 관리 가능



샘플코드)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

// Criteria 사용 문법
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<엔티티> query = cb.createQuery(엔티티.class);

Root<엔티티> e = query.from(엔티티.class);

query.select(e).where(cb.equal(e.get("컬럼명"), "조건값");
em.createQuery(cq).getResultList();

tx.commit();

 

QueryDSL 

 

: 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 프레임워크
: 타 지원 쿼리보다 사용하기에 제일 편리
: 별도 셋팅 필요
: 동적 쿼리 작성 편리
: 단순하고 편리
: 쿼리 재사용 가능
: JPQL 문법을 숙지하고 사용



샘플 코드)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

// QueryDSL 문법
JPAFactoryQuery query = new JPAQueryFactory(em);
Q엔티티 e = Q엔티티.엔티티;

List<엔티티> list =
    query.selectFrom(e)
         .where(조건)
         .orderBy(컬럼명)
         .fetch();

tx.commit();

 

네이티브 SQL

 

: JPA가 제공하는 SQL을 직접 사용
: JPQL로 해결할 수 없는,
특정 DB에 의존
ex) 오라클의 connect by



샘플 코드)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

// 네이티브 SQL 문법
String sql = "SELECT 컬럼 FROM 테이블 WHERE 조건";
List<엔티티> resultList = em.createNativeQuery(sql, 엔티티.class).getResultList();

tx.commit();

 

JDBC 직접 사용, SpringJdbcTemplate, MyBatis 등

: JPA를 사용하면서, JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, MyBatis 등을 함께 사용 가능
: 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요



* 트랜잭션의 commit 시점 외에도, 엔티티 매니저의 쿼리를 날리는 시점에도 플래시 작동
하지만, 해당 쿼리 사용은, 영속성 컨텍스트를 사용하지 않음


샘플코드)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();

EntityTransaction tx = em.getTransaction();
tx.begin();

엔티티 e = new 엔티티();
e.set컬럼("값");
em.persist(e);

em.flush(); // DB 적용 후, 쿼리 실행

// JDBC 문법
DataBaseConnection.executeQuery("SELECT * FROM 테이블");

tx.commit();

 

 

 


※ JPA에서의 쿼리 방법에 대해서는, 아래 포스팅을 참조 부탁드리겠습니다.

https://logger-debug.tistory.com/entry/JPA-%EC%BF%BC%EB%A6%AC-JPQL-%ED%8E%98%EC%9D%B4%EC%A7%95-%EC%A1%B0%EC%9D%B8-%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC

 

JPA 쿼리 JPQL 페이징 조인 서브쿼리

- -안녕하세요? 오늘은, JPA의 쿼리 방법 중 하나인, JQPL에 대해 알아보도록 하겠습니다.※ JPA에서의 쿼리 방법에 대해서는, 아래 포스팅을 참조 부탁드리겠습니다.https://logger-debug.tistory.com/entry/JP

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-JPQL-%ED%83%80%EC%9E%85-%ED%91%9C%ED%98%84%EC%8B%9D%EA%B3%BC-%EA%B8%B0%ED%83%80%EC%8B%9D-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%A1%B0%EA%B1%B4%EC%8B%9D%EA%B3%BC-%EA%B8%B0%EB%B3%B8-%ED%95%A8%EC%88%98

 

JPA JPQL 타입 표현식과 기타식 그리고 조건식과 기본 함수

- -안녕하세요? 오늘은 JPA의 JPQL 타입 표현식과 기타식 그리고 조건식과 기본 함수 에 대해서 알아보도록 하겠습니다.※ JPA에서의 쿼리 방법에 대해서는, 아래 포스팅을 참조 부탁드리겠습니다.

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-JPQL-%EA%B2%BD%EB%A1%9C-%ED%91%9C%ED%98%84%EC%8B%9D

 

JPA JPQL 경로 표현식

- -안녕하세요? 오늘은 JPA에서 JPQL의 경로 표현식 에 대해 알아보도록 하겠습니다.※ JPA에서의 쿼리 방법에 대해서는, 아래 포스팅을 참조 부탁드리겠습니다.https://logger-debug.tistory.com/entry/JPA-Quer

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-%EC%BF%BC%EB%A6%AC-%ED%8C%A8%EC%B9%98-%EC%A1%B0%EC%9D%B8-JPQL-FETCH-JOIN

 

JPA 쿼리 패치 조인 JPQL FETCH JOIN

- -안녕하세요? 오늘은 JPA에서 JPQL 패치(FETCH) 조인 에 대해 알아보도록 하겠습니다.※ JPA에서의 쿼리 방법에 대해서는, 아래 포스팅을 참조 부탁드리겠습니다.https://logger-debug.tistory.com/entry/JPA-Qu

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-%EC%BF%BC%EB%A6%AC-JPQL-%EB%B2%8C%ED%81%AC-%EC%97%B0%EC%82%B0

 

JPA 쿼리 JPQL 벌크 연산

- -안녕하세요? 오늘은 JPA의 JPQL 중 벌크 연산에 대해 알아보도록 하겠습니다.-벌크 연산: 쿼리 한번으로, 여러 테이블 로우 변경: executeUpdate의 결과는 영향받은 엔티티 수를 반환: Update / Delete

logger-debug.tistory.com


오늘은 JPA의 다양한 쿼리 방법에 대해서 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길 바라겠습니다.