[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 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의 주요 기능
- Serializers: 데이터를 JSON으로 변환하거나, JSON 데이터를 검증 및 Python 객체로 변환
- APIView: API 요청(GET, POST 등)에 대한 처리를 쉽게 정의
- Authentication/Authorization: 기본 인증, 토큰 인증 등 다양한 인증 방식을 지원
- Browsable API: API를 브라우저에서 쉽게 테스트할 수 있는 UI 제공
- 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 포함
- 상태 유지로 인해 서버 리소스 소모
- 토큰 기반 인증
- 클라이언트가 인증 상태를 유지
- 각 요청에 토큰 포함
- 무상태성으로 확장성이 좋음
📙 내일 일정
- 중간 프로젝트
'TIL _Today I Learned > 2024.11' 카테고리의 다른 글
[DAY 89] 중간 프로젝트_ 학업성취도 평가 지표 (0) | 2024.11.25 |
---|---|
[DAY 88] 네트워크 기본 개념 & 중간 프로젝트 (1) | 2024.11.22 |
[DAY 86] 중간 프로젝트_ 채점 기준 선정 (0) | 2024.11.20 |
[DAY 84] 중간 프로젝트_ LLM (0) | 2024.11.18 |
[DAY 83] 중간 프로젝트_ KST 알고리즘의 활용 (0) | 2024.11.15 |