Restful API를 만들기 위한 Django 기본 내용

명훈·2023년 9월 13일
0

Android-Server-DB

목록 보기
2/2
post-thumbnail
  • 이전 작업 정리
    • AWS 서버 인스턴스(Ubuntu) 생성
    • MySql 설치 및 ip통한 외부 접근 허용 설정
    • 로컬에서 SQL 접근 환경 설정 : DataGrip - 서버 MySql 연결

  • 작업 내용
    • 데이터베이스와 안드로이드가 상호작용하기 위한 Restful API를 Django를 통해 생성하기 위해서 기본적인 내용을 정리하고 환경을 설정

웹 개발의 관점이라기 보다는 안드로이드에서 서버의 데이터베이스를 사용하기 위하여 구축하는 서버를 사용하는 입장에서 내용을 정리해보았다.

window OS에서 PyCharm 프로(학생 라이센스) 버전을 사용하기 때문에, 복잡한 초기 설정 작업이 일부 자동으로 생성된 부분이 있다는 점을 참고..!


PyCharm 설치

  • 파이참(PyCharm)은 파이썬 개발에 가장 널리 사용되는 통합 개발 환경(IDE, Integrated Development Environment) 또는 개발 도구
  • 이전에 설치한 DataGrip을 개발한 JetBrains에서 파이썬 개발 환경을 제공하고 있다길래 사용해보았음. UI가 깔끔하고 이뻐서..
    학생 계정으로 무료 사용하는 방법

Django introduction

1. Django 기본 패턴(MVT 패턴)

Django 프레임워크에서는 크게 세 가지의 구성 요소가 있다. 이를 MVT 구조라고 하고 아래와 같은 구성으로 되어있다.

1) Model : 데이터베이스 정의
모델은 사용할 데이터에 대한 정의를 담고있는 클래스다


2) View : 로직 정의
Django에서 뷰는 함수 또는 클래스의 메소드로 작성이 되고, 웹 요청을 받고 응답을 반환해준다. 다양한 형태의 응답 데이터를 만들어 내기 위한 로직을 뷰에 작성하는 것으로, 보통 view.py 파일에 작성하긴 하지만, 파이썬 경로에 있는 다른 파일로 작성해도 무방하긴 하다.


3) Template : 화면 정의
장고가 클라이언트에 반환하는 최종 응답은 HTML 텍스트인데, 개발자가 작성한 *.html 파일(템플릿 파일)을 HTML 텍스트 파일로 변환하여 클라이언트에 보내주게 된다. 즉, 사용자에게 보여줄 인터페이스를 구성하는 클래스다.


4) URLonf : URL 정의
클라이언트로부터 받은 요청에 들어있는 URL이 urls.py 파일에 정의된 URL패턴과 매칭되는지를 분석한다. 아래의 코드처럼, urls.py 파일에 URL과 View를 매핑하는(URL/뷰 매핑) 코드를 작성해준다.

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),
]

2. Django : 객체 관계 매핑(ORM)

ORM은 Object Relational Mapping의 줄임말로, 객체(OOP)와 관계형데이터베이스와 연결하는 시스템을 말한다. 간단하게 말하면 데이터베이스 프로그램인 MySql 등을 직접 켜서 사용자가 데이터베이스 구성을 하지 않아도, 장고의 model.py 등의 코드를 작성해서 클래스 내부에서 진행할 수 있는 기능이다.
DBMS 자체에 대해 시간을 소요하지 않게되기 때문에 편하고, 비즈니스 로직에 집중하면 된다는 장점이 있지만, 복잡한 시스템에서는 ORM으로만은 구현하기 어려운 경우도 있을 수 있다.

보다 자세한 설명 페이지 1
보다 자세한 설명 페이지 2

3. Elegant URL 설계

말그대로 멋진 URL 설계라는 뜻으로, urls.py 파일을 통해 정규표현식을 사용해서 복잡한 URL을 표현할 수도 있고, 어떤 URL에 대하여 원하는 python 함수를 1:1로 대응시킬 수 있도록 짜여있다. 즉, 특정 URL로 들어가면 만들어둔 특정 함수가 실행되도록 하는 방식이다.

4. Django App

Django App은 python의 패키지 중 하나인데, 전체 프로젝트에서도 여러가지 기능별로 묶여지는 부분들이 있는데 이를 그냥 한 장소에서만 하는 것은 매우 복잡하고 어지럽다 볼 수 있다. 그래서 몇 개의 웹 어플리케이션들로 나누어서 관리를 하는 것이 일반적이다. 이러한 여러 app들을 전반적인 설정 파일들과 함께 묶어둔 것이 하나의 프로젝트인 것이다.

