[Django Ninja] 장고 닌자 도전기

이정진·2023년 12월 13일
0

Study

목록 보기
10/13
post-thumbnail

Django 기본

패턴

MTV 또는 MVT 패턴이라 부르며, 세부적으로는 M(Model) T(Template) V(View)를 의미한다. 여기서, View의 정의가 굉장히 헷갈리게 되었던 것 같다. 기본적으로 Java/Spring Boot에서의 MVC 패턴에서의 View와 동일한 역할일 것이라고 생각했으나, 오히려 Django에서의 View는 Controller와 매핑되며, 오히려 Template이 View를 의미한다는 것이 주의해야할 점이다.

Model: Django와 DB를 연결시켜주는 코드이며, DB Table과 매핑

  • models.py가 기본
  • 파이썬의 클래스 사용
  • 모든 Model 클래스는 django.db.models.Model 클래스를 상속
  • 각각의 모델 속성은 데이터베이스 필드를 의미

Template: 사용자에게 제공될 결과물의 형태를 의미

  • html을 사용하여 나타냄
  • templates 디렉토리 내의 html 파일 사용

View: 사용자의 요청을 받아 처리하는 웹 사이트의 로직을 가지는 코드

  • views.py를 기본값으로 사용
  • 파이썬의 함수(function)을 사용

구조

Project

  • __init__.py: 해당 파일이 위치한 디렉토리가 Python 패키지 디렉토리임을 명시
  • settings.py: Django 프로젝트 상의 모든 환경 설정을 관리하는 파일
  • urls.py: Django 프로젝트의 모든 URL을 관리하는 파일
  • wsgi.py: Django 프로젝트의 웹 서비스를 위한 호환 규격을 명시한 파일
  • manage.py: 웹 서버 실행, DB Model 적용을 위한 Migration 등 웹 애플리케이션 실행 및 관리를 전담하는 파일로, 서버 구동 시 해당 파일로 진행

App


(출처: 현로그 블로그, 2023. 12. 14)

  • admin.py: 관리자용 페이지를 설정하는 파일
  • apps.py: 앱의 정보가 작성된 파일 (별도로 추가 코드를 작성하지 않음)
  • models.py: 애플리케이션에서 사용하는 Model 클래스를 정의하는 파일 (앱에 사용하는 데이터의 구조를 정의하는 것)
  • tests.py: 프로젝트의 테스트 코드를 작성하는 파일
  • views.py: view함수들이 정의되는 곳. 각 페이지 안에서 실행될 함수 내용이 작성되는 파일로 앱의 기능, 로직을 작성한다.

Project와 App의 구분은 Setting.py의 유무로 구분할 수 있다.

Django 기본 환경 설정

Linux 가상환경 접속 방법

# 가상환경 생성
python3 -m venv {생성할 디렉토리명}

# 가상환경 접속
source ./bin/activate

# 가상환경 종료
deactivate

Q. 파이썬에서 가장환경이 왜 필요한가?

A. 프로젝트를 배포하면 원격 서버에 따로 패키지들을 설치해 줘야 하는데, 내가 이 프로젝트만을 위해서 설치한 패키지들이 어떤 건지 확인할 수 있다.

그리고 시간이 지남에 따라 패키지들이 업데이트되는데, 이것저것 업데이트를 하다 보면 서로 의존적인 패키지들 사이에 버전이 맞지 않아 호환이 되지 않는 경우들이 생긴다.

파이썬 버전 자체가 다른 환경인 경우도 있겠다. 프로젝트를 배포하려는 서버에는 파이썬 2만 설치된 경우도 있고, 2와 3이 같이 있는 경우도 있는 등 다양한 환경이다.

설치

  1. 가상환경 내 장고 닌자 패키지 설치
mkdir django_sample
cd django_sample
  1. 새로운 장고 프로젝트 시작
django-admin startproject {프로젝트명}

django-admin은 django 프로젝트를 관리하는 여러 기능을 가지고 있다.
위 코드에서 startproject는 Django 프로젝트의 기반 구조를 만드는 기능이다.

(오류) django-admin 모듈을 찾지 못할 경우, django-admin 별도 설치 진행

pip install django-admin
  1. 패키지 구조 확인

  1. 기본 코드 작성
# 파일명 urls.py
from django.contrib import admin
from django.urls import path
from ninja import NinjaAPI

api = NinjaAPI()

@api.get("/add")
def add(request, a: int, b: int):
    return {"result": a + b}


urlpatterns = [
    path('admin/', admin.site.urls),
    path("api/", api.urls),
]
  1. 서버 실행
python3 ./manage.py runserver

(주의) 마이그레이션 미적용

장고에서 마이그레이션을 진행하지 않았을 경우, 발생하는 오류이다.
장고는 ORM을 사용하기에 models.py와 클래스를 통해 DB 스키마를 생성하고 컨트롤하는데, 모델의 변경 내역을 DB 스키마에 적용시키지 않았을 때 위와 같은 오류가 발생합니다. 관련 블로그 글

python3 ./manage.py migrate

마이그레이션 명령어를 실행하면, 스키마에 적용되며 해당 오류가 발생하지 않습니다.

  1. 테스트

접속 URL: http://localhost:8000/api/add?a=1&b=2
결과: {"result": 3}

  1. Swagger UI (API 문서)

장고 닌자에서는 기본적으로 Swagger UI와 Redoc으로 API 문서화를 지원한다.
접속 URL: http://127.0.0.1:8000/api/docs

단, 기본 설정이 Swagger UI이므로 Redoc으로 수정하고자 한다면 하단의 방식으로 코드를 설정해야 한다.

api = NinjaAPI(docs=Redoc())

튜토리얼

파일 분리해서 api 연결하기

  1. api.py를 urls.py와 동일한 디렉토리에 생성 및 하단과 같이 코드 작성
from ninja import NinjaAPI

api = NinjaAPI()

@api.get("/hello")
def hello(request):
    return "Hello World"
  1. urls.py에서 import 진행
from django.contrib import admin
from django.urls import path
from .api import api

urlpatterns = [
    path('admin/', admin.site.urls),
    path("api/", api.urls),
]
  1. 서버 실행

레퍼런스

0개의 댓글