장고는 파이썬 기반의 하이레벨 웹 프레임워크다. 꽤 오랫동안 사용되기도 했고.. 매우 안정적이기도 하고.. 한번 사용하면 개발속도가 엄청 빠르기도 하고.. 이미 나와있는 자료들도 많아서 배우기 쉬울 것이다.

이 글은 아래와 같은 사람들이 보면 좋을 것 같다!

  1. 프론트 개발자인데 Firebase와 같은 DBaaS(DB as a Service) 플렛폼 사용할 때
  2. 장고 개발자인데 최근에 React/Angular 또는 모바일 앱을 사용하려 할 때
  3. 프론트엔드 시작하는 개발자인데 백엔드 개발에 어려움을 겪고 있을 때
  4. 성숙한 프레임 워크를 사용하여 백엔드 서비스를 구축하고 싶을 때

1. 왜 Django를 Angular, React 또는 Mobile SDK와 함께 사용하는 것이 간단하지 않을까?

장고는 Full Stack 웹 프레임 워크로,

자체 ORM, 템플릿 엔진 등이 포함되어 있으며 전체 application이 단일 서비스로 실행되도록 제작되었다.

 

반면 프론트엔드 프레임워크 또는 모바일 SDK를 사용하는 경우

클라이언트/프론트 엔드가 백엔드에서 완전히 분리되도록 설계되어있다.

 

2. 그럼 굳이 왜 장고를 사용하려 하는거지?

프론트엔드와 백엔드간의 REST 기반의 통신 아키텍쳐로 완전한 Decoupling을 용이하게 할 수 있기 때문!

장고의 REST 프레임워크는 이전 포스팅에서 소개한 바가 있다.

 

[Django/장고] DRF(Django Rest Framework)란

RESTful이란 RESTful이란 Representational State Transfer의 줄임말이다. 먼저 REST에 대해서 소개를 하자면, http의 url과 http method(GET, POST, PUT, DELETE)를 사용해서 API 가독성을 높인 구조화된 시스템..

butter-shower.tistory.com

 

그래서 제안된 아키텍쳐의 그림은 아래와 같다! 

Request를 HTTP 프로토콜로 하고 response는 JSON 형태로! Serializer와 API view가 필요하다.


3. 그래서 어떻게 모바일 백엔드를..?

백엔드 개발 순서가 따로 있는건 아니지만 추천을 한다면 먼저 모델을 개발하고(models.py), 그 다음에 seralizer.py, urls.py, views.py 순서로 하면 좋은 것 같다.

django-admin startapp (앱 이름) 명령어를 통해 앱을 생성하자. 모델은 원래 유저를 써보자.

메인 프로젝트 이름있는 폴더 안에서 seralizer.py를 생성하자.

(1) serializer.py 생성

#(앱이름)/serializer.py
 
from rest_framework import serializers
from django.contrib.auth.models import User
 
class UserSerializer(serializer.ModelSerializer):
	class Meta:
    	model = User
        fields = ('url', 'username', 'email')

원래 있던 유저의 정보를 serailize 하는 것이다!

필드는 직접 설정할 수도 있고, 모든 필드를 불러오고 싶다면 fields =  '__all__' 로 하면 된다.

 

(2) urls.py를 설정하자

#(프로젝트폴더이름)/urls.py
 
from django.urls import path
from user.views import fetch_user
 
urlpatterns = [
	...
    path('fetch_user/', fetch_user),
]

 

(3) views.py를 작성하자 (젤 중요!!)

#(앱이름)/views.py
 
from django.contrib.auth.models import User
from rest_framework.decorators import api_view
from .serializer import UserSerializer
from rest_framework.response import Response
 
@api_view(['get'])
def fetch_user(request):
	#fetch all user objects
    users = User.objects.all()
    serializer = UserSerializer(users, many=True)
    
    #return Response using rest_framework's response
    return Response(seralizer.data)

유저 정보를 받아오는 fetch_user 함수를 작성한 모습이다.

request가 들어오면 리턴하는 형식이다. 이 예시는 GET만 허용한다. (POST 안됨)

 