각 앱들은 독자적으로 model, view, url 파일 등을 갖게된다. 앱을 생성하는 코드를 terminal이나 cmd 등의 명령 프롬프트에 입력하면 관련 파일들과 함께 앱 폴더가 프로젝트 폴더 내부에 생성되게 된다. 자세한 내용은 아래의 진행 과정에 추가하였다.


PyCharm에서 Django 환경 구축

1. Django 프로젝트 생성

  • PyCharm을 프로버전으로 선택하면 아래처럼 처음부터 어떤 프로젝트를 만들 것인지 간단하게 생성이 가능하다
  • 일반 커뮤니티 버전은 Pure Python 버전으로만 만들어지고, 그 안에서 생성을 또 해야한다
  • HanDtx를 만들기 위해서 Django 프로젝트니까 프로젝트이름은 hanDtxPrototype으로 설정
  • 가상환경을 따로 만드는 이유
    • 기본적으로 전체 프로그램을 구현하기 위한 패키지들은 하나의 프로젝트를 구현하는 것에 모두 사용되지는 않을 수 있음
    • 그렇다면 어떻게 보면 한 프로젝트를 만드는데 모든 패키지를 다 사용하는 것은 자원 낭비
    • 그래서 그 프로젝트를 생성하기 위해서 필요한 패키지만을 사용할 수 있도록 프로젝트마다 별도의 가상환경을 만들어 진행하는 경우가 많음
    • 물론 그냥 없이 해도 되는데 좋지 않을 수 있음

기본적으로 Django를 설치 후 문제가 발생하지 않았다면, localhost(127.0.0.1)의 8000번 포트로 브라우저 창에서 접근하면 아래와 같은 화면이 나타나고, urls.py에 기본으로 적혀있는 path를 추가로 입력하면 로그인 창같은 화면이 나온다.

2. Django 프로젝트 setting.py 구성에 대한 지식

장고 프레임워크의 모든 개발환경 설정은 setting.py 파일에서 설정한다. setting.py 파일에서 로그 설정, app 등록, templates 설정, DB 설정, 다국어 및 지역 시간 설정, 정적파일 설정 등을 종합적으로 관리한다.

1) 로그 설정

기본으로 True로 설정되어 있어서 개발할 때, 로그를 지속적으로 남기게 된다. 운영시에는 꼭 False로 변경을 해주어야 한다고 한다.

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

2) App 등록

생성한 App들을 등록해주어야 한다. 앞서 말한 것처럼 하나의 프로젝트에는 여러 App 들로 구성되어 있고, 이러한 App들에 기반하여 프로젝트가 구동된다. 기본적으로 생성되는 App들에 더하여 생성하게 될 앱을 INSTALLED_APPS 부분에 등록해준다.

# Application definition

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "hanDtxPrototypeApp",
]

3) Templates 설정

공통적으로 들어가는 html 코드를 관리하기 위한 확장형 template들의 경로를 설정할 수 있다.

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [os.path.join(BASE_DIR, 'templates')],
        ,
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]

4) DB 설정

앞서 언급한 ORM 기능이 적용되는 대상을 설정한다고 볼 수 있다. 기본적으로는 sqlite를 사용하게 되고, 별도로 이후에 원하는 데이터베이스로 변경해줄 수 있다.

# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

5) 정적파일 설정

CSS, JavaScript, Images와 같은 정적 파일 경로를 설정해준다.

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = "static/"

6) Django 접근 허용 호스트 ip 설정

ALLOWED_HOSTS 옵션에 해당 Django 프로젝트에 접근할 수 있는 host ip들을 명시할 수 있다. "*"로 설정하면 모든 ip에 대해 허용한다.

ALLOWED_HOSTS = ['*']

3. Django 프로젝트 setting.py 설정 작업

1) template 엔진 비사용 설정

각 구성요소의 내용을 확인해보면 알 수 있지만, 모바일 앱과 데이터베이스를 사용하기 위한 서버를 연결함에 있어서 template은 구현하지 않아도 된다는 것을 알 수 있다. 즉, Django를 사용하여 API서버를 개발하고 웹 페이지 렌더링이 필요하지 않는 나의 상황에서는 template 작성없이 Django를 설정할 수 있다. setting.py 의 tempates 부분의 'DIRS'를 공백으로 바꾸어 설정해주어 template 엔진을 사용하지 않도록 설정한다.

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

2) 언어 및 시간 설정

3) REST

profile
댕댕이 라이프

0개의 댓글