TIL 48 | AWS S3 & Django

임종성·2021년 8월 25일
1

Django

목록 보기
17/17
post-thumbnail

Wecode 2차 프로젝트에서 이미지 파일을 등록하고 AWS S3에 업로드하여 저장하는 방식을 사용한다. Django Project에 필요한 Static, Media File을 AWS S3라는 별도 저장소에서 관리하는 방법을 알아보자.

Django Setting

미디어, 정적파일을 공유하고 관리할 수 있도록 AWS S3 설정을 마치고 버킷을 만든 후에 Django Setting을 시작하자.

AWS S3, Django Setting 관련 참고자료 1, 참고자료 2

Install Module

pip install boto3 - S3를 사용하기 위한 Module
pip install django-storages - 다양한 저장소를 사용하기 위한 Module

Settings.py

  • AWS로 시작하는 변수들은 모두 AWS S3와 boto3를 사용하기 위한 변수들이다.
  • 주로 Client를 연결해주는 Access Key와 파일이 저장되는 경로들을 설정해준다.
  • INSTALLED_APPSstorages 앱도 추가해준다.

S3 Client

이번 Project에서는 두 개의 View에서 Image 파일만 업로드하고 한 개의 Bucket만 사용하지만, 일반적으로 다수의 bucket을 사용하며 파일을 여러번 업로드 할 수 있으므로 효율성을 위해 Class를 작성해서 사용했다.

S3Client Class

Base Directory에 storage.py를 생성해서 Class를 만들어보자.

  • __init__ 생성자에서 Project에서 사용하는 storage인 s3와 Access Key를 사용해 S3 Client를 설정한다.
  • upload() 함수를 생성해 file, file_name(bucket에서의 파일경로), bucket_name을 변수로 사용해서 지정한 경로에 업로드한다.
  • delete() 함수를 생성해 S3에 저장되어 있는 파일을 삭제한다.

Upload File to AWS S3

Form Data로 파일을 받고 S3Client Class를 활용해서 AWS S3에 파일을 업로드하고 DB에는 파일의 경로를 저장해주자.

작성한 리뷰를 DB에 저장하고, 요청받은 파일은 S3에 업로드하는 ReviewView
파일 이름의 중복을 방지하기 위해 uuid를 사용했다.

POSTMAN으로 Intergration Test

S3 Bucket에 업로드된 파일과 동시에 DB에 저장된 파일 경로


TIL

파일을 업로드하는 두 View에서 같은 방식으로 코드를 작성해서 S3에 업로드했는데, 멘토이신 경훈님의 조언으로 Class를 작성해봤다. Python Class 작성은 생소하기도 하고 Django를 사용하면서 이미 만들어져 있는 함수에만 익숙해져서 생각보다 껄끄러웠다.

처음엔 단순히 __init__upload만 작성했는데, 조금 아쉬워서 refactoring하려고 이것저것 만져보고 테스트하다가 DB에 저장되는 파일경로와 실제 S3에 저장되는 파일경로가 다른다는 것을 깨달았다. 알고보니 uuidS3Client밖과 안에서 동시에 사용해서 그런것이었다.. 위코드에서 나오기 5분전에 알게되었는데, 지금이라도 알아서 다행이라고 생각한다.

그렇게 치명적인 오류도 수정하고, 하는 김에 S3의 파일 삭제하는 방법도 찾아서 S3Client Class에 포함시켜봤다. 다음에 프로젝트를 하는 기회가 온다면 Class를 작성해서 작업효율을 높이는 법에 대해 고민해봐야겠다.

profile
어디를 가든 마음을 다해 가자

0개의 댓글