프레임워크/스프링
[스프링] 휴면 계정 처리를 위한 전략과 그 구현 (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 | 거의 사용 안 함 | 로그아웃 버튼을 강제할 때만 고려 |