DRF(Django Rest Framework) 개념 정리

.


Background

  필자는 최근 DRF로 구현된 API를 NestJS로 이전하는 작업을 진행하게 되었다. 이 과정에서 DRF의 구조와 개념을 명확히 이해하는 것이 중요하다고 판단했고, 이에 DRF에 대한 종합적인 정리의 필요성을 느꼈다. 이 게시글을 작성하면서, Django Rest Framework(이하 DRF)의 주요 개념과 구조를 이해하고자 한다.


Subject

DRF?

  Django를 기반으로 RESTful API를 쉽게 구축할 수 있게 해주는 강력한 도구다.

Key Concepts of DRF

1) Serializer

  Serializer는 복잡한 데이터 타입(예: QuerySet, 모델 인스턴스)을 JSON, XML 등의 형식으로 쉽게 변환할 수 있게 해준다. 또한 역직렬화를 통해 받은 데이터의 유효성을 검사하고 데이터베이스에 저장할 수 있게 해준다.

2) ViewSet

  ViewSet은 CRUD 작업을 위한 일반적인 뷰 로직을 제공한다. 개발자는 ViewSet을 사용함으로써 반복적인 코드 작성을 줄이고, 일관된 API 구조를 유지할 수 있다.

3) Router

  Router는 ViewSet과 함께 사용되어 URL 설정을 자동화한다. 이를 통해 코드의 양을 줄이고 URL 구조를 보다 더 체계적으로 관리할 수 있다.

4) Permission

  DRF는 다양한 권한 클래스를 제공하는데, 이를 통해 API에 대한 접근 제어를 세밀하게 할 수 있으며, 필요에 따라 커스텀 권한을 만들 수도 있다.

5) Authenticator

  DRF는 다양한 인증 방식을 지원하는데, 기본적인 세션 인증부터 토큰 기반 인증, JWT 인증 등을 쉽게 구현할 수 있다.

Structure of DRF

1) Request Processing Flow

URL Routing > View Logic > Serialization > Response
  1. URL Routing: 들어온 요청은 먼저 urls.py에 정의된 URL 패턴에 따라 적절한 뷰로 라우팅된다
  2. View Logic: 뷰에서는 요청을 처리하고 필요한 데이터를 가져온다.
  3. Serialization: 데이터는 Serializer를 통해 JSON 등의 형식으로 변환된다.
  4. Response: 직렬화된 데이터는 클라이언트에게 응답으로 전송된다.

2) Layer Structure

  1. Model Layer: 데이터베이스 스키마를 정의한다.
  2. Serialization Layer: 데이터의 변환과 유효성 검사를 담당한다.
  3. View Layer: 요청을 처리하고 응답을 생성한다.
  4. URL Layer: URL과 View를 매핑한다.

3) Component Relationships

  • Model and Serializer: Serializer는 모델 필드를 기반으로 정의될 수 있다.
  • Serializer and ViewSet: ViewSet은 Serializer를 사용하여 데이터를 직렬화/역직렬화한다.
  • ViewSet and Router: Router는 ViewSet의 메서드를 URL 패턴에 매핑한다.

4) Middleware

  DRF는 Django의 미들웨어 시스템을 활용하여, 인증 및 권한 검사 등이 요청 처리 전에 미들웨어에서 수행되도록 할 수 있다.


Summnary

  필자가 생각하는 두 프레임워크 간 시스템 이식을 위해서 가장 중요한 개념은 각 프레임워크의 Layer Structure를 이해하는 것이다. 아래는

#### DRF (Django Rest Framework)

- `Model Layer`: 데이터베이스 스키마 정의
- `Serialization Layer`: 데이터 변환 및 유효성 검사
- `View Layer`: 요청 처리 및 응답 생성
- `URL Layer`: URL과 뷰 매핑

#### NestJS

- `Controller Layer`: 요청 수신 및 클라이언트로의 응답 전송
- `Service Layer`: 비즈니스 로직 처리
- `Repository Layer`: 데이터 접근 및 조작
- `Entity Layer`: 데이터베이스 스키마 정의 (TypeORM 사용 시)
- `DTO Layer`: 데이터 전송 객체 정의 (데이터 유효성 검사 포함)
- `Module Layer`: 애플리케이션의 각 부분을 모듈로 구성

  NestJS의 계층 구조는 DRF보다 더 세분화되어 있다. 특히 Service Layer와 Repository Layer의 분리는 비즈니스 로직과 데이터 접근 로직을 명확히 구분하여 코드의 재사용성과 테스트 용이성을 높이고 있다.

  이렇게 DRF의 주요 개념들과 구조적 특성들을 잘 이해하면, NestJS로의 전환 과정에서도 유사한 패턴을 적용할 수 있을 것이다. 예를 들어, DRF의 Serializer는 NestJS의 DTO(Data Transfer Object)와 유사한 역할을 하며, ViewSet은 NestJS의 Controller + Service와 비슷한 개념으로 볼 수 있다.