디자인 패턴
- 만약 하나의 스크립트에 서버에서 처리해야하는 로직과 프론트로 전달되어야 하는 HTML 코드를 함께 작성하게 되면, 프론트만 수정해야 할 때도 로직이 들어있는 스크립트를 열어보아야 하고 잘못하면 로직 코드에 문제가 발생하게 된다.
- 따라서 이러한 문제들을 해결하기 위해 화면 출력을 위한 HTML 코드를 별도의 파일로 분리하고, 서버쪽 코드는 다시 DB 구조를 위한 파일과 기능을 위한 파일을 분리하는 디자인 패턴을 사용하기 시작했다.
- 웹 프로그래밍에서 자주 사용되는 디자인 패턴은 MVC로, Model View Controller의 약자이다.
MTV 패턴
- MTV는 Model Template View의 약자로 각각의 기능은 아래와 같다.
Model | DB의 구조를 결정하며, 테이블의 이름과 각 칼럼의 이름, 타입 등을 설계한다. |
Template | 사용자에게 보여지는 UI 부분으로, HTML 코드 등 실질적으로 클라이언트에게 보여질 부분에 해당된다. |
View | 기능, 로직 부분으로, 넘겨받을 데이터를 어떻게 해석하고 가공할지, 처리된 결과를 어떻게 클라이언트에게 돌려줄지 결정하는 부분에 해당된다. |
- MVC와 배교했을 때 Model은 Model과, View는 Template와, Controller는 View와 수행하는 역할이 동일하다.
- MTV 패턴은 장고 전체에서 사용되지만 특히 앱 안에서 철저하게 분리해 사용된다.
MTV 패턴 적용
앱 생성
python manage.py startapp 앱이름
- 위의 명령어로 앱을 생성하면 아래와 같이 MTV 패턴이 적용된 파일과 폴더가 만들어진다.
models.py
- 장고에서 DB의 명세를 관리하는 파일
- 모델은 클래스로 작성하며 클래스의 이름은 테이블 이름이 되고, 클래스의 속성들은 컬럼이 된다. (속성의 값이 컬럼의 데이터 타입과 제약사항을 결정)
- 모델을 이용하면 ORM 내부에서 자동으로 데이터베이스에 할 일을 전달하고 결과를 반환해주기 때문에, 개발자는 특정 DB에서 사용되는 SQL 문이나 API 사용법을 몰라도 웹 어플리케이션을 작성하는 것이 가능하다.
admin.py
- 장고의 기본 관리자 페이지를 사용하면 모델이 제대로 만들어졌는지 바로 확인이 가능하다.
- 만약 만든 모델을 관리자 페이지에서 확인하거나 특별한 기능을 추가하고 싶으면 admin.py에 해당 내용을 작성한다.
views.py, urls.py
- 만들 view는 views.py에 작성하고, 어떤 url을 이용해 어떤 view를 동작시킬지에 관한 내용은 urls.py에 작성한다.
- 보통은 프로젝트 urls.py와 각 앱에 해당하는 urls.py들로 구성한다.
앱 등록
- config/settings.py 파일에서 INSTALLED_APPS 변수에 아래와 같이 등록할 앱을 추가한다.
- 간단하게 앱 이름만 적어도 된다.
# Application definition
INSTALLED_APPS = [
'members.apps.MembersConfig'
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
뷰 생성
- 뷰는 views.py에 작성하며, 클래스형 뷰와 함수형 뷰 두가지 방법으로 작성할 수 있다.
함수형 뷰
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello, world!")
URL 연결
- 뷰를 만들고 나면, 앱 폴더 아래에 urls.py을 만들어서 뷰를 호출하기 위한 URL을 뷰와 연결시켜준다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index')
]
- path 함수는 path(route, view, kwargs, name) 형태로 호출된다.
- route: 주소를 의미하며, 경로변수가 존재하면 <>를 써서 나타낸다.
- view: route 주소로 접근했을 때 호출할 뷰
- kwargs: 뷰에 전달할 값들
- name: route의 이름을 의미하며, 이 이름을 가지고 원하는 곳에서 주소를 호출해 출력하거나 사용할 수 있다.
- 해당 urls.py는 앱의 라우팅만 담당하기 때문에, 프로젝트의 메인 urls.py 파일에서 연결해주어야 한다.
config/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('members/', include('앱이름.urls')),
]
- include는 다른 urls.py 파일을 참조할 수 있도록 해주는 함수
모델 만들기
- 모델은 데이터베이스의 구조도로, 데이터베이스에 어떤 테이블을 만들고 어떤 컬럼을 갖게 할 것인지와 해당 컬럼의 제약조건을 결정한다.
- 모델은 보통 models.py에 클래스 형태로 작성한다.
from django.db import models
# Create your models here.
class Team(models.Model):
team_name = models.CharField(max_length=100)
def __str__(self):
return self.team_name
class Member(models.Model):
username = models.CharField(max_length=100)
team = models.ForeignKey(Team)
def __str__(self):
return self.username
- 장고의 모델은 model.Model을 상속받아 만들며, 이 부모 클래스가 실제로 데이터베이스와 ORM을 이용해 동작하는 기능을 제공한다.
- 각 클래스 변수들은 필드 값을 가지며 해당 필드는 자료형과 같다.
- __str__ 메서드느느 관리자 화면이나 shell에서 객체를 출력할 때 나타낸 내용을 결정한다. (toString)
데이터베이스에 적용
python manage.py makemigrations 앱이름
- 위 명령어를 실행하면 앱의 변경사항을 추적해서 데이터베이스에 적용할 내용을 만들어서 migrations 폴더에 기록한다.
- 이후 변경사항을 데이터베이스에 반영하기 위해 아래와 같은 명령어를 입력한다.
python manage.py migrate
뷰 렌더링
from .models import Member
# Create your views here.
def index(request):
member_list = Member.objects.all()
context = {'member_list': member_list}
return render(request, 'members/index.html', context)
- render 메서드는 request와 템플릿 이름, 사전형 객체를 인자로 받는다.
- 사전형 객체는 템플릿에서 사용할 변수들을 말한다.
'Django > Django' 카테고리의 다른 글
장고 개발 환경 세팅 (0) | 2022.03.09 |
---|