프레임워크/스프링

[스프링] 휴면 계정 처리를 위한 전략과 그 구현 (1) 전략 및 엔티티 구성

believekim 2025. 6. 23. 06:59

 

휴면계정처리를 완료해보니 개인정보 유효기간제가 폐지되었다는 사실을 알았다.
하지만 구현하여 연계되는 기능이 많기에 글을 써보려고 한다.


시스템 환경

IDE IntelliJ IDEA
Language Java 17
Framework Spring Boot 3.4.5
Build Tool Gradle
ORM JPA (Hibernate)
Database MySQL
Security Spring Security + JWT (jjwt 0.11.5)

 

  • 개인정보 보호법 폐지 관련 전문가 칼럼

https://m.ddaily.co.kr/page/view/2024040109384261610

 

[스타트업 법률상식148] 개인정보 유효기간제 폐지, 휴면계정을 복구할 수 있을까?

현수진 변호사. [ⓒ법무법인 민후]...

m.ddaily.co.kr


 

1. 휴면계정처리 전략 

  • 아래 전략 중 실시간 처리, 정기처리, 하이브리드 처리를 알아보려고 한다.
전략 방식 장점 단점
실시간 처리 (로그인 시 판단) 로그인 요청 시 lastLoginAt 검사하여 휴면 여부 판단 구현 간단, 즉각 반영 주기적 휴면 전환 불가
정기 처리 (스케줄러) 매일/매주 실행되는
스케줄러로 상태 전환
간단한 유지 관리, Spring만으로 가능 대규모 처리에 불
정기 처리 (Spring Batch) 배치 잡으로 수십만 건 이상 사용자 일괄 처리 대용량 처리에 적합, 병렬 처리 가능 배치 설정이 필요함
하이브리드 스케줄러 + 실시간 혼합 정확성 & 실시간 대응 복잡도 증가

 

 

2. 공통 엔티티 구성

  • 기본 User엔티티에 아래의 필드를 추가
// 마지막 로그인 시간 기록
private LocalDateTime lastLoginAt;

// 계정 상태
@Builder.Default
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private UserStatus userStatus = UserStatus.ACTIVE;

 

  • UserStatus는 enum으로 작성했으며 ACTIVE와 DORMANT만 사용하였다.
public enum UserStatus {
    // 정상적으로 활동 중인 유저
    ACTIVE,

    // 장기간 미접속 등으로 휴면 상태
    DORMANT,

//    // 사용자가 자진 탈퇴한 상태 (회원 정보는 일정 기간 보존)
//    WITHDRAWN,

//    //	부정 행위 등으로 관리자에 의해 정지된 계정
//    BANNED,

//    // 비밀번호 연속 실패, OTP 인증 실패 등으로 일시적으로 잠긴 계정
//    LOCKED
}

 

3. User엔티티 MarkAsDormant() 추가

  • 보안을 위해 Setter를 막고 변경하고자 메서드를 추가했다.
public void markAsDormant() {
    this.userStatus = UserStatus.DORMANT;
}

 

 

4. 로그인 시간을 기준으로 삼는 이유

  • 먼저 기준은 3가지가 나올 수 있다.
기준 이유
로그인 시점 ⬅️ ✅ 현실적이고 신뢰 가능한 기준
로그아웃 시점 ❌ 누락 가능성이 큼
마지막 요청 시점 (lastActionAt) ⭕ 가능하지만 구현 복잡도 증가

  • 회사의 상황마다 다른 쓰임새는 아래와 같다.
기준 설명 예시
lastLoginAt 가장 일반적 네이버, 카카오 등
lastAccessAt 접속만 해도 갱신 포털, 게임 등 일부
lastActionAt 마지막 활동 시각 보안이 중요한 금융 서비스
lastLogoutAt 거의 사용 안 함 로그아웃 버튼을 강제할 때만 고려