웹 애플리케이션 개발에서 파일 저장은 중요한 요소입니다. 로컬 서버에 파일을 저장하는 전통적인 방법은 한계가 있을 수 있으며, AWS S3와 같은 클라우드 스토리지를 사용하면 이러한 문제를 해결할 수 있습니다. 본 문서에서는 Django를 사용하여 AWS S3와 연동하는 방법을 단계별로 안내합니다.
1. AWS S3 개요
AWS S3(Amazon Simple Storage Service)는 안전하고 확장 가능한 객체 스토리지 서비스입니다. S3는 데이터를 저장하고 검색하는 데 최적화된 서비스로, 웹사이트 호스팅, 백업, 대용량 데이터 저장 및 복원 등 다양한 용도로 사용됩니다. AWS S3를 사용함으로써 사용자는 데이터의 내구성과 가용성을 높일 수 있습니다.
1.1 AWS S3의 주요 특징
- 내구성: AWS S3는 99.999999999%의 내구성을 제공하여, 데이터 손실 염려가 적습니다.
- 가용성: S3는 높은 가용성을 제공하여 언제 어디서든 데이터를 접근할 수 있습니다.
- 보안: IAM을 통해 역할 기반 접근 제어를 구현할 수 있습니다.
- 비용 효율성: 사용한 만큼만 비용을 지불하며, 데이터 저장 및 전송 비용이 유연하게 관리됩니다.
2. Django 프로젝트 설정
이제 Django 프로젝트를 설정하고, AWS S3와 연동할 준비를 하겠습니다.
2.1 Django 프로젝트 생성
django-admin startproject myproject
2.2 의존성 설치
AWS SDK와 Django의 S3 연동을 위해 다음 패키지를 설치해야 합니다.
pip install boto3 django-storages
2.3 Django 설정 수정
settings.py 파일에 AWS S3 설정을 추가합니다.
import os
# AWS S3 설정
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_REGION_NAME = 'your-region' # 예: 'us-east-1'
# 정적 파일 및 미디어 파일 설정
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3.S3StaticStorage'
3. AWS IAM 역할 설정
AWS S3에 접근하기 위해서는 IAM을 통해 적절한 권한을 가진 사용자 또는 역할을 설정해야 합니다.
3.1 IAM 사용자 생성
- AWS 관리 콘솔에 로그인합니다.
- IAM 대시보드로 이동 후 ‘사용자’를 선택하고 ‘사용자 추가’ 버튼을 클릭합니다.
- 사용자 이름을 입력하고, AWS Management Console을 선택합니다.
3.2 권한 부여
- ‘권한 단계’에서 ‘정책 직접 연결’을 선택합니다.
- ‘AmazonS3FullAccess’ 정책을 선택하여 모든 S3 리소스에 대한 접근 권한을 부여합니다.
- 마지막으로 ‘사용자 만들기’를 클릭하여 사용자를 생성합니다.
3.3 AWS Access Key 확보
생성된 사용자의 Access Key ID와 Secret Access Key를 복사하여 .env 파일이나 환경 변수에 저장합니다.
4. 파일 업로드 기능 구현
Django에서 파일 업로드 기능을 구현합니다. 사용자가 파일을 업로드하면 S3에 저장되도록 합니다.
4.1 모델 생성
from django.db import models
class Document(models.Model):
title = models.CharField(max_length=100)
file = models.FileField(upload_to='documents/')
def __str__(self):
return self.title
4.2 관리 폼 생성
from django import forms
from .models import Document
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ('title', 'file')
4.3 뷰 생성
from django.shortcuts import render, redirect
from .forms import DocumentForm
def upload_file(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('upload_success')
else:
form = DocumentForm()
return render(request, 'upload.html', {'form': form})
4.4 URL 설정
from django.urls import path
from . import views
urlpatterns = [
path('upload/', views.upload_file, name='upload_file'),
path('upload_success/', TemplateView.as_view(template_name='upload_success.html'), name='upload_success'),
]
4.5 업로드 템플릿 생성
파일 업로드
파일 업로드
5. 파일 보기 및 삭제 기능
업로드된 파일을 보여주고 삭제할 수 있는 기능을 구현합니다.
5.1 파일 리스트 뷰
def file_list(request):
documents = Document.objects.all()
return render(request, 'file_list.html', {'documents': documents})
5.2 삭제 기능 구현
def delete_file(request, pk):
document = Document.objects.get(pk=pk)
document.delete()
return redirect('file_list')
5.3 URL 등록
urlpatterns += [
path('files/', views.file_list, name='file_list'),
path('files/delete//', views.delete_file, name='delete_file'),
]
5.4 파일 리스트 템플릿
파일 리스트
업로드된 파일 목록
{% for document in documents %}
-
{{ document.title }}
삭제
{% endfor %}
6. 마무리 및 추가 고려 사항
이제 Django 애플리케이션에서 AWS S3에 파일을 업로드하고 관리하는 방법을 구현했습니다. 다음은 고려해야 할 몇 가지 추가 사항입니다.
6.1 보안 고려사항
공개적으로 데이터를 저장하는 경우, S3 버킷의 퍼미션을 철저히 관리해야 합니다. 파일에 대한 액세스 권한을 설정하고, 불필요한 권한을 부여하지 않도록 주의해야 합니다.
6.2 비용 관리
AWS S3는 사용량에 따라 요금이 청구되므로, 비용을 관리하기 위해 데이터 사용량을 주기적으로 모니터링해야 합니다.
6.3 파일 형식 제한
특정 파일 형식만 업로드할 수 있도록 제한하려면 Django 폼에서 검증 로직을 추가하는 것이 좋습니다.
결론
Django를 AWS S3와 연동함으로써 파일 저장 및 관리를 보다 효율적으로 수행할 수 있습니다. 이 강좌를 통해 클라우드 스토리지의 장점을 이해하고, 실무에 적용할 수 있는 기반 지식을 쌓으셨기를 바랍니다.