Django REST Framework를 사용하다 - 2

Python은 쉽고 빠른 매우 효율적인 프로그래밍 언어입니다.

Django는 Python을 활용하여 빠르고 쉽게 웹서비스를 만들 수 있도록 고안된 프레임워크입니다.

그중에서도 Django REST Framework(이하 DRF)는 Django를 활용하여 REST API를 구현하는데 필요한 다양한 기능들을 제공합니다.

이를 활용하여 Django로 REST API를 만들기 위한 사항들을 검토합니다.

DRF를 사용하기 위해 다음의 사항들을 먼저 검토해야 합니다.

  • Django 기본 사용법
  • Database 설정
  • Django ORM


Django 기본 사용법


아래의 내용을 Django를 CLI(Command-Line Interface)환경에서 사용하는 방법을 나타내고 있습니다.
하지만 좀 더 편리하고 사용자 친화적인 환경에서 Django 개발을 진행하고 싶다면 Jetbrain사에서 제공하는 PyCharm을 검토하십시오.

PyCharm을 활용한 Django 프로젝트 생성 및 어플리케이션 활용 방법은 아래의 글을 참조하세요.

링크

Django 프로젝트를 생성하고 어플리케이션을 설치 및 등록하는 방법을 알아봅니다.

프로젝트 생성하기

$ django-admin.py startproject [project 이름]

어플리케이션 생성하기

//프로젝트 폴더 안에서 수행한다
$ django-admin.py startapp [application 이름]

프로젝트와 어플리케이션을 생성하면 다음과 같은 디렉토리 구조를 확인할 수 있습니다.

.
./manage.py
./test_project
./test_project/__init__.py
./test_project/settings.py -> Django 프로젝트의 전체적인 설정을 합니다
./test_project/urls.py -> 사용자 요청시 어떻게 라우팅을 할 것인지 결정합니다
./test_project/wsgi.py -> Web Server Gateway Interface관련 설정을 합니다
./test_app
./test_app/__init__.py
./test_app/admin.py
./test_app/apps.py
./test_app/models.py -> 데이터베이스 연동을 위한 Model이 정의되어 있습니다
./test_app/tests.py
./test_app/views.py -> 사용자의 요청에 응답하기 위한 로직을 처리하는 View가 정의되어 있습니다
./test/app/migrations
./test_app/migrations/__init__.py


Project에서는 URL 처리, WSGI 세팅 그리고 설치된 어플리케이션 관리를 할 수 있습니다.

App은 실제로 개발이 이루어지는 곳입니다.

View에서 비즈니스 로직을 구현할 수 있습니다.

Models에서는 데이터베스와 연동되는 model을 구현합니다.
Model을 구현하는 것은 Object Relational Mapping(이하 ORM)을 한다고 할 수 있습니다.

직접 Model을 구현할 수도 있지만 Inspectdb를 활용하여 기존 데이터베이스의 테이블들을 Model화 시키는 것도 가능합니다.

만든 App이 정상적으로 작동하기 위해서는 Django에게 알려주어야 합니다.

프로젝트 디렉토리의 settings에 생성한 app을 등록해 주어야 합니다.

$ cd ./[project 디렉토리]
$ vi settings.pyINSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'test_app', <- 생성한 App의 이름을 적어줍니다.
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)


Database 설정

Django REST Framework 프로젝트 폴더의 setting.py에서 데이터베이스 연결 설정을 할 수 있습니다.

$ vi ./settings.py


DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase',
}
}

디폴트 데이터베이스로 위와 같이 설정이 되어 있습니다.

자신에게 맞는 데이터베이스 엔진, 데이터베이스 이름, 사용자, 비밀번호, 호스트 주소를 입력하면 그곳으로 연결할 수 있습니다.

저의 경우 AWS RDS에 MariaDB 데이터베이스를 운영하기 때문에 그곳으로 연결을 시도합니다.


공식사이트에서는 다음과 같은 템플릿을 제공합니다.

아래 템플릿을 참고하여 데이터베이스 설정을 변경하면 됩니다.

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}

DB엔진에는 다음과 같은 종류가 있습니다.

  • 'django.db.backends.postgresql'
  • 'django.db.backends.mysql'
  • 'django.db.backends.sqlite3'
  • 'django.db.backends.oracle'

위의 내용을 알맞게 채워넣습니다.

  • ENGINE → 위의 목록을 참조하여 알맞은 DB 엔진을 선택합니다.
  • NAME → 데이터베이스 이름을 선택합니다.
  • USER → 데이터베이스에 접근하는 사용자를 선택합니다.
  • PASSWORD → 데이터베이스 접근 시 비밀번호를 입력합니다.
  • HOST → 데이터베이스 주소를 입력합니다. AWS RDS의 경우 End Point를 입력합니다.
  • PORT → 데이터베이스 접속을 위한 Port를 입력합니다. Port는 반드시 개방되어 있어야 합니다.



