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
- URL Routing: 들어온 요청은 먼저
urls.py
에 정의된 URL 패턴에 따라 적절한 뷰로 라우팅된다 - View Logic: 뷰에서는 요청을 처리하고 필요한 데이터를 가져온다.
- Serialization: 데이터는 Serializer를 통해 JSON 등의 형식으로 변환된다.
- Response: 직렬화된 데이터는 클라이언트에게 응답으로 전송된다.
2) Layer Structure
- Model Layer: 데이터베이스 스키마를 정의한다.
- Serialization Layer: 데이터의 변환과 유효성 검사를 담당한다.
- View Layer: 요청을 처리하고 응답을 생성한다.
- 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
와 비슷한 개념으로 볼 수 있다.