Forest Gump?

JPA와 queryDsl이란 뭘까? 본문

카테고리 없음

JPA와 queryDsl이란 뭘까?

code1010 2022. 12. 15. 17:47

보통 프로젝트를 하다보면 jdbc에 종속된 MyBatis로 쿼리를 짜서 이용했는데,  런타임 오류가 많이나고,

새로운 방법으로 프로젝트 진행을 해보고싶어서 많이 쓰고 있다는 JPA에 대해 스터디를 해보려고 한다.

 

JPA : Java Persistence API

자바 애플리케이션에서 관계형 데이터베이스를 사용하는 방식 을 정의한 인터페이스

특정 기능을 하는 라이브러리가 아니다.

단지, '관계형 데이터베이스를 어떻게 사용해야 하는지'를 정의하는 한 방법일 뿐이다.

지루하게 반복되는 CRUD 문제를 쉬운 방법으로 해결하기 위한 라이브러리.

 

스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입해만 한다.

그럼 이때 Hibernate가 JPA의 구현체이며, 이는 인터페이스를 직접 구현한 라이브러리를 뜻한다.

(TMI : 다른 JPA 구현체를 사용해도 되고 가능하다면 직접 JPA를 구현해 사용할 수도 있음. 하지만 하이버네이트는 이미 좋다고 검증된 라이브러리이기 때문에 이를 사용할 뿐)

JPA와 Hibernate는 마치 자바의 인터페이스와 해당 인터페이스를 구현한 class와 같은 관계이다.

 

다음은 JPA의 다양한 쿼리 방법이며, 실무에서는 SpringBoot+ JPA + QueryDSL 을 기본으로 사용한다고 한다.

  • JPQL
  • JPA Criteria
  • QueryDSL
  • 네이티브 SQL
  • JDBC API 직접 사용, MyBatis, SpringJdbc Template 함꼐 사용

나한테 익숙한 JPQL은 Java Persistence Query Language 로 가장 단순한 조회 방법을 뜻하는 거였다.

즉 JPA = JPQL 를 어찌보면 맞지만 JPA에 내포되는 개념으로 JPA에서 사용하는 SQL 쿼리 방법을 뜻한다.

 

앞으로 프로젝트에서 주로 쓸 방법은 QueryDSL이다.

간단하게 자바 코드로 JPQL/ SQL 을 이용한 쿼리 작성을 도와주는 빌더 API로

SQL 쿼리 문자열이 아닌, 코드로 컴파일 하는 시점에 문법 오류를 발견할 수 있다는 장점이 있어 많이 사용된다.

(Q객체라는 generated 된 파일들을 사용함) 

 

참고로 queryDsl 은 인터페이스 Repository, 상속받는 RepositoryImpl  , Repositorycustom 파일 이런 3개의 구조로

많이 쓰이는것 같다. 

 

(이런 번거로운 방법이 싫어서 우아한 테크 이동욱님이 강의하신 방법을 채용했다.) 

 

queryDsl 의 간략한 정보가 아닌, 추가적인 내용은 다음 포스트에서 다뤄보겠다.