Django에서 외부 Database에 연결하여 사용하기 위해서는 몇가지 설정이 필요합니다.

여기에서는 CentOS7 환경에서 AWS RDS의 MariaDB에 접속하는 방법을 살펴봅니다.

먼저, mysql-client를 설치합니다.

$ yum install mariadb-devel -y


만약 yum을 실행하는데 Keyboard Exception 에러가 발생한다면 그것은 Python 때문입니다.

$ ls -al /bin/python*

위 명령어를 통해 어떤 버전의 python이 /bin/python에 링크되어 있는지 확인하세요.
2.6이나 2.7버전대가 연결되어야 위의 에러가 발생하지 않습니다.
만약 3.5나 3.6버전이 연결되어있다면 링크를 제거하고 새롭게 링크를 걸어줍니다.

$ ln -s /bin/python2.7 /bin/python -> 2.x버전대가 python으로 링크되어야 yum 사용시 에러가 발생하지 않습니다.
$ ln -s /bin/python3.6 /bin/python3 -> 에러를 피하기 위해 python3로 링크를 걸어줍니다.


이제 pip로 mysql-client를 설치합니다.

$ pip install mysqlclient


완료되었으면 프로젝트 폴더에서 데이터베이스에 접근 및 사용하기 위한 적용 작업을 수행합니다.

$ python manage.py migrate


아래처럼 Migration이 완료되었습니다.




Model - Django ORM


Model은 여러분의 웹 어플리케이션에서 다룰 하나의 데이터 단위를 의미합니다.
어플리케이션 폴더내의 models.py에 이 부분이 정의됩니다.

쉽게 말해서, 데이터베이스에 저장될 테이블을 정의한다고 생각하면됩니다.

Model을 만들게 되면 Django에서는 알아서 설정한 데이터베이스에 테이블을 만듭니다.
이후 데이터 쓰기, 조회, 수정, 삭제시 데이터베이스에도 변경 내용어 반영됩니다.

Django에서는 Model이 바로 ORM(Object-relational Mapping)이라고 할 수 있습니다.

ORM은 기존 쿼리문을 작성하여 데이터베이스의 데이터를 조작하는 것을 넘어서기 위해 등장했습니다.
데이터베이스의 데이터를 객체화하여 사용하기 위한 개념입니다.
위처럼 데이터를 객체화하여 사용할 수 있다면 유지 보수면에서도 효율적이고 쓸데없는 코드양을 줄일 수 있습니다.

객체와 데이터베이스 테이블간에 연결(Mapping)이 필요합니다. ORM이 이 역할을 합니다.


Model을 구현하기 위해서는 먼저 어플리케이션 디렉토리내의 models.py를 오픈합니다.

$ vi [application root directory]/models.py


Person이라는 모델을 클래스 형식으로 구현합니다.

Model 클래스를 상속하는 것에 주의합니다.

from django.db import models

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

위의 모델을 구현하면 데이터베이스에는 아래와 같은 명령이 실행됩니다.

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


모델을 구현 후, 실제로 데이터베이스에 적용하기 위해서는 마이그레이션을 수행해야합니다.

$ python manage.py migrate

데이터베이스에 myapp_Person 테이블이 생성된 것을 확인할 수 있습니다.



위의 예에서는 Model의 구현을 통해 데이터베이스에 Model과 대응하는 테이블을 구현했습니다.
만약 기존에 테이블이 모두 갖춰져있는 데이터베이스를 보유한 경우는 어떻게할까요?

Django에서는 존재하는 데이터베이스를 분석해 Model을 자동으로 만들어주는 도구를 제공합니다.

inspectdb가 바로 그것입니다.

데이터베이스 연결이 모두 완료된 상태에서 아래의 명령어를 입력합니다.

$ python manage.py inspectdb > models.py

현재 디렉토리 위치에서 model.py가 생성된 것을 볼 수 있습니다.

열어보면 데이터베이스의 테이블들에 대응하는 model들이 생성된 것을 확인할 수 있습니다.


이제 생성된 models.py를 어플리케이션 폴더안에 넣습니다.

그리고 데이터베이스에 적용하는 명령을 수행합니다.

$ python manage.py migrate


작업 수행중 아래와 같은 에러를 만날 수 있습니다.





위의 에러는 Auto Increment 필드에 Primary Key 설정이 되어있지 않을 때 발생합니다.

inspectdb에서 Model을 만들 때 사용자가 field값을 Primary Key로 설정할 수 있기 때문에 Primary Key 지정을 하지 않았습니다.

이 때문에 위의 에러가 발생한 것입니다.

class Bizlink(models.Model):
biz_no = models.AutoField(primary_key=True)

따라서 위 처럼 해당 모델 클래스의 Field값에 primary key지정을 해주면 에러가 발생하지 않습니다.

댓글()