본문 바로가기
데이터 접근 기술/JPA

나는 지금 JPQL이 필요하다!

by oncerun 2022. 10. 26.
반응형

 

JPQL를 이해하지 않고 QueryDSL이 좋다고 라이브러리를 바로 쓸 수는 없다고 판단했다.

그래서 미래의 나에게 미리 사과를 하고 JPQL을 활용해 이번 프로젝트를 마무리할 것이다.

 

물론 요즘 DDD관련 서적도 읽고 JPA 공부도 다시 시작했고 JPQL도 배워 즉시 사용할 것이기 때문에 

프로덕트 환경이 아닌 로컬에서 조금씩 리팩터링과 기술의 변경을 적용할 예정이다. 

 

JPA 및 Spring-Data-JPA가 아무리 좋다한들 복잡한 로직에 대해선 결국 쿼리 작성이 필요하긴 한 것 같다.

그래서 이를 지원하는 기능을 찾아보았다.

 

  • JPQL
  • JPA Criteria
  • QueryDSL
  • Native SQL
  • SpringJdbcTemplate

아 순수 JDBC와 MyBatis는 제외하려고 한다.  현재 우리 프로젝트에 뭐가 제일 적당한지 찾아보자.

 

JPQL 

- 가장 단순하다. 

 이는 쿼리의 형태를 띄고있지만 테이블이 아닌 엔티티 객체를 대상으로 검색하는 쿼리를 작성한다. 

자원이 무한하다면 그냥 모든 DB 데이터를 메모리에 넣고 쓰겠지만 이는 현실적으로 불가능

따라서 현재 상황에 필요한 데이터만 끌어올려서 사용하려면 검색 조건이 필요하다

 

JPQL은 JPA에서 제공하는 객체 지향 쿼리 언어라고 한다. 

ANSI 표준은 전부 다 지원한다는 점은 매우 메리트가 있어 보인다. 

 

entityManager.createQuery( "select h From Hair h where h.name like "double%",Hair.class).getResultList();

 

테이블 대신 엔티티라는 것 말고는 SQL과 별 차이가 없어 보인다. 

 

그럼 JPQL은 JPA에 의존하지 특정 데이터베이스에 의존하지 않는다는 장점이 보인다. 다만 현재는 해당사항이 없다.

 

단점이 동적 쿼리에 대해 매우 약한 모습을 보인다. 이에 대한 대안으로 JPA Criteria가 나왔다고 한다. 

근데 현재 동적 쿼리에 대한 부분이 많지 않아서 한 번쯤 경험해보는 것도 나쁘지 않아 보인다.

 

JPA Criteria

 - 자바 코드로 JPQL을 작성할 수 있도록 한다. 

자바 코드를 쓴다는 것은 type 체크가 가능하다는 것. 이는 컴파일 시점에 오류를 잡을 수 있다.

다만 JPA Criteria 예제를 보면 알레르기가 올라와서 우선 보류

 

 

QueryDSL

 

가장 많이 추천하는 오픈소스 라이브러리이다.

 

 

세팅하는 것 보면 고생좀하겠는데 고생할만한 가독성이다.

 

동적 쿼리 쉽고, 컴파일 시점 오류 발견되는 많은 장점을 가지고 있어 보인다.

 

근데 사용조건이 JPQL을 알 고사 용하라고 하기 때문에 보류!

Native SQL

- 특정 데이터베이스의 벤더에 종속적인 SQL을 사용해야 할 때 적당하다. 

예를 들면 오라클 데이터베이스는 표준 SQL이 아닌 오라클에서 지원되는 기능이 상당히 많다. 

이런 경우 사용하면 좋을 듯하다.

 

별도의 라이브러리도 아니고 JPA에서 제공해주는 데 필요할 시점에 안쓸 이유가 없다.

JPQL이 이해가 안 되고 오류를 만났는데, 정말 시간이 없으면 em.createNativeQuery을 통해 생 SQL 쿼리를 날릴 때 사용해야겠다. 

SpringJdbcTemplate

이럼 jpa랑 혼합하여 썼을 때 문제가 하나 있다. 

이는 영속성 콘텍스트를 사용하는 것이 아니라 직접 jdbc를 사용하는 것이기 때문에 순서를 중요하게 생각하고 flush()를 전에 꼭 호출해야 한다.

이러한 규칙은 내부 구조를 복잡하게 만들 수 있을 것 같은데..

 

아.. 미안 절벽에 몰렸을 때 한번 사용해줄게..

반응형

'데이터 접근 기술 > JPA' 카테고리의 다른 글

N+1 문제 해결  (0) 2022.10.29
나는 지금 JPQL이 필요하다! (2)  (0) 2022.10.26
주말 정리  (0) 2022.10.24
영속성 컨텍스트  (0) 2022.10.23
Entity의 변경을 JPA에서 처리하는 방법  (0) 2022.10.23

댓글