Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] S3 를 통한 Image Upload 기능 구현 #418

Closed
wants to merge 11 commits into from

Conversation

kpeel5839
Copy link
Collaborator

작업 대상

Image 를 Upload 하는 API 수정

📄 작업 내용

  • POST /pins (핀 생성과 함께 Image 리스트를 받을 수 있도록 수정)
  • POST /pins/images (Pin 에 단일 이미지를 추가하는 기능)
  • POST /topics/new
  • POST /topics/merge
  1. 기존에 위 API 들 모두 String 으로 Image URL 을 받고 있었는데, 해당 부분을 MultipartFile 를 받을 수 있도록 수정
  2. 받은 MultipartFile 을 AWS S3 2023/team-projects/2023-map-be-fine/(dev, prod) 에 upload
  3. cloud front url + "/" + 생성한 image name 으로 DB 에 Image URL 저장
  4. DB 에 저장된 Image URL 로 S3 에 올라가 있는 Image 로 접근가능

이 이외에 이해가 안되는 부분이 있다면 질문 남겨주시면 감사할 것 같아요!

🙋🏻 주의 사항

이야기 해봐야 할 사항들이 조금 있는 것 같아요! 이야기 해본 다음 제가 계속해서 보완해나가도록 하겠습니다.

  • DB 에 저장해야 할 내용은 Image URL 이라고 생각하시나요? 아니면 fileName 이름이라고 생각하시나요? ex) imageURL -> https://.../imageName.png, image 이름 -> imageName.png

    • Image URL 을 저장한다면?
      • S3 에 이미지를 올린 데이터의 경우에는 그냥 끝에 fileName 만 따서 삭제하면 됩니다. 이건 쉬워요 ex ) url 은 cloud front url + "/" + fileName 이니까 file name 만 따서 S3 에 삭제요청 날리면됩니다.
    • fileName 을 선택한다면?
      • fileName 을 저장하는 것을 선택한다면, 기존의 데이터를 활용하지 못할 것 같아요.
      • Image 이름을 DB 에 저장한다면, 실제로 이미지에 접근할 때 cloud front urlprefix 에 붙여야 하는데, 기존의 데이터들은 https://... 이렇게 저장되어 있어, cloud front url + https://... 로 이미지를 요청하게 되요.
  • 기존 데이터를 어떻게 활용할 것일까?

    • 기존 데이터는 그냥 쌩 인터넷에 올라와 있는 url 이에요
      • 이 때 S3 에 올라가 있는 사진을 지우려고 한다고 가정해볼게요.
        • 그러면 어떤 것은 실제로 S3 에서 지울 수 있는 사진이고
        • 어떤 것은 인터넷에 올라와 있는 사진이니 지울 수 없을거에요.
        • 이 부분은 딱히 문제가 되지 않을까요??
        • 그냥 DB 에서만 지우면 되니까 전혀 문제가 되지 않을까요?
    • ec2 에 작은 Spring Boot Project 를 하나 띄워서 현재 DB 상에 있는 image url 을 모두 파일로 저장하고, S3 에 올리는 방법도 있을 것 같아요 (기존 데이터를 S3 에 이관하기 위해서)
  • 이미지 삭제.. 전에 많이 이야기 나눴지만 막상 S3 와 함께 구현해보려 하니까 쉽지 않아요

    • 현재는 핀을 복사하는 기능이 존재해요
    • 그렇기 때문에 Image URL 과 같은 정보는 그대로 복사가 되죠.
    • 여기서 발생하는 문제는 실제로 S3 의 이미지를 지울 때 발생해요.
    • 어떤 한 유저가 Image 지울 때 같이 S3 의 이미지도 지우면 동일한 Image URL 을 가지고 있던 핀들은 모두 이미지를 조회할 수 없게 되요.
    • 간단하게 이 문제를 해결할 방법을 생각해봤는데, PinImage Entity 에서 imageURL 을 unique 하게 만들어, 동일한 URL 이라면 하나로 묶어주는거에요.
    • 위 방법을 채택하게 되면 이미지를 추가할 때의 로직이 현재와 조금 달라지겠지만, 어떤 User 가 해당 image 를 삭제했을 때, 이제 이 image url 이 DB 상에 하나도 존재하지 않는지 확인하고 S3 에서 제거할 수 있어요.
    • 근데 여기서 문제가 발생하는데, 근데 또 기본 이미지는 어떻게 하죠? 허허허허... 미치겠네요
  • 아직 Rest Docs 를 해결하지 못했더연 도이 말씀대로 notion 에다가 일단 명세 남겨놓고 해결해나가겠습니다. 똥송해연..

스크린샷

📎 관련 이슈

closed #386

레퍼런스

https://blog.pium.life/aws-s3-apply/

@kpeel5839 kpeel5839 added BE 백엔드 관련 이슈 우선순위 : 상 feat 새로운 기능 개발 labels Sep 15, 2023
@kpeel5839 kpeel5839 added this to the 5차 데모데이 milestone Sep 15, 2023
@kpeel5839 kpeel5839 self-assigned this Sep 15, 2023
@github-actions
Copy link

github-actions bot commented Sep 15, 2023

Unit Test Results

  62 files    62 suites   13s ⏱️
283 tests 283 ✔️ 0 💤 0
294 runs  294 ✔️ 0 💤 0

Results for commit 7f769b1.

♻️ This comment has been updated with latest results.

Copy link
Collaborator

@junpakPark junpakPark left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩷

@kpeel5839
Copy link
Collaborator Author

kpeel5839 commented Sep 16, 2023

@kpeel5839 kpeel5839 closed this Sep 16, 2023
@kpeel5839 kpeel5839 deleted the feat/#386-images branch September 17, 2023 10:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
BE 백엔드 관련 이슈 feat 새로운 기능 개발 우선순위 : 상
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

2 participants