위의 serializer.py에서 만든 UesrSerializer를 통해 직렬화를 하고, many=True를 통해 잠재적으로 둘 이상의 객체가 있음을 알린다. api_view 장고 rest 프레임 워크에서 제공하는 것으로, 이쁘게 보여주는 화면같은거다.

 

REST 프레임워크에서 Response를 import해와서 JSON 형식으로 응답하도록 했다.

응답은 serializer.data로 모든 유저 객체 정보를 보여주도록 설정했다.

 

(4) 실행시켜보자

python manage.py runserver 를 터미널에서 실행시키고 웹브라우저로 http://localhost:8000/fetch_user 를 들어가면!

 

이렇게 에러가 뜬다 ㅎㅎ views.py의 serializer 부분을 아래와 같이 수정하자.

serializer = UserSerializer(users, context = {'request' : request}, many = True)

그리고 다시 들어가보면 잘 된당

굳~~

이제 각자의 프론트엔드에서 개발을 할 때 http://localhost:8000/fetch_user 로 리퀘스트를 하면 백엔드와 정보를 주고받을 수 있다. 챱챱


출처

https://butter-shower.tistory.com/52?category=718374

'Django > TIL etc' 카테고리의 다른 글

파이썬 패키지 관리툴 poetry 소개  (0) 2022.01.21
Poetry 와 장고 프로젝트  (0) 2022.01.21
Django REST Framework 튜토리얼  (0) 2022.01.20
MVC 패턴이 뭐야?  (0) 2022.01.20
Django REST Framework 가 뭐야?  (0) 2022.01.20

https://www.django-rest-framework.org/tutorial/quickstart/

 

Quickstart - Django REST framework

We're going to create a simple API to allow admin users to view and edit the users and groups in the system. Create a new Django project named tutorial, then start a new app called quickstart. # Create the project directory mkdir tutorial cd tutorial # Cre

www.django-rest-framework.org

장고 REST 프레임워크 튜토리얼 문서를 따라하면서 익혀보도록 하자.


1. 프로젝트 만들기

새로운 장고 프로젝트를 만들고(rest_tutorial), 새로운 앱을 만들자. (quick start)

$ django-admin startproject tutorial
$ cd tutorial
$ django-admin startapp quickstart

 

그리고 django REST Framework를 설치하는 것도 잊지 말자.

$ pip install djangorestframework

 

이제 데이터베이스를 다시 처음으로 초기화하고 슈퍼 유저를 만들자

$ python manage.py migrate
$ python manage.py createsuperuser

 

2. Serializer 생성하기

먼저 serializer를 정의하자.

이 전에 포스팅에도 나와있는데, serialize를 한다는 것은 JSON이나 XML 파일 등으로 바꾸어 주는 것을 말한다.

tutorial/quickstart/serializers.py 를 생성해 아래의 코드 내용을 넣자.

#tutorial/quickstart/serializers.py
 
from django.contrib.auth.models import User, Group
from rest_framework import serializers
 
 
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')
 
 
class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

하이퍼 링크를 하는 HyperlinkedModelSerializer를 사용했는데, 다른 것들도 다 사용할 수 있다.

근데 hyperlink를하는게 좋은 RESTful 디자인이라고 한다.

 

3. Views.py 작성

그 다음엔 뷰를 작성해보도록 하자.

# tutorial/quickstart/views.py
 
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer
 
 
class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
 
 
class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

ViewSet을 사용해서 편하게 작성할 수 있다.

(django rest framework가 제공해줌. 예쁘기도 하고 편하기도 하다.)

 

4. urls.py 작성하기

사실 혼자서 따라할때 여기가 자꾸 어디 urls.py인지 헷갈렸다.. tutorial/tutorial/urls.py 에 작성해야한다.

# tutorial/tutorial/urls.py
 
from django.contrib import admin
from django.urls import include, path
from rest_framework import routers
from quickstart import views 	#이 부분 수정함
 
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
 
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('admin/', admin.site.urls),
]

우리는 위에서 view 대신에 viewset을 사용해서 자동적으로 URLconf를 우리의 API에 생성할 수 있다.

그래서 그냥 라우터 클래스에 등록해주기만 하면 끝!

또, API URL들을 기본 제공하는 기능보다 더 추가하고싶다면 URL conf를 명시해주면 된다.

