Development Artist

[웹 서비스 A-Z][Django] #9 Design Pattern 본문

Project_Personal

[웹 서비스 A-Z][Django] #9 Design Pattern

JMcunst 2023. 3. 10. 19:25
728x90
반응형

지난 시간에는 Django의 동작 메카니즘에 대해서 살펴보았습니다.

특히 settings.py를 자세히 봤었는데요, 오늘은 Django app을 만들어보고 프로젝트에 적용 및 디자인 패턴에 대해서 알아보도록 하겠습니다.

지난 시간에 settings.py에 ‘INSTALLED_APPS’라는 부분을 보셨을 겁니다.

이곳에는 기본적으로 세팅되는 프레임워크 뿐만 아니라, 직접 앱을 만들어서 세팅해줄 수도 있습니다.

Django는 Project만 만들어서 사용하지 않습니다. 모듈 정도의 개념으로 App이란 것을 만들어서 사용하는데요, 이렇게 개발하면 재사용성을 높이고 유지보수가 원할합니다.

이번에 개발한 포탈에는 다양한 시스템이 들어가는데요, 하나의 시스템을 하나의 앱으로 봐도 좋을 것 같습니다. 가령 Billing 시스템, Quiz 시스템, CSP 모니터링 시스템이 있다면 billing App, quiz App, monitoring App을 만들었습니다.

CLI를 켭니다.

# python manage.py startapp testone
python manage.py startapp [원하는 APP 명]

다음과 같이 ‘test_one’이라는 App이 만들어졌습니다. 해당 Django 프로젝트에서 이 App을 바로 사용할 수 있을까요? 아닙니다. 등록을 해줘야합니다.

testone/apps.py로 가봅니다.

TestoneConfig라는 클래스를 만들고 있으며, name은 ‘testone’으로 주는 것을 볼 수 있습니다.

Django에서 서버를 구동시키면 settings.py가 읽히고, INSTALLED_APPS에 있는 목록들의 apps.py를 참조하여 config를 가져오게 됩니다.

따라서, settings.py의 INSTALLED_APPS에 우리가 만든 testone을 등록해줍시다.

apps.py의 클래스에 name을 지정해주면 name만 써도 됩니다. 만약 name이 지정이 안되어있다면, 주석처리 처럼 full 참조를 적어주어야 합니다.

이렇게 app 등록을 마쳤습니다.

이제 이 앱의 디자인패턴을 보도록 하겠습니다. ‘Django Pattern’ 정도 키워드로 구글링을 해보시면 많이 볼 수 있는 단어가 있습니다. 바로 ‘MVT’ 패턴인데요, 이것이 바로 Django 앱 작성시 고려하는 패턴이 되겠습니다.

MVT 패턴은 Model-View-Template의 약자입니다.

  • 클라이언트에서 Django 서버로 요청을 합니다.
  • URL Conf가 요청을 분석하여 처리에 필요한 View를 할당합니다.
  • View는 데이터 CRUD 관련 처리가 필요하다면 진행합니다.
  • 처리 결과를 Template화 하여 클라이언트에게 던져 줍니다.

이제 디자인패턴을 알았으니 어떻게 실제 코드에 반영되고 있는지 확인해봐야겠죠?

settings.py의 'ROOT_URLCONF' 를 찾아가봅시다. 'test_server.urls' 라고 쓰여져 있는데, test_server/urls.py 를 말하고 있습니다.

