본문 바로가기
TIL _Today I Learned/2024.11

[DAY 87] Django REST Framework & 중간 프로젝트

by gamdong2 2024. 11. 21.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.11.21

📕 학습 목록

  • Django REST Framework 소개
  • Django REST Framework 구현
  • 네트워크 및 배경 지식

 

📗 기억할 내용

1. Django REST Framework 소개

1) Django와 DRF의 차이점

  • Django
    • 웹 개발을 위한 풀스택 프레임워크
    • 주로 HTML, 템플릿, 서버사이드 렌더링을 사용한 웹사이트 개발에 초점
    • API를 개발할 수 있는 기능도 제공하지만, 직접 요청과 응답 로직을 구현해야 하며 반복 작업이 많음
  • Django REST Framework
    • Django 위에서 동작하며 RESTful API를 쉽게 개발할 수 있도록 도와주는 라이브러리
    • Django의 핵심 기능인 ORM, views, forms 등을 활용하면서도 REST API 개발에 필요한 직렬화, 인증, 권한 관리 등 다양한 기능을 추가로 제공

2) Django만 사용할 때와 DRF를 사용할 때의 비교

  • Django로 API를 만드는 방식
    • 데이터를 JSON으로 변환하는 과정, 데이터 검증, 권한 관리를 직접 구현해야 함
from django.http import JsonResponse

def user_list(request):
    users = User.objects.all().values()  # QuerySet을 JSON으로 변환
    return JsonResponse(list(users), safe=False)
  • DRF로 API를 만드는 방식
    • serializers.py를 사용해 데이터 직렬화/역직렬화 과정을 쉽게 처리
    • 인증, 권한 관리, 데이터 검증 등은 DRF의 기본 기능으로 제공
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import User
from .serializers import UserSerializer

class UserListView(APIView):
    def get(self, request):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

 

3) DRF의 주요 기능

  1. Serializers: 데이터를 JSON으로 변환하거나, JSON 데이터를 검증 및 Python 객체로 변환
  2. APIView: API 요청(GET, POST 등)에 대한 처리를 쉽게 정의
  3. Authentication/Authorization: 기본 인증, 토큰 인증 등 다양한 인증 방식을 지원
  4. Browsable API: API를 브라우저에서 쉽게 테스트할 수 있는 UI 제공
  5. Pagination, Filtering: 데이터 페이징 처리 및 필터링을 쉽게 구현

 

4) API 와 REST API의 개념

  • API (Application Programming Interface)
    • 응용 프로그램 간 상호작용을 가능하게 하는 인터페이스
    • 데이터를 요청하거나 명령을 실행하도록 연결하는 역할
  • REST API
    • REST(Representational State Transfer) 아키텍처 스타일을 기반으로 설계된 API
    • 특징
      • 무상태성 (Stateless): 서버는 요청 간의 상태를 유지하지 않음
      • 클라이언트-서버 구조: 클라이언트와 서버가 독립적으로 작동
      • 자원 기반 설계: URI를 통해 자원(Resource)을 명시
  일반 API REST API
설계 원칙 특정 설계 원칙 없이 자유롭게 설계됨 REST 아키텍처 스타일을 따름
프로토콜 다양한 프로토콜 사용 (HTTP, FTP, SMTP 등) HTTP 프로토콜 사용
자원
접근 방식
작업 방식(API마다 다름)이 명확하지 않을 수 있음 URL로 자원을 명확히 식별, HTTP 메서드로 작업 정의
데이터 포맷 XML, JSON, CSV 등 다양한 포맷 사용 가능 주로 JSON
상태 관리 Stateful(상태 저장 가능) 방식도 허용 Stateless(상태 비저장)
사용 사례 SOAP API, RPC(Remote Procedure Call) 등 Django REST Framework, Flask REST API, AWS API Gateway 등

 

5) HTTP 메서드와 RESTful 설계 원칙

  • 주요 HTTP 메서드
    • GET: 데이터 조회
    • POST: 데이터 생성
    • PUT/PATCH: 데이터 수정
    • DELETE: 데이터 삭제
  • RESTful 설계 원칙
    • 자원의 표현: URI는 자원을 나타냄     Ex: /api/users/1
    • 명확한 상태: 각 요청은 독립적으로 처리
    • HTTP 상태 코드 활용: 200(성공), 404(자원 없음), 500(서버 오류) 등

 

2. Django REST Framework 구현

1) Django REST Framework 요청/응답 흐름

  • 요청 처리

    ① 클라이언트 → JSON 데이터 요청
    ② views.py: 요청 데이터를 serializers.py로 전달
    ③ serializers.py
        - JSON 데이터를 역직렬화(Deserialize)
        - 데이터 검증 및 처리
    ④ 데이터베이스 저장 또는 처리 후 응답 준비

  • 응답 처리

    ① 데이터베이스에서 Python 객체 반환
    ② views.py: 반환된 데이터를 serializers.py로 전달
    ③ serializers.py: 반환된 데이터를 직렬화(Serialize)
    ④ JSON 응답으로 클라이언트에 반환
 

2) 주요 파일의 역할 및 구현

  • urls.py
    • URL 요청을 views.py에 연결
    • 클라이언트의 요청을 처리할 뷰(View) 함수나 클래스에 매핑하는 라우팅 시스템
