Django REST Framework (DRF)๋?
1. DRF ์ ์
Django REST Framework(DRF)๋ Django์์ RESTful API๋ฅผ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Django์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ JSON ์๋ต, ์ธ์ฆ, ๊ถํ ๊ด๋ฆฌ, ํ์ด์ง, ์ง๋ ฌํ(Serializer) ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
2. DRF๋ฅผ ์ฌ์ฉํ๋ ์ด์
Django๋ ๋ณธ๋ ์๋ฒ ์ธก ๋ ๋๋ง์ ์ํ ์น ํ๋ ์์ํฌ์ด์ง๋ง, RESTful API ๊ฐ๋ฐ์ ์ํด ์ฌ์ฉํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ์์
์ด ํ์ํจ.
DRF๋ ์ด๋ฐ ๊ณผ์ ์ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ฉฐ, API ๊ฐ๋ฐ์ ์ํ ๋ค์๊ณผ ๊ฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
โ
์ง๋ ฌํ(Serialization) → JSON ๋ฐ์ดํฐ ๋ณํ์ ์ฝ๊ฒ ์ฒ๋ฆฌ
โ
์ธ์ฆ ๋ฐ ๊ถํ ๊ด๋ฆฌ → ๊ธฐ๋ณธ ์ ๊ณต๋๋ ์ธ์ฆ ์์คํ
(OAuth, JWT ๋ฑ)
โ
ViewSet ๋ฐ Generic Views → ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ ํจ์จ์ ์ผ๋ก ๊ฐ๋ฐ
โ
API ๋ธ๋ผ์ฐ์ UI ์ ๊ณต → ๊ฐ๋ฐ ๋ฐ ๋๋ฒ๊น
์ด ํธ๋ฆฌ
โ
ํ์ด์ง, ํํฐ๋ง, ๊ฒ์ ๊ธฐ๋ฅ ์ ๊ณต
3. DRF ์ค์น
pip install djangorestframework
๊ทธ๋ฆฌ๊ณ `settings.py`์ DRF๋ฅผ ๋ฑ๋กํด์ค๋ค.
INSTALLED_APPS = [
'rest_framework', # Django REST framework ์ถ๊ฐ
]
4. DRF ๊ธฐ๋ณธ ๊ฐ๋
1) Serializer (์ง๋ ฌํ)
Django์ `Model` ๋ฐ์ดํฐ๋ฅผ JSON ํํ๋ก ๋ณํํ๋ ์ญํ ์ ํ๋ค.
๐ ์์ : ๋ชจ๋ธ์ JSON์ผ๋ก ๋ณํ
from rest_framework import serializers
from myapp.models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__' # ๋ชจ๋ ํ๋๋ฅผ ํฌํจ
2) API View (APIView)
Django์ ๊ธฐ๋ณธ `View`๋ฅผ ํ์ฅํ์ฌ API ์์ฒญ์ ์ฒ๋ฆฌํ๋ ํด๋์ค์ด๋ค.
๐ ์์ : APIView๋ฅผ ์ด์ฉํ CRUD
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from myapp.models import Post
from myapp.serializers import PostSerializer
class PostListAPIView(APIView):
def get(self, request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
๐น `get()` → ๋ชจ๋ ๊ฒ์๊ธ ์กฐํ
๐น `post()` → ์๋ก์ด ๊ฒ์๊ธ ์์ฑ
3) Generic Views (DRF ์ ๊ณต ๋ทฐ)
๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํด DRF์์ ์ ๊ณตํ๋ Generic Views๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๐ ์์ : Generic View๋ฅผ ์ด์ฉํ CRUD
from rest_framework import generics
from myapp.models import Post
from myapp.serializers import PostSerializer
class PostListCreateView(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
class PostRetrieveUpdateDeleteView(generics.RetrieveUpdateDestroyAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
โ
`ListCreateAPIView` → `GET(๋ชฉ๋ก ์กฐํ)`, `POST(์์ฑ)` ์๋ ์ฒ๋ฆฌ
โ
`RetrieveUpdateDestroyAPIView` → `GET(๋จ์ผ ์กฐํ)`, `PUT(์์ )`, `DELETE(์ญ์ )` ์๋ ์ฒ๋ฆฌ
4) ViewSet & Router
`ViewSet`์ RESTful API์ CRUD ๊ธฐ๋ฅ์ ๋์ฑ ์๋ํํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
`Router`๋ฅผ ์ฌ์ฉํ๋ฉด URL ์ค์ ๋ ์๋ํํ ์ ์๋ค.
๐ ์์ : ViewSet & Router
from rest_framework import viewsets
from myapp.models import Post
from myapp.serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
๐ ์์ : Router ์ฌ์ฉ
from rest_framework.routers import DefaultRouter
from myapp.views import PostViewSet
router = DefaultRouter()
router.register(r'posts', PostViewSet)
urlpatterns = router.urls # ์๋์ผ๋ก URL ์์ฑ
โ
`ModelViewSet` → CRUD ์๋ ์ฒ๋ฆฌ
โ
`DefaultRouter` → `/posts/` ์๋ํฌ์ธํธ ์๋ ์์ฑ
5. ์ธ์ฆ & ๊ถํ ๊ด๋ฆฌ
DRF๋ ๋ค์ํ ์ธ์ฆ(Authentication) ๋ฐ ๊ถํ ๊ด๋ฆฌ(Permissions) ์์คํ ์ ์ ๊ณตํ๋ค.
1) ๊ธฐ๋ณธ ์ธ์ฆ ์ค์ (`settings.py`)
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated', # ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅ
]
}
2) ๊ฐ๋ณ ๋ทฐ์์ ๊ถํ ์ค์
from rest_framework.permissions import IsAuthenticated, AllowAny
from rest_framework.views import APIView
class PublicView(APIView):
permission_classes = [AllowAny] # ๋๊ตฌ๋ ์ ๊ทผ ๊ฐ๋ฅ
class PrivateView(APIView):
permission_classes = [IsAuthenticated] # ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ์ ๊ทผ ๊ฐ๋ฅ
6. ํ์ด์ง & ํํฐ๋ง
1) ํ์ด์ง ์ค์ (`settings.py`)
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10, # ํ ํ์ด์ง์ 10๊ฐ์ฉ ์ถ๋ ฅ
}
2) ํํฐ๋ง ์์
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics
from myapp.models import Post
from myapp.serializers import PostSerializer
class PostListView(generics.ListAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
filter_backends = [DjangoFilterBackend] # ํํฐ๋ง ํ์ฑํ
filterset_fields = ['category', 'author'] # ํน์ ํ๋๋ก ํํฐ๋ง ๊ฐ๋ฅ
7. DRF ๋ธ๋ผ์ฐ์ API ์ธํฐํ์ด์ค
DRF๋ฅผ ์ฌ์ฉํ๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์ API๋ฅผ ์ฝ๊ฒ ํ ์คํธํ ์ ์๋ GUI ์ธํฐํ์ด์ค๊ฐ ์ ๊ณต๋๋ค.
- URL์ ์ ๊ทผํ๋ฉด ์๋์ผ๋ก API UI๊ฐ ์ ๊ณต๋จ
- GET, POST, PUT, DELETE ์์ฒญ์ ์ฝ๊ฒ ํ ์คํธ ๊ฐ๋ฅ
- API ์๋ต(JSON)๋ ํ์ธ ๊ฐ๋ฅ
8. DRF์ Django์ ์ฐจ์ด์
๊ธฐ๋ฅ | Django | Django REST Framework |
๋ฐ์ดํฐ ํฌ๋งท | HTML | JSON, XML ๋ฑ ๋ค์ํ ํฌ๋งท ์ง์ |
์ธ์ฆ | ๊ธฐ๋ณธ Django ์ธ์ฆ | OAuth, JWT ๋ฑ ๋ค์ํ ์ธ์ฆ ์ ๊ณต |
API ์ง์ ์ฌ๋ถ | ์๋์ผ๋ก ๊ตฌํ ํ์ | RESTful API ๊ธฐ๋ณธ ์ง์ |
View ์ฒ๋ฆฌ ๋ฐฉ์ | Django View ์ฌ์ฉ | APIView, GenericView, ViewSet ์ฌ์ฉ |
์ ๋ฆฌ ๐งน
- DRF๋ Django์์ RESTful API๋ฅผ ์ฝ๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค ์ ์๋๋ก ๋์์ค
- Serializer๋ฅผ ์ฌ์ฉํ์ฌ JSON ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์์
- APIView, GenericView, ViewSet์ ํ์ฉํ์ฌ CRUD API๋ฅผ ๊ฐํธํ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
- ๊ถํ, ์ธ์ฆ, ํ์ด์ง, ํํฐ๋ง ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ ์ ๊ณต๋จ
- API UI ๋ธ๋ผ์ฐ์ ๊ฐ ์์ด ๊ฐ๋ฐ ๋ฐ ํ ์คํธ๊ฐ ์ฉ์ดํจ
'AI ๐ค > Django โ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250204] URI ์ดํดํ๊ธฐ (0) | 2025.02.04 |
---|---|
[250203] Serializer ์ ๋ฆฌ~ (0) | 2025.02.03 |
[250122] DateTimeField() ๊ฐ๋ ์ ๋ฆฌ~ (0) | 2025.01.22 |
[250121] ์ฟผ๋ฆฌ์ (QuerySet)์ด๋? (0) | 2025.01.21 |
[250120] HttpResponse์ render์ ์ฐจ์ด์ (1) | 2025.01.20 |