From 3287e718c4fafb8ade4c84803098a6511a981be8 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 12 Mar 2026 17:07:00 +0900 Subject: [PATCH] =?UTF-8?q?fix(push-notification-list):=20=ED=91=B8?= =?UTF-8?q?=EC=8B=9C=20=EC=95=8C=EB=A6=BC=20=EC=A1=B0=ED=9A=8C=20JSON=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=BF=BC=EB=A6=AC=20=ED=8C=8C=EC=8B=B1=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=EB=A5=BC=20=EC=88=98=EC=A0=95=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/20260312_푸시알림조회쿼리오류수정.md | 17 +++++++++++++++++ .../PushNotificationListRepository.kt | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 docs/20260312_푸시알림조회쿼리오류수정.md diff --git a/docs/20260312_푸시알림조회쿼리오류수정.md b/docs/20260312_푸시알림조회쿼리오류수정.md new file mode 100644 index 00000000..8c5550e5 --- /dev/null +++ b/docs/20260312_푸시알림조회쿼리오류수정.md @@ -0,0 +1,17 @@ +# 푸시 알림 조회 쿼리 오류 수정 + +- [x] `PushNotificationController` 연계 조회 API에서 발생한 DB 조회 오류 재현 경로와 실제 실패 쿼리 식별 +- [x] `QuerySyntaxException` 원인인 JPQL/HQL 함수 사용 구문을 코드베이스 패턴에 맞게 수정 +- [x] 수정 코드 정적 진단 및 테스트/빌드 검증 수행 +- [x] 검증 결과를 문서 하단에 기록 + +## 검증 기록 + +### 1차 수정 +- 무엇을: `PushNotificationListRepository.recipientContainsMember`의 QueryDSL 템플릿을 `JSON_CONTAINS({0}, JSON_ARRAY({1}), '$')`에서 `function('JSON_CONTAINS', {0}, function('JSON_ARRAY', {1}), '$') = 1`로 수정했다. +- 왜: Hibernate JPQL/HQL 파서는 MySQL 함수명(`JSON_CONTAINS`, `JSON_ARRAY`) 직접 호출 구문을 인식하지 못해 `QuerySyntaxException`이 발생하므로, JPQL 표준 함수 호출 래퍼(`function`)로 감싸 파싱 가능하도록 변경이 필요했다. +- 어떻게: + - 검색: `grep`/AST/Explore/Librarian로 `PushNotificationController -> PushNotificationService -> PushNotificationListRepository` 호출 흐름과 문제 쿼리를 확인했다. + - 정적 진단: `lsp_diagnostics`로 Kotlin 파일 진단을 시도했으나 현재 환경에 `.kt` LSP 서버 미설정으로 실행 불가를 확인했다. + - 테스트: `./gradlew test --tests "kr.co.vividnext.sodalive.fcm.notification.PushNotificationServiceTest" --tests "kr.co.vividnext.sodalive.fcm.notification.PushNotificationControllerTest"` 실행 결과 `BUILD SUCCESSFUL`. + - 빌드: `./gradlew build -x test` 실행 결과 `BUILD SUCCESSFUL`. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/notification/PushNotificationListRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/notification/PushNotificationListRepository.kt index 90fa306c..701516d6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/notification/PushNotificationListRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/notification/PushNotificationListRepository.kt @@ -124,7 +124,7 @@ class PushNotificationListQueryRepositoryImpl( recipientChunk.notification.id.eq(pushNotificationList.id) .and( Expressions.booleanTemplate( - "JSON_CONTAINS({0}, JSON_ARRAY({1}), '$')", + "function('JSON_CONTAINS', {0}, function('JSON_ARRAY', {1}), '$') = 1", recipientChunk.recipientMemberIds, memberId )