ACHO.pk devlog

[Django] MVT/MVC 패턴과 django framework flow 본문

프레임워크/Django

[Django] MVT/MVC 패턴과 django framework flow

Acho 2022. 12. 27. 23:21

가상환경 세팅과 프로젝트 세팅은 내가 이전에 써놓은 거 참고하자..

https://acho.tistory.com/30

 

[멋쟁이 사자처럼 10기-Django] 가상환경 셋팅하고 Django 시작하기

드디어 백엔드에 첫 발을 내딛는 순간이다. 내가 추가적으로 공부할 때나 새로운 프로젝트를 진행할 때 이렇게 기록하는 것이 도움이 된다는 걸 잘 알기 때문에 귀찮더라도 꾸준히 기록하기 위

acho.tistory.com


 

·MVC 패턴

서버 쪽에서 봤을 때, 클라이언트에서 요청이 들어오면 Control가 요청에 대해 판단한다.

데이터베이스 요청이 필요할 경우 Model에 넘기고, Model은 데이터베이스를 거쳐 데이터를 Control에게 넘겨준다. 

Control은 특별한 작업 이후에  View에서 가장 적합한 view를 호출하여 클라이언트에게 응답을 한다. 

 

Control : 프로그램이 실행되는 것을 관리( model과 view의 상호작용 관리)

Model :  데이터베이스와 관련된 기능

View : 클라이언트에게 보여줄 화면 관리

 

model, view, control가 기능별로 분리되어 있어  동시에 각각의 기능을 개발할 수 있으며, 일부 기능이 추가될 경우에도 기존의 구성 요소를 재사용할 수 있어서 코드 재사용성이 향상된다. 유지보수 측면에서 효율적이다. 

 

 

·MVT 패턴

서버 쪽에서 봤을 때, 클라이언트에서 요청이 들어오면 View가 요청에 대해 판단한다.

데이터베이스와 관련된 작업일 경우 Model에 넘기고, Model은 데이터베이스를 거쳐 데이터를 View에게 넘겨준다.

View는 데이터베이스에서 가져온 데이터를 처리한 후에 Template에 통신하여 클라이언트에게 응답하기 위한 가장 적합한 template를 골라 응답한다.

 

mvc 개념을 그대로 받아들였지만 용어는 다르게 사용했다. View를 Template, Control를 View라고 표현하며 mvt 패턴이라고 한다.


·Django framework flow

1. 클라이언트(브라우저, 웹 등)가 url 요청을 한다. (request)

 

2. django가 urlconf 방식을 이용해서 어떤 view에 어떤 함수나 메서드가 실행될지 결정한다.

urls.py 안에 url과 실제 django framework이 실행되어야하는 함수나 메서드가 매핑되어 있다.

 

3. View에서는 실제로 실행되어야 할 함수나 메서드가 실행된다. 실행됨에 있어서 데이터베이스가 필요하다. 

 

4. Model로 넘긴 후에 데이터베이스에 접근해서 필요한 데이터를 가공하고, 다시 Model로 넘긴 후 View에 가공한 데이터를 넘긴다.

 

5. View에서는 그 데이터를 가지고 추가적인 작업을 한 후에 Template에 적합한 html을 요구한다.

 

6. Template에서는 클라이언트에게 알맞은 html을 선택해서 클라이언트에게 response 해준다.

·URLconf (urls.py)

urlpatterns라는 컨테이너 자료형이 존재한다.

"클라이언트 요청 URL이 들어오면 view에 해당 함수가 실행된다" 로 봐도 된다. 

 

클라이언트로부터 요청을 받으면 django는 먼저 요청에 들어 있는 url를 분석한다.

urls.py에 정의된 url 패턴과 매칭이 되는지 분석한다.

url을 정의하기 위해서는 urls.py파일에 url과 처리 함수를 매핑하는 코드를 작성하면 된다. 여기서 처리함수는 view라고 부른다. 이러한 url/view 매핑을 urlconf라고 한다.

url 패턴을 정의할 때 꺽쇠(<>)을 사용하는 부분이 있다. 이는 url 패턴의 일부 문자열을 추출하기 위한 것이 typename 형식으로 사용한다.

path("head/<int:num>/", views.head_num)

요청 url <> 부분이 정수이면 매치되고, 정수가 아니면 매치되지 않는다. 매치될 경우(ex = "/head/3/")에는 문자열 3을 인자명 num에 할당한다. 즉, 요청 url이 "/head/3/"이면 view함수를 views.head_num(request, num=3)처럼 호출한다.

<>부분을 django에서는 path converter라고 부르는데 여기에 사용되는 데이터 타입은 str, int, slug, uuid, path가 있으며, 추가로 타입을 등록할 수 있다. 디폴트는 str타입이며, str은 /(슬래시)를 제외한 모든 문자열과 매치된다.

urlpatterns = [
	# 클라이언트 요청 URL, view(함수 또는 메서드)
	path('pants/', include("pants.urls")
	# 'pants/'로 시작하는 url은 "pants.url"에서 다룬다.
]


app_name = 'pants'
urlpatterns = [ 
	path('price/', views.pants_price, name="pantsPrice"),
	path('<int:size>/', views.pants_size)
	# pants_size 함수가 실행될 때 함수의 매개변수로 <int:size>가 전달된다.
]

 

 

·View (views.py)

클라이언트의 요청에 따른 애플리케이션 실행 결과를 Template, 에러 메시지 등을 이용해서 클라이언트한테 response한다.

render 는 template을 불러오고, redirect 는 URL로 이동한다. URL 이동은 해당 URL에 맞는 views가 다시 실행된다는 뜻이다.

def pants_price(request):
	# DB 등을 이용한 프로그램 실행 결과
	return HTTPResponse()
    
def pants_size(request, size):
	# DB 등을 이용한 프로그램 실행 결과
	return redirect('원하는 url') or return render(request, 'html파일명.html')

 

 

·Model (models.py)

Class를 이용한 맵핑을 통해 django에서는 데이터베이스에 테이블이 생성된다. 

ORM(Object Relational Mapping) 사용

애플리케이션이름_클래스명 소문자 → 테이블 생성됐을 때 테이블 이름

# Pants : 데이터베이스 이름
class Pants(models.Model):
	p_price = models.IntegerField(default = 0)
	p_size = models.CharField(max_length = 10)
	# p_price, p_size : 필드명
python manage.py migrate
# 초기화, 변경사항 반영
python manage.py makemigrations
# 변경사항 파일을 자동으로 생성

 

 

 

·Template (*.html)

사용자가 임의로 templates 폴더를 만들어서 그 폴더에 html 파일을 넣어 관리한다.

django가 만들어준 디렉토리가 아닌 사용자가 임의로 만들었기 때문에 django가 이 template 파일들을 찾을 수 있도록 알려줄 필요가 있다. 

    · settings.py

애플리케이션을 추가할 때마다 등록을 해줘야한다. 그래야 애플리케이션이 제대로 동작하고 templates 폴더도 실행이 가능하다.

# True : 개발모드 Flase : 운영모드 -> 고유 IP 주소  
DEBUG = True

ALLOWED_HOSTS = [] # 여기에 고유 IP주소 명시

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    # 내가 만든 애플리케이션 등록
    '____'
]

 

 

 

'프레임워크 > Django' 카테고리의 다른 글

[Django] 데이터베이스(ORM) + 레코드(데이터) 다루기  (0) 2022.12.28
[Django] HTTP  (0) 2022.12.27
Comments