개발 일지

QuerydslPredicate 란

북극곰은콜라 2022. 11. 23. 21:58
반응형

QueryDSL


개요

  • spring-data-commons 라이브러리에서 제공하는 기능
  • 목적은 컨트롤러의 파라미터를 이용하여 간단하게 Querydsl 조건문을 생성

예시

parameter value QueryDSL predicate (in Controller) SQL
member.name test1 member.name.eq("test1") SELECT .... FROM member WHERE name = 'test1'
member.name test1 member.name.in("test1", "test2") SELECT .... FROM member WHERE name in ('test1', 'test2')
member.name test2

동작 Flow

querydslPredicate flow


QuerydslBindings 클래스

  • pathSpecs : 특정 key값으로 cutomize된 binding function정보를 들고 있는 맵
  • typeSpecs : 특정 Class를 key값으로 cutomize된 binding function정보를 들고 있는 맵
  • 두 종류 Specs의 우선순위 -> path 실행 후 type 실행 -> 먼저 걸리면 리턴

이슈가 있음..

pathSpecs(Map)에 등록할때 key값 생성하는 메서드에 이슈가 있음 (spring-data-commons:2.3.4.RELEASE)

  • path.toString -> any(xxxx.yyyy).yyyyKey.zzzz
  • rootPath.getMetadata().getName() -> xxxx
  • subString 결과 any(x 가 짤려서 xxx.yyyy~~로 시작하게되어 잘못된 결과 리턴함

1.5 버전의 queryDSL 해당부분 (spring-data-commons:1.12.3.RELEASE)

private static String toDotPath(Path<?> path, String tail) {
 
 if (path == null) {
  return tail;
 }
 
 PathMetadata metadata = path.getMetadata();
 Path<?> parent = metadata.getParent();
 
 if (parent == null) {
  return tail;
 }
 
 Object element = metadata.getElement();
 
 if (element == null || !StringUtils.hasText(element.toString())) {
  return toDotPath(parent, tail);
 }
 
 return toDotPath(parent, StringUtils.hasText(tail) ? String.format("%s.%s", element, tail) : element.toString());

현재 element기반 parent를 구해서 하나씩 append 하는 형식으로 최상위까지 갔다가 리턴 (재귀함수)


결론

  • 일정버전 이상의 spring boot 버전에서 이슈가 있는 라이브러리이다.
  • 또한 Client가 Entity의 구조를 파악하고 서버의 controller를 통해 entity로 접근하는 방식은 위험하며, 좋지 못한 구조
  • 이 기술은 Spring-boot 2.0 으로 들어와서 관련된 문서조차 없으며 딱히 Deprecated는 안 되어있지만 이슈 관리가 안되는 것으로 보아 사용하면 안될것으로 판단됨
  • 쓰지말자..
반응형

'개발 일지' 카테고리의 다른 글

Spring boot With Embedded Tomcat  (0) 2022.11.23
MDC 란  (0) 2022.11.23
Nginx vs HAProxy  (0) 2022.11.23
OIDC 란  (0) 2022.11.23
Logstash 란  (0) 2022.11.23