-
컬럼 값을 Collection으로 받을 때 Querydsl 이슈실무에서 알게된 내용 2022. 6. 21. 21:09
최근 팀 내에서 GW 방식으로 통신하던 것들을 Edge API로 전환하는 작업을 하고 있다. 이 때문에 Querydsl를 사용해서 쿼리를 작성해야 하는 일이 있었다. 그런데, 특정 검색조건에 대해 Querydsl을 작성하고 DB 통합 Test를 돌렸더니 갑자기 NPE(NullPointerException)가 발생했다. (참고로 현재 내가 맡고 있는 서비스에서는 DB 통합 Test를 위해 Database Rider을 사용하고 있다.)
처음 들었던 생각은 애초에 말도 안 되는 생각이지만 '데이터가 없어서 그런가?'였다.
역시나 이건 아니었다.
이에 코드를 분석해 봤더니 아래 빨간 네모에서 null 값을 리턴하고 있어서 NPE가 발생하고 있었다.
[MethodNode 클래스]
여기서 궁금증이 하나 생겼다. 왜 null 값을 리턴하는 걸까?
일단 내가 확인한 바로는 컬럼 값을 Collection(List, Set 등)으로 받는 필드에 대해 Querydsl을 작성하면 NPE가 발생했다.
이를 통해 짐작해보면 해당 필드(컬럼)는 컨버터를 통해 Collection 타입으로 컨버팅이 되기에 타입을 Collection으로 선언은 했지만 Querydsl을 수행할 때는 해당 컬럼을 Collection으로 보지 않기 때문에 null을 리턴한다고 생각했다.
따라서, 이를 해결하기 위해 Querydsl에서 아래와 같은 방법으로 문제를 해결했다.
[컬럼이 json 타입인 경우]
booleanBuilder.and( Expressions.booleanTemplate( "JSON_CONTAINS({0}, {1}) = true", user.nicknames, --> 엔티티 컬럼명 searchOption.nickname --> 검색 값 ) )
[컬럼이 varchar 타입인 경우]
booleanBuilder.and( Expressions.booleanTemplate( "{0} like concat('%', {1}, '%')", user.nicknames, searchOption.nickname ) )
참고 자료
'실무에서 알게된 내용' 카테고리의 다른 글
ClientAbortException은 언제 발생하는가? (0) 2022.06.23 운영 배포 전에 챙겼던 Kafka Producer Client 포인트들 (0) 2022.06.22 Grafana loki에서 에러 로그 하나가 검색이 안 됐던 이슈 (0) 2022.06.14 시스템 별로 Feign Client readTimeout 설정 때문에 내부 동작 코드 분석 (0) 2022.06.14 현재 운영하고 있는 DB(MySQL) 커넥션 수 확인하기 (0) 2022.06.03