# test_server/urls.py
"""test_server URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    <https://docs.djangoproject.com/en/4.1/topics/http/urls/>
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

클라이언트 요청이 오면 가장 먼저 ROOT_URLCONF에 명시된 urls.py가 받게됩니다. 지금은 깡통이라 admin/ 하나만 보입니다. 주석처리된 부분에서 urls.py의 활용 방법에 대해 Examples 예시로 보여주고 있는데요, Including another URLconf를 따라해보겠습니다.

사전에 먼저 설치해줘야 하는 프레임워크가 있는데요, 'djangorestframework' 입니다.

file>settings(이하 Ctrl+Alt+S)>project:[project name]>Python Interpreter 에서 + 버튼을 통해 ‘djangorestframework’를 찾아서 설치해줍니다. 저는 3.14.0 버전으로 install을 해주겠습니다.

그리고 settings.py의 INSTALLED_APPS에 'rest_framework' 를 추가해줍니다.

우리는 이전에 ‘testone’ 앱을 만들었습니다.

testone/urls.py 를 만들어 주세요.

# testone/urls.py
from django.urls import path
from .views import access_test

app_name = 'testone'

urlpatterns = [
    path('access-test/', access_test, name="access_test"),
]

testone/views.py 에 아래와 같이 작성해 줍니다.

# testone/views.py
from rest_framework import status
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def access_test(request):
    res_data = dict()

    msg = 'TEST ACCESS'
    res_data['message'] = msg

    return Response(data=res_data, status=status.HTTP_200_OK)

그리고 test_server/urls.py에 testone의 urls.py를 등록해줍니다.

# test_server/urls.py
from django.contrib import admin
from django.urls import path, include

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

여기까지 한 것은,

클라이언트로부터 access-test 요청이 오면 ROOT_URLCONF인 test_server/urls.py에서 testone/urls.py로 던지고 testone/urls.py에서는 access-test 요청에 대한 처리를 AccessTestView에 할당을 하고 AccessTestView는 요청을 처리해서 응답을 클라이언트에게 return 하는 매우 간단한 API를 작성했습니다.

AccessTestView는 단순히 ‘TEST ACCESS’ String 값을 응답 데이터에 싣어서 보내는 동작을 수행합니다.

이제 서버를 구동시켜 봅시다.

python manage.py runserver

그리고 우리가 만든 ‘access-test’ API를 테스트 해봐야 합니다.

여러 테스트 방법 중에 저는 ‘포스트맨’을 사용하는 것을 추천드립니다. https://www.postman.com/downloads/

curl 방법과 Postman 방법을 보여드리겠습니다.

먼저 curl은 터미널을 여시고 curl이 설치되어 있다면 아래의 명령어로 확인할 수 있습니다.

curl --location --request GET 'http://127.0.0.1:8000/testone/access-test?format=json'

그리고 포스트맨으로 날려보겠습니다. method는 GET으로 해줍니다. 아래 URL을 넣고 Send를 날려줍니다.

http://127.0.0.1:8000/testone/access-test?format=json

그렇습니다! 정상적으로 서버와 통신하여 message를 받은 모습입니다!

와우! API 작성을 마쳤습니다. 앞으로 개발하실 API는 다음과 같은 방식으로 확장성 있게 사용할 수 있을 것으로 보입니다.

지금 시간에 Model 쪽과 Template 쪽을 사용하지 않았는데요, 차차 다뤄보도록 하겠습니다.

감사합니다.

Additional

View를 작성하는데 있어서 2가지 방법이 있습니다. FBV 와 CBV입니다.

  • FBV는 Function-Based View의 약자로 ‘함수 기반 뷰’.
  • CBV는 Class-Based View의 약자로 ‘클래스 기반 뷰’.

views.py를 보시면, AccessTestView를 함수 형식으로 구성을 하였습니다. def 를 사용했기 때문이죠.

두 방식의 차이는 https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b 에서 자세히 확인할 수 있습니다.

FBV와 CBV 중 어떤 것을 선택해야하는지 정답은 없지만, 두가지를 다 써본 경험을 토대로 느낀 점을 말해보자면, 어플리케이션을 고도화 시키기 위해서는 CBV가 더 좋다는 것이였다. Class 내에 list, create 등 지원되는 viewset을 장착시키고 2개 이상으로 구성할 수 있기 때문이였다.

FBV로 구성을 했을 시, 해당 함수는 하나의 API Method로 동작을 해야 했다. 가령 어노테이션으로 @api_view(('GET',))과 같은 것을 넣어서 GET으로만 사용을 했습니다.

특히 settings.py를 자세히 봤었는데요, 오늘은 Django app을 만들어보고 프로젝트에 적용 및 디자인 패턴에 대해서 알아보도록 하겠습니다.

지난 시간에 settings.py에 ‘INSTALLED_APPS’라는 부분을 보셨을 겁니다.

이곳에는 기본적으로 세팅되는 프레임워크 뿐만 아니라, 직접 앱을 만들어서 세팅해줄 수도 있습니다.

Django는 Project만 만들어서 사용하지 않습니다. 모듈 정도의 개념으로 App이란 것을 만들어서 사용하는데요, 이렇게 개발하면 재사용성을 높이고 유지보수가 원할합니다.

이번에 개발한 포탈에는 다양한 시스템이 들어가는데요, 하나의 시스템을 하나의 앱으로 봐도 좋을 것 같습니다. 가령 Billing 시스템, Quiz 시스템, CSP 모니터링 시스템이 있다면 billing App, quiz App, monitoring App을 만들었습니다.

CLI를 켭니다.

# python manage.py startapp testone
python manage.py startapp [원하는 APP 명]

다음과 같이 ‘test_one’이라는 App이 만들어졌습니다. 해당 Django 프로젝트에서 이 App을 바로 사용할 수 있을까요? 아닙니다. 등록을 해줘야합니다.

testone/apps.py로 가봅니다.

TestoneConfig라는 클래스를 만들고 있으며, name은 ‘testone’으로 주는 것을 볼 수 있습니다.

Django에서 서버를 구동시키면 settings.py가 읽히고, INSTALLED_APPS에 있는 목록들의 apps.py를 참조하여 config를 가져오게 됩니다.

따라서, settings.py의 INSTALLED_APPS에 우리가 만든 testone을 등록해줍시다.

apps.py의 클래스에 name을 지정해주면 name만 써도 됩니다. 만약 name이 지정이 안되어있다면, 주석처리 처럼 full 참조를 적어주어야 합니다.

이렇게 app 등록을 마쳤습니다.

이제 이 앱의 디자인패턴을 보도록 하겠습니다. ‘Django Pattern’ 정도 키워드로 구글링을 해보시면 많이 볼 수 있는 단어가 있습니다. 바로 ‘MVT’ 패턴인데요, 이것이 바로 Django 앱 작성시 고려하는 패턴이 되겠습니다.

MVT 패턴은 Model-View-Template의 약자입니다.

  • 클라이언트에서 Django 서버로 요청을 합니다.
  • URL Conf가 요청을 분석하여 처리에 필요한 View를 할당합니다.
  • View는 데이터 CRUD 관련 처리가 필요하다면 진행합니다.
  • 처리 결과를 Template화 하여 클라이언트에게 던져 줍니다.

이제 디자인패턴을 알았으니 어떻게 실제 코드에 반영되고 있는지 확인해봐야겠죠?

settings.py의 ROOT_URLCONF 를 찾아가봅시다. 'test_server.urls' 라고 쓰여져 있는데, test_server/urls.py 를 말하고 있습니다.

# test_server/urls.py
"""test_server URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    <https://docs.djangoproject.com/en/4.1/topics/http/urls/>
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

클라이언트 요청이 오면 가장 먼저 ROOT_URLCONF에 명시된 urls.py가 받게됩니다. 지금은 깡통이라 admin/ 하나만 보입니다. 주석처리된 부분에서 urls.py의 활용 방법에 대해 Examples 예시로 보여주고 있는데요, Including another URLconf를 따라해보겠습니다.

사전에 먼저 설치해줘야 하는 프레임워크가 있는데요, djangorestframework 입니다.

file>settings(이하 Ctrl+Alt+S)>project:[project name]>Python Interpreter 에서 + 버튼을 통해 ‘djangorestframework’를 찾아서 설치해줍니다. 저는 3.14.0 버전으로 install을 해주겠습니다.

그리고 settings.py의 INSTALLED_APPS에 'rest_framework' 를 추가해줍니다.

우리는 이전에 ‘testone’ 앱을 만들었습니다.

testone/urls.py 를 만들어 주세요.

# testone/urls.py
from django.urls import path
from .views import access_test

app_name = 'testone'

urlpatterns = [
    path('access-test/', access_test, name="access_test"),
]

testone/views.py 에 아래와 같이 작성해 줍니다.

# testone/views.py
from rest_framework import status
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def access_test(request):
    res_data = dict()

    msg = 'TEST ACCESS'
    res_data['message'] = msg

    return Response(data=res_data, status=status.HTTP_200_OK)

그리고 test_server/urls.py에 testone의 urls.py를 등록해줍니다.

# test_server/urls.py
from django.contrib import admin
from django.urls import path, include

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

여기까지 한 것은,

클라이언트로부터 access-test 요청이 오면 ROOT_URLCONF인 test_server/urls.py에서 testone/urls.py로 던지고 testone/urls.py에서는 access-test 요청에 대한 처리를 AccessTestView에 할당을 하고 AccessTestView는 요청을 처리해서 응답을 클라이언트에게 return 하는 매우 간단한 API를 작성했습니다.

AccessTestView는 단순히 ‘TEST ACCESS’ String 값을 응답 데이터에 싣어서 보내는 동작을 수행합니다.

이제 서버를 구동시켜 봅시다.

python manage.py runserver

그리고 우리가 만든 ‘access-test’ API를 테스트 해봐야 합니다.

여러 테스트 방법 중에 저는 ‘포스트맨’을 사용하는 것을 추천드립니다. https://www.postman.com/downloads/

