https://github.com/SQUAD-D/board
GitHub - SQUAD-D/board
Contribute to SQUAD-D/board development by creating an account on GitHub.
github.com
게시판 프로젝트를 진행하면서 가장 깊은 고민이 였던 부분은 사용자의 고아 이미지 처리였다.
우선 고아 이미지가 어떻게 생성되는지 살펴보자.
사용자의 이미지는 게시글 작성 요청 시점이 아닌 업로드 즉시 AWS S3에 저장된다.
@PostMapping(value = "/boards/img")
public ImageInfoResponse saveImg(
@RequestPart(value = "image") MultipartFile image) {
return boardService.saveImageToS3(image);
}
문제는 작성 중 이미지를 업로드한 뒤에 페이지를 벗어나는 사용자에대한 처리가 없다는 것이다.
S3에는 이미지가 업로드 되었지만 이미지의 주인은 없는 상태가 된다.
그래서 작성 요청이 완료된 이미지와 작성 중인 이미지를 다른 폴더에 저장해야겠다고 생각했다.
사용자가 업로드한 모든 이미지는
1차적으로 S3 tmp 폴더에 저장한다.
그 후 게시글을 작성하면 Original 폴더로 이미지를 이동시킨다.
public void moveImageToOriginal(String imageUUID, String from, String to) {
s3Client.copyObject(bucket, from + "/" + imageUUID, bucket, to + "/" + imageUUID);
s3Client.deleteObject(bucket, from + "/" + imageUUID);
}
그 뒤에 Spring의 Scheduler를 이용해 주기적으로 tmp 폴더의 이미지를 제거해주면 되겠다고 판단했다.
하지만 곧 바로 이 방법은 문제가 있다는 걸 깨달았는데
만약 스프링 스케줄러가 21:00에 이미지를 주기적으로 제거한다면
20:59에 이미지를 업로드한 게시글 작성자는 21:00에 이미지가 바로 삭제되는 문제가 발생한다.
S3의 이미지 객체 수명주기를 이용하자
s3에서는 이미지의 수명관리 기능을 제공한다.
이 기능을 이용하면 객체 생성시점으로부터 설정한 시간이 지나면 만료객체로 전환되고
만료객체를 삭제하거나 다른 저장소로 옮기는 옵션이 있다.
나는 만료객체를 바로 삭제하는 옵션을 택했다.
이제 이미지 객체는 업로드된 이후 24시간이 지나도록 tmp 폴더에 머물러있다면 만료객체가 돼 제거된다.
물론 프론트단에서 24시간안에 게시글 작성을 완료해야만 이미지가 업로드된다는 경고를 보여주어야한다.
'Spring' 카테고리의 다른 글
[Spring Security JWT 로그인 (2)] JWT가 탈취된다면 어떻게 대응해야 할까 (0) | 2024.03.10 |
---|---|
Redis Session Clustering [세션 고정] (0) | 2023.12.17 |
코드의 중복과 Null 처리 (0) | 2023.09.25 |
@Query 어노테이션으로 직접 작성한 JPQL은 AUTO Flush 할까? (0) | 2023.07.20 |
Cannot delete or update a parent row: a foreign key constraint fails [CASCADE Option, OrphanRemoval, @Modifying, JPQL 에 대하여] (0) | 2023.07.18 |