자 이제 DRF와 REST API가 뭔지 아셨죠~~??
아직 잘 모르겠다구요? 괜찮아요! 정상입니다. 하하
그럼 직접 만들어보면서 다시 알아볼까요??
⚠️해당 문서는 DRF를 빠르게 구현해보면서 알아가는 과정으로,
이해가지 않는 코드가 있더라도 일단 따라해보세요~!⚠️
친절한 저는 장고 프로젝트 생성하는 것부터 설명드릴게요~~
** 참고로 저는 macOS 환경에서 개발 중입니다
우선 작업 폴더를 하나 만듭시다.
해당 폴더를 vscode로 열어 터미널에 아래 명령어를 입력해주세요
pip3 install django
django-admin startproject drf
그러면 아래와 같이 파일들이 생성됩니다.
.
├── drf
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
이제 drf 폴더로 이동해 작업을 해볼게요
cd drf
터미널에 ls
를 입력했을 때, drf manage.py
가 나온다면 올바른 위치에 있는 것 입니다~
저는 가상환경으로 pipenv
를 사용한답니다~!
venv
가 편하신 분들은 venv
를 사용하셔도 무방합니다
pip3 install pipenv
pipenv shell
pipenv shell
이란, 가상환경을 실행하는 명령어입니다.
exit
명령어를 통해 가상환경을 종료할 수 있어요
pipenv install djangorestframework
Pipfile
과 Pipfile.lock
이 추가되었으면 완료입니다~
.
├── drf
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── Pipfile
└── Pipfile.lock
settings.py
에 INTSALLED_APPS
부분에 해당 코드를 추가해주세요
장고 프로젝트에서 사용할 애플리케이션을 설정하는 부분입니다~
# settings.py
INSTALLED_APPS = [
# ...
'rest_framework',
]
이제 기본적인 세팅은 끝났습니다!
자 이제 본격적으로 개발을 시작해볼까요?
Blog 기능 을 구현해보겠습니다.
유저들이 blog를 포스트하고, 댓글도 작성할 수 있는 웹을 만들어볼게요~!!
장고에선 프로젝트의 기능 별로 별도의 애플리케이션을 만들어서 기능을 구현하는 게 관리하기 용이합니다.
아래 명령어를 통해 애플리케이션을 생성해볼게요
python3 manage.py startapp blog
그럼 아래처럼 blog 디렉토리가 생성되었을 겁니다!
.
├── Pipfile
├── Pipfile.lock
├── blog
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── drf
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
아까와 마찬가지로 INTSALLED_APPS
부분에 코드를 추가해주세요
# settings.py
INSTALLED_APPS = [
# ...
'rest_framework',
'blog',
]
blog 기능을 구현하기 위해서는 User
, Blog
, Comment
모델이 필요하겠네요!
아래와 같이 작성해주세요
# models.py
from django.db import models
class User(models.Model):
username = models.CharField(max_length=30)
belong = models.CharField(max_length=30)
class Blog(models.Model):
title = models.CharField(max_length=30)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
class Comment(models.Model):
text = models.TextField()
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
이렇게 뚝딱 세개의 모델을 구현했습니다.
근데, 모델을 작성했으면 migrate 해야겠죠?? 아래 명령어를 입력해주세요
python3 manage.py makemigrations
python3 manage.py migrate
자~ 이제 작성한 데이터베이스 스키마가 db.sqlite3
에 저장되었을 겁니다.
DRF를 사용하기 위해선 forms.py
대신 QuerySet
데이터베이스를 JSON
으로 직렬화해주는 serializers.py
를 사용할 겁니다.
blog
디렉토리 안에 serializers.py
파일을 추가해주세요.
.
.
├── migrations
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── serializers.py
├── tests.py
└── views.py
이제 serializers.py
안에 해당 코드를 작성해주세요
# serializers.py
from rest_framework import serializers
from .models import User, Blog, Comment
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
class BlogSerializer(serializers.ModelSerializer):
class Meta:
model = Blog
fields = '__all__'
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = '__all__'
이젠 시리얼라이저를 사용하여 views를 만들어볼게요
views.py
에 해당 코드를 추가해주세요
# views.py
from rest_framework import viewsets
from .models import User, Blog, Comment
from .serializers import UserSerializer, BlogSerializer, CommentSerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class BlogViewSet(viewsets.ModelViewSet):
queryset = Blog.objects.all()
serializer_class = BlogSerializer
class CommentViewSet(viewsets.ModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
우선 settings.py
가 있는 drf
디렉토리의 urls.py
에 해당 코드를 추가해주세요.
# drf/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
]
그럼 blog/
로 시작하는 url을 blog
디렉토리의 urls.py
로 매핑을 완료했습니다~!
다시 blog
디렉토리로 돌아와 urls.py
파일을 생성해주세요!
그리고 아래 코드를 작성해주세요
# blog/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import UserViewSet, BlogViewSet, CommentViewSet
router = DefaultRouter()
router.register(r'users', UserViewSet, basename='user')
router.register(r'blogs', BlogViewSet, basename='blog')
router.register(r'comments', CommentViewSet, basename='comment')
urlpatterns = [
path('', include(router.urls)),
]
자 이제 코드의 구현은 끝났습니다~ 이제 예시가 될 데이터베이스를 생성해볼까요?
프로젝트의 루트 디렉토리(manage.py
가 있는 디렉토리)에서 작업해야 합니다!
python3 manage.py shell
을 터미널에 입력해줍니다.
$ python3 manage.py shell
Python 3.11.2 (main, Mar 24 2023, 00:13:59) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
같은 요상한 게 터미널에 뜰텐데 당황하지 마세요. 잘 하셨습니다 ㅎㅎ
해당 명령어는 장고 프로젝트에서 python shell을 쓸 수 있도록 하는 명령어입니다.
자 그럼 아래의 명령어를 한줄한줄 입력해볼게요!
>>> from blog.models import *
>>> user1 = User(username="taeho", belong="likelion sg")
>>> user1.save()
>>> blog1 = Blog(title="제목입니다", content="블로그의 내용입니다~!!", author=user1)
>>> blog1.save()
>>> comment1 = Comment(text="태호님 반갑습니다~", blog=blog1, user=user1)
>>> comment1.save()
>>> exit()
exit()
은 파이썬 shell을 탈출하는 명령어입니다.
그럼 user1과 blog1, comment1의 데이터가 저장되었습니다.
API로 한번 확인해볼까요?
python3 manage.py runserver
명령어를 통해 로컬에서 서버를 실행시켜볼게요
그 다음 http://127.0.0.1:8000/blog/ 에 접속해보면~~!!
같은 화면이 뜰 겁니다!!
와우~~ 아까 router로 연결해준 users, blogs, comments가 모두 잘 있네요
blogs로 들어가볼까요??
저희가 저장했었던 blog 데이터가 JSON
형식으로 잘 나타나네요!!
고생하셨습니다 짝짝짝👏👏👏