마지막으로, 로그인 로그아웃 디폴트를 추가해주었는데, 선택 사항이지만 매우 유용해서 추가했다. 굳~

 

5. settings.py 손보기

tutorial/tutorial/settings,.py 의 파일을 손보자. 아래의 코드 내용을 settings.py에 붙여넣어준다.

# in tutorial/tutorial/settings.py
 
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

 

그리고 INSTALLED_APPS 부분에도 'rest_framework'를 추가해준다.

# in tutorial/tutorial/settings.py
 
INSTALLED_APPS = [
	...
    'rest_framework',    # need to add
]

 

6. 실행

이제 수정한 파일들을 수정하도록 하자. 먼저 서버를 돌리자.

$ python manage.py runserver

 

웹 브라우저로 들어가보면 아래와 같은 결과가 나올 것이다.

DRF 실행 결과


출처

https://butter-shower.tistory.com/51?category=718374

'Django > TIL etc' 카테고리의 다른 글

파이썬 패키지 관리툴 poetry 소개  (0) 2022.01.21
Poetry 와 장고 프로젝트  (0) 2022.01.21
모바일 앱을 위한 장고  (0) 2022.01.20
MVC 패턴이 뭐야?  (0) 2022.01.20
Django REST Framework 가 뭐야?  (0) 2022.01.20
from django.http import HttpResponse
import datetime
 
def current_datetime(request):
	now = datetime.datetime.now();
    html = "<html><body>It is now %s</body></html>" % now
    return HttpResponse(html)

MVT 패턴이란

장고 프레임워크에서는 View를 Template, Controller는 View라고 표현하며, MVC를 MVT 패턴이라고 한다.

- 모델은 데이터 베이스에 저장되는 데이터를 의미하는 것이고,

- 뷰는 실질적으로 프로그램 로직이 동작하여 데이터를 가져오고 적절하게 처리한 결과를 템플릿에 전달하는 역할을 수행

- 템플릿은 사용자에게 보여지는 UI부분을 뜻한다.

 

장고의 MVT 패턴

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

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

1. Model - 데이터베이스 정의

모델은 사용할 데이터에 대한 정의를 담고있는 클래스다.


2. URLconf - URL 정의

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

파이썬의 URL 정의 방식은 전통적인 자바나 PHP 계열의 URL보다 직관적이고 이해하기가 쉽다. 그래서 이러한 방식을 Elegent URL (우아한?! URL)이라고 부른다. URL을 정의하기 위해서는 아래 예제처럼 urls.py 파일에 URL과 처리함수 (뷰)르 매핑하는 파이썬 코드를 작성하면 된다. 이러한 URL/뷰 매핑을 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),
]

위의 예시에서 article/2003 부분이 URL이고 views.special_case_2003 부분이 처리함수(뷰)이다.

 

2.1 장고에서 URL을 분석하는 순서

웹 클라이언트가 웹 서버에 페이지 요청시, 장고에서 URL을 분석하는 순서를 간단히 요약하면 아래와 같다.

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

2.2 Path Converter

위의 코드 예제를 보면 URL 패턴을 정의할 때 int:year 처럼 꺾쇠를 사용하는 부분이 있다. 이 꺾쇠 부분을 장고에서는 Path converter라고 부르는데, 이는 URL 패턴의 일부 문자열을 추출하기 위한 것이며, type:name 형식으로 사용한다.

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

 

2.3 URL 패턴에서의 정규표현식 (regular expression)

URL 패턴에 정규표현식을 사용하면 URL을 좀 더 세밀하게 다룰 수 있다. 예를 들자면 아래와 같다.

from django.urls import path, re_path
 
from . import views
 
urlpatterns = [
    path('article/2003/', views.special_case_2003),
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[₩w-]+/$', views.article_detail)   
]

path() 함수에서의 int:year 부분이 re_path() 함수에서는 (?P[0-9]{4}) 처럼 정규표현식으로 사용하면서,

모든 정수가 아니라 0-9로 이뤄진 4자리 숫자만 매치되도록 한정하고 있다.

 

보통은 path() 함수를 많이 사용하고, URL을 통해 좀 더 정교하게 정의하고자 할때는 re_path() 함수와 정규표현식을 사용한다. 정규표현식에 사용되는 문자의 의미는 아래와 같다.


