File tree Expand file tree Collapse file tree
src/main/java/com/back/web7_9_codecrete_be/global/storage Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments