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

[feat] S3 이미지 업로드 및 삭제 기능 구현 #40

Merged
merged 19 commits into from
Jan 8, 2024

Conversation

meena2003
Copy link
Member

🎯 목적

  • 새 기능 (New Feature)

  • 설정 (Setup)

  • 간략한 설명:
    : 클라이언트측에서 S3에 이미지를 업로드하고 url을 반환 받거나, 이미지 url을 통해 S3 이미지를 삭제할 수 있는 기능입니다.


🛠 작성 사항

- 이미지 저장 / 수정 / 삭제 흐름

  • 클라이언트는 한 번에 한 장의 이미지 업로드만 요청하고, 저장된 S3 저장소 URL을 반환받을 수 있습니다.
    • 게시글 등록시 여러 이미지 url을 배열로 한번에 POST 요청합니다.
  • 이미지를 삭제는 한 번에 한 장 가능하며, 서버로부터 받은 S3 URL을 삭제 요청으로 보냅니다.
    • HTTP form-data imageUrl로 삭제할 이미지의 S3 URL을 보냅니다.
  • 한 게시글에 이미지를 수정(추가 등록 또는 삭제)하려면 클라이언트는 이미지 등록, 삭제 API를 요청 개수만큼 호출한 뒤, 완성된 이미지 url 배열을 백엔드 서버로 요청합니다.

해당 기능 사용법

  • 이미지 저장과 삭제 모두 프론트와 직접 소통하기 때문에 다른 백엔드 개발자가 해당 기능을 사용할 상황은 없다고 봅니다.

발생 예외 항목

  1. FileEmptyException : 업로드 요청 파일이 없는 경우
  2. FileMaxSizeExceededException : 파일이 허용 용량을 초과할 경우
  3. FileNotExistsException : 삭제 요청한 파일이 S3에 존재하지 않을 경우
  4. FileUploadFailException : 기타 원인으로 S3 업로드에 실패할 경우

🔗 관련 이슈


💡 특이 사항 및 고민 지점

- 개발용 버킷과 배포용 버킷을 구분했습니다.

Screen Shot 2024-01-08 at 12 57 15 AM

  • 개발시 사용하는 버킷은 tripcometrue-dev-s3-bucket입니다.
  • 배포시 사용하는 버킷은 tripcometrue-s3-bucket입니다.

- 버킷 내부에 디렉토리를 나누지 않았습니다.

  • S3에서 객체(파일)은 고유 키(key)로 식별됩니다. 따라서 굳이 디렉토리를 나누지 않아도 이미지를 식별하는 데 큰 문제가 없고, 직접 S3에 들어가서 이미지를 확인할 상황이 많지 않을 것이라 판단했습니다.

- 파일을 업로드하면 UUID로 고유의 파일명으로 변환시킨 뒤 S3에 저장합니다.

  • 파일 이름이 중복되면 덮어씌여집니다. 따라서 동일한 사진을 중복 저장하기 위해선 고유의 파일명으로 저장해야 합니다.

- 업로드 최대 용량을 5MB로 설정했습니다.

  • 초과하는 이미지는 FileMaxSizeExceededException 예외를 발생시킵니다.

- 멀티파트 파일을 File 객체로 변환하지 않습니다.

  • FIle 객체로 변환한 후 S3에 업로드하는 경우가 있습니다.
  • 하지만 아직 그로 인한 이점을 확인하지 못했기 때문에 클라이언트 측으로 받은 멀티파트 파일을 그대로 S3에 업로드 합니다.
  • 추후 File 객체로 변환시 어떤 이점이 있는지 파악한 뒤에 리팩토링을 진행하겠습니다.

- 조금 더 객체지향적인 설계가 가능할 것 같습니다.

  • 현재 S3에 저장하기 위한 UUID 고유 파일명으로 변환 작업과, 삭제를 위해 파일 이름을 디코딩하는 작업이 서비스 계층에 있습니다.
  • Image 클래스를 만들어 위 작업을 서비스 계층으로부터 분리하고 싶습니다.
  • 추후 리팩토링을 진행하겠습니다.

기타 의견이 있으시면 말씀 부탁드립니다.

meena2003 and others added 15 commits January 6, 2024 01:20
이미지 1장을 받아서 S3에 저장하고 저장된 url을 Dto로 반환하는 기능 구현. 파일 업로드 실패시 예외 처리
클라이언트가 url을 JSON으로 보내면 해당 S3에 위치한 이미지 파일 삭제 기능 구현.
이미지 저장시 UUID로 파일명을 고유값으로 만들어서 동일한 이미지가 덮어씌여지지 않도록 함
단순히 S3RequestDto, S3ResponseDto에서 목적어를 추가함으로써 어떤 Dto인지 분명하게 의미를 전달함
S3DeleteRequestDto 삭제. 컨트롤러에서 삭제 요구 url 데이터를 @RequestBody에서 @RequestParam으로 변경함.
@meena2003 meena2003 self-assigned this Jan 8, 2024
Copy link

github-actions bot commented Jan 8, 2024

Test Results

1 tests  ±0   1 ✅ ±0   0s ⏱️ ±0s
1 suites ±0   0 💤 ±0 
1 files   ±0   0 ❌ ±0 

Results for commit ded5d90. ± Comparison against base commit 73fb55b.

♻️ This comment has been updated with latest results.

@meena2003 meena2003 added enhancement New feature or request feat 기능을 추가합니다. labels Jan 8, 2024
Copy link
Member

@junmo95 junmo95 left a comment

Choose a reason for hiding this comment

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

👍

@liyusang1
Copy link
Contributor

수고하셨습니다! :)

@meena2003 meena2003 requested a review from junmo95 January 8, 2024 12:48
@meena2003 meena2003 closed this Jan 8, 2024
@meena2003 meena2003 reopened this Jan 8, 2024
@@ -4,6 +4,8 @@ spring:
datasource:
driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
url: jdbc:tc:mysql:8:///tripcometrue?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
config:
Copy link
Contributor

Choose a reason for hiding this comment

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

윗줄에 보시면 이미 설정이 되어 있어서 해당 부분 삭제 하시면 될거 같습니다!

@meena2003 meena2003 closed this Jan 8, 2024
@meena2003 meena2003 reopened this Jan 8, 2024
@meena2003 meena2003 merged commit aa5962d into develop Jan 8, 2024
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request feat 기능을 추가합니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants