Python/Django Ninja

[Django Ninja] Django Ninja 프레임워크란? (with. Boiler Plate)

yubi5050 2023. 2. 26. 00:16

 

Django Ninja란?

Django Ninja - https://github.com/vitalik/django-ninja

 

GitHub - vitalik/django-ninja: 💨 Fast, Async-ready, Openapi, type hints based framework for building APIs

💨 Fast, Async-ready, Openapi, type hints based framework for building APIs - GitHub - vitalik/django-ninja: 💨 Fast, Async-ready, Openapi, type hints based framework for building APIs

github.com

Django 기반의 웹 프레임워크로 Python의 FastAPI프레임워크에 영향을 받아 개발되기 시작한 프레임워크로 최근까지도 꾸준히 업데이트가 되고 있으며 Python 3.6+ 이상의 환경에서 Pydantic과 비동기를 지원함

 

Ninja 장점 및 특징

Django의 장점 및 특징은 다음과 같습니다.

  • 가볍게 만들어 볼 수 있음.(Django의 기본 구성을 일부 따르지만 Flask나 Fast API와 유사한 구조를 가짐)
  • Pydantic을 wrapping한 Schema를 지원 하여 데이터 검증에 이점 (기존 DRF가 Validation이 느린 점을 보완)
  • Type hints가 지원되어, 보다 안정적인 코드를 짤 수 있음
  • API Docs 문서 자동 생성 (OpenAPI 형식을 따르며, FastAPI 처럼 Docs가 자동 지원되어 편한 API 테스트 가능)
  • Django의 ORM을 그대로 쉽게 사용 가능 (FastAPI는 ORM으로 SqlAlchemy를 사용해야 함)
  • Async를 지원함. (지금의 장고는 wsgi 기반에서 sync_to_async 등을 통해 비동기 처리 가능한 수준 링크)

 

Ninja BoilerPlate

경험적으로 작성한 Boilerplate는 다음과 같다.

 

App

- 분리 기준 : 서비스 따라

 

Router

- router 폴더 밑에는 여러 api.py들이 존재

- 하나의 앱에서는 여러 Router(api.py)를 가짐

- api.py를 분리하는 기준은 앱 내에서 논리적인 서비스 단위에 따라

- ex) accounts라는 app 밑에는 user_api.py 와 auth_api.py 가 존재 가능

- api.py 내부는 한 눈에 보일 수 있도록 최대한 간략하게 작성 (Service 모듈 이용)

 

Service

- 각 api 구현에 필요한 business login 코드가 존재하는 곳

- 주로 ORM을 통한 DB 작업이 이루어지는 곳

- Exception에 대한 커스텀 핸들링도 수행

 

Schema

- 들어온 Input에 대한 validation 수행

- validation 에러시 Exception에 대한 커스텀 핸들링도 수행

- 나가는 Output에 대한 형태 정의

- 검증 간 발생하는 DB 접근은 분리해도 되고, 분리하지 않아도 됨.

 

Test

- 테스트 코드 작성 (unit ~ E2E)

 

Common

- 프로젝트에서 공통적으로 사용되는 파일들 (필요에 따라 폴더 구조도 가능)

- enum : 개발에 필요한 상수 정의

- aws_service : 클라우드와 같은 aws와 관련 된 서비스

- decorator : 데코레이터 모음 (permission 체크 등)

- error handling : 발생하는 에러에 대해, 커스텀하여 내려주는 모듈 (발생하는 상태코드를 우리 서비스에 맞게 내려줄 수 있다.)

 

소스코드 : 링크

├── project/				// project 폴터
│   ├── __init__.py
│   ├── api.py			// url 분리 (router들)
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py			// 최초 url 진입점 (docs, admin, api 등)
│   └── wsgi.py
├── accounts/
│   ├── __init__.py
│   ├── apps.py
│   ├── router/			// router
│   │   ├── user_api.py
│   │   └── auth_api.py
│   ├── service/			// service (business logic)
│   │   ├── user_service.py
│   │   └── auth_service.py
│   ├── schema/			// schema - 필요에 따라 In, Out 스키마 분리
│   │   ├── user_schema.py
│   │   └── auth_schema.py
│   ├── test/			// test code
│   │   ├── test_user.py
│   │   └── test_auth.py
│   └── models.py			// models ORM
├── common/ 				// 개발에 일반적으로(공통적으로) 쓰이는 폴더
│   ├── enum.py
│   ├── aws_service.py
│   ├── decorator.py
│   └── error_handling.py
├── manage.py
├── Dockerfile
└── requirements.txt