curl 방법과 Postman 방법을 보여드리겠습니다.

먼저 curl은 터미널을 여시고 curl이 설치되어 있다면 아래의 명령어로 확인할 수 있습니다.

curl --location --request GET '<http://127.0.0.1:8000/testone/access-test?format=json>'

그리고 포스트맨으로 날려보겠습니다. method는 GET으로 해줍니다. 아래 URL을 넣고 Send를 날려줍니다.

<http://127.0.0.1:8000/testone/access-test?format=json>

그렇습니다! 정상적으로 서버와 통신하여 message를 받은 모습입니다!

와우! API 작성을 마쳤습니다. 앞으로 개발하실 API는 다음과 같은 방식으로 확장성 있게 사용할 수 있을 것으로 보입니다.

지금 시간에 Model 쪽과 Template 쪽을 사용하지 않았는데요, 차차 다뤄보도록 하겠습니다.

감사합니다.

Additional

View를 작성하는데 있어서 2가지 방법이 있습니다. FBV 와 CBV입니다.

  • FBV는 Function-Based View의 약자로 ‘함수 기반 뷰’.
  • CBV는 Class-Based View의 약자로 ‘클래스 기반 뷰’.

views.py를 보시면, AccessTestView를 함수 형식으로 구성을 하였습니다. def 를 사용했기 때문이죠.

두 방식의 차이는 https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b 에서 자세히 확인할 수 있습니다.

FBV와 CBV 중 어떤 것을 선택해야하는지 정답은 없지만, 두가지를 다 써본 경험을 토대로 느낀 점을 말해보자면, 어플리케이션을 고도화 시키기 위해서는 CBV가 더 좋다는 것이였다. Class 내에 list, create 등 지원되는 viewset을 장착시키고 2개 이상으로 구성할 수 있기 때문이였다.

FBV로 구성을 했을 시, 해당 함수는 하나의 API Method로 동작을 해야 했다. 가령 어노테이션으로 @api_view(('GET',))과 같은 것을 넣어서 GET으로만 사용을 했습니다.

특히 settings.py를 자세히 봤었는데요, 오늘은 Django app을 만들어보고 프로젝트에 적용 및 디자인 패턴에 대해서 알아보도록 하겠습니다.

지난 시간에 settings.py에 ‘INSTALLED_APPS’라는 부분을 보셨을 겁니다.

이곳에는 기본적으로 세팅되는 프레임워크 뿐만 아니라, 직접 앱을 만들어서 세팅해줄 수도 있습니다.

Django는 Project만 만들어서 사용하지 않습니다. 모듈 정도의 개념으로 App이란 것을 만들어서 사용하는데요, 이렇게 개발하면 재사용성을 높이고 유지보수가 원할합니다.

이번에 개발한 포탈에는 다양한 시스템이 들어가는데요, 하나의 시스템을 하나의 앱으로 봐도 좋을 것 같습니다. 가령 Billing 시스템, Quiz 시스템, CSP 모니터링 시스템이 있다면 billing App, quiz App, monitoring App을 만들었습니다.

CLI를 켭니다.

# python manage.py startapp testone
python manage.py startapp [원하는 APP 명]

다음과 같이 ‘test_one’이라는 App이 만들어졌습니다. 해당 Django 프로젝트에서 이 App을 바로 사용할 수 있을까요? 아닙니다. 등록을 해줘야합니다.

testone/apps.py로 가봅니다.

TestoneConfig라는 클래스를 만들고 있으며, name은 ‘testone’으로 주는 것을 볼 수 있습니다.

Django에서 서버를 구동시키면 settings.py가 읽히고, INSTALLED_APPS에 있는 목록들의 apps.py를 참조하여 config를 가져오게 됩니다.

따라서, settings.py의 INSTALLED_APPS에 우리가 만든 testone을 등록해줍시다.

apps.py의 클래스에 name을 지정해주면 name만 써도 됩니다. 만약 name이 지정이 안되어있다면, 주석처리 처럼 full 참조를 적어주어야 합니다.

이렇게 app 등록을 마쳤습니다.

이제 이 앱의 디자인패턴을 보도록 하겠습니다. ‘Django Pattern’ 정도 키워드로 구글링을 해보시면 많이 볼 수 있는 단어가 있습니다. 바로 ‘MVT’ 패턴인데요, 이것이 바로 Django 앱 작성시 고려하는 패턴이 되겠습니다.

MVT 패턴은 Model-View-Template의 약자입니다.

  • 클라이언트에서 Django 서버로 요청을 합니다.
  • URL Conf가 요청을 분석하여 처리에 필요한 View를 할당합니다.
  • View는 데이터 CRUD 관련 처리가 필요하다면 진행합니다.
  • 처리 결과를 Template화 하여 클라이언트에게 던져 줍니다.

이제 디자인패턴을 알았으니 어떻게 실제 코드에 반영되고 있는지 확인해봐야겠죠?

settings.py의 ROOT_URLCONF 를 찾아가봅시다. 'test_server.urls' 라고 쓰여져 있는데, test_server/urls.py 를 말하고 있습니다.

