Skip to content

Commit 6303802

Browse files
committed
feat: 파일 지연 삭제 구현
1 parent 10ca092 commit 6303802

3 files changed

Lines changed: 90 additions & 0 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.back.web7_9_codecrete_be.global.storage;
2+
3+
import jakarta.persistence.Entity;
4+
import jakarta.persistence.GeneratedValue;
5+
import jakarta.persistence.GenerationType;
6+
import jakarta.persistence.Id;
7+
import lombok.AllArgsConstructor;
8+
import lombok.Builder;
9+
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
11+
12+
import java.time.LocalDateTime;
13+
14+
@Entity
15+
@Getter
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
@Builder
19+
public class FileDeleteQueue {
20+
21+
@Id
22+
@GeneratedValue(strategy = GenerationType.IDENTITY)
23+
private Long id;
24+
25+
private String fileUrl;
26+
27+
private LocalDateTime deleteAt;
28+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.back.web7_9_codecrete_be.global.storage;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
import java.time.LocalDateTime;
6+
import java.util.List;
7+
8+
public interface FileDeleteQueueRepository extends JpaRepository<FileDeleteQueue, Long> {
9+
List<FileDeleteQueue> findAllByDeleteAtBefore(LocalDateTime now);
10+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.back.web7_9_codecrete_be.global.storage;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.beans.factory.annotation.Value;
5+
import org.springframework.scheduling.annotation.Scheduled;
6+
import org.springframework.stereotype.Component;
7+
import software.amazon.awssdk.services.s3.S3Client;
8+
9+
import java.time.LocalDateTime;
10+
import java.util.List;
11+
12+
@Component
13+
@RequiredArgsConstructor
14+
public class FileDeleteScheduler {
15+
16+
private final FileDeleteQueueRepository repository;
17+
private final S3Client s3Client;
18+
19+
@Value("${cloud.aws.s3.bucket}")
20+
private String bucket;
21+
22+
@Value("${cloud.aws.region.static}")
23+
private String region;
24+
25+
@Scheduled(fixedDelay = 600000) // 10분마다 실행
26+
public void deleteFiles() {
27+
28+
List<FileDeleteQueue> targets =
29+
repository.findAllByDeleteAtBefore(LocalDateTime.now());
30+
31+
for (FileDeleteQueue file : targets) {
32+
try {
33+
String key = extractKey(file.getFileUrl());
34+
35+
s3Client.deleteObject(builder -> builder
36+
.bucket(bucket)
37+
.key(key)
38+
);
39+
40+
} catch (Exception e) {
41+
// 실패해도 계속 진행
42+
}
43+
}
44+
45+
repository.deleteAll(targets);
46+
}
47+
48+
private String extractKey(String fileUrl) {
49+
String prefix = "https://" + bucket + ".s3." + region + ".amazonaws.com/";
50+
return fileUrl.substring(prefix.length());
51+
}
52+
}

0 commit comments

Comments
 (0)