🎯 이 글의 목적: 백엔드 프로젝트 개발 전에 쟝고 탑다운 정리 + 웹 서비스에서 백엔드의 역할 짚고 넘어가기
(from MDN web docs)
쟝고의 기본 서비스 아키텍쳐. 웹 애플리케이션 프레임워크에서 주로 차용하는 Model-View-Controller(MVC) 소프트웨어 디자인 패턴의 일종이라고 볼 수 있음.
MVC 패턴은
앱을 구성하는 데이터를 담당하는 Model
유저에게 데이터를 보여주는 방식을 담당하는 View
유저의 입력을 처리하는 로직을 담당하는 Controller
세 가지 구획으로 웹 애플리케이션의 기능을 분류.
그리고 쟝고의 MVT의 경우
Model은 MVC에서와 같은 의미
View가 반대로 MVC의 Controller에 해당하고
MVT의 Template이 MVC의 View에 해당한다고 보면 된다.
쟝고의 Model, View, Template 레이어가 각각의 역할을 하면서 상호작용하는 웹 서비스의 기본적인 작동 과정은 다음과 같다.
🎬 django 웹 서비스 기본 시나리오
- 유저(클라이언트/웹브라우저)가 서버로 HTTP 요청 전송
- 이를 django의 URL dispatcher가 받아 담당 View function으로 routing
- View function은 사전 정의된 로직에 따라 들어온 요청을 처리
- 그 과정에서 Model의 애플리케이션 데이터를 create/read/update/delete
- 요청 처리 결과를 Template에 담아 render
- render된 결과를 HTTP 응답의 형태로 View가 반환. 이를 유저에게 다시 제공.
위의 흐름을 요약하면
데이터(Model)를 로직(View)에 따라 처리해 유저에게 보여준다(Template)
는 것이고, 이러한 웹 서비스의 본질을 세 가지 핵심적인 요소로 나누어 구조적으로 이해하고 관리하겠다는 것이 쟝고의 MVT 패턴이다.
urlpatterns
라는 변수 이름을 가진 리스트를 탐색as_view()
클래스 메소드를 통해 생성된 파이썬 함수 형태의 호출 가능한 객체<form>...</form>
태그가 있음 (HTML Form)Form
객체 안의 딕셔너리 타입 cleaned_data
어트리뷰트를 통해 접근 가능DJANGO_SETTINGS_MODULE
환경변수 세팅까지 함 $ django-admin <command> [options]
$ manage.py <command> [options]
$ python -m django <command> [options]
django-admin makemigrations <app_name>
django-admin migrate <app_name> <migration_name>
django-admin runserver [addrport]
django-admin runserver localhost:8000
django-admin shell --interface {ipython,bpython,python}
django-admin startproject name [directory]
django-admin startapp name [directory]
django-admin createsuperuser
is_staff
속성이 True
인 admin 사이트에 접근할 수 있는 관리자 계정을 만드는 명령DJANGO_SETTINGS_MODULE
환경변수로 어떤 파이썬 모듈을 설정 파일로 사용할지 지정django-admin runserver
명령 시 --settings
옵션을 통해서도 파이썬 모듈 경로 전달 가능INSTALLED_APPS
ALLOWED_HOSTS
AUTH_USER_MODEL
[auth.User](https://docs.djangoproject.com/en/4.0/ref/contrib/auth/#user-model)
django.contrib.auth.models.AbstractUser
를 상속받아 커스텀 User 모델을 만들고, 가장 처음 migration에서 해당 User 모델을 반영하는 것을 권장 → 이후 필요에 따라 모델 수정DEBUG
False
로 꺼서 나가야 함MEDIA_ROOT
FileField
/ImageField
를 통해 저장한 모든 파일은 Media 파일로 취급MEDIA_ROOT
변수 값MEDIA_URL
MEDIA_ROOT
에 있는 Media 파일에 접근할 때 사용할 수 있는 URL{{ MEDIA_URL }}
과 같이 사용 가능STATIC_ROOT
django-admin collectstatic
명령으로 모을 때 사용할 경로STATIC_URL
STATIC_ROOT
에 있는 Static 파일에 접근할 때 사용할 수 있는 URL/admin/
URL로 admin 사이트 접근 가능 from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
pass
💡 이제 django를 활용해서 백엔드를 만들어볼 차례
쟝고를 활용해 무언가 만들어 보기 전에, 먼저 문제를 명확히 해보자.
우선 지금까지 쟝고를 배운 것은 파이썬을 이용한 백엔드 작업을 하기 위해서.
Template 레이어가 있는 쟝고는 프론트엔드까지 한번에 해결할 수 있는 통합 웹 프레임워크지만 주요 사용 목적은 백엔드를 구축하기 위함.
하지만 백엔드만 가지고는 추상적인 구현일 뿐 애플리케이션 관점에서 완결된 작업이 될 수 없음. 일반 유저가 사용할 수 있는 형태로 존재하는 하나의 웹 서비스가 유효한 프로젝트의 단위일 것.
그렇다면 현재의 웹 서비스 패러다임에서 백엔드와 프론트엔드 구분에 대해 생각해보자.
즉, 웹 서비스를 만들어야 하는데 백엔드가 꼭 필요한가?
MVC 패턴을 가지고 생각해봤을 때,
보통의 유저가 사용할 웹 서비스를 만든다고 하면 애플리케이션 관점에서는 오히려 사용자가 상호작용할 인터페이스(View)와 사용자가 원하는 기능을 수행해 줄 로직(Controller)이 만들고자 하는 웹서비스의 필수적인 요소이지 않을까?
그리고 자바스크립트 덕분에 어떤 프론트엔드를 만든다고 해도 로직은 기본적으로 심을 수 있을 것.
따라서 로직 쪽에서 임무의 중복이 있지만 간단한 수준의 경우 이를 프론트엔드에 양보한다고 하면,
Model 레이어의 관리가 주 임무인 백엔드는 웹 서비스에 있어 필수가 아닌 선택이 된다. (심지어 간단한 수준의 데이터 저장은 프론트엔드 사이드에서도 수행이 가능하다)
여기 깃헙 레포에 가면 프론트엔드만으로 완성 가능한 웹 애플리케이션의 예시가 여럿 있다. 간단한 입력을 받아 일련의 로직을 거친 뒤 결과 값을 유저에게 보여주는 서비스.
그래서 백엔드 프로젝트를 진행하고자 한다면 그냥 웹 서비스가 아닌 백엔드가 활약할 수 있는 웹 서비스를 만들어야 하겠다.
그런 서비스는 당연히 Model 레이어가 필수로 있어야 하는, 데이터 활용이 복잡한 서비스일 것이고 아래와 같은 특징이 있을 것 같다.
기업이 서비스할 정도의 규모가 있는 서비스는 대부분 백엔드가 당연히 필요하다. 위의 레포에서도 티어가 올라가 서비스가 복잡해지면 백엔드가 필요한 서비스가 된다.
하지만 시작하는 입장에서 생각해보면 막연하게 들어본 대로 백엔드와 프론트엔드는 웹 서비스에 있어 당연하게 그냥 있어야 하는 거라고 받아들이기 쉬움
역할과 필요성을 먼저 알고 만들기 위해 다소 당연한 얘기를 파고 들어 정리해봤는데
이제 실제로 웹 서비스를 한 번 만들어보자.