ViewSet의 내부 동작 흐름: Router부터 Response까지
DRF ViewSet이 클라이언트 요청을 받아 처리하고 응답을 생성하는 전체 과정을 단계별로 설명
전체 흐름 개요
graph TD
A[클라이언트 요청] --> B[Django URL Resolver]
B --> C[DRF Router]
C --> D[ViewSet.as_view 메서드]
D --> E[APIView dispatch 메서드]
E --> F[액션 메서드 실행]
F --> G[Response 생성]
G --> H[렌더링]
H --> I[클라이언트 응답]Router: URL과 ViewSet 연결
router.register()가 ViewSet을 분석하여 URL 패턴을 자동 생성HTTP 메서드와 ViewSet 액션 메서드를 매핑
예:
GET /users/1/→retrieve액션,POST /users/→create액션
as_view(): ViewSet을 Django View로 변환
Django URL Dispatcher는 함수 형태의 View가 필요하지만 ViewSet은 클래스
as_view()가 HTTP 메서드-액션 매핑을 기반으로 새로운 View 함수를 동적 생성내부적으로
UserViewSet.as_view({'get': 'retrieve', 'put': 'update'})형태로 동작
dispatch(): APIView의 핵심 처리 과정
요청-응답 사이클을 관장하는 핵심 메서드로 다음 단계를 순차 실행:
initialize_request: Django HttpRequest를 DRF Request 객체로 래핑
perform_authentication: authentication_classes를 통한 사용자 인증
check_permissions: permission_classes를 통한 권한 검사
check_throttles: throttle_classes를 통한 요청량 제어
모든 검사를 통과해야 액션 메서드 호출
액션 메서드 실행
ModelViewSet의 경우 mixins에서 제공하는 기본 구현 사용:
get_object(): URL pk 값으로 객체 조회
get_serializer(): 시리얼라이저 인스턴스 생성
Response(): 직렬화된 데이터를 Response 객체로 반환
렌더링과 최종 응답
Content Negotiation: 클라이언트 Accept 헤더 확인
Renderer를 통해 데이터를 요청된 포맷(JSON 등)으로 변환
Django HttpResponse 객체 생성하여 클라이언트에 전달
실무 팁
self.action속성으로 현재 실행 중인 액션 확인 가능액션 메서드 직접 오버라이드보다는 헬퍼 메서드(
get_queryset,get_serializer_class등) 오버라이드 권장인증/권한 오류는 대부분 dispatch 단계에서 발생
@action데코레이터로 커스텀 엔드포인트 추가 가능
Last updated