3. View - 로직 정의

일반적으로 뷰는 웹 요청을 받아서 데이터 베이스 접속 등 해당 어플리케이션의 로직에 맞는 처리를 하고,

그 결과 데이터를 HTML로 변환하기 위하여 템플릿 처리를 한 후에

최종 HTML로 된 응답 데이터를 웹 클라이언트로 반환하는 역할을 한다.

 

장고에서 뷰는 함수 또는 클래스의 메소드로 작성되며, 웹 요청을 받고 응답을 반환해준다.

다양한 형태의 응답 데이터를 만들어 내기 위한 로직을 뷰에 작성하는 것인데,

이러한 뷰는 보통 views.py 파일에 작성하지만 원한다면 다른 파일에 작성해도 무방하다.

다만 파이썬 경로에 있는 파일이어야 장고가 찾을 수 있다.

간단한 예시로, 현재 날짜와 시간을 HTML로 반환해주는 뷰를 작성해보자.

from django.http import HttpResponse
import datetime
 
def current_datetime(request):
	now = datetime.datetime.now();
    	html = "<html><body>It is now %s</body></html>" % now
    	return HttpResponse(html)

이 경우 클래스가 아니라 함수로 뷰를 작성한 예시이다.

뷰 함수는 첫번째 인자로 HttpRequest 객체를 받는다.

그리고 필요한 처리를 한 후에 최종적으로 HttpResponse 객체를 반환해준다.

 

위의 예시에서는 HTML코드를 뷰 함수 내에 직접 사용했지만, 보통은 별도의 탬플릿 파일에 HTML 코드를 작성한다.

즉, 뷰는 별도로 작성된 템플릿 파일을 해석해서 HTML 코드를 생성하고 이를 HttpResponse 객체에 담아서 클라이언트에게 응답한다.


4. Template - 화면 UI 정의

장고가 클라이언트에 반환하는 최종 응답은 HTML 텍스트다.

개발자가 응답에 사용할 *.html 파일을 작성하면,

장고는 이를 해석해서 최종 HTML 텍스트 응답을 생성하고, 이를 클라이언트에게 보내준다.

 

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

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

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

장고는 그에 맞는 위치에 템플릿 파일이 위치해야 템플릿 파일을 찾을 수 있다.

 

장고에서 템플릿 파일을 찾을 때는 TEMPLATE_DIRS 및 INSTALLED_APPS에서 지정된 앱의 디렉토리를 검색한다.

이 항목들은 프로젝트 설정 파일인 settings.py에 정의되어 있다.

여러개의 디렉토리를 지정할 수 있는데, 지정된 순서대로 디렉토리를 검색하여 템플릿 파일을 찾는다.


5. MVT 코딩 순서

무엇을 먼저 코딩해야하는지는 정해진 것이 없다.

UI 화면을 생각하면서 로직을 풀어나가는 것이 쉬울 때에는 보통 템플릿을 먼저 코딩한다.

 

내가 본 책에서는.. 아래 순서와 같이 코딩을 한다고 했다.

  1. 프로젝트 뼈대 만들기 : 프로젝트 및 앱 개발에 필요한 디렉토리와 파일 생성
  2. Model 코딩하기 : 테이블 관련 사항을 개발(models.py, admin.py 파일)
  3. URLconf 코딩하기 : URL 및 뷰 매핑 관계를 정의 (urls.py 파일)
  4. Template 코딩하기 : 화면 UI 개발 (templates/디렉토리 하위의 *.html 파일들)
  5. View 코딩하기 : 어플리케이션 로직 개발 (views.py 파일) 

출처

https://butter-shower.tistory.com/49?category=718374

MVC 패턴

디자인 패턴 중 하나로, Model, View, Controller의 약자이다.

 

디자인 패턴 :

어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여 특정한 '규약'을 통해 쉽게 쓸 수 있는 형태로 만든 것을 말한다.

라이브러리나 프레임워크가 그에 따른 예. 결국 좀 더 쉽고 편리하게 사용할 수 있게 만든 특정한 방법을 뜻함.

MVC design pattern

하나의 어플리케이션, 프로젝트를 구성할 때 그 구성요소를 세 가지 역할(model, view, controller)로 구분한 패턴이다.

