[블로그 만들기 #1] - DRF로 API 서버 구축하기

2025. 12. 14. 22:24📚 Django

Django REST Framework로 API 서버 구축하기

📝 [BACK-1] DRF로 블로그 API 서버 구축

Django REST Framework를 활용한 개인 블로그 API 서버 만들기


Django DRF REST API

🎯 이번 목표

Django REST Framework를 활용하여 개인 블로그 서비스에 필요한 API 서버를 구축합니다. 카테고리, 게시글, 댓글 모델을 정의하고 데이터를 관리할 수 있는 기본 구조를 만들어봅니다.

⚙️ 프로젝트 초기 설정

1 .gitignore 생성

터미널
# gitignore.io 사이트에서 생성하거나
# 직접 생성
touch .gitignore
.gitignore
# 가상환경
venv/

# Django
*.pyc
__pycache__/
db.sqlite3
media/

# IDE
.vscode/
.idea/

2 가상환경 & Django 설치

터미널
# 가상환경 생성
python -m venv venv

# 가상환경 활성화 (Windows)
venv\Scripts\activate

# 가상환경 활성화 (Mac/Linux)
source venv/bin/activate

# Django 설치
pip install django

3 DRF 설치

터미널
# Django REST Framework 설치
pip install djangorestframework

4 Django 프로젝트 생성

터미널
# 프로젝트 생성
django-admin startproject blog_api_service .

# posts 앱 생성
python manage.py startapp posts

5 settings.py 설정

blog_api_service/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # DRF 추가
    'rest_framework',
    # posts 앱 추가
    'posts',
]

🗄️ 모델 정의

블로그 서비스에 필요한 3가지 모델을 정의합니다: 카테고리(Category), 게시글(Post), 댓글(Comment)

📊 모델 스키마

Category (카테고리)

필드명 타입
PK PRIMARY KEY
name Text(250)

Post (게시글)

필드명 타입
PK PRIMARY KEY
category Foreign Key
title Text(100)
content Text(250)
created_at DateTime
updated_at DateTime

Comment (댓글)

필드명 타입
PK PRIMARY KEY
post Foreign Key
content Text(250)
created_at DateTime

모델 코드 작성

posts/models.py
from django.db import models


class Category(models.Model):
    """카테고리 모델"""
    name = models.CharField(max_length=250)
    
    def __str__(self):
        return self.name


class Post(models.Model):
    """게시글 모델"""
    category = models.ForeignKey(
        Category, 
        on_delete=models.CASCADE,
        related_name='posts'
    )
    title = models.CharField(max_length=100)
    content = models.TextField(max_length=250)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    def __str__(self):
        return self.title


class Comment(models.Model):
    """댓글 모델"""
    post = models.ForeignKey(
        Post,
        on_delete=models.CASCADE,
        related_name='comments'
    )
    content = models.TextField(max_length=250)
    created_at = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f'{self.post.title}의 댓글'
🔍 중요 코드 설명
1. ForeignKey 설정
  • on_delete=models.CASCADE - 부모 데이터 삭제 시 자식 데이터도 함께 삭제
  • related_name='posts' - 역참조 이름 지정 (category.posts.all()로 접근 가능)
2. 자동 시간 필드
  • auto_now_add=True - 생성 시 자동으로 현재 시간 저장
  • auto_now=True - 수정 시마다 자동으로 현재 시간 갱신
3. __str__ 메서드
  • 관리자 페이지나 쉘에서 객체를 읽기 쉬운 형태로 표시

🔄 마이그레이션 실행

정의한 모델을 데이터베이스에 반영합니다.

터미널
# 마이그레이션 파일 생성
python manage.py makemigrations

# 데이터베이스에 적용
python manage.py migrate
✅ 마이그레이션 완료

모델이 성공적으로 데이터베이스에 반영되었습니다. 다음 단계에서는 Serializer와 ViewSet을 작성하여 API를 구현할 예정입니다.

🛠️ Admin 페이지 등록 (선택)

Django 관리자 페이지에서 데이터를 쉽게 관리하기 위해 모델을 등록합니다.

posts/admin.py
from django.contrib import admin
from .models import Category, Post, Comment


admin.site.register(Category)
admin.site.register(Post)
admin.site.register(Comment)
터미널
# 슈퍼유저 생성
python manage.py createsuperuser

# 서버 실행
python manage.py runserver

# http://127.0.0.1:8000/admin 접속

📁 현재 프로젝트 구조

프로젝트 구조
blog_api_service/
│
├── blog_api_service/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
│
├── posts/
│   ├── migrations/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py        # ✅ 작성 완료
│   ├── tests.py
│   └── views.py
│
├── venv/
├── .gitignore
├── db.sqlite3
└── manage.py

감사합니다.

Happy Coding! 🚀