반응형
개요
- 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
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 |