# test_server/urls.py
"""test_server URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    <https://docs.djangoproject.com/en/4.1/topics/http/urls/>
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

클라이언트 요청이 오면 가장 먼저 ROOT_URLCONF에 명시된 urls.py가 받게됩니다. 지금은 깡통이라 admin/ 하나만 보입니다. 주석처리된 부분에서 urls.py의 활용 방법에 대해 Examples 예시로 보여주고 있는데요, Including another URLconf를 따라해보겠습니다.

사전에 먼저 설치해줘야 하는 프레임워크가 있는데요, djangorestframework 입니다.

file>settings(이하 Ctrl+Alt+S)>project:[project name]>Python Interpreter 에서 + 버튼을 통해 ‘djangorestframework’를 찾아서 설치해줍니다. 저는 3.14.0 버전으로 install을 해주겠습니다.

그리고 settings.py의 INSTALLED_APPS에 'rest_framework' 를 추가해줍니다.

우리는 이전에 ‘testone’ 앱을 만들었습니다.

testone/urls.py 를 만들어 주세요.

# testone/urls.py
from django.urls import path
from .views import access_test

app_name = 'testone'

urlpatterns = [
    path('access-test/', access_test, name="access_test"),
]

testone/views.py 에 아래와 같이 작성해 줍니다.

# testone/views.py
from rest_framework import status
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def access_test(request):
    res_data = dict()

    msg = 'TEST ACCESS'
    res_data['message'] = msg

    return Response(data=res_data, status=status.HTTP_200_OK)

그리고 test_server/urls.py에 testone의 urls.py를 등록해줍니다.

# test_server/urls.py
from django.contrib import admin
from django.urls import path, include

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

여기까지 한 것은,

클라이언트로부터 access-test 요청이 오면 ROOT_URLCONF인 test_server/urls.py에서 testone/urls.py로 던지고 testone/urls.py에서는 access-test 요청에 대한 처리를 AccessTestView에 할당을 하고 AccessTestView는 요청을 처리해서 응답을 클라이언트에게 return 하는 매우 간단한 API를 작성했습니다.

AccessTestView는 단순히 ‘TEST ACCESS’ String 값을 응답 데이터에 싣어서 보내는 동작을 수행합니다.

이제 서버를 구동시켜 봅시다.

python manage.py runserver

그리고 우리가 만든 ‘access-test’ API를 테스트 해봐야 합니다.

여러 테스트 방법 중에 저는 ‘포스트맨’을 사용하는 것을 추천드립니다. https://www.postman.com/downloads/

curl 방법과 Postman 방법을 보여드리겠습니다.

먼저 curl은 터미널을 여시고 curl이 설치되어 있다면 아래의 명령어로 확인할 수 있습니다.

curl --location --request GET '<http://127.0.0.1:8000/testone/access-test?format=json>'

그리고 포스트맨으로 날려보겠습니다. method는 GET으로 해줍니다. 아래 URL을 넣고 Send를 날려줍니다.

<http://127.0.0.1:8000/testone/access-test?format=json>

그렇습니다! 정상적으로 서버와 통신하여 message를 받은 모습입니다!

와우! API 작성을 마쳤습니다. 앞으로 개발하실 API는 다음과 같은 방식으로 확장성 있게 사용할 수 있을 것으로 보입니다.

지금 시간에 Model 쪽과 Template 쪽을 사용하지 않았는데요, 차차 다뤄보도록 하겠습니다.

감사합니다.

Additional

View를 작성하는데 있어서 2가지 방법이 있습니다. FBV 와 CBV입니다.

  • FBV는 Function-Based View의 약자로 ‘함수 기반 뷰’.
  • CBV는 Class-Based View의 약자로 ‘클래스 기반 뷰’.

views.py를 보시면, AccessTestView를 함수 형식으로 구성을 하였습니다. def 를 사용했기 때문이죠.

두 방식의 차이는 https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b 에서 자세히 확인할 수 있습니다.

FBV와 CBV 중 어떤 것을 선택해야하는지 정답은 없지만, 두가지를 다 써본 경험을 토대로 느낀 점을 말해보자면, 어플리케이션을 고도화 시키기 위해서는 CBV가 더 좋다는 것이였다. Class 내에 list, create 등 지원되는 viewset을 장착시키고 2개 이상으로 구성할 수 있기 때문이였다.

FBV로 구성을 했을 시, 해당 함수는 하나의 API Method로 동작을 해야 했다. 가령 어노테이션으로 @api_view(('GET',))과 같은 것을 넣어서 GET으로만 사용을 했습니다.

특히 settings.py를 자세히 봤었는데요, 오늘은 Django app을 만들어보고 프로젝트에 적용 및 디자인 패턴에 대해서 알아보도록 하겠습니다.

지난 시간에 settings.py에 ‘INSTALLED_APPS’라는 부분을 보셨을 겁니다.

이곳에는 기본적으로 세팅되는 프레임워크 뿐만 아니라, 직접 앱을 만들어서 세팅해줄 수도 있습니다.

Django는 Project만 만들어서 사용하지 않습니다. 모듈 정도의 개념으로 App이란 것을 만들어서 사용하는데요, 이렇게 개발하면 재사용성을 높이고 유지보수가 원할합니다.

이번에 개발한 포탈에는 다양한 시스템이 들어가는데요, 하나의 시스템을 하나의 앱으로 봐도 좋을 것 같습니다. 가령 Billing 시스템, Quiz 시스템, CSP 모니터링 시스템이 있다면 billing App, quiz App, monitoring App을 만들었습니다.

CLI를 켭니다.

# python manage.py startapp testone
python manage.py startapp [원하는 APP 명]

다음과 같이 ‘test_one’이라는 App이 만들어졌습니다. 해당 Django 프로젝트에서 이 App을 바로 사용할 수 있을까요? 아닙니다. 등록을 해줘야합니다.

testone/apps.py로 가봅니다.

TestoneConfig라는 클래스를 만들고 있으며, name은 ‘testone’으로 주는 것을 볼 수 있습니다.

Django에서 서버를 구동시키면 settings.py가 읽히고, INSTALLED_APPS에 있는 목록들의 apps.py를 참조하여 config를 가져오게 됩니다.

따라서, settings.py의 INSTALLED_APPS에 우리가 만든 testone을 등록해줍시다.

apps.py의 클래스에 name을 지정해주면 name만 써도 됩니다. 만약 name이 지정이 안되어있다면, 주석처리 처럼 full 참조를 적어주어야 합니다.

이렇게 app 등록을 마쳤습니다.

이제 이 앱의 디자인패턴을 보도록 하겠습니다. ‘Django Pattern’ 정도 키워드로 구글링을 해보시면 많이 볼 수 있는 단어가 있습니다. 바로 ‘MVT’ 패턴인데요, 이것이 바로 Django 앱 작성시 고려하는 패턴이 되겠습니다.

MVT 패턴은 Model-View-Template의 약자입니다.

  • 클라이언트에서 Django 서버로 요청을 합니다.
  • URL Conf가 요청을 분석하여 처리에 필요한 View를 할당합니다.
  • View는 데이터 CRUD 관련 처리가 필요하다면 진행합니다.
  • 처리 결과를 Template화 하여 클라이언트에게 던져 줍니다.

이제 디자인패턴을 알았으니 어떻게 실제 코드에 반영되고 있는지 확인해봐야겠죠?

settings.py의 ROOT_URLCONF 를 찾아가봅시다. 'test_server.urls' 라고 쓰여져 있는데, test_server/urls.py 를 말하고 있습니다.

# test_server/urls.py
"""test_server URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    <https://docs.djangoproject.com/en/4.1/topics/http/urls/>
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

클라이언트 요청이 오면 가장 먼저 ROOT_URLCONF에 명시된 urls.py가 받게됩니다. 지금은 깡통이라 admin/ 하나만 보입니다. 주석처리된 부분에서 urls.py의 활용 방법에 대해 Examples 예시로 보여주고 있는데요, Including another URLconf를 따라해보겠습니다.

사전에 먼저 설치해줘야 하는 프레임워크가 있는데요, djangorestframework 입니다.

file>settings(이하 Ctrl+Alt+S)>project:[project name]>Python Interpreter 에서 + 버튼을 통해 ‘djangorestframework’를 찾아서 설치해줍니다. 저는 3.14.0 버전으로 install을 해주겠습니다.

