DJango 서버개발, 파일 업로드 기능 구현하기

Django는 강력하고 유연한 웹 프레임워크로, 다양한 웹 애플리케이션을 쉽게 개발할 수 있게 해줍니다. 본 강좌에서는 Django를 사용하여 파일 업로드 기능을 구현하는 방법을 자세히 설명하겠습니다. 이를 통해 사용자는 웹 애플리케이션에서 파일을 업로드하고 저장할 수 있는 방법을 배우게 될 것입니다. 이 강좌를 진행한 후, 간단한 파일 업로드 기능을 갖춘 웹 애플리케이션을 구현할 수 있을 것입니다.

1. Django 설치 및 프로젝트 시작하기

먼저 Django를 설치하고 새로운 프로젝트를 시작합니다. 다음 명령어를 사용하여 Django를 설치하세요:

pip install django

설치가 완료되면, Django 프로젝트를 생성합니다:

django-admin startproject myproject

생성된 프로젝트 디렉토리로 이동합니다:

cd myproject

2. 새로운 앱 생성하기

파일 업로드 기능을 구현하기 위해 ‘uploads’라는 새로운 앱을 생성합니다:

python manage.py startapp uploads

그런 다음, 생성한 앱을 프로젝트의 설정 파일인 settings.py에 추가합니다. 파일의 INSTALLED_APPS 목록에 'uploads'를 추가합니다:

INSTALLED_APPS = [
    ...
    'uploads',
]

3. 파일 업로드 모델 만들기

다음으로 파일 업로드를 위한 모델을 생성합니다. uploads/models.py 파일을 열고 다음 코드를 추가합니다:

from django.db import models

class Upload(models.Model):
    title = models.CharField(max_length=100)
    file = models.FileField(upload_to='uploads/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

이 모델은 파일 업로드를 위한 데이터베이스 구조를 정의합니다. title 필드는 파일의 제목을 저장하고, file 필드는 실제 파일을 저장합니다. uploaded_at 필드는 파일이 업로드된 시간을 자동으로 기록합니다.

4. 데이터베이스 마이그레이션

모델을 작성한 후, 데이터베이스에 반영하기 위해 마이그레이션을 수행합니다. 다음 명령어를 입력하세요:

python manage.py makemigrations uploads
python manage.py migrate

5. 파일 업로드 폼 만들기

이제 파일 업로드를 위한 폼을 생성하겠습니다. uploads/forms.py 파일을 생성하고 아래 코드를 추가합니다:

from django import forms
from .models import Upload

class UploadForm(forms.ModelForm):
    class Meta:
        model = Upload
        fields = ['title', 'file']

이 폼은 사용자로부터 파일 이름과 파일을 입력받기 위한 것입니다.

6. 뷰 및 URL 설정

다음으로 사용자가 파일을 업로드할 수 있도록 뷰를 설정해야 합니다. uploads/views.py 파일을 열고 아래 코드를 추가합니다:

from django.shortcuts import render, redirect
from .forms import UploadForm

def upload_file(request):
    if request.method == 'POST':
        form = UploadForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('upload_file')
    else:
        form = UploadForm()
    return render(request, 'uploads/upload.html', {'form': form})

여기서는 POST 요청이 있을 경우 폼을 검증하고, 유효할 경우 파일을 저장합니다. 사용자가 파일 업로드 페이지로 돌아갈 수 있도록 리디렉션합니다.

7. URL 설정

뷰 함수에 대한 URL을 설정하려면 uploads/urls.py 파일을 생성하고 아래 코드를 추가합니다:

from django.urls import path
from .views import upload_file

urlpatterns = [
    path('', upload_file, name='upload_file'),
]

이제 프로젝트의 기본 URL과 연결하기 위해 myproject/urls.py 파일을 수정합니다:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('uploads/', include('uploads.urls')),
]

8. 템플릿 만들기

사용자에게 파일 업로드 폼을 보여주기 위해 템플릿을 생성합니다. uploads/templates/uploads/upload.html 파일을 생성하고 아래 코드를 추가합니다:

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>파일 업로드</title>
</head>
<body>
    <h1>파일 업로드</h1>
    <form method="post" enctype="multipart/form-data">
        <{% csrf_token %}>
        <div>
            <label for="title">파일 제목:</label>
            <input type="text" name="title" required>
        </div>
        <div>
            <label for="file">파일 선택:</label>
            <input type="file" name="file" required>
        </div>
        <button type="submit">업로드</button>
    </form>
</body>
</html>

위의 HTML 템플릿은 사용자가 파일 제목과 파일을 선택해 업로드할 수 있는 폼을 제공합니다.

9. 정적 파일 및 미디어 파일 설정

미디어 파일 업로드를 위해 Django 설정 파일인 settings.py를 수정해야 합니다. 다음 항목을 추가하세요:

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

또한, 프로젝트 URL 설정 파일인 myproject/urls.py에 미디어 파일을 제공하기 위한 코드를 추가합니다:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('uploads/', include('uploads.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

10. 서버 실행 및 테스트

모든 설정이 완료되었으니, 이제 서버를 실행해보겠습니다. 다음 명령어로 서버를 실행합니다:

python manage.py runserver

이제 웹 브라우저에서 http://127.0.0.1:8000/uploads/ 주소로 접속하면 파일 업로드 폼이 나타납니다. 파일을 선택하고 제목을 입력한 후 ‘업로드’ 버튼을 클릭하면 파일이 서버에 성공적으로 업로드됩니다.

11. 업로드된 파일 관리

업로드된 파일을 관리할 수 있는 방법도 필요한데, 간단하게 업로드된 파일 목록을 보여주는 페이지를 추가해보겠습니다. uploads/views.py에 업로드된 파일 목록을 볼 수 있는 뷰를 추가합니다:

from .models import Upload

def file_list(request):
    files = Upload.objects.all()
    return render(request, 'uploads/file_list.html', {'files': files})

그리고 URL을 설정하여 파일 목록을 볼 수 있도록 합니다. uploads/urls.py에 다음 코드를 추가합니다:

urlpatterns = [
    path('', upload_file, name='upload_file'),
    path('files/', file_list, name='file_list'),
]

마지막으로, 파일 목록을 보여줄 템플릿을 생성합니다. uploads/templates/uploads/file_list.html 파일을 만들고 다음 코드를 추가합니다:

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>업로드된 파일 목록</title>
</head>
<body>
    <h1>업로드된 파일 목록</h1>
    <ul>
        <{% for file in files %}>
            <li><a href="{{ file.file.url }}">{{ file.title }}</a></li>
        <{% endfor %}>
    </ul>
    <a href="{% url 'upload_file' %}">파일 업로드 페이지로 이동</a>
</body>
</html>

12. 결론

이번 강좌에서는 Django를 사용하여 간단한 파일 업로드 기능을 구현하는 과정을 살펴보았습니다. 파일 업로드 모델, 폼, 뷰, 템플릿, URL 설정 등 다양한 요소를 통해 최종적으로 사용자가 파일을 웹 애플리케이션에 업로드하고 확인할 수 있는 기능을 구축하게 되었습니다.

Django는 강력한 기능을 제공하며, 파일 업로드 외에도 다양한 기능을 쉽게 확장할 수 있습니다. 앞으로 이 강좌에서 배운 내용을 바탕으로 더 복잡한 애플리케이션으로 발전시켜보시길 바랍니다.

감사합니다!