From 901afcff97d0bfc2b859721d5dee24a13ac53023 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 5 Mar 2026 17:32:34 +0900 Subject: [PATCH] =?UTF-8?q?refactor(admin-charge):=20=EC=B6=A9=EC=A0=84=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=9D=91=EB=8B=B5=20QueryProjection=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=EB=A1=9C=20=EA=B5=AC=EC=A1=B0=EB=A5=BC=20?= =?UTF-8?q?=EB=8B=A8=EC=88=9C=ED=99=94=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/20260305_관리자충전상세쿼리프로젝션리팩토링.md | 13 +++++++++++++ .../charge/AdminChargeStatusQueryRepository.kt | 4 ++-- .../admin/charge/AdminChargeStatusService.kt | 10 ---------- .../admin/charge/GetChargeStatusDetailQueryDto.kt | 13 ------------- .../admin/charge/GetChargeStatusDetailResponse.kt | 3 ++- 5 files changed, 17 insertions(+), 26 deletions(-) create mode 100644 docs/20260305_관리자충전상세쿼리프로젝션리팩토링.md delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailQueryDto.kt diff --git a/docs/20260305_관리자충전상세쿼리프로젝션리팩토링.md b/docs/20260305_관리자충전상세쿼리프로젝션리팩토링.md new file mode 100644 index 00000000..03bfa87b --- /dev/null +++ b/docs/20260305_관리자충전상세쿼리프로젝션리팩토링.md @@ -0,0 +1,13 @@ +# 관리자 충전 상세 QueryProjection 리팩토링 + +- [x] `AdminChargeStatusService.getChargeStatusDetail` 후처리 매핑 제거 +- [x] `AdminChargeStatusQueryRepository.getChargeStatusDetail` 반환 타입을 응답 DTO QueryProjection으로 변경 +- [x] 관련 DTO/QueryDSL 생성 타입 정합성 확인 +- [x] 검증 수행 (`lsp_diagnostics`, `./gradlew test`, `./gradlew build`) + +## 검증 기록 + +### 1차 구현 +- 무엇을: `GetChargeStatusDetailResponse`에 `@QueryProjection`을 적용하고, `AdminChargeStatusQueryRepository`가 해당 DTO를 직접 select 하도록 변경했으며, 서비스의 후처리 `map`을 제거했다. 또한 불필요해진 `GetChargeStatusDetailQueryDto.kt` 파일을 삭제했다. +- 왜: 상세 응답 가공을 서비스에서 한 번 더 수행하지 않고 DB 조회 시점(QueryProjection)에서 완성된 응답 형태를 가져오도록 구조를 단순화하기 위해서다. +- 어떻게: `lsp_diagnostics`로 수정 파일 진단을 시도했으나 `.kt` LSP 미설정으로 도구 검증이 불가함을 확인했고, 대신 `./gradlew test`와 `./gradlew build -x test`를 실행해 테스트/빌드 성공(`BUILD SUCCESSFUL`)을 확인했다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt index ed9c2eb0..c25db1bd 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusQueryRepository.kt @@ -88,7 +88,7 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory endDate: LocalDateTime, paymentGateway: PaymentGateway, currency: String? = null - ): List { + ): List { val formattedDate = Expressions.stringTemplate( "DATE_FORMAT({0}, {1})", Expressions.dateTimeTemplate( @@ -117,7 +117,7 @@ class AdminChargeStatusQueryRepository(private val queryFactory: JPAQueryFactory return queryFactory .select( - QGetChargeStatusDetailQueryDto( + QGetChargeStatusDetailResponse( charge.id, member.nickname, payment.method.coalesce(""), diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt index 5a73b91f..a645075c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/AdminChargeStatusService.kt @@ -44,15 +44,5 @@ class AdminChargeStatusService(val repository: AdminChargeStatusQueryRepository) .toLocalDateTime() return repository.getChargeStatusDetail(startDate, endDate, paymentGateway, currency) - .map { - GetChargeStatusDetailResponse( - chargeId = it.chargeId, - nickname = it.nickname, - method = it.method, - amount = it.amount, - locale = it.locale, - datetime = it.datetime - ) - } } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailQueryDto.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailQueryDto.kt deleted file mode 100644 index d2ce711e..00000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailQueryDto.kt +++ /dev/null @@ -1,13 +0,0 @@ -package kr.co.vividnext.sodalive.admin.charge - -import com.querydsl.core.annotations.QueryProjection -import java.math.BigDecimal - -data class GetChargeStatusDetailQueryDto @QueryProjection constructor( - val chargeId: Long, - val nickname: String, - val method: String, - val amount: BigDecimal, - val locale: String, - val datetime: String -) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt index f96145f1..235b413a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/charge/GetChargeStatusDetailResponse.kt @@ -1,8 +1,9 @@ package kr.co.vividnext.sodalive.admin.charge +import com.querydsl.core.annotations.QueryProjection import java.math.BigDecimal -data class GetChargeStatusDetailResponse( +data class GetChargeStatusDetailResponse @QueryProjection constructor( val chargeId: Long, val nickname: String, val method: String,