그리고 settings.py의 INSTALLED_APPS에 'rest_framework' 를 추가해줍니다.

우리는 이전에 ‘testone’ 앱을 만들었습니다.

testone/urls.py 를 만들어 주세요.

# testone/urls.py
from django.urls import path
from .views import access_test

app_name = 'testone'

urlpatterns = [
    path('access-test/', access_test, name="access_test"),
]

testone/views.py 에 아래와 같이 작성해 줍니다.

# testone/views.py
from rest_framework import status
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def access_test(request):
    res_data = dict()

    msg = 'TEST ACCESS'
    res_data['message'] = msg

    return Response(data=res_data, status=status.HTTP_200_OK)

그리고 test_server/urls.py에 testone의 urls.py를 등록해줍니다.

# test_server/urls.py
from django.contrib import admin
from django.urls import path, include

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

여기까지 한 것은,

클라이언트로부터 access-test 요청이 오면 ROOT_URLCONF인 test_server/urls.py에서 testone/urls.py로 던지고 testone/urls.py에서는 access-test 요청에 대한 처리를 AccessTestView에 할당을 하고 AccessTestView는 요청을 처리해서 응답을 클라이언트에게 return 하는 매우 간단한 API를 작성했습니다.

AccessTestView는 단순히 ‘TEST ACCESS’ String 값을 응답 데이터에 싣어서 보내는 동작을 수행합니다.

이제 서버를 구동시켜 봅시다.

python manage.py runserver

그리고 우리가 만든 ‘access-test’ API를 테스트 해봐야 합니다.

여러 테스트 방법 중에 저는 ‘포스트맨’을 사용하는 것을 추천드립니다. https://www.postman.com/downloads/

curl 방법과 Postman 방법을 보여드리겠습니다.

먼저 curl은 터미널을 여시고 curl이 설치되어 있다면 아래의 명령어로 확인할 수 있습니다.

curl --location --request GET '<http://127.0.0.1:8000/testone/access-test?format=json>'

그리고 포스트맨으로 날려보겠습니다. method는 GET으로 해줍니다. 아래 URL을 넣고 Send를 날려줍니다.

<http://127.0.0.1:8000/testone/access-test?format=json>

그렇습니다! 정상적으로 서버와 통신하여 message를 받은 모습입니다!

와우! API 작성을 마쳤습니다. 앞으로 개발하실 API는 다음과 같은 방식으로 확장성 있게 사용할 수 있을 것으로 보입니다.

지금 시간에 Model 쪽과 Template 쪽을 사용하지 않았는데요, 차차 다뤄보도록 하겠습니다.

감사합니다.

Additional

View를 작성하는데 있어서 2가지 방법이 있습니다. FBV 와 CBV입니다.

  • FBV는 Function-Based View의 약자로 ‘함수 기반 뷰’.
  • CBV는 Class-Based View의 약자로 ‘클래스 기반 뷰’.

views.py를 보시면, AccessTestView를 함수 형식으로 구성을 하였습니다. def 를 사용했기 때문이죠.

두 방식의 차이는 https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b 에서 자세히 확인할 수 있습니다.

FBV와 CBV 중 어떤 것을 선택해야하는지 정답은 없지만, 두가지를 다 써본 경험을 토대로 느낀 점을 말해보자면, 어플리케이션을 고도화 시키기 위해서는 CBV가 더 좋다는 것이였다. Class 내에 list, create 등 지원되는 viewset을 장착시키고 2개 이상으로 구성할 수 있기 때문이였다.

FBV로 구성을 했을 시, 해당 함수는 하나의 API Method로 동작을 해야 했다. 가령 어노테이션으로 @api_view(('GET',))과 같은 것을 넣어서 GET으로만 사용을 했습니다.

특히 settings.py를 자세히 봤었는데요, 오늘은 Django app을 만들어보고 프로젝트에 적용 및 디자인 패턴에 대해서 알아보도록 하겠습니다.

지난 시간에 settings.py에 ‘INSTALLED_APPS’라는 부분을 보셨을 겁니다.

이곳에는 기본적으로 세팅되는 프레임워크 뿐만 아니라, 직접 앱을 만들어서 세팅해줄 수도 있습니다.

Django는 Project만 만들어서 사용하지 않습니다. 모듈 정도의 개념으로 App이란 것을 만들어서 사용하는데요, 이렇게 개발하면 재사용성을 높이고 유지보수가 원할합니다.

이번에 개발한 포탈에는 다양한 시스템이 들어가는데요, 하나의 시스템을 하나의 앱으로 봐도 좋을 것 같습니다. 가령 Billing 시스템, Quiz 시스템, CSP 모니터링 시스템이 있다면 billing App, quiz App, monitoring App을 만들었습니다.

CLI를 켭니다.

# python manage.py startapp testone
python manage.py startapp [원하는 APP 명]

다음과 같이 ‘test_one’이라는 App이 만들어졌습니다. 해당 Django 프로젝트에서 이 App을 바로 사용할 수 있을까요? 아닙니다. 등록을 해줘야합니다.

testone/apps.py로 가봅니다.

TestoneConfig라는 클래스를 만들고 있으며, name은 ‘testone’으로 주는 것을 볼 수 있습니다.

Django에서 서버를 구동시키면 settings.py가 읽히고, INSTALLED_APPS에 있는 목록들의 apps.py를 참조하여 config를 가져오게 됩니다.

따라서, settings.py의 INSTALLED_APPS에 우리가 만든 testone을 등록해줍시다.

apps.py의 클래스에 name을 지정해주면 name만 써도 됩니다. 만약 name이 지정이 안되어있다면, 주석처리 처럼 full 참조를 적어주어야 합니다.

이렇게 app 등록을 마쳤습니다.

이제 이 앱의 디자인패턴을 보도록 하겠습니다. ‘Django Pattern’ 정도 키워드로 구글링을 해보시면 많이 볼 수 있는 단어가 있습니다. 바로 ‘MVT’ 패턴인데요, 이것이 바로 Django 앱 작성시 고려하는 패턴이 되겠습니다.

MVT 패턴은 Model-View-Template의 약자입니다.

  • 클라이언트에서 Django 서버로 요청을 합니다.
  • URL Conf가 요청을 분석하여 처리에 필요한 View를 할당합니다.
  • View는 데이터 CRUD 관련 처리가 필요하다면 진행합니다.
  • 처리 결과를 Template화 하여 클라이언트에게 던져 줍니다.

이제 디자인패턴을 알았으니 어떻게 실제 코드에 반영되고 있는지 확인해봐야겠죠?