이 패턴을 사용하면 사용자 인터페이스로부터 비즈니스 로직을 분리하여 어플리케이션의 시각적인 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 어플리케이션을 만들 수 있다. 

  • Model : 어플리케이션의 정보(데이터)를 나타냄
  • View : 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타냄
  • Controller : 데이터와 비즈니스 로직 사이의 상호 동작을 관리함.

1. 모델, Model

어떤 동작을 수행하는 코드를 말한다. 사용자에게 어떻게 보일지 신경 쓰지 않아도 되는 모델은 순수 public 함수로만 이루어진다. 몇몇 함수들은 사용자의 질의(query)에 대해 상태 정보를 제공하고 나머지 함수들은 상태를 수정한다.

모델은 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보해야한다. 이와 같은 통보를 통해 뷰는 최신의 결과를 보여줄 수 있고, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가/제거/수정할 수 있다. 

2. 뷰, View

데이터 및 객체의 입력, 그리고 보여주는 출력을 담당함. 데이터를 기반으로 사용자들이 볼 수 있는 화면이다.

뷰는 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 읽어온다. 뷰는 모델이 가지고 있는 정보를 따로 저장해서는 안된다. 단지 읽어오기만 해야할 뿐! 변경이 일어나면 변경 통지에 대한 처리 방법을 구현해야 한다.

3. 컨트롤러, Controller

데이터와 사용자 인터페이스 요소들을 잇는 다리 역할을 한다. 즉, 사용자가 데이터를 출력하고 수정하는 것에 대한 '이벤트'들을 처리하는 부분을 뜻한다.

컨트롤러를 사용하여 모델의 상태를 바꾼다. 이 때 모델의 상태가 바뀌면 등록된 뷰에 자신의 상태가 바뀌었다는 것을 알리고 뷰는 거기에 맞게 사용자에게 모델의 상태를 보여준다.

 

왜 MVC 패턴을 사용해야 할까?

사용자가 보는 페이지, 데이터 처리 그리고 이 두가지를 중간에서 제어하는 컨트롤러 이 세 가지로 구성되는 하나의 어플리케이션을 만들면 각각 맡은 바에만 집중할 수 있게 된다. 서로 분리되어 각자의 역할에 집중할 수 있게끔 하여 개발을 하고 그렇게 어플리케이션을 만든다면 유지보수성, 확장성, 유연성 등이 증가하고 중복 코딩이라는 문제점 또한 사라진다.

'Django > TIL etc' 카테고리의 다른 글

파이썬 패키지 관리툴 poetry 소개  (0) 2022.01.21
Poetry 와 장고 프로젝트  (0) 2022.01.21
모바일 앱을 위한 장고  (0) 2022.01.20
Django REST Framework 튜토리얼  (0) 2022.01.20
Django REST Framework 가 뭐야?  (0) 2022.01.20

RESTful이란

RESTful이란 Representational State Transfer의 줄임말이다.

먼저 REST에 대해서 소개를 하자면, http의 url과 http method(GET, POST, PUT, DELETE)를 사용해서 API 가독성을 높인 구조화된 시스템 아키텍쳐(framework)라고 생각하면 된다.

하나의 URL로 우리는 최소 4가지의 HTTP method를 전송할 수 있다.

 

스마트폰이 등장하기 전 IT 기업들은 웹 페이지를 보여주는 웹서버만 구현하면 됬다.

그 웹 서버에서 DB 서버의 데이터도 읽어오고 사용자들이 글을 남기면 DB 서버에 저장까지 하는 기능을 모두 담당했다. 하지만 스마트폰이 출시되고, 어플리케이션의 등장으로 더이상 웹으로만 서비스를 제공하는 것에는 한계가 있었다.

 

따라서 HTML로 렌더링 하는 웹서버가 아닌, JSON 혹은 XML 과 같은 형식을 통해서 데이터를 다루는 별도의 API 서버가 필요했다. 스마트폰 어플과 웹에서 동일한 기능을 제공하는데 기존의 웹서버를 계속 사용하면 매번 HTML을 읽어서 해당 태그에 있는 정보를 찾아내는 일은 정말 미친짓이기 때문이다. (덜덜)

 

