์ด ๊ฒ์๊ธ์ ๋ฉ์์ด ์ฌ์์ฒ๋ผ ๋์๋ฆฌ์ ์ฅ๊ณ ์คํฐ๋๋ฅผ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
- ์ฑ ๋ฐฑ์๋๋ฅผ ์ํ DJANGO REST FRAMEWORK with ํ์ด์ฌ - ๊ถํํ ์ ์ ์ ์ฑ ์ ์ฐธ๊ณ ํ์ฌ ์ค์ต์ ์งํํ์ต๋๋ค.
๋ฐฑ์๋๋ฅผ ์ํ Django REST Framework with ํ์ด์ฌ
COUPANG
www.coupang.com
6.2.7 (TIP) ๋ฆฌ์กํธ์ ์ฐ๋ํ๊ธฐ
CORS๋ ์ด๋ค ๊ฐ๋ ์ผ๊น? -> ์ฝ๊ฒ ๋จ์ด ๋ป์ ํ์ด๋ณด๋ฉด,
๋ค๋ฅธ ์ถ์ฒ๋ผ๋ฆฌ ์์์ ๊ณต์ ํ๋ ๊ฒ
๊ฐ์ ์ถ์ฒ๋ผ๋ ๊ฒ์ ์ฃผ์๊ฐ์ด ํฌํธ ๋ฒํธ๊น์ง ๋์ผํ ๊ฒฝ์ฐ๋ฅผ ๋ปํฉ๋๋ค.
์ฆ, ๋ฆฌ์กํธ ํ๋ก์ ํธ์ Django ํ๋ก์ ํธ๋ฅผ ์ฐ๋ํ๋ ค๋ ๊ฒฝ์ฐ
๋ฆฌ์กํธ๋ http://127.0.0.1:3000, Django ํ๋ก์ ํธ๋ http://127.0.0.1:8000์ด๋ฏ๋ก
-> ํฌํธ๋ฒํธ๊ฐ ๋ฌ๋ผ ๋ค๋ฅธ ์ถ์ฒ๊ฐ ๋ฉ๋๋ค.
๋ฆฌ์กํธ์์ ๋ค๋ฅธ ์ถ์ฒ์ธ Django ๋ก๋ถํฐ ๋ฐ์ดํฐ(๋ฆฌ์์ค)๋ฅผ ๊ฐ์ ธ์ค๋ ค๋๋ฐ
์ด๊ฒ์ด SOP(Same Origin Policy)_๊ฒฝ์ฐฐ?์ ์ํด
์ฐจ๋จ ๋๋ ๊ฒ์ ๋๋ค.
์ด์ ๋ํ ์์ธ ์กฐํญ์ด CORS ์ ๋๋ค.
CORS์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ ์ฐธ๊ณ
CORS๋ ์ ์ด๋ ๊ฒ ์ฐ๋ฆฌ๋ฅผ ํ๋ค๊ฒ ํ๋๊ฑธ๊น?
์ด๋ฒ ํฌ์คํ ์์๋ ์น ๊ฐ๋ฐ์๋ผ๋ฉด ํ๋ฒ์ฏค์ ์ป์ด๋ง์ ๋ดค์ ๋ฒํ ์ ์ฑ ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด๋ ค๊ณ ํ๋ค. ์ฌ์ค ์น ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด CORS ์ ์ฑ ์๋ฐ์ผ๋ก ์ธํด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ๊ต์ฅํ ํํด์
evan-moon.github.io
์ฆ, ์๋ฒ์์ (๋ฐฑ์๋์์ ) CORS ์ ์ฑ ์ ์ค์ํ๋๋ก ์ค์ ํด๋๋ฉด
SOP์ ์์ธ ์กฐํญ์ธ CORS ์ ์ฑ ์ ์ค์ํ์ฌ
๋ค๋ฅธ ์ถ์ฒ๋ผ๋ฆฌ๋ ์์ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
(ํ๋ก ํธ์๋์์ ๋ฐ์ํ๋ ์๋ฌ์ง๋ง ๋ฐฑ์๋์์ ์ ์ฑ ์ ์ง์ผ์ผ ํ๋ค๋ ๊ฒ์ด ์กฐ๊ธ ์์ด๋ฌ๋ํ ๋ถ๋ถ์๋ค)
์ ๊ทธ๋ผ ์ด์ , ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค.
1. ํจํค์ง ์ค์น
2. ์ฑ์ ๋ฑ๋ก
3. ๋ฏธ๋ค์จ์ด์ ๋ฑ๋ก
์ด์ ๋ฐฑ์๋๊ฐ ํ ์ผ์ ์์ต๋๋ค.