* 라우팅(Routing): 사용자가 특정 URL(경로)로 요청을 보냈을 때, 그 요청을 처리할 코드나 함수(View)를 연결하는 과정. 즉, 어떤 URL로 요청이 오면 어떤 기능을 실행할지 정해주는 역할을 하는 것
from django.urls import path
from . import views

urlpatterns = [
    path('api/users/', views.UserListView.as_view(), name='user_list'),
    path('api/users/<int:id>/', views.UserDetailView.as_view(), name='user_detail'),
]
  • views.py
    • urls.py에서 정의된 URL에 대해 클라이언트의 요청(GET, POST, PUT, DELETE 등)이 들어왔을 때, 수행할 로직(함수, 클래스)을 정의
    • 요청(request) 데이터를 처리하고 응답(response)을 반환
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import UserSerializer
from .models import User

class UserListView(APIView):
    def get(self, request):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)
  • serializers.py
    • 데이터를 직렬화(Serialize) 및 역직렬화(Deserialize): Python 객체 데이터를 JSON 형식으로 변환하거나, 반대로 JSON 데이터를 Python 객체로 변환하여 데이터 교환을 가능하게 해줌
    • 클라이언트-서버 간 데이터 변환
from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

 

3) 인증(Authentication)과 세션/토큰 관리

  • 인증 방식
    • 세션 기반 인증: Django의 기본 인증 방식
    • 토큰 기반 인증: DRF에서 주로 사용하는 방식    Ex: JWT(JSON Web Token)
  • 세션과 토큰의 차이
    • 세션: 서버가 상태를 유지하며 세션 ID를 관리
    • 토큰: 클라이언트가 상태를 관리하며 토큰 자체에 인증 정보 포함

4) API 요청/응답 처리

  • 요청 처리: 클라이언트 → API 요청(JSON 데이터로 요청) → URL 매핑 → views.py: 요청 데이터를 serializers.py 로 전달 → serializers.py: 역직렬화(Python 객체로 변환) → 데이터베이스 저장 또는 처리 → 응답 준비
  • 응답 처리: 데이터베이스 → Python 객체 반환 → views.py: 반환된 데이터를 serializers.py 로 전달 → serializers.py: 직렬화(JSON 데이터로 변환) → 클라이언트에 응답
[구체적인 DRF의 요청/응답 처리 흐름]

* 요청 처리
1. 클라이언트 → API 요청
- 클라이언트(브라우저, 모바일 앱 등)가 API 엔드포인트로 HTTP 요청을 보냄. 요청 데이터는 보통 JSON 형식으로 전달됨
- Ex: POST /api/users/ (새 사용자 생성 요청)
2. URL 매핑
- 요청된 URL은 urls.py에 정의된 라우팅 규칙에 따라 특정 View로 전달됨
- Ex: /api/users/ → views.py의 UserCreateView
3. views.py: 요청 데이터 처리
- views.py는 요청을 처리하고, 데이터를 serializers.py에 전달하여 데이터 검증 및 변환(역직렬화)을 수행
4. serializers.py: 역직렬화(Deserialize)
- JSON 데이터를 Python 객체로 변환하여 데이터베이스 저장 및 비즈니스 로직 처리를 준비
- 이 과정에서 데이터 유효성 검증도 수행됨
- Ex: 필수 필드가 비어 있거나 잘못된 형식의 데이터인 경우 에러 반환
5.데이터베이스 저장 또는 처리
- 역직렬화된 데이터를 ORM을 통해 데이터베이스에 저장하거나 추가 처리를 수행
6. 응답 준비
- 데이터 처리 결과를 반환하기 위해 Python 객체 형태로 준비

* 응답 처리
1. 데이터베이스 → Python 객체 반환
- ORM(QuerySet)이 데이터베이스에서 데이터를 가져와 Python 객체 형태로 반환
2. views.py: Python 객체 전달
- 조회한 데이터를 serializers.py로 전달하여 JSON으로 변환합니다(직렬화)
3. serializers.py: 직렬화(Serialize)
- Python 객체를 JSON 데이터로 변환하여 클라이언트가 읽을 수 있는 형태로 만듦
4. 클라이언트에 응답
- 변환된 JSON 데이터를 HTTP 응답으로 클라이언트에 반환
- 응답에는 HTTP 상태 코드도 포함됨   
- Ex: 200 OK, 201 Created, 400 Bad Request

 

3. 네트워크 및 배경 지식

1) TCP/IP와 HTTP 프로토콜 이해

  • TCP/IP
    • 데이터 통신을 위한 기본 프로토콜
    • 신뢰할 수 있는 데이터 전송을 보장
  • HTTP
    • 클라이언트-서버 간의 데이터 전송을 위한 애플리케이션 계층 프로토콜
    • RESTful API는 HTTP 프로토콜을 기반으로 설계

2) VPC 개념

  • VPC (Virtual Private Cloud)
    • AWS 등 클라우드 환경에서 사용자가 정의한 가상 네트워크
    • DRF 배포 시 안전한 네트워크 구성에 사용
    • API 서버와 데이터베이스를 분리하여 보안 강화

3) 세션과 토큰 기반 인증의 차이

  • 세션 기반 인증
    • 서버가 사용자의 상태를 세션에 저장
    • 각 요청에 세션 ID 포함
    • 상태 유지로 인해 서버 리소스 소모
  • 토큰 기반 인증
    • 클라이언트가 인증 상태를 유지
    • 각 요청에 토큰 포함
    • 무상태성으로 확장성이 좋음

 
 

📙 내일 일정

  • 중간 프로젝트