From 39c215c0422bc203170d2237c63cc6a67d7e6e69 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 25 Feb 2026 22:03:57 +0900 Subject: [PATCH] =?UTF-8?q?fix(member-block):=20=EB=8F=99=EC=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=ED=8C=90=EB=B3=84=20=EC=A1=B0=EA=B1=B4=EC=9D=84=20?= =?UTF-8?q?name=20birth=20di=20gender=20=EC=A1=B0=ED=95=A9=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=95=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/20260225_회원차단동일인판별조건강화.md | 15 +++++++++++++++ .../co/vividnext/sodalive/member/MemberService.kt | 9 +++++++-- .../sodalive/member/auth/AuthRepository.kt | 15 +++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 docs/20260225_회원차단동일인판별조건강화.md diff --git a/docs/20260225_회원차단동일인판별조건강화.md b/docs/20260225_회원차단동일인판별조건강화.md new file mode 100644 index 00000000..43128247 --- /dev/null +++ b/docs/20260225_회원차단동일인판별조건강화.md @@ -0,0 +1,15 @@ +- [x] 기존 `memberBlock` 동일인 판별 로직(`di` 단일 조건)과 연관 Repository 조회 경로 확인 +- [x] `AuthRepository`에 `name + birth + di + gender` AND 조건 조회 메서드 추가 +- [x] `MemberService.memberBlock`에서 다중 조건 조회 메서드 사용으로 변경 +- [x] 변경 파일 정적 진단 및 테스트 실행 +- [x] 구현 결과/검증 기록 문서 반영 + +## 검증 기록 + +### 1차 구현 +- 무엇을: `memberBlock`의 동일인 확장 조회를 `di` 단일 조건에서 `name + birth + di + gender` AND 조건으로 변경했다. +- 왜: 동일인 판단 정밀도를 높여, `di`만 일치하는 케이스로 과차단되는 가능성을 줄이기 위해서다. +- 어떻게: + - 코드 변경: `src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthRepository.kt`에 `getMemberIdsByNameAndBirthAndDiAndGender(...)` QueryDSL 조회를 추가했다. + - 코드 변경: `src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt`의 `memberBlock`에서 `blockedMember.auth`의 `name/birth/di/gender`를 사용해 신규 조회 메서드를 호출하도록 바꿨다. + - 검증: `lsp_diagnostics`는 `.kt` LSP 서버 미구성으로 실행 불가(도구 에러 확인). 대신 `./gradlew test` 성공, `./gradlew build -x test` 성공으로 테스트/빌드 및 `ktlint` 체크 통과를 확인했다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 80a3ef77..feaf92d5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -529,8 +529,13 @@ class MemberService( ?: throw SodaException(messageKey = "common.error.invalid_request") val blockTargetMemberIds = mutableSetOf(request.blockMemberId) - blockedMember.auth?.di?.let { di -> - val verifiedMemberIds = authRepository.getMemberIdsByDi(di = di) + blockedMember.auth?.let { auth -> + val verifiedMemberIds = authRepository.getMemberIdsByNameAndBirthAndDiAndGender( + name = auth.name, + birth = auth.birth, + di = auth.di, + gender = auth.gender + ) blockTargetMemberIds.addAll(verifiedMemberIds) } blockTargetMemberIds.remove(memberId) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthRepository.kt index 0fe96e5e..7f6b9f94 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthRepository.kt @@ -13,6 +13,7 @@ interface AuthRepository : JpaRepository, AuthQueryRepository interface AuthQueryRepository { fun getOldestCreatedAtByDi(di: String): LocalDateTime fun getMemberIdsByDi(di: String): List + fun getMemberIdsByNameAndBirthAndDiAndGender(name: String, birth: String, di: String, gender: Int): List fun getAuthIdByMemberId(memberId: Long): Long? fun getActiveMemberIdsByDi(di: String): List } @@ -36,6 +37,20 @@ class AuthQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : AuthQ .fetch() } + override fun getMemberIdsByNameAndBirthAndDiAndGender(name: String, birth: String, di: String, gender: Int): List { + return queryFactory + .select(member.id) + .from(member) + .leftJoin(member.auth, auth) + .where( + auth.name.eq(name) + .and(auth.birth.eq(birth)) + .and(auth.di.eq(di)) + .and(auth.gender.eq(gender)) + ) + .fetch() + } + override fun getAuthIdByMemberId(memberId: Long): Long? { return queryFactory .select(auth.id)