11package com .back .global .scheduler ;
22
3+ import com .back .domain .node .entity .BaseLine ;
4+ import com .back .domain .node .repository .BaseLineRepository ;
5+ import com .back .domain .node .service .BaseLineService ;
36import com .back .domain .user .entity .Role ;
47import com .back .domain .user .entity .User ;
58import com .back .domain .user .repository .UserRepository ;
1114import org .springframework .stereotype .Component ;
1215import org .springframework .transaction .annotation .Transactional ;
1316
14- import java .util .ArrayList ;
1517import java .util .List ;
1618import java .util .Map ;
1719
1820/**
19- * 게스트 유저 정리 보조 scheduler
20- * - 세션 리스너에서 처리하지 못하고 남은 게스트가 있다면 삭제
21+ * 게스트 유저 정리 보조 Scheduler
22+ * - 세션 리스너에서 처리하지 못하고 남은 게스트가 있다면 정리
2123 */
2224@ Slf4j
2325@ Component
2426@ RequiredArgsConstructor
2527public class GuestCleanupScheduler {
2628
2729 private final UserRepository userRepository ;
30+ private final BaseLineRepository baseLineRepository ;
31+ private final BaseLineService baseLineService ;
2832 private final FindByIndexNameSessionRepository <? extends Session > sessionIndexRepo ;
2933
3034 @ Scheduled (cron = "0 0 17 * * ?" ) // 매일 오후 5시
3135 @ Transactional
3236 public void cleanupExpiredGuests () {
33- log .info ("=== 게스트 정리 작업 시작 (index 기반) ===" );
37+ log .info ("=== 게스트 정리 작업 시작 ===" );
3438
3539 List <User > allGuests = userRepository .findByRole (Role .GUEST );
3640 if (allGuests .isEmpty ()) {
3741 log .info ("게스트 유저가 없습니다." );
3842 return ;
3943 }
4044
41- List < User > expiredGuests = new ArrayList <>() ;
45+ int deletedUsers = 0 ;
4246
4347 for (User guest : allGuests ) {
4448 String principal = guest .getEmail ();
@@ -50,14 +54,39 @@ public void cleanupExpiredGuests() {
5054 );
5155
5256 boolean hasActive = sessions != null && !sessions .isEmpty ();
53- if (!hasActive ) expiredGuests .add (guest );
57+ if (hasActive ) { continue ; }
58+
59+ Long userId = guest .getId ();
60+
61+ try {
62+ List <Long > baseLineIds = baseLineRepository
63+ .findByUser_IdOrderByIdDesc (userId )
64+ .stream ()
65+ .map (BaseLine ::getId )
66+ .toList ();
67+
68+ for (Long baseLineId : baseLineIds ) {
69+ try {
70+ baseLineService .deleteBaseLineDeep (userId , baseLineId );
71+ } catch (Exception ex ) {
72+ log .error ("[GuestCleanupScheduler] baseline({}) deep 삭제 실패 - 계속 진행" , baseLineId , ex );
73+ }
74+ }
75+
76+ userRepository .delete (guest );
77+ deletedUsers ++;
78+
79+ log .info ("[GuestCleanupScheduler] 게스트 및 소유 리소스 삭제 완료: email={}, userId={}" ,
80+ principal , userId );
81+
82+ } catch (Exception e ) {
83+ log .error ("[GuestCleanupScheduler] 게스트(userId={}, email={}) 삭제 처리 중 오류 - 다음 유저로 계속" ,
84+ userId , principal , e );
85+ }
5486 }
5587
56- if (!expiredGuests .isEmpty ()) {
57- userRepository .deleteAllInBatch (expiredGuests );
58- log .info ("만료 게스트 {}명 삭제 완료 - IDs={}" ,
59- expiredGuests .size (),
60- expiredGuests .stream ().map (User ::getId ).toList ());
88+ if (deletedUsers > 0 ) {
89+ log .info ("만료 게스트 {}명 삭제 완료" , deletedUsers );
6190 } else {
6291 log .info ("삭제할 만료 게스트가 없습니다." );
6392 }
0 commit comments