settings.py의 ROOT_URLCONF 를 찾아가봅시다. 'test_server.urls' 라고 쓰여져 있는데, test_server/urls.py 를 말하고 있습니다.

# test_server/urls.py
"""test_server URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    <https://docs.djangoproject.com/en/4.1/topics/http/urls/>
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

클라이언트 요청이 오면 가장 먼저 ROOT_URLCONF에 명시된 urls.py가 받게됩니다. 지금은 깡통이라 admin/ 하나만 보입니다. 주석처리된 부분에서 urls.py의 활용 방법에 대해 Examples 예시로 보여주고 있는데요, Including another URLconf를 따라해보겠습니다.

사전에 먼저 설치해줘야 하는 프레임워크가 있는데요, djangorestframework 입니다.

file>settings(이하 Ctrl+Alt+S)>project:[project name]>Python Interpreter 에서 + 버튼을 통해 ‘djangorestframework’를 찾아서 설치해줍니다. 저는 3.14.0 버전으로 install을 해주겠습니다.

그리고 settings.py의 INSTALLED_APPS에 'rest_framework' 를 추가해줍니다.

우리는 이전에 ‘testone’ 앱을 만들었습니다.

testone/urls.py 를 만들어 주세요.

# testone/urls.py
from django.urls import path
from .views import access_test

app_name = 'testone'

urlpatterns = [
    path('access-test/', access_test, name="access_test"),
]

testone/views.py 에 아래와 같이 작성해 줍니다.

# testone/views.py
from rest_framework import status
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def access_test(request):
    res_data = dict()

    msg = 'TEST ACCESS'
    res_data['message'] = msg

    return Response(data=res_data, status=status.HTTP_200_OK)

그리고 test_server/urls.py에 testone의 urls.py를 등록해줍니다.

# test_server/urls.py
from django.contrib import admin
from django.urls import path, include

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

여기까지 한 것은,

클라이언트로부터 access-test 요청이 오면 ROOT_URLCONF인 test_server/urls.py에서 testone/urls.py로 던지고 testone/urls.py에서는 access-test 요청에 대한 처리를 AccessTestView에 할당을 하고 AccessTestView는 요청을 처리해서 응답을 클라이언트에게 return 하는 매우 간단한 API를 작성했습니다.

AccessTestView는 단순히 ‘TEST ACCESS’ String 값을 응답 데이터에 싣어서 보내는 동작을 수행합니다.

이제 서버를 구동시켜 봅시다.

python manage.py runserver

그리고 우리가 만든 ‘access-test’ API를 테스트 해봐야 합니다.

여러 테스트 방법 중에 저는 ‘포스트맨’을 사용하는 것을 추천드립니다. https://www.postman.com/downloads/

curl 방법과 Postman 방법을 보여드리겠습니다.

먼저 curl은 터미널을 여시고 curl이 설치되어 있다면 아래의 명령어로 확인할 수 있습니다.

curl --location --request GET '<http://127.0.0.1:8000/testone/access-test?format=json>'

그리고 포스트맨으로 날려보겠습니다. method는 GET으로 해줍니다. 아래 URL을 넣고 Send를 날려줍니다.

<http://127.0.0.1:8000/testone/access-test?format=json>

그렇습니다! 정상적으로 서버와 통신하여 message를 받은 모습입니다!

와우! API 작성을 마쳤습니다. 앞으로 개발하실 API는 다음과 같은 방식으로 확장성 있게 사용할 수 있을 것으로 보입니다.

지금 시간에 Model 쪽과 Template 쪽을 사용하지 않았는데요, 차차 다뤄보도록 하겠습니다.

감사합니다.

Additional

View를 작성하는데 있어서 2가지 방법이 있습니다. FBV 와 CBV입니다.

  • FBV는 Function-Based View의 약자로 ‘함수 기반 뷰’.
  • CBV는 Class-Based View의 약자로 ‘클래스 기반 뷰’.

views.py를 보시면, AccessTestView를 함수 형식으로 구성을 하였습니다. def 를 사용했기 때문이죠.

두 방식의 차이는 https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b 에서 자세히 확인할 수 있습니다.

FBV와 CBV 중 어떤 것을 선택해야하는지 정답은 없지만, 두가지를 다 써본 경험을 토대로 느낀 점을 말해보자면, 어플리케이션을 고도화 시키기 위해서는 CBV가 더 좋다는 것이였다. Class 내에 list, create 등 지원되는 viewset을 장착시키고 2개 이상으로 구성할 수 있기 때문이였다.

FBV로 구성을 했을 시, 해당 함수는 하나의 API Method로 동작을 해야 했다. 가령 어노테이션으로 @api_view(('GET',))과 같은 것을 넣어서 GET으로만 사용을 했습니다.

특히 settings.py를 자세히 봤었는데요, 오늘은 Django app을 만들어보고 프로젝트에 적용 및 디자인 패턴에 대해서 알아보도록 하겠습니다.

지난 시간에 settings.py에 ‘INSTALLED_APPS’라는 부분을 보셨을 겁니다.

이곳에는 기본적으로 세팅되는 프레임워크 뿐만 아니라, 직접 앱을 만들어서 세팅해줄 수도 있습니다.

Django는 Project만 만들어서 사용하지 않습니다. 모듈 정도의 개념으로 App이란 것을 만들어서 사용하는데요, 이렇게 개발하면 재사용성을 높이고 유지보수가 원할합니다.

이번에 개발한 포탈에는 다양한 시스템이 들어가는데요, 하나의 시스템을 하나의 앱으로 봐도 좋을 것 같습니다. 가령 Billing 시스템, Quiz 시스템, CSP 모니터링 시스템이 있다면 billing App, quiz App, monitoring App을 만들었습니다.

CLI를 켭니다.

# python manage.py startapp testone
python manage.py startapp [원하는 APP 명]

다음과 같이 ‘test_one’이라는 App이 만들어졌습니다. 해당 Django 프로젝트에서 이 App을 바로 사용할 수 있을까요? 아닙니다. 등록을 해줘야합니다.

testone/apps.py로 가봅니다.

TestoneConfig라는 클래스를 만들고 있으며, name은 ‘testone’으로 주는 것을 볼 수 있습니다.

Django에서 서버를 구동시키면 settings.py가 읽히고, INSTALLED_APPS에 있는 목록들의 apps.py를 참조하여 config를 가져오게 됩니다.

따라서, settings.py의 INSTALLED_APPS에 우리가 만든 testone을 등록해줍시다.

apps.py의 클래스에 name을 지정해주면 name만 써도 됩니다. 만약 name이 지정이 안되어있다면, 주석처리 처럼 full 참조를 적어주어야 합니다.

이렇게 app 등록을 마쳤습니다.

이제 이 앱의 디자인패턴을 보도록 하겠습니다. ‘Django Pattern’ 정도 키워드로 구글링을 해보시면 많이 볼 수 있는 단어가 있습니다. 바로 ‘MVT’ 패턴인데요, 이것이 바로 Django 앱 작성시 고려하는 패턴이 되겠습니다.

MVT 패턴은 Model-View-Template의 약자입니다.

  • 클라이언트에서 Django 서버로 요청을 합니다.
  • URL Conf가 요청을 분석하여 처리에 필요한 View를 할당합니다.
  • View는 데이터 CRUD 관련 처리가 필요하다면 진행합니다.
  • 처리 결과를 Template화 하여 클라이언트에게 던져 줍니다.

이제 디자인패턴을 알았으니 어떻게 실제 코드에 반영되고 있는지 확인해봐야겠죠?

settings.py의 ROOT_URLCONF 를 찾아가봅시다. 'test_server.urls' 라고 쓰여져 있는데, test_server/urls.py 를 말하고 있습니다.

# test_server/urls.py
"""test_server URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    <https://docs.djangoproject.com/en/4.1/topics/http/urls/>
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

