HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🧚
[1기]최종 프로젝트 데브코스
/
📜
[팀13] 사각사각 ✏️
/
🎊
기술 문서
/
🌀
이미지 업데이트할 때 이전 데이터는 어떻게 관리하는게 좋을까? (S3 리소스 관리)
🌀

이미지 업데이트할 때 이전 데이터는 어떻게 관리하는게 좋을까? (S3 리소스 관리)

작성자 : 김다희
이미지를 현재 S3에 올리고 있고 S3에 올라간 이미지 경로를 받아서 데이터베이스 이미지 필드에 TEXT값으로 저장하고 있다. 그리고 이미지를 수정할 수 있는 기능을 제공한다. 이미지를 수정할 때 새로 올라간 이미지의 S3 이미지 경로를 받아서 데이터베이스 이미지 필드를 update한다. 그럼 이전 이미지는 어떻게 관리해야할까? 크게 3가지 방식이 있을 것 같다.
 
  1. 이전 이미지는 관리안함.
      • 이 방식은 너무 위험한 것 같다. 이전 이미지는 영영 지울 수 없는 상태가 된다.
  1. 수정 요청이 오면 이미 S3에 올라간 이미지를 삭제하고 새로운 이미지를 업데이트 한다.
      • 유저의 정보가 물리적으로 즉시 삭제되는건 위험한 요소들이 있다.
        • 위험 요소 1 : 장애 또는 버그로 원치 않는 데이터가 삭제된다.
  1. 수정 요청이 오면 이미 S3에 올라간 이미지 정보를 별도의 테이블에 데이터를 저장하고, 새로운 이미지를 업데이트 한다. (소프트 딜리트)
      • 데이터가 즉시 삭제되지 않기때문에 위험 요소가 줄어든다.
      • 별도 테이블에 저장된 데이터는 서비스 트래픽이 많지않는 시점에 배치 처리로 지울 수 있다.
 
3번 방식을 채택해보자.
왜 소프트 딜리트를 해야할까?
현 시점에서는 2번을 채택해도 큰 문제는 없을 것이지만 3번 방식을 채택한다면
  1. 비즈니스 로직을 더 깊게 생각해볼 수 있을것 이고
  1. 트랜잭션을 어떻게 묶어야할지도 고민할 수 있다.
  1. 더 나아가 배치처리까지 해볼 수 있다.
때문에 이번 프로젝트에서는 소프트 딜리트를 채택한다.
 
그럼 어떻게 소프트 딜리트를 처리할 수 있을까?
 
현재 소프트 딜리트로 관리되어야 하는 리소스는 아래와 같다.
  • series table - thumbnail field
  • article table - thumbnail field
  • user table - profile field
 
그리고 이 데이터들이 업데이트 요청이 왔을 때 수정되기 전 데이터를 관리하는 테이블을 만들자.
  • 이 테이블의 역할은 데이터들의 임시 휴지통 테이블이라고 생각하자.
테이블은 필드 1개당 1개여야할까? 그럴 필요는 없을 것 같다.
  • 분리수거까지는 필요없다.
 
그럼 테이블에는 어떤 필드들이 필요할까? 아래와 같은 데이터가 필요할 것 같다.
 
처음 생각한 Entity
처음 생각한 Entity(Version 1)
  • 유저 아이디
  • S3 imageKey
  • ImageStatus(는 현재 2가지로 정의한다.)
    • created - S3에서 물리적인 삭제가 되지 않음. (물리적인 삭제 대기상태)
    • deleted - S3에서 물리적으로 삭제됨.
      • S3에서 물리적인 삭제가 되었는데도 deleted 상태로 데이터를 가지고 있어야할까?
      • → 데이터가 잘못지워졌을수도 있다.
        → S3 sms 는 특정 기간동안 자체 백업이 가능하다.
  • ImageName
  • hard_delete_date
 
처음엔 위와같이 Entity를 설계했는데,
현재는 프로젝트에서 관리하는 리소스가 image만 있기때문에 상관없겠지만, 관리해야하는 리소스가 text file과 같은 파일까지 관리되어야 한다면 위 테이블은 취지에 맞지않게된다. 이미지가 아닌 어떤 파일이 오더라도 가능하게 다시 설계를 생각했다. 즉 관리되어야하는 리소스를 추상화해서 다시 생각했다.
 
다시 생각한 Entity(Version2)
notion image
  • domainId
  • userId
  • S3 fileKey
  • Status
  • DomainType
  • FileCategory
  • FileType
  • softDeleteDate
  • hardDeleteDate
 
변경된 부분으로는
  • 이미지로 네이밍했던 부분을 file로 변경했다.
  • 유저 아이디를 추가해서 유저별로 데이터를 관리할 수 있도록 했다.
  • 도메인에 대한 정보를 추가해서 도메인별로 관리될 수 있도록 했다.
    • 도메인 엔티티 아이디를 추가했다.
    • 도메인 타입을 추가했다.
  • 파일에 대한 메타데이터를 추가하고, 파일정보별로 관리될 수 있도록 했다.
    • 파일 카테고리를 추가했다.
    • 파일 타입을 추가했다.
  • 리소스 상태를 관리할 수 있도록 했다.
    • CREATED - 물리적 삭제 x
    • DELETED - 물리적 삭제 o
  • 유저가 삭제를 요청한 날짜를 추가했다.
  • 물리적으로 S3에서 지운 날짜를 추가했다.
 
처음에는 이미지만 관리하던 테이블이였다면
개선을 통해 파일을 관리하는 테이블이 되었고,
유저 / 도메인 / 파일 정보에 따라 유의미한 데이터를 관리할 수 있게 되었다.
 
+ 해당 테이블은 어떠한 테이블과도 연관관계를 맺지않는다.