'll Hacker

[WIL] 2주차, Django의 MVT 아키텍처 이해 본문

Dev/GDSC

[WIL] 2주차, Django의 MVT 아키텍처 이해

씨이오가 되자 2024. 9. 27. 20:30
728x90

MVT 패턴

Model

- 데이터베이스와의 상호작용을 관리하여, 데이터 구조와 비즈니스 로직을 정의

- Django ORM을 통해 데이터를 쉽게 조회, 저장, 업데이트 가능

View

- 클라이언트의 요청을 받아 필요한 데이터를 처리하고, 응답을 준비

- Model에서 데이터를 가져와 Template에 전달하여 최종 응답을 생성

Template

- 사용자에게 보여질 HTML 파일을 담당하며, View에서 전달된 데이터를 시각적으로 표현

- Django의 템플릿 언어를 사용해 동적으로 데이터를 표시 가능

웹 클라이언트의 요청을 받고, 장고에서 MVT패턴에 따라 처리하는 과정

  1. 클라이언트로부터 요청을 받으면 URLconf를 이용하여 URL을 분석
  2. URL 분석 결과를 통해 해당 URL에 대한 처리를 담당할 뷰를 결정
  3. 뷰는 자신의 로직을 실행하면서 만일 데이터베이스 처리가 필요하면 모델을 통해 처리하고 그 결과를 반환받음
  4. 뷰는 자신의 로직 처리가 끝나면 템플릿을 사용하여 클라이언트 전송할 HTML 파일을 생성
  5. 뷰는 최종 결과로 HTML파일을 클라이언트에게 보내 응답.

URLconf? - URL 정의 

클라이언트로부터 받은 요청에 들어있는 URL이 urls.py 파일에 정의된 URL 패턴과 매칭되는지 분석

URL을 정의하기 위해서 urls.py파일에 URL과 처리함수(뷰)로 매핑하는 파이썬 코드를 작성

이 때, URL/뷰 매핑을 URLconf라고 한다.

 

Django에서 URL 분석 순서

  1. settings.py 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf(urls.py)의 위치를 알아낸다
  2. URLconf를 로딩하여 urlpatterns 변수에 지정되어있는 URL 리스트를 검사
  3. 위에서부터 순서대로 URL 리스트의 내용을 검사하면서 URL 패턴이 매치되면 검사 종료
  4. 매치된 URL의 뷰를 호출. 여기서 뷰는 함수 또는 클래스의 메소드이다.
    호출 시 HttpRequest 객체와 매칭할 때 추출된 단어들을 뷰에 인자로 넘겨줌
  5. URL 리스트 끝까지 검사했는데도 매칭에 실패하면 에러를 처리하는 뷰를 호출 

Path converter

 

URL 패턴의 일부 문자열을 추출

url의 int가 qna_id라는 변수명으로 view에서 활용

 

 

 

 

re_path 정규식을 활용한 매칭 문자열

' - '. ' : ' , 혹은 단어 문자(알파벳 대소문자, 특수기호 등)으로 이루어진 1개 이상의 문자열을 key로서 view에 전달

 

 

표현 정의
. (dot) 모든 문자 하나 (any single character)
^ 문자열의 시작
$ 문자열의 끝
[ ] [ ] 괄호에 있는 문자 하나, 예를들어 [akz]라면 a 또는 k 또는 z
[^ ] [ ] 괄호에 있는 문자 이외의 문자 하나. 만일 [^ab]면 a와 b를 제외한 문자 하나
* 0번 이상의 반복. {0,}와 동일
+ 1번 이상의 반복. {1,} 와 동일
? 0번 또는 1번 반복. {0, 1}와 동일
{n} n번 반복
{m, n} 최소 m 번에서 최대 n번까지 반복
| 예를들어 A|B라면 A 또는 B
[a-z] a에서  z 까지 임의의 문자. 즉 영문 소문자 한개
₩w 영문, 숫자 또는 밑줄(_) 한개. [0-9a-zA-Z]와 동일
₩d 숫자 한개. [0-9]와 동일

 

더 쉽게 말해보자면 

 

빨간색 네모 친 부분을 보면 

URL 패턴을 정의할 때 int:qna_id처럼 꺽쇠를 사용하는 부분이 있는데, 이것을 Path Converter이라고 한다.

이것은 URL 패턴의 일부 문자열을 추출하기 위한 것이고,

type:name 형식으로 사용한다.

 

str /(슬래시)를 제외한 모든 문자열과 매치됨.
타입이 지정되지 않았다면 디폴트로 str 타입을 사용한다
int 0 또는 양의 정수와 매치됨.
매치된 정수는 파이썬의 int 타입으로 변환됨
slug slug 형식의 문자열(ASCII, 숫자, 하이픈, 밑줄로만 구성)과 매치됨
uuid UUID 형식의 문자열과 매치
매치된 문자열은 파이썬의 uuid 타입으로 변환됨
path /(슬래시)를 포함한 모든 문자열과 매치됨
이는 URL 패턴의 일부가 아니라 전체를 추출하고자 할 때 많이 사용.

View - 로직 정의

Django에서 로직은 함수 혹은 클래스의 메소드로 작성되며 클라이언트의 요청을 처리하고 그에 맞는 결과값을 반환

작성한 view는 urls.py를 통해 연결

결과값을 HTML로 변환하기 위하여 템플릿 처리한 후 최종 HTML로 된 응답데이터를 웹 클라이언트로 반환함.

 

+ 장고에서 View는 함수 또는 클래스의 메소드로 작성

 

Request

페이지가 요청되면 장고는 요청에 대한 메타데이터가 포함된 HttpRequest 개체를 생성