클라이언트 요청이 오면 가장 먼저 ROOT_URLCONF에 명시된 urls.py가 받게됩니다. 지금은 깡통이라 admin/ 하나만 보입니다. 주석처리된 부분에서 urls.py의 활용 방법에 대해 Examples 예시로 보여주고 있는데요, Including another URLconf를 따라해보겠습니다.

사전에 먼저 설치해줘야 하는 프레임워크가 있는데요, djangorestframework 입니다.

file>settings(이하 Ctrl+Alt+S)>project:[project name]>Python Interpreter 에서 + 버튼을 통해 ‘djangorestframework’를 찾아서 설치해줍니다. 저는 3.14.0 버전으로 install을 해주겠습니다.

그리고 settings.py의 INSTALLED_APPS에 'rest_framework' 를 추가해줍니다.

우리는 이전에 ‘testone’ 앱을 만들었습니다.

testone/urls.py 를 만들어 주세요.

# testone/urls.py
from django.urls import path
from .views import access_test

app_name = 'testone'

urlpatterns = [
    path('access-test/', access_test, name="access_test"),
]

testone/views.py 에 아래와 같이 작성해 줍니다.

# testone/views.py
from rest_framework import status
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def access_test(request):
    res_data = dict()

    msg = 'TEST ACCESS'
    res_data['message'] = msg

    return Response(data=res_data, status=status.HTTP_200_OK)

그리고 test_server/urls.py에 testone의 urls.py를 등록해줍니다.

# test_server/urls.py
from django.contrib import admin
from django.urls import path, include

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

여기까지 한 것은,

클라이언트로부터 access-test 요청이 오면 ROOT_URLCONF인 test_server/urls.py에서 testone/urls.py로 던지고 testone/urls.py에서는 access-test 요청에 대한 처리를 AccessTestView에 할당을 하고 AccessTestView는 요청을 처리해서 응답을 클라이언트에게 return 하는 매우 간단한 API를 작성했습니다.

AccessTestView는 단순히 ‘TEST ACCESS’ String 값을 응답 데이터에 싣어서 보내는 동작을 수행합니다.

이제 서버를 구동시켜 봅시다.

python manage.py runserver

그리고 우리가 만든 ‘access-test’ API를 테스트 해봐야 합니다.

여러 테스트 방법 중에 저는 ‘포스트맨’을 사용하는 것을 추천드립니다. https://www.postman.com/downloads/

curl 방법과 Postman 방법을 보여드리겠습니다.

먼저 curl은 터미널을 여시고 curl이 설치되어 있다면 아래의 명령어로 확인할 수 있습니다.

curl --location --request GET '<http://127.0.0.1:8000/testone/access-test?format=json>'

그리고 포스트맨으로 날려보겠습니다. method는 GET으로 해줍니다. 아래 URL을 넣고 Send를 날려줍니다.

<http://127.0.0.1:8000/testone/access-test?format=json>

그렇습니다! 정상적으로 서버와 통신하여 message를 받은 모습입니다!

와우! API 작성을 마쳤습니다. 앞으로 개발하실 API는 다음과 같은 방식으로 확장성 있게 사용할 수 있을 것으로 보입니다.

지금 시간에 Model 쪽과 Template 쪽을 사용하지 않았는데요, 차차 다뤄보도록 하겠습니다.

감사합니다.

Additional

View를 작성하는데 있어서 2가지 방법이 있습니다. FBV 와 CBV입니다.

  • FBV는 Function-Based View의 약자로 ‘함수 기반 뷰’.
  • CBV는 Class-Based View의 약자로 ‘클래스 기반 뷰’.

views.py를 보시면, AccessTestView를 함수 형식으로 구성을 하였습니다. def 를 사용했기 때문이죠.

두 방식의 차이는 https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b 에서 자세히 확인할 수 있습니다.

FBV와 CBV 중 어떤 것을 선택해야하는지 정답은 없지만, 두가지를 다 써본 경험을 토대로 느낀 점을 말해보자면, 어플리케이션을 고도화 시키기 위해서는 CBV가 더 좋다는 것이였다. Class 내에 list, create 등 지원되는 viewset을 장착시키고 2개 이상으로 구성할 수 있기 때문이였다.

FBV로 구성을 했을 시, 해당 함수는 하나의 API Method로 동작을 해야 했다. 가령 어노테이션으로 @api_view(('GET',))과 같은 것을 넣어서 GET으로만 사용을 했습니다.

특히 settings.py를 자세히 봤었는데요, 오늘은 Django app을 만들어보고 프로젝트에 적용 및 디자인 패턴에 대해서 알아보도록 하겠습니다.

지난 시간에 settings.py에 ‘INSTALLED_APPS’라는 부분을 보셨을 겁니다.

이곳에는 기본적으로 세팅되는 프레임워크 뿐만 아니라, 직접 앱을 만들어서 세팅해줄 수도 있습니다.

Django는 Project만 만들어서 사용하지 않습니다. 모듈 정도의 개념으로 App이란 것을 만들어서 사용하는데요, 이렇게 개발하면 재사용성을 높이고 유지보수가 원할합니다.

이번에 개발한 포탈에는 다양한 시스템이 들어가는데요, 하나의 시스템을 하나의 앱으로 봐도 좋을 것 같습니다. 가령 Billing 시스템, Quiz 시스템, CSP 모니터링 시스템이 있다면 billing App, quiz App, monitoring App을 만들었습니다.

CLI를 켭니다.

# python manage.py startapp testone
python manage.py startapp [원하는 APP 명]