따라서 RESTful 아키텍쳐를 HTTP Method와 함께 사용해 웹, 데스크탑 앱, 스마트폰 어플들까지 하나의 API 서버를 생성할 수 있다.

Django 또한 View 클래스 자체가 RESTful 한 서버를 만들기에 최적인 프레임워크다.


장고 REST 프레임워크는 웹 API를 구축하기 위한 강력하고 유연한 툴킷입니다.

DRF(Django Rest Framework)란

Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리다.

 

Django REST framework를 사용하는 이유는 아래와 같다.

  • 웹 브라우저 API는 범용성이 크다. 개발을 쉽게 만들어준다.
  • 인증 정책에 OAuth1, OAuth2 를 위한 추가적인 패키지가 추가되어 있는 경우
  • 시리얼라이즈 기능을 제공해준다. (DB data -> JSON)
  • 문서화 및 커뮤니티 지원이 잘 되어있다.

Serializer 란

DRF의 가장 매력적인 기능으로는 Serializer가 있다.

Serializer란 말 그대로 직렬화하는 클래스로서, 사용자의 DB안에 사용자 프로필 사진, 이메일, 이름, 성별이 있다고 가정하면 사용자 모델 인스턴스를 JSON 형태 혹은 Dictionary 형태로 직렬화 할 수 있다.

 

예를 보면,

user = User(email="user@user.user", name="user", sex="Female", profile_image="user.png")
UserSerializer(user).data{
	"email" : "user@user.user",
    "name" : "user",
    "sex" : "female",
    "profile_image" : "user.png"
}

위와 같은 사용자가 있다면 DRF의 serializer를 통해 모델 인스턴스를 직렬화 할 수 있다.

실 사용시에는 만약 사용자 정보를 열람하는 URL이 /serializer/user/<user id>/가 있고 해당 View에는 user_id의 해당하는 모델 인스턴스의 정보를 리턴한다고 가정하자. 그렇게 되면 만약 우리가 /serializer/user/1/ 이라는 URL로 요청했을 시 user_id가 1인 사용자의 정보를 JSON 형태로 응답받을 수 있다.

이는 사용자 프로필 페이지에 접근했을 때 사용하는 View 라고 하면 사용자 페이지에 들어갈 때 마다 해당하는 사용자의 user_id만 URL에 입력해주게되면 각 사용자의 정보를 JSON 형태로 응답 받을 수 있을 것이다.

위와 같은 기능을 하는 Serializer를 ModelSerializer라고 부른다.

Django REST Framework 설치

pip install djangorestframework

위의 명령어를 터미널에서 실행시키자.

 

다음으로는 django settings.py 파일에서 INSTALL_APP 부분에 'rest_framework' 를 명시해주자.

INSTALL_APPS = [
	...
    'rest_framework', #add
]

참고한 블로그

https://yunhookim.tistory.com/7

 

DRF(Django Rest framework) 소개

DRF(Django Rest framework) 소개 DRF(Django Rest Framework, http://www.django-rest-framework.org)란 Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈 소스 라이브러리이다. RESTful..

yunhookim.tistory.com

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

'Django > TIL etc' 카테고리의 다른 글

파이썬 패키지 관리툴 poetry 소개  (0) 2022.01.21
Poetry 와 장고 프로젝트  (0) 2022.01.21
모바일 앱을 위한 장고  (0) 2022.01.20
Django REST Framework 튜토리얼  (0) 2022.01.20
MVC 패턴이 뭐야?  (0) 2022.01.20

path 가 뭐야?

 

#백준

 

문제

ACM-ICPC 인터넷 예선, Regional, 그리고 World Finals까지 이미 2회씩 진출해버린 kriii는 미련을 버리지 못하고 왠지 모르게 올해에도 파주 World Finals 준비 캠프에 참여했다.

대회를 뜰 줄 모르는 지박령 kriii를 위해서 격려의 문구를 출력해주자.

 

입력

본 문제는 입력이 없다.

 

출력

두 줄에 걸쳐 "강한친구 대한육군"을 한 줄에 한 번씩 출력한다.


코드

print("강한친구 대한육군")
print("강한친구 대한육군")

 

+ Recent posts