ํ๋ก ํธ์๋์์ ์ด๋ป๊ฒ ์ฐ๋ฆฌ์ ๋ฐฑ์๋ API๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
๋ฆฌ์กํธ์ ํต์ฌ์ ์ธ ๋ถ๋ถ์ ์ฝ๋๋ง ์ดํด๋ณด๊ณ ์ ์ฉ๋ ๊ฒฐ๊ณผ ํ๋ฉด์ ํจ๊ป ์ดํด๋ณด๋ฉฐ ๋ง๋ฌด๋ฆฌ ํ๊ฒ ์ต๋๋ค.
6.3 ์ฑ : ๊ฒ์๊ธ
๊ฒ์๊ธ ์ฑ์ ๋ง๋ค๊ณ ๊ฒ์๊ธ ๊ด๋ จ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ฒ ์ต๋๋ค.
6.3.1 ๊ฒ์๊ธ ๊ธฐ๋ฅ ์ ๋ฆฌ
์ฌ์ค ์์ ์งํํ ํ์ ๊ด๋ จ ๊ธฐ๋ฅ์ด ํ๋ก์ ํธ์์ ์ ์ผ ์ด๋ ต๊ณ ๋ฎ์ ๋ถ๋ถ์ ๋๋ค.
6.3.2 ๊ฒ์๊ธ ๋ชจ๋ธ ๋ง๋ค๊ธฐ & ๋ง์ด๊ทธ๋ ์ด์
posts ๋ผ๋ ์ด๋ฆ์ ์ฑ์ ๋ง๋ค๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค.
์ ์, ์ ์ ํ๋กํ, ์ ๋ชฉ, ์นดํ ๊ณ ๋ฆฌ, ๋ณธ๋ฌธ, ์ด๋ฏธ์ง, ์ข์์ ๋๋ฅธ ์ฌ๋๋ค, ๊ธ์ด ์ฌ๋ผ๊ฐ ์๊ฐ
๋ง์ด๊ทธ๋ ์ด์ ์ ์ฑ๊ณตํจ
6.3.3 ์๋ฆฌ์ผ๋ผ์ด์
๋ชจ๋ธ์ ๋ค์ ๋จ๊ณ๋ฅผ ์๋ฆฌ์ผ๋ผ์ด์ ์ ๋๋ค.
๊ฐ์ ๋ชจ๋ธ์ ๋ํด ๋ ๊ฐ์ ์๋ฆฌ์ผ๋ผ์ด์ ๋ฅผ ๋ง๋ค ๊ฒ
์ผ๋จ ์์ฑํ๊ณ , ์ ๊ทธ๋ ๊ฒ ํ๋์ง ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
-> ๊ฐ์ ์ฉ๋๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ
-> ๊ฒ์๊ธ์ ์์ฑํ ๋, ์ ์ ๊ฐ ์ ๋ ฅํด์ฃผ๋ ์ ๋ณด๋ ์ ๋ชฉ, ์นดํ ๊ณ ๋ฆฌ, ๋ณธ๋ฌธ, ์ด๋ฏธ์ง ์ ๋ ๋ฟ,,, ๋๋จธ์ง ๋ฐ์ดํฐ๋ ์ฐ๋ฆฌ์ ์ฝ๋๊ฐ ์์์ ์ฑ์์ฃผ๊ฑฐ๋, ์ฒ์์๋ ๋น์นธ์ผ๋ก ๋๊ฒ ๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.
-> ์ด๋ฐ ๊ฒฝ์ฐ ํด๋น ๊ฒ์๊ธ์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ญ์ผ๋ก JSON์ผ๋ก ๋ณํํ์ฌ ์ ๋ฌํด์ผ ํ๋ ์๋ฆฌ์ผ๋ผ์ด์ ์๋ ๋ถ๋ช ๋ค๋ฅผ ํ์๊ฐ ์์ต๋๋ค.
-> ๋ฐ๋ผ์ ์ผ๋ฐ PostSerializer์ PostCreateSerializer๋ฅผ ๋๋ ์์ฑํ์ต๋๋ค.
6.3.4 ๋ทฐ(CRUD) + ๊ถํ
๋ค์์ ๋ทฐ ์ ๋๋ค. ๊ฒ์๊ธ์ ๋ชจ๋ CRUD๊ธฐ๋ฅ์ด ๋ค ์๊ธฐ ๋๋ฌธ์ ์์ฃผ ํธํ ๋ง์์ผ๋ก ViewSet์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋์ ์์ ์ ์ธํ๋๋ก ๊ฐ๊ธฐ ๋ค๋ฅธ ์๋ฆฌ์ผ๋ผ์ด์ ๋ฅผ ์ ์ฌ ์ ์์ ํ์ฉํ ์ ์๋๋ก ํ๋ ์ฝ๋๋ฅผ ์์ฑํด ์ฃผ๋ฉด ๋๊ฒ ์ต๋๋ค.
+ ๋ํ ๊ฒ์๊ธ์ ์์ฑํ ๋ ์ ์ ๊ฐ ์ ๋ ฅํด์ฃผ์ง ์๋ ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ด ๋ฃ์ ์ ์๋๋ก ํฉ๋๋ค.
+ ๊ฐ ์ํฉ์ ๋ฐ๋ผ ํ์ํ ๊ถํ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์์ ์์ฑํ๋ ๊ฒ์ฒ๋ผ permission.py ํ์ผ์ posts์ฑ ๋ด์ ์์ฑํ์ฌ ์ฌ์ฉ
์ด๋ ๊ฒ ์ ์๋ CustomReadOnly ๊ถํ ํด๋์ค๋ Django REST Framework์ ์ธ์ฆ๊ณผ ๊ถํ ์์คํ ๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ๋ทฐ์ permission_classes ์์ฑ์ CustomReadOnly๋ฅผ ์ง์ ํจ์ผ๋ก์จ ํด๋น ๋ทฐ์์ ์ ์ํ ๊ถํ ๊ฒ์ฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ๊ธ ์กฐํ(GET) ์์ฒญ์ ๋๊ตฌ๋ ํ์ฉ๋๊ณ , ๊ธ ์์ฑ(POST) ์์ฒญ์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ํ์ฉ๋๋ฉฐ, ํธ์ง(PUT, PATCH, DELETE) ์์ฒญ์ ํด๋น ๊ธ์ ์์ฑ์๋ง ํ์ฉ๋ฉ๋๋ค.
์์ PostViewSet ํด๋์ค๋ ModelViewSet์ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ list, retrieve, create, update, partial_update, destroy ๋ฑ์ ๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด Post ๋ชจ๋ธ์ ๋ํ ์กฐํ, ์์ฑ, ์ ๋ฐ์ดํธ, ์ญ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๋ํ CustomReadOnly ๊ถํ ํด๋์ค๋ฅผ ํตํด ์ฝ๊ธฐ ์ ์ฉ ์์ฒญ์ ๋ํ ๊ถํ ์ ์ด๋ฅผ ์ํํฉ๋๋ค.
6.3.5 URL
๋ทฐ์ ์ ์ฌ์ฉํ๋ ๋ผ์ฐํฐ๋ ํจ๊ป ๋ฐ๋ผ์ต๋๋ค.
์์ ๋ฐฐ์ ๋ ๋๋ก ๋ผ์ฐํฐ๋ฅผ ํ์ฉํด posts/urls.py ๋ฅผ ์ค์ ํ๊ฒ ์ต๋๋ค.
myboard/urls.py
6.3.6 ์คํ
๊ฒ์๊ธ์ด ์ ์์ฑ๋์์ต๋๋ค.
6.3.7. ํํฐ๋ง
ํํฐ๋ง์ ๊ฒ์๊ธ๋ค ์ ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ค ํ ๋ ์กฐ๊ฑฐ๋ฅใน ๊ฑธ์ด ๊ฐ์ ธ์ค๊ฒ๋ ํ๋ ๊ธฐ๋ฅ
pip install django-filter
6.3.8 ํ์ด์ง
์ ์ฒด ์กฐํ ํ์ด์ง๋ฅผ ์ฌ๋ฌ ํ์ด์ง๋ก ๋๋๊ฑฐ๋ ํ ๋ฒ์ ๋ชจ๋ ๊ธ์ ๊ฐ์ ธ์ค๊ธฐ ๋ถ๋ด์ค๋ฌ์ธ ๊ฒฝ์ฐ ํ ๋ฒ์ API ์์ฒญ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ ๋ฐ์ดํฐ ์๋ฅผ ์ ํํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
'DEFAULT_PAGINATION_CLASS':
'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':
3,
6.3.9 ์ข์์
๋ง์ง๋ง ๊ธฐ๋ฅ์ ๋๋ง์ ์ข์์ ๊ธฐ๋ฅ์ ๋๋ค.
์ข์์ ๊ธฐ๋ฅ์ ์ค์ง likes ํ๋์๋ง ์ํฅ์ ์ฃผ๊ณ ๊ฐ๋จํ GET ์์ฒญ ํ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def like_post(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.user in post.likes.all():
post.likes.remove(request.user)
else:
post.likes.add(request.user)
return Response({'status': 'ok'})
6.4 ์ฑ: ๋๊ธ
6.4.3 ์๋ฆฌ์ผ๋ผ์ด์
from rest_framework import serializers
from users.serializers import ProfileSerializer
from .models import Post, Comment
class CommentSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only=True)
class Meta:
model = Comment
fields = ("pk", "profile", "post", "text")
class CommentCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = ("post", "text")
class PostSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(read_only=True)
comments = CommentSerializer(many=True, read_only=True)
class Meta:
model = Post
fields = ("pk", "profile", "title", "body", "image", "published_date",
"likes", "comments")
class PostCreateSerializer(serializers.ModelSerializer):
# image = serializers.ImageField(use_url=True, required=False)
class Meta:
model = Post
fields = ("title", "category", "body", "image")
6.4.4 ๋ทฐ
6.4.5 URL
์๋ฌ ์์ด ์๋ต์ด ์ต๋๋ค.
์ข์ ์ ๊ธฐ๋ฅ์ด ์ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด 1๋ฒ ๊ฒ์๊ธ์ ์กฐํํด ๋ณด์์ต๋๋ค.
๊ฒ์๊ธ์ ํ์ธํด๋ณด๋ฉด ๋น์ด์๋ likes์ 4๋ฒ ์ ์ ๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ์ข์์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ข์์๊ฐ ์ทจ์๋๋ฉด์ 4๋ฒ ์ ์ ๊ฐ ์ญ์ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ฑ : ๋๊ธ
๋๊ธ ์ฑ์ ๋ง๋ค๊ณ ๋๊ธ ๊ด๋ จ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๊ฒ ์ต๋๋ค.
6.4.2 ๋๊ธ ๋ชจ๋ธ & ๋ง์ด๊ทธ๋ ์ด์
์ฐ์ ๋ชจ๋ธ๋ถํฐ ๋ง๋ค๊ฒ ์ต๋๋ค.
๋๊ธ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ๊ฒ์๊ธ๊ณผ ์์ฃผ ๋ฐ์ ํ ์ฐ๊ด์ด ์๋ค๋ณด๋ ๊ตณ์ด ์ฑ์ ๋ฐ๋ก ๋ง๋ค์ง ์์๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
class Comment(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
post = models.ForeignKey(Post,
related_name='comments',
on_delete=models.CASCADE)
text = models.TextField()
6.4.3 ์๋ฆฌ์ผ๋ผ์ด์
6.4.6 ์คํ
6.5 ๋ฐฐํฌํ๊ธฐ
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
'๐ฆ๋ฉ์์ด ์ฌ์์ฒ๋ผ 11๊ธฐ > ๋ฐฑ์๋๋ฅผ ์ํ Django Rest Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Chapter6 ์ค์ ํ๋ก์ ํธ! Django REST Framework + React.js ๊ฒ์ํ ๋ง๋ค๊ธฐ -1 (0) | 2023.05.11 |
---|---|
Chapter5 ์ฐ์ต ํ๋ก์ ํธ : Todo ๋ชฉ๋ก API ๋ง๋ค๊ธฐ (0) | 2023.05.02 |
chapter4 p.103 DRF ์ปจ์ ์ตํ๊ธฐ (0) | 2023.04.14 |
Chapter 4 - 4.2 Django REST Framework ํ๋ก์ ํธ ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ (0) | 2023.04.13 |
Chapter4 Django REST Framework ์ปจ์ ์ตํ๊ธฐ (0) | 2023.04.10 |