티스토리 뷰

오늘은 API 서버를 만드는 첫 걸음. Django restframework 라는걸 배워보도록 하겠다.


시작하기 전에 잠깐 썰을 풀자면 내가 평생 JAVA만 하다가 처음 이 놈의 restframework 를 접했을때 내가 개발을 처음 시작했을 때가 생각이 날 정도로 멘탈이 탈탈 털렸다. 언어 자체가 어려운게 아니라 도저히 개념이 안잡히는거다. 기존의 JAVA나 C#.NET 을 했을 때 같은 전통적인 형태의 개발 언어만 다뤄본 나로써는 Django의 철학을 이해할 수가 없었다.

이해할 수 없는 자의 흔들리는 눈동자


책을 몇권 다시 읽고 블로그를 탐색하고 Django 가이드 문서들을 탐독하고서 이제야 그럭저럭 이해하는 중이다.


일단 Django는 기본적으로 Django 서버와 DB가 엮여있어야 하고 DB가 있는 줄도 모르게 데이터를 저장하고 수정하고 삭제할 수 있도록 만들어져있다. 그렇다보니 ORM이 기본으로 동작하도록 설계되어있고 ORM을 쓰지 않으려면 코드가 굉장하게 지저분함의 끝을 달릴 수 밖에 없게 만들어져있다.

이건 ORM의 태생적인 한계겠지만 프레임워크 자체가 기본적으로 ORM을 사용하도록 만들어져있다면 CMS나 ERP같은 복잡도 있는 시스템을 만들어야할 때 개발자의 멘탈이 털릴 수 밖에 없게된다.


하지만 단순한 홈페이지를 만들때는 이것만한게 없다. 일단 GenericView 클래스를 이용하는 경우 CRUD 기능을 구현하는데 10분도 걸리지 않을 뿐더러 복잡한 권한관리 같은 경우도 간단한 셋팅으로 정리해버릴 수 있다.

한마디로 양날의 검과 같은 프레임워크다. 그러니 Django를 도입하고자 할 때는 본인의 프로젝트가 어떤 성격의 프로젝트인지 잘 이해하고 도입하기를 바란다. 그냥 "Python == Easy" 공식을 들이밀면서 도입했다가는 나처럼 지난 3개월을 하얗게 불태워버릴 수도 있다.


본론으로 들어가자. 일단 Django를 이용해 API 서버를 만들때는 Restframework 라는 프레임 워크를 사용하면 된다.


지난 시간 만들어놨던 myhome 프로젝트에 있는 requirement 폴더의 base.txt 파일을 열어 아래와 같이 내용을 추가한다.


djangorestframework 라고 입력하고 저장한다. 그런 담에 "작업실행" 메뉴를 눌러 "Initialize For Local"을 실행한다.(잘 모르겠다면 여기를 클릭해 지난 포스트를 읽어보고 돌아오길 바란다)



그러면 djangorestframework 가 알아서 다운로드 되었음을 알 수 있다. 그런 뒤에 myhome 폴더의 settings 아래 base.py 파일을 열어 맨 아래로 내려 아래 이미지 처럼 주석을 해제한다.



그리고 중간에 INSTALLED_APPS에 'rest_framework'항목을 추가한다.


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework'
]


이렇게 설정하고 Django 서버를 기동한다.



서버가 기동되어도 뭐가 바뀐건지는 눈에 들어오지는 않는다.

제대로 된건가? 궁금하다면 앱을 만들어보자.


Django는 하나의 프로젝트 안에 여러개의 앱으로 구성되어 각 기능을 구현하는 방식으로 설계되어있다.



그래서 어떤 페이지(혹은 기능)을 구현하려면 일단 App을 생성해야 한다.


작업실행에서 Create App이라는 메뉴를 선택하자.



프로젝트 명은 myhome이니까 myhome이라고 적어주고 만들 앱은 음~ 그냥 HelloWorld 메시지 내려보낼 생각이라서 hello라고 이름을 지어주었다.


그러면 hello라고 폴더가 생겨났을 거다.


그 안에 보면 이런저런 파일들이 있을 텐데 신경써야할 파일의 역할을 설명해드리겠다.


admin.py 에 대해 설명하자면 Django는 admin페이지가 기본적으로 내장되어있는데 그 자동으로 생성되는 화면을 손대고 싶을때 내용을 작성하는 파일인것 같다. 프로젝트 진행하면서 사실 별 쓸일이 없었다.


apps.py 는 걍 이 앱이 무슨 앱인지 이름쓰는 용도 외엔 사용해본적이 없다.

models.py는 이 앱에서 사용하는 DB Table에 대한 모델 클래스를 저장하는 파일이다. 프로젝트 진행하면서 겁나 열어서 사용하게 된다.

test.py는 TDD(Test Driven Development)방식의 개발방법론을 위하여 테스트 시나리오를 코딩해 테스트를 진행하는 파일이다.

views.py는 요청과 응답을 처리하는 비지니스 처리를 위한 파일이다.


여기서 주로 수정하고 작성하는 파일은 view.py랑 model.py 파일이다. 그리고 여기에 serializers.py 도 하나 만들어야하는데 일단 오늘은 hello,world 를 화면에 찍어봐야하니까 나중에 알려주겠다.


자, 그러면 일단 App을 만들었으니깐 myhome/settings/base.py 파일을 열고 INSTALLED_APPS 항목에 방금만든 App의 이름을 입력해준다.


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'hello.apps.HelloConfig'
]


이렇게 등록해야 App을 이용할 수가 있다.


그리고 hello폴더의 view.py 파일을 열어보자.

내용에 뭐가 없는데 안에 아래와 같이 클래스 하나를 추가하도록 하자.


from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response    import Response


class HelloWorldView(APIView):
    def get(self, request):
        data = {}
        data['message'] = "Hello,World";

        return Response(data = data)


이렇게 클래스를 만들고 get 함수를 작성했으면 hello 앱 폴더 안에 urls.py 파일을 만든다.


그리고 이 파일안에 아래와 같이 코딩한다.


from django.conf.urls   import url
from .views import HelloWorldView


urlpatterns = [
    url(r'^hello/world/$', HelloWorldView.as_view())
]

이제 거의 다 되었다. 조금 만 더 힘내서 myhome 안에 있는 urls.py 파일을 열어 아래와 같이 수정하자.



"""myhome URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/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
from django.conf.urls import include, url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'', include('hello.urls')),
]


이렇게 해준다음에 "run server" 작업을 실행해본다. 그리고 브라우저에서 "localhost:8000/hello/world"에 접속하자.



요런 화면이 등장하게 될거다. 그렇다면 Postman이라는 소프트 웨어로 접속해 보자.



정상적으로 잘 작동한다.


이제 다음시간에는 Database와 연동해서 Hello, World를 출력해보도록 하자.


오늘은 여기까지. 안녕!


댓글
댓글쓰기 폼