그런 다음 장고는 적절한 뷰를 로드하여 HttpRequest를 뷰 함수의 첫 번째 인수로 전달

각 뷰는 HttpResponse 개체를 반환하는 역할을 합니다.

Request 메타데이터
1. Http Method
  - 클라이언트가 서버에 어떤 작업을 요청하는지 명시
    ex) GET, POST, PUT, DELETE, PATCH 등
2. URL
  - 요청의 대상 리소스를 나타내는 URL 경로
3. Headers
  - 요청에 대한 추가 정보를 전달하는 key-value 형태
  - Host, User-Agent, Content-Type 등을 포함
4. Body
  - 요청 본문에 포함된 데이터
  - 주로 POST, PUT, PATCH 메서드에서 사용

 

HttpRequest

장고는 django.http 모듈의 HttpRequest와 HttpResponse 객체를 통해 서버와 클라이언트 간의 통신 지원

  1. HttpRequest.body - Request의 body 객체
  2. HttpRequest.header - Request의 header 객체
  3. HttpRequest.method - Request를 보내는 방법
  4. HttpRequest.GET - GET 파라미터를 담고 있는 딕셔너리 같은 객체
  5. HttpRequest.user - 요청을 보낸 클라이언트(사용자)

HttpResponse / JsonResponse

HttpResponse는 view에서 return함

데이터를 json형태로 return 해야할 때 HttpResponse가 아닌 JsonResponse를 사용

  1. HttpResponse.content - Response의 raw content
  2. HttpResponse.headers - Response의 header 객체 
  3. HttpResponse.cookies - Response에 포함된 쿠키 객체
  4. HttpResponse.status_code - Response를 통해 보낼 status_code(200(정상), 404(오류) 등)

redirect / render

redirect

- 지정된 url로 redirect하며, 첫번째 인자로 반드시 url이 들어가야하며 절대경로나 상대경로 이용가능

render

- Template을 HttpResponse와 엮어 쉽게 반환해주는 함수. contexxt에는 view에서 사용하던 변수를 html 템플릿에서 전달하는 역할.

redirect
render


Templates - 화면 UI 정의

Django가 클라이언트에 반환하는 최종 응답은 HTML이다.

개발자가 응답에 사용할 *.html 파일을 작성하면, 장고를 이를 해석해서 최종 HTML 텍스트 응답을 생성하고 이를 클라이언트에게 보내줌.

템플릿 파일은 *.html 확장자이며, 장고의 템플릿 시스템 문법에 맞게 작성

유의할 점은 템플릿 파일을 적절한 디렉터리에 위치시켜야함.

즉, 장고에서 템플릿 파일을 찾는 방식을 이해하고 있어야됨!!!

 

1. 생성한 앱 디렉토리 아래 templates 디렉터리 생성

2. html 파일 생성

3. render(request,'index.html') 통해 경로 지정

4. 외부에 templates 파일을 만들어 관리하는 경우, setting.py에 template base dir을 명시

 

Templates 언어가 따로 있음

  1. Template 태그
    • Django 템플릿에서 논리적 처리를 위해 사용
    • 주로 반복, 조건문 등 제어구조에서 처리하는데 사용
    • 문법
      • {% for in %} ~ {% endfor %}
      • {% if %} ... {% elif %} ... {% else %) ... {% endif %}
  2. Template 변수
    • 뷰에서 전달된 데이터를 템플릿에서 표현하기 위한 변수
    • 중괄호 두 개 ({{ }})로 감싸서 사용
    • 변수의 값을 HTML에 출력
  3. Template 필터
    • 변수의 값을 변경하거나 포맷을 지정하는데 사용
    • 파이프 기호를 사용하여 변수에 적용
    • date, length, lower 등 자주 사용

과제

사용자가 아이디와 비밀번호를 입력했을때,

ID=guest, PW=guest가 아니면 로그인 실패(400번 상태를 띄워주는) 맞으면 로그인성공(200번 상태를 띄워주는)

로그인 페이지를 구현해보았다.

# myApp/views.py

from django.shortcuts import render
from django.http import JsonResponse
from django.contrib.auth import authenticate

def login_view(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(request, username=username, password=password)

        if username == 'guest' and password == 'guest':
            # 아이디와 비밀번호가 올바르면 로그인 성공 메시지
            return JsonResponse({"message": "로그인 성공"}, status=200)
        else:
            # 잘못된 아이디 또는 비밀번호
            return JsonResponse({"message": "로그인 실패"}, status=400)

    return render(request, 'login.html')

 

# myApp/urls.py를 생성
from django.urls import path
from .views import login_view

urlpatterns = [
    path('login/', login_view, name='login'),
]

 

# myProject/urls.py

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

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

 

# myApp/templates/login.html

<!DOCTYPE html>
<html>
<head>
    <title>로그인</title>
</head>
<body>
    <h2>로그인</h2>
    <form method="post" action="/login/">
        {% csrf_token %}
        <label for="username">아이디:</label>
        <input type="text" id="username" name="username"><br>
        <label for="password">비밀번호:</label>
        <input type="password" id="password" name="password"><br>
        <button type="submit">로그인</button>
    </form>
</body>
</html>

 

python manage.py runserver

 

예로 ID를 1234, pw를 1234를 입력해보았다.

로그인 실패하면 400이 뜬다.

이번에는 ID를 guest, PW를 guest로 올바르게 입력해보았다.

로그인 성공하면 200이 뜬다.

 


참고 :

https://butter-shower.tistory.com/49

 

 

 

 

 

 

'Dev > GDSC' 카테고리의 다른 글

[WIL] 1주차, Django 기본 이해 및 환경설정  (0) 2024.09.20
gdsc ewha 합격 후기  (1) 2024.09.10