Skip to content

Commit c84e9f8

Browse files
committed
활성화된 멤버가 없는 그룹 정리 로직 구현
1 parent 382e137 commit c84e9f8

File tree

5 files changed

+32
-2
lines changed

5 files changed

+32
-2
lines changed

src/main/java/com/sonkim/bookmarking/common/scheduler/TeamCleanupScheduler.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,27 @@
22

33
import com.sonkim.bookmarking.domain.team.service.TeamService;
44
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
56
import org.springframework.scheduling.annotation.Scheduled;
67
import org.springframework.stereotype.Component;
78

89
@Component
910
@RequiredArgsConstructor
11+
@Slf4j
1012
public class TeamCleanupScheduler {
1113
private final TeamService teamService;
1214

1315
@Scheduled(cron = "0 0 4 * * *")
1416
public void deleteScheduledTeams() {
17+
log.info("삭제가 예정된 그룹 정리 작업 시작...");
1518
teamService.deletePendingTeams();
19+
log.info("삭제가 예정된 그룹 저일 작업 완료.");
20+
}
21+
22+
@Scheduled(cron = "0 0 5 * * *")
23+
public void cleanupOrphanedTeams() {
24+
log.info("주인 없는 그룹 정리 작업 시작...");
25+
teamService.deleteOrphanedTeams();
26+
log.info("주인 없는 그룹 정리 작업 완료.");
1627
}
1728
}

src/main/java/com/sonkim/bookmarking/domain/mypage/service/MyPageService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,5 @@ public void deleteAccount(Long userId) {
133133

134134
// RefreshToken 삭제하여 세션 무효화
135135
tokenService.deleteRefreshToken(userId);
136-
137-
// 마지막 관리자인 그룹이 있는 경우 탈퇴가 불가능하도록 로직 추가 필요
138136
}
139137
}

src/main/java/com/sonkim/bookmarking/domain/team/repository/TeamRepository.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.sonkim.bookmarking.domain.team.entity.Team;
44
import com.sonkim.bookmarking.domain.team.enums.TeamStatus;
55
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
67
import org.springframework.stereotype.Repository;
78

89
import java.time.LocalDateTime;
@@ -14,4 +15,9 @@ public interface TeamRepository extends JpaRepository<Team, Long> {
1415
Optional<Team> findByInviteCode(String inviteCode);
1516

1617
List<Team> findAllByStatusAndDeletionScheduledAtBefore(TeamStatus status, LocalDateTime deletionScheduledAtBefore);
18+
19+
@Query("SELECT t FROM Team t WHERE NOT EXISTS " +
20+
"(SELECT 1 FROM TeamMember tm JOIN tm.user u " +
21+
"WHERE tm.team = t AND u.userStatus = 'ACTIVE')")
22+
List<Team> findOrphanedTeams();
1723
}

src/main/java/com/sonkim/bookmarking/domain/team/service/TeamService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,4 +238,15 @@ public void validateGroupIsActive(Long teamId) {
238238
if (team.getStatus() == TeamStatus.PENDING_DELETION)
239239
throw new IllegalStateException("삭제가 예정된 그룹에서는 이 작업을 수행할 수 없습니다.");
240240
}
241+
242+
@Transactional
243+
public void deleteOrphanedTeams() {
244+
// 활성 멤버가 없는 그룹 조회
245+
List<Team> orphanedTeams = teamRepository.findOrphanedTeams();
246+
247+
if (!orphanedTeams.isEmpty()) {
248+
log.info("{}개의 주인 없는 그룹을 삭제합니다.", orphanedTeams.size());
249+
teamRepository.deleteAll(orphanedTeams);
250+
}
251+
}
241252
}

src/main/java/com/sonkim/bookmarking/domain/user/entity/User.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ public void updatePassword(String newPassword) {
5151
public void withdraw() {
5252
this.userStatus = UserStatus.DELETED;
5353
this.deletedAt = LocalDateTime.now();
54+
55+
String uniqueSuffix = "_" + this.id + "_" + System.currentTimeMillis();
56+
this.username = "deleted" + uniqueSuffix + "@deleted.com";
57+
5458
this.password = null;
5559
profile.anonymize();
5660
}

0 commit comments

Comments
 (0)