From 00a8a3c5839ca50c96da19d8d5875e43e16be426 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Thu, 13 Nov 2025 13:34:05 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat(rank):=20=EB=9E=AD=EC=BB=A4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rank/service/SolverDeleteService.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java diff --git a/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java new file mode 100644 index 00000000..840ecb27 --- /dev/null +++ b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java @@ -0,0 +1,33 @@ +package kr.co.mathrank.domain.rank.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import kr.co.mathrank.domain.rank.entity.Solver; +import kr.co.mathrank.domain.rank.exception.CannotFoundSolverException; +import kr.co.mathrank.domain.rank.repository.SolverRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@Validated +@RequiredArgsConstructor +public class SolverDeleteService { + private final SolverRepository solverRepository; + + @Transactional + public void delete(@NotNull @Valid final Long memberId) { + final Solver solver = solverRepository.findById(memberId) + .orElseThrow(() -> { + log.info("[SolverDeleteService.delete] cannot found solver - memberId: {}", memberId); + return new CannotFoundSolverException("사용자를 찾을 수 없습니다."); + }); + + solverRepository.delete(solver); + log.info("[SolverDeleteService.delete] solver deleted - memberId: {}", memberId); + } +} From 8202c571893b43d6bc63cc7fd22f08c011a00186 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Thu, 13 Nov 2025 13:38:47 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat(member):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20=EC=8B=9C,=20=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=9C=ED=96=89=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/auth/service/MemberDeleteService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java b/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java index af8f7e2a..2bc9490e 100644 --- a/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java +++ b/domain/mathrank-auth-domain/src/main/java/kr/co/mathrank/domain/auth/service/MemberDeleteService.java @@ -6,6 +6,8 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; +import kr.co.mathrank.common.event.EventPayload; +import kr.co.mathrank.common.outbox.TransactionalOutboxPublisher; import kr.co.mathrank.domain.auth.client.OAuthClientManager; import kr.co.mathrank.domain.auth.dto.MemberDeleteCommand; import kr.co.mathrank.domain.auth.entity.Member; @@ -24,6 +26,7 @@ public class MemberDeleteService { private final MemberRepository memberRepository; private final OAuthClientManager oAuthClientManager; private final RefreshTokenRepository refreshTokenRepository; + private final TransactionalOutboxPublisher outboxPublisher; @Transactional public void delete(@NotNull @Valid final MemberDeleteCommand command) { @@ -36,6 +39,7 @@ public void delete(@NotNull @Valid final MemberDeleteCommand command) { throw new UnRegisterMemberException("oauth 연동 해제중 에러 발생했습니다. 잠시 후 다시 시도해주세요"); } refreshTokenRepository.expire(member.getId()); + outboxPublisher.publish("mathrank-member-removed", MemberDeletedEventPayload.from(member)); log.info("[MemberDeleteService.delete] member delete success - memberId: {}", command.targetMemberId()); } @@ -46,4 +50,13 @@ private Member getMember(final Long targetMemberId) { return new CannotFoundMemberException(); }); } + + record MemberDeletedEventPayload( + Long memberId, + String memberName + ) implements EventPayload { + static MemberDeletedEventPayload from(final Member member) { + return new MemberDeletedEventPayload(member.getId(), member.getName()); + } + } } From d560e2bc6648675c0919c4c250fe50be8f744a94 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Thu, 13 Nov 2025 13:41:35 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat(rank):=20=EB=A9=A4=EB=B2=84=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=8B=A0=ED=95=B4=EC=84=9C=20=EB=9E=AD=ED=82=B9=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=9C=EA=B1=B0=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mathrank/app/consumer/rank/EventPayloads.java | 6 ++++++ .../rank/SolvedRankEventMonolithListener.java | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java index 341a840d..fd1ccd9c 100644 --- a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java +++ b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/EventPayloads.java @@ -29,4 +29,10 @@ record MemberUpdatedEventPayload( String schoolCode ) implements EventPayload { } + + record MemberDeletedEventPayload( + Long memberId, + String memberName + ) implements EventPayload { + } } diff --git a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java index c09ad341..0748e038 100644 --- a/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java +++ b/app/consumer/mathrank-rank-consumer-monolith/src/main/java/kr/co/mathrank/app/consumer/rank/SolvedRankEventMonolithListener.java @@ -8,6 +8,7 @@ import kr.co.mathrank.common.event.publisher.monolith.MonolithEvent; import kr.co.mathrank.domain.rank.dto.SolverUpdateCommand; import kr.co.mathrank.domain.rank.service.SolveLogRegisterService; +import kr.co.mathrank.domain.rank.service.SolverDeleteService; import kr.co.mathrank.domain.rank.service.SolverUpdateService; import lombok.RequiredArgsConstructor; @@ -16,6 +17,7 @@ class SolvedRankEventMonolithListener { private final SolveLogRegisterService solveLogRegisterService; private final SolverUpdateService solverUpdateService; + private final SolverDeleteService solverDeleteService; @EventListener @Async @@ -44,4 +46,15 @@ public void consumeMemberUpdatedEvent(final MonolithEvent monolithEvent) { solverUpdateService.updateSolver(new SolverUpdateCommand(Long.parseLong(payload.memberId()), payload.name(), payload.schoolCode())); } + + @EventListener + @Async + public void consumeMemberRemovedEvent(final MonolithEvent monolithEvent) { + if (!monolithEvent.isExpectedTopic("mathrank-member-removed")) { + return; + } + final Event deletedEventPayload = Event.fromJson(monolithEvent.payload(), EventPayloads.MemberDeletedEventPayload.class); + + solverDeleteService.delete(deletedEventPayload.getPayload().memberId()); + } } From 2197c96f0096177399172b9d447b9f7896982f37 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Thu, 13 Nov 2025 13:52:16 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor(rank):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=B0=BE=EC=A7=80=20=EB=AA=BB=ED=96=88=EC=9D=84=20?= =?UTF-8?q?=EB=95=8C,=20=EB=A1=9C=EA=B7=B8=EB=A7=8C=20=EB=82=A8=EA=B8=B0?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/rank/service/SolverDeleteService.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java index 840ecb27..5576db11 100644 --- a/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java +++ b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java @@ -6,8 +6,6 @@ import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import kr.co.mathrank.domain.rank.entity.Solver; -import kr.co.mathrank.domain.rank.exception.CannotFoundSolverException; import kr.co.mathrank.domain.rank.repository.SolverRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,13 +19,12 @@ public class SolverDeleteService { @Transactional public void delete(@NotNull @Valid final Long memberId) { - final Solver solver = solverRepository.findById(memberId) - .orElseThrow(() -> { + solverRepository.findById(memberId) + .ifPresentOrElse(solver -> { + solverRepository.delete(solver); + log.info("[SolverDeleteService.delete] solver deleted - memberId: {}", memberId); + }, () -> { log.info("[SolverDeleteService.delete] cannot found solver - memberId: {}", memberId); - return new CannotFoundSolverException("사용자를 찾을 수 없습니다."); }); - - solverRepository.delete(solver); - log.info("[SolverDeleteService.delete] solver deleted - memberId: {}", memberId); } } From 048884d71e8e120f472e00bba27b93bf4be77ba9 Mon Sep 17 00:00:00 2001 From: huhdy32 Date: Thu, 13 Nov 2025 13:52:46 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix(rank):=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?id=20=EB=A1=9C=20=EC=B0=BE=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/mathrank/domain/rank/service/SolverDeleteService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java index 5576db11..26da8e10 100644 --- a/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java +++ b/domain/mathrank-rank-domain/src/main/java/kr/co/mathrank/domain/rank/service/SolverDeleteService.java @@ -19,7 +19,7 @@ public class SolverDeleteService { @Transactional public void delete(@NotNull @Valid final Long memberId) { - solverRepository.findById(memberId) + solverRepository.findByMemberId(memberId) .ifPresentOrElse(solver -> { solverRepository.delete(solver); log.info("[SolverDeleteService.delete] solver deleted - memberId: {}", memberId);