Post

Django: JSON Response와 Serialization

Django에서 JSON 응답을 생성하고 데이터를 직렬화하는 방법에 대한 심층적인 가이드.

Django: JSON Response와 Serialization

01. JSON Response 만들기

Django에서 클라이언트에게 데이터를 반환할 때, JSON 형식으로 응답을 제공하는 방법과 이를 효율적으로 처리하기 위한 직렬화(Serialization)에 대해 알아보겠습니다.

프로젝트 환경 설정

  1. 새로운 프로젝트 생성
    • api_pjt라는 이름의 프로젝트 생성
    • articles 앱 생성 후, 기본적인 URL 구조를 작성합니다.
    1
    2
    3
    
    django-admin startproject api_pjt
    cd api_pjt
    python manage.py startapp articles
    
  2. URL 연결
    • 프로젝트의 urls.py에서 articles 앱으로 경로를 연결합니다.
    1
    2
    3
    4
    5
    
    from django.urls import path, include
    
    urlpatterns = [
        path('api/v1/articles/', include('articles.urls')),
    ]
    
  3. articles 앱의 URL 구성
    • /html/, /json-01/, /json-02/와 같은 경로를 연결합니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    from django.urls import path
    from . import views
    
    app_name = "articles"
    urlpatterns = [
        path("html/", views.article_list_html, name="article_list_html"),
        path("json-01/", views.json_01, name="json_01"),
        path("json-02/", views.json_02, name="json_02"),
    ]
    
  4. 모델 작성
    • Article 모델을 작성합니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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)
        updated_at = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.title
    
  5. 데이터베이스 마이그레이션

    1
    2
    
    python manage.py makemigrations
    python manage.py migrate
    
  6. 데이터 생성
    • Django Seed 라이브러리를 사용해 더미 데이터를 생성합니다.
    1
    
    pip install django-seed
    
    • settings.pydjango_seed를 추가합니다.

      1
      2
      3
      4
      
      INSTALLED_APPS = [
          "django_seed",
          "articles",
      ]
      
    • 더미 데이터 생성 명령 실행:

      1
      
      python manage.py seed articles --number=30
      

Response 만들기 (1): HTML Response

  1. HTML Response 생성
    • article_list_html 뷰를 작성하여 데이터를 HTML로 출력합니다.
    1
    2
    3
    4
    5
    6
    7
    
    from django.shortcuts import render
    from .models import Article
    
    def article_list_html(request):
        articles = Article.objects.all()
        context = {"articles": articles}
        return render(request, "articles/articles.html", context)
    
  2. HTML 템플릿 작성

    • templates/articles/articles.html 파일 생성:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
           
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>API PJT</title>
      </head>
      <body>
          <h1>Article List</h1>
          <hr>
          {% for article in articles %}
              <h3>title: {{ article.title }}</h3>
              <p>content: {{ article.content }}</p>
              <p>created_at: {{ article.created_at }}</p>
              <p>updated_at: {{ article.updated_at }}</p>
              <hr>
          {% endfor %}
      </body>
      </html>
          
      

Response 만들기 (2): JSON Response

방법 1: 직접 JSON 데이터 생성

  1. 뷰 작성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    from django.http import JsonResponse
    from .models import Article
    
    def json_01(request):
        articles = Article.objects.all()
        json_res = []
    
        for article in articles:
            json_res.append(
                {
                    "title": article.title,
                    "content": article.content,
                    "created_at": article.created_at,
                    "updated_at": article.updated_at,
                }
            )
    
        return JsonResponse(json_res, safe=False)
    
  2. JsonResponse

    • JSON 형식으로 응답을 반환합니다.
    • safe 매개변수를 False로 설정하여 리스트를 반환할 수 있도록 합니다.

방법 2: Django의 내장 Serializer 사용

  1. 뷰 작성

    1
    2
    3
    4
    5
    6
    7
    8
    
    from django.http import HttpResponse
    from django.core import serializers
    from .models import Article
    
    def json_02(request):
        articles = Article.objects.all()
        res_data = serializers.serialize("json", articles)
        return HttpResponse(res_data, content_type="application/json")
    
  2. 특징

    • serializers.serialize()를 사용하여 QuerySet을 JSON으로 변환합니다.
    • 모델 구조에 한정된 데이터만 포함합니다.

Serialization이란?

직렬화의 정의

  • 직렬화(Serialization)는 데이터를 전송 가능하거나 저장 가능한 형식으로 변환하는 과정입니다.
  • Django에서는 모델 인스턴스나 QuerySet을 JSON, XML, YAML 등의 형식으로 변환합니다.

Django의 직렬화 한계

  • 기본 Serializer는 모델 구조에 종속적이며 유연성이 부족합니다.
  • 새로운 필드 추가나 데이터 구조 변경이 어렵습니다.

해결책: 유연한 Serializer의 필요성 Django REST framework(DRF)에서 제공하는 Serializer를 사용하면, 모델과 무관한 유연한 데이터 직렬화를 구현할 수 있습니다. 이를 통해 데이터 구조를 자유롭게 정의하고 검증할 수 있습니다.

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