Projects/block-server

[block-server] 휴지통 자동 삭제 기능 구현 (2)

annovation 2026. 3. 28. 23:30

Application

💡DemoApplication.java

 

feat: 문서 휴지통 자동 삭제 기능 추가 by hellonaeunkim · Pull Request #43 · jho951/Block-server

📝 Part (해당되는 것만 체크) BE FE Infra Docs Test #️⃣ 연관된 이슈 closes #41 🔎 작업 내용 1. 주요 변경 사항 요약 기존 문서 삭제 API를 soft delete에서 hard delete로 변경 문서를 휴지통으로 보내는 별

github.com

  • Code
package com.documents;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

 

💡코드 해석

  •  @EnableScheduling
    • Spring에서 @Scheduled가 붙은 메서드를 찾아서 주기적으로 실행하도록 켜는 설정
    • Spring이 애플리케이션 시작 시 스케줄링 기능을 활성화하고, 예를 들어 아래 나오는 DocumentTrashPurgeScheduler.java 같은 Spring Bean 안의 @Scheduled 메서드를 등록해서 실행한다.

참고 자료


Schedular

💡DocumentTrashPurgeScheduler.java

 

feat: 문서 휴지통 자동 삭제 기능 추가 by hellonaeunkim · Pull Request #43 · jho951/Block-server

📝 Part (해당되는 것만 체크) BE FE Infra Docs Test #️⃣ 연관된 이슈 closes #41 🔎 작업 내용 1. 주요 변경 사항 요약 기존 문서 삭제 API를 soft delete에서 hard delete로 변경 문서를 휴지통으로 보내는 별

github.com

  • Code
package com.documents;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.documents.service.DocumentService;

import lombok.RequiredArgsConstructor;

@Component
@RequiredArgsConstructor
public class DocumentTrashPurgeScheduler {

	private final DocumentService documentService;

	@Scheduled(fixedDelay = 60000)
	public void purgeExpiredTrash() {
		documentService.purgeExpiredTrash();
	}
}

 

💡코드 해석

  • 이 클래스는 휴지통에 들어간 문서 중 만료된 문서를 주기적으로 정리하는 스케줄러 역할을 한다.
  • Spring의 @Scheduled를 이용해서 일정 주기마다 휴지통 만료 문서를 자동 삭제하도록 만든 배치성 컴포넌트이다.
  • 실행될 때 직접 삭제 로직을 구현하지 않고 documentService.purgeExpiredTrash()를 호출함
  • 즉, 스케줄링 책임과 비즈니스 삭제 책임을 분리한 구조

💡코드 설명

  • @Component : Spring이 관리하는 Bean
  • @Scheduled(fixedDelay = 60000)
    • 이전 실행이 끝난 뒤 60초 후 다시 실행

💡클래스를 따로 둔 이유

  • 스케줄링은 실행 트리거 역할, 실제 정책 판단과 DB 삭제는 서비스 계층 역할로 구분하여 구현
  • 이렇게 분리하면 테스트가 쉬워진다. 즉, 서비스는 스케줄러 없이도 단위 테스트가 가능해진다.
  • 나중에 수동 실행(휴지통 비즈니스 로직 직접 호출), 관리자 API, 다른 배치 시스템으로 바꿔도 서비스 재사용 가능

💡fixedDelay


참고 자료

  •  

documentService.purgeExpiredTrash()documentService.purgeExpiredTrash()

Service

💡DocumentServiceImpl.java

 

feat: 문서 휴지통 자동 삭제 기능 추가 by hellonaeunkim · Pull Request #43 · jho951/Block-server

📝 Part (해당되는 것만 체크) BE FE Infra Docs Test #️⃣ 연관된 이슈 closes #41 🔎 작업 내용 1. 주요 변경 사항 요약 기존 문서 삭제 API를 soft delete에서 hard delete로 변경 문서를 휴지통으로 보내는 별

github.com

  • Code
@Override
@Transactional
public void purgeExpiredTrash() {
    LocalDateTime expiredAt = LocalDateTime.now().minusMinutes(TRASH_RETENTION_MINUTES);
    List<Document> expiredTrashRoots = documentRepository.findExpiredTrashRoots(expiredAt);

    for (Document expiredTrashRoot : expiredTrashRoots) {
        documentRepository.delete(expiredTrashRoot);
    }
}

...

private void validateTrashRestoreAvailable(Document document) {
    LocalDateTime restoreDeadline = document.getDeletedAt().plusMinutes(TRASH_RESTORE_AVAILABLE_MINUTES);
    LocalDateTime restoreDeadline = document.getDeletedAt().plusMinutes(TRASH_RETENTION_MINUTES);
    if (!LocalDateTime.now().isBefore(restoreDeadline)) {
        throw new BusinessException(BusinessErrorCode.DOCUMENT_NOT_FOUND);
    }
	}

Repository

💡DocumentRepository.java

 

feat: 문서 휴지통 자동 삭제 기능 추가 by hellonaeunkim · Pull Request #43 · jho951/Block-server

📝 Part (해당되는 것만 체크) BE FE Infra Docs Test #️⃣ 연관된 이슈 closes #41 🔎 작업 내용 1. 주요 변경 사항 요약 기존 문서 삭제 API를 soft delete에서 hard delete로 변경 문서를 휴지통으로 보내는 별

github.com

  • Code
@Query("""
    select d
    from Document d
    left join d.parent p
    where d.deletedAt is not null
      and d.deletedAt <= :expiredAt
      and (
        p is null
        or p.deletedAt is null
      )
    order by
      d.deletedAt asc,
      d.createdAt asc,
      d.id asc
    """)
List<Document> findExpiredTrashRoots(@Param("expiredAt") LocalDateTime expiredAt);

Github repo

https://github.com/jho951/Block-server/pull/43

 

feat: 문서 휴지통 자동 삭제 기능 추가 by hellonaeunkim · Pull Request #43 · jho951/Block-server

📝 Part (해당되는 것만 체크) BE FE Infra Docs Test #️⃣ 연관된 이슈 closes #41 🔎 작업 내용 1. 주요 변경 사항 요약 기존 문서 삭제 API를 soft delete에서 hard delete로 변경 문서를 휴지통으로 보내는 별

github.com