Wecode 2차 프로젝트에서 이미지 파일을 등록하고 AWS S3에 업로드하여 저장하는 방식을 사용한다. Django Project에 필요한 Static, Media File을 AWS S3라는 별도 저장소에서 관리하는 방법을 알아보자.
미디어, 정적파일을 공유하고 관리할 수 있도록 AWS S3 설정을 마치고 버킷을 만든 후에 Django Setting을 시작하자.
pip install boto3
- S3를 사용하기 위한 Module
pip install django-storages
- 다양한 저장소를 사용하기 위한 Module
INSTALLED_APPS
에 storages
앱도 추가해준다.이번 Project에서는 두 개의 View에서 Image 파일만 업로드하고 한 개의 Bucket만 사용하지만, 일반적으로 다수의 bucket을 사용하며 파일을 여러번 업로드 할 수 있으므로 효율성을 위해 Class를 작성해서 사용했다.
Base Directory에 storage.py
를 생성해서 Class를 만들어보자.
__init__
생성자에서 Project에서 사용하는 storage인 s3
와 Access Key를 사용해 S3 Client를 설정한다. upload()
함수를 생성해 file
, file_name
(bucket에서의 파일경로), bucket_name
을 변수로 사용해서 지정한 경로에 업로드한다.delete()
함수를 생성해 S3에 저장되어 있는 파일을 삭제한다.Form Data로 파일을 받고 S3Client Class를 활용해서 AWS S3에 파일을 업로드하고 DB에는 파일의 경로를 저장해주자.
작성한 리뷰를 DB에 저장하고, 요청받은 파일은 S3에 업로드하는 ReviewView
파일 이름의 중복을 방지하기 위해uuid
를 사용했다.
POSTMAN으로 Intergration Test
S3 Bucket에 업로드된 파일과 동시에 DB에 저장된 파일 경로
파일을 업로드하는 두 View에서 같은 방식으로 코드를 작성해서 S3에 업로드했는데, 멘토이신 경훈님의 조언으로 Class를 작성해봤다. Python Class 작성은 생소하기도 하고 Django를 사용하면서 이미 만들어져 있는 함수에만 익숙해져서 생각보다 껄끄러웠다.
처음엔 단순히 __init__
과 upload
만 작성했는데, 조금 아쉬워서 refactoring하려고 이것저것 만져보고 테스트하다가 DB에 저장되는 파일경로와 실제 S3에 저장되는 파일경로가 다른다는 것을 깨달았다. 알고보니 uuid
를 S3Client
밖과 안에서 동시에 사용해서 그런것이었다.. 위코드에서 나오기 5분전에 알게되었는데, 지금이라도 알아서 다행이라고 생각한다.
그렇게 치명적인 오류도 수정하고, 하는 김에 S3의 파일 삭제하는 방법도 찾아서 S3Client Class에 포함시켜봤다. 다음에 프로젝트를 하는 기회가 온다면 Class를 작성해서 작업효율을 높이는 법에 대해 고민해봐야겠다.