From 2f9ac425d445d2dcda8ed5b1557994398897e558 Mon Sep 17 00:00:00 2001 From: Shinjongyun Date: Mon, 13 Oct 2025 13:37:20 +0900 Subject: [PATCH] =?UTF-8?q?[Fix]=20#16=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=EB=A1=9C=EC=A7=81=20=EC=98=A4=EB=A5=98=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 --- .../member/repository/MemberRepository.java | 6 ++++++ .../domain/user/service/UserService.java | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/member/repository/MemberRepository.java b/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/member/repository/MemberRepository.java index 468ec51..3de2d09 100644 --- a/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/member/repository/MemberRepository.java +++ b/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/member/repository/MemberRepository.java @@ -25,4 +25,10 @@ public interface MemberRepository extends JpaRepository { Optional findByUserAndClub(User user, Club club); List findByUser(User user); List findAllByClubAndIsExistTrue(Club club); + + @Modifying(clearAutomatically = true, flushAutomatically = true) + @Query("delete from Member m where m.user.id = :userId") + void deleteByUserId(@Param("userId") Long userId); + + boolean existsByUserId(Long userId); } diff --git a/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/user/service/UserService.java b/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/user/service/UserService.java index a0323b8..958bbf7 100644 --- a/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/user/service/UserService.java +++ b/src/main/java/com/WhoIsRoom/WhoIs_Server/domain/user/service/UserService.java @@ -25,6 +25,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; import java.net.http.HttpRequest; import java.util.*; @@ -178,17 +180,25 @@ private void validateClubExistence(Set clubIds) { } } + @Transactional public void deleteAccount (HttpServletRequest request, Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new BusinessException(ErrorCode.USER_NOT_FOUND)); + if (memberRepository.existsByUserId(userId)) { + memberRepository.deleteByUserId(userId); + } + userRepository.delete(user); String accessToken = jwtUtil.extractAccessToken(request) .orElseThrow(() -> new CustomAuthenticationException(ErrorCode.SECURITY_INVALID_ACCESS_TOKEN)); - if (accessToken != null) { - jwtService.invalidAccessToken(accessToken); // Redis에 blacklist 저장 - } + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + jwtService.invalidAccessToken(accessToken); + } + }); SecurityContextHolder.clearContext(); }