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(); }