Post

[FlickTalk]환경 세팅 3

사용 기술

백엔드: python(django) 프론트엔드: 부트스트랩? Vue3 next.js를 써볼까


Django REST Framework로 API 만들기

DRF란?

Django REST Framework는 Django에서 RESTful API를 빠르게 만들 수 있게 도와주는 확장 라이브러리.

장점은 꽤 많음:

  • 요청과 응답을 JSON으로 쉽게 처리 가능
  • 브라우저에서 API 테스트 가능한 UI 제공
  • 인증, 권한, 페이징, 필터링 등 지원
  • Django와 잘 통합돼서, 생산성이 높음!

DRF 설치

1
pip install djangorestframework

설치 후, 프로젝트에 등록 (settings.py)

1
2
3
4
INSTALLED_APPS = [
    ...
    'rest_framework',
]

첫 API 만들기 – 예: 게시글 리스트 출력

이제 본격적으로 API를 하나 만들어볼 것. 예시로 게시글 목록을 불러오는 API를 만들어봄.


1. 모델 정의 (articles/models.py)

1
2
3
4
5
6
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
  • CharField: 문자열 필드 (제한 길이 필요)
  • TextField: 긴 글에 적합
  • DateTimeField(auto_now_add=True): 글이 생성된 시간 저장
1
2
python manage.py makemigrations
python manage.py migrate

→ 모델을 DB에 반영!


2. 직렬화 클래스 생성 (articles/serializers.py)

API에서 데이터를 주고받기 위해 Python 객체 ↔ JSON 형태로 바꾸는 클래스가 필요함. 이를 “Serializer”라고 부름. 이건 없어서 만들어 줘야함

내 기준으로 serializer는 변환기라고 생각됨 model이 db에 저장되는 데이터 타입을 보여주는 sql같은걸로 보면 table 한개 인거 같은데 이걸 json으로 변환해주거나 json을 다시 이걸로 변환해 주거나!

그리고 앱에 등록할때 djangorestframework를 install 했었는데 rest_framework를 등록했어서 왜 그런가 하고 알아봤더니 설치는 저 이름으로 되지만 내부 구조 venv 내부에 있는데 이 패키지 실제 앱 이름이 rest_framework기 때문에 installed_apps에도 그렇게 써줘야 Django가 제대로 찾을수있다.

1
2
3
4
5
6
7
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

fields = '__all__'은 모델의 모든 필드를 포함시킨다는 의미


3. API View 작성 (articles/views.py)

1
2
3
4
5
6
7
8
9
10
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Article
from .serializers import ArticleSerializer

class ArticleList(APIView):
    def get(self, request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)
  • APIView: DRF에서 제공하는 기본 View 클래스
  • Response: DRF의 응답 객체 (JSON 형식으로 반환해줌)
  • serializer: queryset을 JSON 형태로 변환

4. URL 연결

앱 단위 URL 연결 (articles/urls.py)

1
2
3
4
5
6
7
8
from django.urls import path
from .views import ArticleList

app_name = 'articles'

urlpatterns = [
    path('', ArticleList.as_view(), name='article-list'),
]

프로젝트의 URL에 앱 URL 포함시키기 (config/urls.py)

1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls')),
]

/articles/ 경로로 들어오면 articles 앱으로 연결됨


✅ API 작동 확인하기

서버 실행:

1
python manage.py runserver

→ 브라우저에서 http://127.0.0.1:8000/articles/ 접속

브라우저에서 DRF가 제공하는 예쁘장한 API 페이지가 나타나고, JSON 형식으로 게시글 데이터가 출력됨 (비어 있으면 빈 배열이 뜸)


URL 구조 다시 정리

  • 프로젝트에 있는 config/urls.py최상위 입구
  • 각 앱(articles, users, 등등)은 자기 url 관리
  • include()를 사용해서 프로젝트에서 앱별로 요청을 넘겨주는 구조
1
path('articles/', include('articles.urls'))

→ 위 줄은 “articles로 시작하는 주소 요청은 articles 앱한테 넘겨줘~” 라는 뜻


URL에 이름 붙이는 이유?

  • 나중에 템플릿에서 URL을 쓸 때 "경로를 직접 안 쓰고" 이름으로 참조 가능
  • 경로가 바뀌어도, 이름은 안 바꾸면 됨
  • app_nameurl name을 같이 쓰면 다른 앱과 충돌 없이 명시적임

예:

1
{% url 'articles:article-list' %}

🛠 Admin 관리자 사이트에서 테스트하기

지금은 게시글이 없기 때문에, 데이터를 추가해야 확인 가능함!

→ Django는 기본 관리자 페이지를 제공함

  1. 관리자 계정 생성
1
python manage.py createsuperuser
  1. 관리자 사이트 등록 (articles/admin.py)
1
2
3
4
from django.contrib import admin
from .models import Article

admin.site.register(Article)
  1. 브라우저에서 http://127.0.0.1:8000/admin/ 접속 후 로그인

→ 게시글 직접 추가 가능!


🎯 정리

지금까지 한 작업은:

  • DRF 설치 및 등록
  • 모델 정의 → 마이그레이션
  • 직렬화 → APIView 정의 → URL 연결
  • 관리자 페이지로 데이터 추가

다음 단계는?

👉 Next.js에서 이 API를 호출해서 프론트에 표시해보기!

  • CORS 설정으로 Django와 Next.js 연동
  • axios/fetch로 API 요청
  • 게시글 리스트 렌더링

주소 끝에 /가 왜 붙을까?

  • Django에서는 URL 끝에 / 붙는 게 기본 관행 (ex: /articles/) → 이게 없으면 301 리다이렉트 발생함
1
# 이거 헷갈릴 수 있는데 주소 끝에 `/` 붙이도록 습관화하기!

개발 팁

  • .gitignore 파일은 보통 manage.py와 같은 위치에 둠
  • venv로 가상환경을 만들면 자동으로 .gitignore에 포함되지만, 다른 이름으로 만들면 직접 추가해야 함
1
2
3
4
5
# pip freeze로 의존성 목록 저장
pip freeze > requirements.txt

# 다른 사람은 이걸로 한방에 설치!
pip install -r requirements.txt

  • git ignore를 만들어줘야 후에 깃에 프로젝트를 올릴 필요가없는 가상환경은 올라가지 않는다.
    • 용량이 너무 크고 git은 소스코드만 추적하는 곳인데, 이런 큰 바이너리 파일(사람이 읽을 수 없는 0과 1로 이루어진 파일)을 올리면 속도가 느려지고 용량도 낭비된다. requirements.txt 파일로 누구든지 그냥 만들수있음. pip install -r requirements.txt를 입력하여 requirements.txt 내 패키지와 버젼에 맞춰 설치한다. ==> 패키지를 삭제하려면 pip uninstall 삭제하고싶은패키지이름 어떤 버젼을 다운 받을 수있는지 보고싶다면? pip install Django== 라고 치면 설치가등 버젼 보여줌 ==> 근데 최신버젼은 안먹힘 pip index versions Django 최신버젼은 이렇게 입력을 해야함! 업글하려니 파이썬이 3.9. 라인 버젼이라 되지않음 5.2.3은 3.10부터 사용가능하다고!

github - newmovie

This post is licensed under CC BY 4.0 by the author.