2023.09.06.수.TIL

heeh·2023년 9월 11일

TIL

목록 보기
80/82
post-thumbnail

2023.09.06.수.TIL

  • 할 것
    • 12시 회의
    • 오후 시간까지 회원 탈퇴 redis로 try

회원 탈퇴

  • ㅂㅅㅁ튜터님에게 질문!
    • 유저테이블에 탈퇴 여부를 갖고 있다
      • 스케줄링을 이용하여
  • Redis를 이용한 구현도 가능하게 보이지만… 적합해보이지 않아 비추천!
    • Redis에 넣는 정보는 써도 그만 안써도 그만 하는 정보를 넣어 주는 것!
    • 회원 탈퇴를 신청한 사람들의 정보는 중요한 정보이며 Redis에 담는 것은 부적합

스케줄러 사용하기

  • 참고
  • 생성
    • public class WithdrawalCleanupScheduler
    • public class Withdrawal
    • public interface WithdrawalRepository extends JpaRepository<Withdrawal, Long>
  • @스케줄링이 내부적으로 사용자들의 탈퇴 신청을 확인하여 탈퇴(유저 정보 삭제)를 진행시켜 줌
    • 회원 탈퇴를 신청한 시간으로부터 설정한 만료 기간으로 탈퇴가 작동
      • ex) 회원 탈퇴를 신청한 시간으로부터 7일 후 탈퇴 완료 → 스케줄러가 일(날)마다 확인
      • ex) 회원 탈퇴를 신청한 시간으로부터 5시간 후 탈퇴 완료 → 스케줄러가 시간마다 확인
    • 언제 탈퇴 신청을 하든 스케줄러가 정해진 시간에 탈퇴가 작동
      • ex) 매 시간 정각에 탈퇴 완료 → 스케줄러가 매 시간 정각 전 마다 확인
      • ex) 매주 금요일 자정에 탈퇴 완료 → 스케줄러가 매주 금요일 자정 전 마다 확인
    • 스케줄러 관련 트래픽 발생 주의
      • ex) 많은 사람들이 한꺼번에 신청할 때
      • ex) 너무 짧은 회원 탈퇴 유예기간으로 인해 스케줄러의 탈퇴 확인과 작동이 너무 많을 때
  • WithdrawalCleanupScheduler의 스케줄링 주기 표시
    • @Scheduled(fixedDelay = 60000) // 60000 밀리초 = 1분
  • 삭제 메서드
    • public ResponseEntity withdrawUser(Long userId, User user)의 삭제 코드 스니펫
      // 사용자 탈퇴 처리가 완료되면 WithdrawalRequest를 삭제합니다.
              withdrawalRepository.delete(withdrawal);
      • UserService 클래스의 withdrawUser 메서드는 사용자가 직접 탈퇴를 요청하고, 해당 요청을 처리하는 역할을 합니다. 이 메서드에서 withdrawalRepository.delete(withdrawal);를 호출하는 것은 사용자가 탈퇴를 요청하고 탈퇴가 완료되었을 때 Withdrawal 엔티티를 삭제하는 것입니다. 이것은 사용자 요청에 따른 개별적인 탈퇴 처리를 수행합니다.
    • public class WithdrawalCleanupScheduler의 삭제 코드 스니펫
      // 기간 만료된 회원 탈퇴 정보를 삭제
              for (Withdrawal withdrawal : expiredWithdrawals) {
                  withdrawalRepository.delete(withdrawal);
      • WithdrawalCleanupScheduler 클래스는 주기적으로 실행되는 작업을 관리하고, 기간이 만료된 회원 탈퇴 정보를 조회하고 삭제하는 역할을 합니다. 이 작업은 주기적으로 실행되며 자동으로 회원 탈퇴 정보를 정리하는 역할을 합니다.
  • 만료 기간
    • public class WithdrawalCleanupScheduler
      • @Scheduled(fixedDelay = 60000)
        • 이 어노테이션은 스프링의 스케줄링 기능을 사용하여 일정한 간격(여기서는 60,000밀리초 또는 1분)으로 메서드를 주기적으로 실행합니다. 즉, 이 코드는 메서드를 1분마다 실행하는데 사용됩니다.
    • UserService - public ResponseEntity withdrawUser(Long userId, User user)
      LocalDateTime now = LocalDateTime.now();
              LocalDateTime scheduledDeletionTime = now.plusMinutes(1);
              Withdrawal withdrawal = Withdrawal.builder()
                      .userId(targetUser.getId())
                      .requestTime(now)
                      .scheduledDeletionTime(scheduledDeletionTime)
                      .status(WithdrawalStatusEnum.PENDING) // 탈퇴 상태를 대기 중으로 설정
                      .build();
      • 이 코드는 현재 시간에서 1분을 더한 시간을 계산하여 scheduledDeletionTime에 저장합니다. 이것은 특정 시간을 예약하는 데 사용됩니다. 예를 들어, 현재 시간이 2023-09-06 12:00:00 이라면, scheduledDeletionTime은 2023-09-06 12:01:00이 됩니다.
    • 따라서 두 기능은 서로 다릅니다. @Scheduled 어노테이션을 사용한 경우 메서드는 주기적으로 실행되며, LocalDateTime를 사용한 코드는 특정 시간을 계산하고 예약하는 데 사용됩니다. 이러한 두 가지 기능은 서로 다른 목적을 가지고 있으므로 겹치는 기능이 아닙니다.
    • 회원을 탈퇴하는 것과 관련하여 만료 시간을 갖는 것은 LocalDateTime scheduledDeletionTime = now.plusMinutes(1);
    • 이 코드는 현재 시간에서 1분을 더한 시간을 계산하여 scheduledDeletionTime 변수에 저장합니다. 이 시간은 회원 탈퇴 요청이 들어올 때, 탈퇴 처리를 얼마나 지연시킬지를 나타내며, 일반적으로 1분 후에 탈퇴 처리를 진행하도록 설정되어 있습니다. 따라서 이 시간이 지나면 회원 탈퇴 처리가 진행됩니다.
    • 반면, @Scheduled(fixedDelay = 60000)은 스케줄러가 매 1분마다 지정된 작업을 수행하는 데 사용됩니다. 이것은 주기적인 작업 실행과 관련이 있으며, 탈퇴 처리의 예약 시간과는 직접적인 연관이 없습니다.
    • 더 이해하기
      • 질문

        LocalDateTime scheduledDeletionTime = now.plusSeconds(30); 이고
        @Scheduled(fixedDelay = 60000) 라면

        회원 탈퇴는 30초 후에 진행되는데 스케줄러는 60초 이후에 작동 되나요?
        , 맞습니다.
        
        LocalDateTime scheduledDeletionTime = now.plusSeconds(30);은 scheduledDeletionTime 변수를 현재 시간에서 30초 후의 시간으로 설정합니다. 이것은 회원 탈퇴 처리가 예약된 시간을 나타냅니다.
        
        @Scheduled(fixedDelay = 60000)은 스케줄러를 60(, 1) 간격으로 실행하도록 설정합니다. 이것은 스케줄러가 60초마다 주기적으로 작업을 수행하는 것을 의미합니다.
        
        따라서 scheduledDeletionTime이 30초 후로 설정되었다고 하더라도, 스케줄러는 60초마다 실행되므로, 스케줄러가 작동될 때까지 기다리면 1분 이상이 소요될 수 있습니다., 스케줄러가 작동되면 회원 탈퇴 처리가 30초 후에 진행될 것입니다.
      • 하지만 스케줄러가 작동할 때 기간이 만료되면서 회원 탈퇴(회원 정보 삭제)가 이루어져야 하는데…???

        @Scheduled(fixedDelay = 60000)를 쓰기 위해서는 LocalDateTime scheduledDeletionTime = now.plusSeconds(30);를 삭제하는 것이 옳은가요?

        @Scheduled(fixedDelay = 60000)은 일정한 주기로 메서드를 실행하는 어노테이션입니다. LocalDateTime scheduledDeletionTime = now.plusSeconds(30);은 탈퇴 예정 시간을 30초 후로 설정하는 코드입니다.
        
        만약 @Scheduled(fixedDelay = 60000)을 사용하여 주기적으로 메서드를 실행하려면, 해당 주기 내에 탈퇴 예정 시간이 지난 회원을 처리하고자 한다면 LocalDateTime scheduledDeletionTime 설정을 변경할 필요가 있습니다. fixedDelay의 값에 따라 메서드가 얼마나 자주 실행될지가 결정되므로, 예를 들어 60,000 밀리초(, 60초 또는 1)로 설정하면 매 1분마다 메서드가 실행됩니다.
        
        따라서 이 경우, LocalDateTime scheduledDeletionTime을 스케줄러의 주기와 일치하도록 설정하는 것이 좋습니다. 예를 들어 LocalDateTime scheduledDeletionTime = now.plusMinutes(1);로 변경하여 1분 뒤를 탈퇴 예정 시간으로 설정할 수 있습니다. 이렇게 하면 @Scheduled(fixedDelay = 60000) 주기마다 1분 뒤에 탈퇴 예정인 회원을 처리할 수 있게 됩니다.

        그러면 scheduledDeletionTime = now.plusSeconds(30); 으로 인해 30초가 지났을 때 회원 탈퇴가 작동 하는 건가요?
        아니면 30초가 지났을 때 아무것도 일어나지 않고 @Scheduled(fixedDelay = 60000)으로 인해 1분이 지나야 회원 탈퇴가 작동하는 건가요?

        scheduledDeletionTime = now.plusSeconds(30);에서 30초가 지난 후에 해당 회원의 탈퇴를 처리하기 위한 시간을 설정하는 것입니다. 이 시간은 스케줄러와 관련이 없으며, 해당 회원의 탈퇴 처리를 위한 시간을 지정하는 것입니다.
        
        @Scheduled(fixedDelay = 60000)은 스케줄러가 1분마다 실행될 것을 의미하며, 스케줄러가 실행될 때 30초가 지난 회원의 탈퇴 처리를 확인하고, 그 시점에서 처리를 진행합니다., 30초가 지난 후에 회원 탈퇴가 작동하는 것이 맞습니다. 스케줄러는 1분마다 실행되므로, 스케줄러가 실행되는 시점에서 30초가 지난 회원의 탈퇴 처리를 확인하게 됩니다.

        scheduledDeletionTime = now.plusSeconds(30);를 삭제하면 어떻게 되나요?

        scheduledDeletionTime = now.plusSeconds(30);를 삭제하면, 회원 탈퇴 요청을 받고 바로 스케줄러에 의해 처리될 것입니다., 탈퇴 요청을 받은 즉시 회원 탈퇴 작업이 시작되고, 스케줄러에 의한 지연 없이 처리됩니다.
        
        반면에, scheduledDeletionTime을 유지하면, 탈퇴 요청을 받은 후 30초가 경과한 후에 스케줄러가 실행될 때 해당 회원의 탈퇴 처리가 진행됩니다. 따라서 30초 동안은 탈퇴 요청을 취소할 수 있고, 그 이후에는 스케줄러가 작동하여 탈퇴 처리를 수행합니다.
  • public void cleanupWithdrawals()에 있는 내용을 UserServicewithdrawUser 메서드로 이동 할 수 있을까?
    1. WithdrawalCleanupScheduler는 주기적으로 실행되는 스케줄러로, 주기마다 만료된 탈퇴 정보를 처리하는 역할을 수행합니다. 이에 반해 withdrawUser 메서드는 요청을 통해 특정 사용자의 탈퇴를 처리하는 역할을 합니다. 따라서 이 두 기능은 서로 다른 동작을 수행합니다.

    2. WithdrawalCleanupScheduler는 주기적으로 실행되므로 자동으로 만료된 탈퇴 정보를 처리하고, 이미 탈퇴 진행 중인 경우에는 처리하지 않습니다. 반면에 withdrawUser 메서드는 요청에 의해 특정 사용자의 탈퇴를 처리하므로 요청에 따라 사용자가 직접 탈퇴를 요청한 경우에만 작동합니다.

      따라서 WithdrawalCleanupScheduler의 로직을 그대로 UserServicewithdrawUser 메서드로 이동하는 것은 권장되지 않습니다. 두 가지 기능은 서로 다른 상황에서 사용되는 것이 좋습니다. WithdrawalCleanupScheduler는 주기적으로 자동으로 처리하고, withdrawUser 메서드는 사용자의 요청에 따라 처리하는 것이 적절합니다.

profile
공부하자개발하자으쌰으쌰

0개의 댓글