파이썬

MVT - Models 내용

mcdn 2020. 9. 19. 17:09
반응형

자 이제 세부적인 내용을 알아보자.

우선 모델이란 사용될 데이터에 대한 정의를 담고 있는 장고의 클래스다. 

장고는 ORM기법을 사용하여 애플리케이션에서 사용할 데이터 베이스를 클래스로 매핑하여 코딩할 수 있다. 즉 하나의 모델 클래스는 하나의 테이블에 매핑되고 모델 클래스의 속성은 테이블의 컬럼에 매핑된다.

더보기
더보기

이때 ORM이란?

ORM(Object - Relational Mapping)은 객체와 관계형 데이터베이스를 연결해주는 역할을 한다. 기존에 사용자가 직접 SQL 언어를 사용해 데이터를 요청했던거와 달리 ORM 덕분에 데이터베이스 대신 객체(클래스)를 이용해 데이터를 처리할 수 있게 되었다. ORM은 자동으로 적절한 SQL 구문이나 데이터베이스 API를 호출해서 처리해주기 때문. 

더보기
더보기

이때 API란?

www.data.go.kr/ 의 사진은 오픈 API의 예이다. 국가에서는 데이터를 카테고리로 정리한 조회서비스를 제공하고 있다. 이 API를 사용하게 되면 개발자가 만든 앱/프로그램에서도 해당 프로그램이 제공하는 기능을 끌어다가 사용할 수 있다. 결국 이 두 프로그램 사이에서 중간 매개체 역할을 하는 것이 바로 API이다. 

blog.wishket.com/api%EB%9E%80-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85-%EA%B7%B8%EB%A6%B0%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8/ API를 쉽게 비유해준 내용이 있길래 가져와 봤다.

"API를 본격적으로 알아보기 전에, 비유를 들어 쉽게 설명을 도와드리겠습니다. 여러분이 멋진 레스토랑에 있다고 가정해봅시다. 점원이 가져다준 메뉴판을 보면서 먹음직스러운 스테이크를 고르면, 점원이 주문을 받아 요리사에 요청을 할 텐데요. 그러면 요리사는 정성껏 스테이크를 만들어 점원에게 주고, 여러분은 점원이 가져다준 맛있는 음식을 먹을 수 있게 됩니다.

여기서 점원의 역할을 한 번 살펴보겠습니다. 점원은 손님에게 메뉴를 알려주고, 주방에 주문받은 요리를 요청합니다. 그다음 주방에서 완성된 요리를 손님께 다시 전달하지요. API는 점원과 같은 역할을 합니다.
API는 손님(프로그램)이 주문할 수 있게 메뉴(명령 목록)를 정리하고, 주문(명령)을 받으면 요리사(응용프로그램)와 상호작용하여 요청된 메뉴(명령에 대한 값)를 전달합니다.
쉽게 말해, API는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체로 볼 수 있습니다."

https://www.data.go.kr/

 

 

장고의 ORM 기법에 대한 이해를 돕기 위해 Person이라는 테이블 즉 장고의 Person 모델 클래스를 정의해보겠다. 

models.py 파일에 정의. 

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    

이 Person 모델은 다음과 같은 데이터베이스 테이블을 생성한다. 장고 내부적으로 SQL 명령을 사용했기 때문

CREATE TABLE myapp_person (
	"id" serial NOT NULL PRIMARY KEY, 
    "first_name" varchar(30) NOT NULL, 
    "last_name" varchar(30) NOT NULL,
);

 

테이블 및 칼럼을 자동적으로 생성하기 위해서는 규칙을 따라야 한다. 

1. 테이블명(first_name 등)은 애플리케이션명과 모델 클래스명을 밑줄로 연결하고 모두 소문자로 표시한다. 원한다면 다른 이름으로 직접 지정

2. Primary Key는 Person클래스에서 정의하지 않아도 장고에서 자동으로 부여한다. 개발자가 직접 지정할 수 있다. 

 

4.2 장고 파이썬 쉘로 데이터 조작하기에서 데이터 조작을 실습하면 입력된 데이터를 확인 및 변경할 수 있는 기능도 해볼 수 있다. 

 

 

다음은 URLconf 파트

Urlconf 예시는 

from django.urls import path

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>', views.article_detail),
]

지금은 views라는 클래스가 없어서 special_case_2003과 같은 함수가 없는 상태지만 만약 있다면 이렇게 view와 연동해서 처리하게 된다. 

 

이와 같이 URL을 매핑하는 방식과 처리하는 함수인 뷰를 별도로 정의하면 많은 유연성을 제공하게 된다. 

 

장고에서 URL을 분석하는 순서는 다음과 같다. 

1. setting.py 파일의 ROOT_URLCONF 항목을 읽어 최상위 URLconf(urls.py)의 위치를 알아낸다. 

2. URLconf를 로딩하여 urlpatterns 변수에 지정되어 있는 URL 리스트를 검사한다. 

3. 위에서부터 순서대로 URL리스트의 내용을 검사하면서 URL 패턴이 매치되면 검사를 종료한다. 

4. 매치된 URL의 뷰를 호출한다. 여기서 뷰는 함수 또는 클래스의 메소드다. 호출 시 HTTPRequest 객체와 매칭할때 추출했던 단어들을 뷰에 인자로 넘겨준다. 

5. 리스트를 끝까지 검색했는데도 매칭에 실패하면 에러를 처리하는 뷰를 호출한다. 

 

 

 

 

URL 패턴에 정규표현식을 사용하면 더 복잡한 URL을 표현할 수 있다. 

from django.urls import path, re_path

from . import views

urlpatterns = [
    path('articles/2003', views.special_case_2003), 
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archieve), 
    re_path(r'^articles/(?P<year>[0-9]{4}/(?P<month>[0-9]{2}/$', views.month_archieve), 
    re_path(r'^articles/(?P<year>[0-9]{4}/(?P<month>[0-9]{2}/(?P<slug>[\w-]+/$', views.article_detail),
]

2020/09/13 - [파이썬] - 정규표현식에 사용되는 문자의 의미.

 

정규표현식에 사용되는 문자의 의미.

URL 패턴에 정규표현식을 사용하면 더 복잡한 URL을 표현할 수 있다. from django.urls import path, re_path from . import views urlpatterns = [ path('articles/2003', views.special_case_2003), re_path(r'..

so-es-immer.tistory.com

 

 

반응형