[KT AIVLE 4기] Django - 뷰와 모델

장고는 풀스택 웹프레임워크이며, MVT 디자인 패턴으로 Web App을 개발하도록 강제된다.

14주차에 박두진 강사님의 “웹프로그래밍” 수업에서 Flask를 사용해서 웹서버를 만들었는데,

16주차 오정임 강사님의 “장고 활용 웹 개발” 수업에서는 장고를 사용해서 웹서버를 만들었다.


🧩장고는 풀스택 웹프레임워크이다.

클라이언트와 서버를 http 프로토콜로 연결하여 요청과 처리를 주고 받는 것을 개발하는 것을 웹프로그래밍이라고 한다.

웹프로그래밍은 프론트엔드와 백엔드로 나눌 수 있는데 전 스택의 프레임워크가 장고이다.

프레임워크와 라이브러리 비교

프레임워크란 라이브러리와 비교했을 때, 실행흐름을 유저 코드가 제어하는 것이 아닌 프레임워크가 제어한다는 점에서 코드의 특정 디자인 패턴이 강제된다.

장고는 MVT (model, view, template) 디자인 패턴으로 웹애플리케이션을 만들어야 한다.

웹애플리케이션

장고에서는 웹애플리케이션을 project 라고 한다.

즉 장고 프로젝트는 “웹 사이트” 를 의미하며,

웹 사이트에는 사용자의 서비스를 처리하는 여러 기능을 제공하는데 이를 “앱” 이라고 한다.

프로젝트를 만들고, 앱을 만든다.

아래 명령어로 앱을 만들면, 각 앱에 models, views, urls 등의 코드가 자동 생성된다.

django-admin startproject <프로젝트 이름>
python manage.py startapp <앱 이름>
python manage.py runserver

( manage.py 는 장고 프로젝트를 실행시켜주는 커맨드 유틸리티이다.)

python manage.py shell
python manage.py runserver


🧩실습 - 장고 프로젝트 환경변수 설정

"""settings.py"""

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

# client에 요청이 들어왔을 때 제일 먼저 찾아가는 곳
ROOT_URLCONF = "mysite.urls" 

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        # "NAME": BASE_DIR / "chinook.db", # 기존에 사용하던 chinook.db를 연동
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

settings.py은 manage.py의 DJANGO_SETTINGS_MODULE 환경변수로 설정하고,

settings.py에서 ROOT_URLCONF, DATABASES의 ENGINE을 설정해야 한다.

추가로, 서비스할 앱을 INSTALLED_APPS 리스트에 추가해야 한다.


🧩실습 - View 함수 만들고, urls에 등록하기

View 함수는 HttpRequest 객체가 첫번째 인자로 무조건 받아야 함.

HttpRequest를 return 해야한다.

이때, 서비스 처리에 DB를 사용해야 한다면 Model 객체를 사용한다.

"""/blog/views.py 코드"""

from django.http import HttpResponse  # Response의 status code 200으로 지정
from django.shortcuts import get_object_or_404
from .models import *

# 전체 목록 조회 서비스
def list(request):
    # 서비스 처리
    post_all = Post.objects.all()  # select * from post
    return HttpResponse(post_all)

# 상세 보기 (get) 
# status code 404 예외처리 (87p)
def detail(request, id):
    # post = Post.objects.get(id=id)  # 없으면 프로그램 강제 종료됨
    post = get_object_or_404(Post, id=id)  # 없으면 404 예외처리
    return HttpResponse(post.title)

Path 변수

url의 path 변수를 서비스 처리시에 사용하고자 할 때, url에 view를 등록할 때 아래와 같이 해야한다.

"""/blog/urls.py 코드"""

from django.urls import path
from . import views

urlpatterns = [
    path('', views.list),   # 웹브라우저에서 http://localhost:8000/blog/ 요청할 때
    path('<int:id>/', views.detail), 
    path('test1/', views.test1),
]

🧩실습 - Models 객체 만들고, Migrate해서 DB에 적용하기

Model은 DB와 Form으로 만들 수 있다.

Form - Model - DB (table)

1. 기존의 DB를 Model로

해당 DB를 장고 프로젝트 폴더에 넣고 아래와 같은 명령어 실행

python manage.py inspectdb > music/models.py

장고 쉘 로 아래와 같이 데이터를 CRUD 할 수 있다.


2. 직접 Model 클래스 만들기

해당 앱의 models.py에 Models.Model을 상속받은 클래스를 정의한다.

모델 클래스는 : DB의 테이블

모델 인스턴스는 : DB의 row

(1) 모델 관계 설정하기

모델 관계를 사용자 정의명을 이용해서 조회할 수 있다.

모델 관계 인스턴스 추출을 위한 명령어
1:N 관계 1측 인스턴스.모델명 소문자_set
1:1 관계 1측 인스턴스.모델명 소문자
N:M 관계 인스턴스.핃드명

N:M 관계에서, 관계필드가 설정되지 않은 모델의 인스턴스에서 조회하고 싶을 때는 인스턴스.모델명 소문자_set   1:N관계 쓰는 것 처럼 사용한다.

또한, 모델 클래스에서 관계 필드를 설정할 때 related_name = 'comments' 를 설정하면 p.comment_set 이 아닌 p.comments로 사용한다.

"""/blog/models.py 코드"""

from django.db import models

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=250)
    body = models.TextField()
    
    # (디폴트) 앱명_모델명 소문자
    
    def __str__(self):
        return self.title

# 모델 관계 설정
class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE)  # Post 모델과 1:N 관계 설정
    author = models.CharField(max_length=20)
    message = models.TextField()
    created = models.DateField(auto_now_add=True)  # 최초 저장 시점의 시간 저장
    updated = models.DateTimeField(auto_now=True)  # 객체 저장 시점의 시간 저장


문제

Post의 제목(title)에 ‘오로라’가 포함된 글만 추출하고,

추출한 글의 댓글(comment) (1:N 관계) 들과 태그(tag) (N:M 관계) 들을 출력하시오.

In [59]: qs = Post.objects.filter(title__contains='오로라')
In [60]: for post in qs:
    ...:     for comm in post.comment_set.all():
    ...:         print(comm.message)
    ...:     print()
    ...:     for tag in post.tag.all():
    ...:         print(tag)
    ...:
아이슬란드에서 언제 어디에서 오로라를 볼 수 있을까요? 레이캬비크 어디에서 가장 잘 볼 수 있지요? 오로라를 보려면 아이슬란드에 얼마나 오래 머물러야 할까요?

오로라
겨울

소감

14주차 웹프로그래밍 강의에서는 AWS EC2와 Nginx로 서버를 운영하고 Flask로 웹서비스를 배치했는데, 오늘 장고 강의에서는 장고 프레임워크를 시용해서 웹서버를 운영하고 배치하는 것을 간단히 하는 실습을 해보아서 흥미가 있었다.

오정임 강사님께서 처음 시작 부분에 장고는 풀스택 웹프레임워크라고 하면서 Flask와의 차이를 짚어주셨다. 그래서, 오늘 수업을 복습할 때 14주차 강의를 한 번 더 복습하면서 클라이언트-서버의 전체적인 흐름을 다시 잡으려고 했다.

Categories:

Updated:

Leave a comment