DRF 이해하기 (2) - DRF 무작정 따라하기

taehoyoon·2023년 4월 2일
1

DRF 이해하기

목록 보기
2/2
post-thumbnail

자 이제 DRF와 REST API가 뭔지 아셨죠~~??
아직 잘 모르겠다구요? 괜찮아요! 정상입니다. 하하

그럼 직접 만들어보면서 다시 알아볼까요??

⚠️해당 문서는 DRF를 빠르게 구현해보면서 알아가는 과정으로,
이해가지 않는 코드가 있더라도 일단 따라해보세요~!⚠️


1. Django 프로젝트 생성

친절한 저는 장고 프로젝트 생성하는 것부터 설명드릴게요~~
** 참고로 저는 macOS 환경에서 개발 중입니다

1. 프로젝트 생성

우선 작업 폴더를 하나 만듭시다.
해당 폴더를 vscode로 열어 터미널에 아래 명령어를 입력해주세요

pip3 install django
django-admin startproject drf

2. 파일 생성 확인

그러면 아래와 같이 파일들이 생성됩니다.

.
├── drf
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

3. 작업 폴더로 이동

이제 drf 폴더로 이동해 작업을 해볼게요

cd drf

터미널에 ls를 입력했을 때, drf manage.py가 나온다면 올바른 위치에 있는 것 입니다~


2. 가상환경 설치

저는 가상환경으로 pipenv를 사용한답니다~!
venv가 편하신 분들은 venv를 사용하셔도 무방합니다

1. pipenv 설치

pip3 install pipenv
pipenv shell

pipenv shell이란, 가상환경을 실행하는 명령어입니다.
exit 명령어를 통해 가상환경을 종료할 수 있어요

2. django, drf 라이브러리 설치

pipenv install djangorestframework

3. 가상환경 파일 추가 확인

PipfilePipfile.lock이 추가되었으면 완료입니다~

.
├── drf
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── Pipfile
└── Pipfile.lock

3. 설정 추가

1. settings.py 추가 설정

settings.pyINTSALLED_APPS 부분에 해당 코드를 추가해주세요
장고 프로젝트에서 사용할 애플리케이션을 설정하는 부분입니다~

# settings.py

INSTALLED_APPS = [
    # ...
    'rest_framework',
]

이제 기본적인 세팅은 끝났습니다!


4. 애플리케이션 추가

자 이제 본격적으로 개발을 시작해볼까요?
Blog 기능 을 구현해보겠습니다.
유저들이 blog를 포스트하고, 댓글도 작성할 수 있는 웹을 만들어볼게요~!!

1. 애플리케이션 생성

장고에선 프로젝트의 기능 별로 별도의 애플리케이션을 만들어서 기능을 구현하는 게 관리하기 용이합니다.
아래 명령어를 통해 애플리케이션을 생성해볼게요

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

2. settings.py에 애플리케이션 추가

아까와 마찬가지로 INTSALLED_APPS 부분에 코드를 추가해주세요

# settings.py

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'blog',
]

5. blog 애플리케이션에서 기능 구현하기

1. models.py

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에 저장되었을 겁니다.

2. serializers.py

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__'

3. views.py

이젠 시리얼라이저를 사용하여 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

4. urls.py

우선 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)),
]

자 이제 코드의 구현은 끝났습니다~ 이제 예시가 될 데이터베이스를 생성해볼까요?


6. 예시 모델 생성 및 API 보기

1. 예시 모델 생성

프로젝트의 루트 디렉토리(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로 한번 확인해볼까요?

2. API Router로 확인하기

python3 manage.py runserver

명령어를 통해 로컬에서 서버를 실행시켜볼게요

그 다음 http://127.0.0.1:8000/blog/ 에 접속해보면~~!!


같은 화면이 뜰 겁니다!!

와우~~ 아까 router로 연결해준 users, blogs, comments가 모두 잘 있네요

blogs로 들어가볼까요??

저희가 저장했었던 blog 데이터가 JSON 형식으로 잘 나타나네요!!

고생하셨습니다 짝짝짝👏👏👏

소스코드 : https://github.com/taeho0888/drf

profile
어흥🦁

0개의 댓글