다음과 같이 ‘test_one’이라는 App이 만들어졌습니다. 해당 Django 프로젝트에서 이 App을 바로 사용할 수 있을까요? 아닙니다. 등록을 해줘야합니다.

testone/apps.py로 가봅니다.

TestoneConfig라는 클래스를 만들고 있으며, name은 ‘testone’으로 주는 것을 볼 수 있습니다.

Django에서 서버를 구동시키면 settings.py가 읽히고, INSTALLED_APPS에 있는 목록들의 apps.py를 참조하여 config를 가져오게 됩니다.

따라서, settings.py의 INSTALLED_APPS에 우리가 만든 testone을 등록해줍시다.

apps.py의 클래스에 name을 지정해주면 name만 써도 됩니다. 만약 name이 지정이 안되어있다면, 주석처리 처럼 full 참조를 적어주어야 합니다.

이렇게 app 등록을 마쳤습니다.

이제 이 앱의 디자인패턴을 보도록 하겠습니다. ‘Django Pattern’ 정도 키워드로 구글링을 해보시면 많이 볼 수 있는 단어가 있습니다. 바로 ‘MVT’ 패턴인데요, 이것이 바로 Django 앱 작성시 고려하는 패턴이 되겠습니다.

MVT 패턴은 Model-View-Template의 약자입니다.

  • 클라이언트에서 Django 서버로 요청을 합니다.
  • URL Conf가 요청을 분석하여 처리에 필요한 View를 할당합니다.
  • View는 데이터 CRUD 관련 처리가 필요하다면 진행합니다.
  • 처리 결과를 Template화 하여 클라이언트에게 던져 줍니다.

이제 디자인패턴을 알았으니 어떻게 실제 코드에 반영되고 있는지 확인해봐야겠죠?

settings.py의 ROOT_URLCONF 를 찾아가봅시다. 'test_server.urls' 라고 쓰여져 있는데, test_server/urls.py 를 말하고 있습니다.

# test_server/urls.py
"""test_server URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    <https://docs.djangoproject.com/en/4.1/topics/http/urls/>
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path

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

클라이언트 요청이 오면 가장 먼저 ROOT_URLCONF에 명시된 urls.py가 받게됩니다. 지금은 깡통이라 admin/ 하나만 보입니다. 주석처리된 부분에서 urls.py의 활용 방법에 대해 Examples 예시로 보여주고 있는데요, Including another URLconf를 따라해보겠습니다.

사전에 먼저 설치해줘야 하는 프레임워크가 있는데요, djangorestframework 입니다.

file>settings(이하 Ctrl+Alt+S)>project:[project name]>Python Interpreter 에서 + 버튼을 통해 ‘djangorestframework’를 찾아서 설치해줍니다. 저는 3.14.0 버전으로 install을 해주겠습니다.

그리고 settings.py의 INSTALLED_APPS에 'rest_framework' 를 추가해줍니다.

우리는 이전에 ‘testone’ 앱을 만들었습니다.

testone/urls.py 를 만들어 주세요.

# testone/urls.py
from django.urls import path
from .views import access_test

app_name = 'testone'

urlpatterns = [
    path('access-test/', access_test, name="access_test"),
]

testone/views.py 에 아래와 같이 작성해 줍니다.

# testone/views.py
from rest_framework import status
from rest_framework.decorators import api_view, renderer_classes
from rest_framework.renderers import TemplateHTMLRenderer, JSONRenderer
from rest_framework.response import Response

@api_view(('GET',))
@renderer_classes((TemplateHTMLRenderer, JSONRenderer))
def access_test(request):
    res_data = dict()

    msg = 'TEST ACCESS'
    res_data['message'] = msg

    return Response(data=res_data, status=status.HTTP_200_OK)

그리고 test_server/urls.py에 testone의 urls.py를 등록해줍니다.

# test_server/urls.py
from django.contrib import admin
from django.urls import path, include

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

여기까지 한 것은,

클라이언트로부터 access-test 요청이 오면 ROOT_URLCONF인 test_server/urls.py에서 testone/urls.py로 던지고 testone/urls.py에서는 access-test 요청에 대한 처리를 AccessTestView에 할당을 하고 AccessTestView는 요청을 처리해서 응답을 클라이언트에게 return 하는 매우 간단한 API를 작성했습니다.

AccessTestView는 단순히 ‘TEST ACCESS’ String 값을 응답 데이터에 싣어서 보내는 동작을 수행합니다.

이제 서버를 구동시켜 봅시다.

python manage.py runserver

그리고 우리가 만든 ‘access-test’ API를 테스트 해봐야 합니다.

여러 테스트 방법 중에 저는 ‘포스트맨’을 사용하는 것을 추천드립니다. https://www.postman.com/downloads/

curl 방법과 Postman 방법을 보여드리겠습니다.

먼저 curl은 터미널을 여시고 curl이 설치되어 있다면 아래의 명령어로 확인할 수 있습니다.

curl --location --request GET '<http://127.0.0.1:8000/testone/access-test?format=json>'

그리고 포스트맨으로 날려보겠습니다. method는 GET으로 해줍니다. 아래 URL을 넣고 Send를 날려줍니다.

<http://127.0.0.1:8000/testone/access-test?format=json>

그렇습니다! 정상적으로 서버와 통신하여 message를 받은 모습입니다!

와우! API 작성을 마쳤습니다. 앞으로 개발하실 API는 다음과 같은 방식으로 확장성 있게 사용할 수 있을 것으로 보입니다.

지금 시간에 Model 쪽과 Template 쪽을 사용하지 않았는데요, 차차 다뤄보도록 하겠습니다.

감사합니다.

Additional

View를 작성하는데 있어서 2가지 방법이 있습니다. FBV 와 CBV입니다.

  • FBV는 Function-Based View의 약자로 ‘함수 기반 뷰’.
  • CBV는 Class-Based View의 약자로 ‘클래스 기반 뷰’.

views.py를 보시면, AccessTestView를 함수 형식으로 구성을 하였습니다. def 를 사용했기 때문이죠.

두 방식의 차이는 https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b 에서 자세히 확인할 수 있습니다.

FBV와 CBV 중 어떤 것을 선택해야하는지 정답은 없지만, 두가지를 다 써본 경험을 토대로 느낀 점을 말해보자면, 어플리케이션을 고도화 시키기 위해서는 CBV가 더 좋았습니다. Class 내에 list, create 등 지원되는 viewset을 장착시키고 2개 이상으로 구성할 수 있기 때문이였습니다.

FBV로 구성을 했을 시, 해당 함수는 하나의 API Method로 동작을 해야 했습니다. 가령 어노테이션으로 '@api_view(('GET',))'과 같은 것을 넣어서 GET으로만 사용을 했습니다.

728x90
반응형
Comments