[Django] 장고 입문기! 장고 너는 누구냐 ...

django프레임워크
avatar
2025.05.27
·
9 min read

6452

🍹 갑자기 장고?

요즘 FISA 최종 프로젝트를 하고 있는데용

담당하게 된 기능이 시간 이슈로 하나하나 늘어가다 보니까 새로운 것을 시도해보고 싶다는 생각이 들었어유

플라스크로 두 기능을 띄워보고 나니까 이번엔 장고를 해볼까? 해서

장고를 해보기로 했습니다

🐈‍⬛ Django란?

6454

Django는 파이썬 기반의 오픈소스 웹 프레임워크로, MTV(Model-Template-View) 아키텍처 패턴을 따릅니다.

The web framework for perfectionists with deadlines."

📌 django의 핵심 특징

기능

설명

MTV 구조

모델, 템플릿, 뷰로 역할 분리

ORM

데이터베이스를 파이썬 객체로 다룰 수 있음

(SQL 거의 없이 CRUD 가능)

Admin 자동 생성

관리자 페이지를 자동으로 생성해주는 기능

보안 내장

CSRF, SQL Injection, XSS 등 다양한 보안 기능 자동 지원

라우팅

URLConf를 통해 URL과 뷰 함수를 매핑

템플릿 시스템

HTML + Django 템플릿 언어로 UI 구성

확장성

다양한 앱들을 플러그인처럼 붙일 수 있음(재사용 가능)

🗂 MTV 구조 설명

구성 요소

역할

Model

DB 구조 정의 (예. 테이블)

Template

사용자에게 보여질 HTML

View

비즈니스 로직 처리, Model과 Template 연결

🔁 이 구조는 일반적인 MVC와 비슷하되, Template - View 역할, View - Controller 역할을 함

🚀 개발 흐름 예시

  1. 모델 정의

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
  1. 뷰 작성

def post_list(request):
    posts = Post.objects.all()
    return render(request, 'blog/post_list.html', {'posts': posts})
  1. URL 연결

urlpatterns = [
    path('', post_list),
]
  1. 템플릿 작성post_list.html

{% for post in posts %}
    <h2>{{ post.title }}</h2>
    <p>{{ post.content }}</p>
{% endfor %}

Django의 장점

  • 생산성 높음

    • 관리 페이지, ORM, 인증 등 기본 내장

  • 보안 우수

    • 설정만 잘 하면 보안 취약점 대응 쉬움

  • 커뮤니티/문서 활발

  • 확장성/재사용성 뛰어남

    • 앱 단위 개발 가능

🧩 Django가 적합한 경우

  • 블로그, 쇼핑몰, 커뮤니티 등 빠른 CRUD 중심 웹앱

  • 내부 관리 시스템, API 서버(Django REST Framework 활용 시)

👻 Saju_project 사주 기반 매물 추천 기능

📌 개요

사용자로부터 생년월일, 태어난 시를 입력 받음

→ 사주와 오행의 개수를 계산

→ 모자란 오행을 보완하기 위한 방향(예. 남향, 북향 등)에 해당하는 매물을 DB에서 필터링

→ 랜덤으로 10개 출력

💻 기술 스택

  • 🧠 언어: python

  • 🧱 프레임워크: django

  • 🎨 FE: HTML, Javascript, Animate.css

  • 🗄 DB: MySQL

🔗 전체 구조 흐름

HTML + JavaScript (사용자 입력)
   ↓
Django View (Python 로직 처리)
   ↓
MySQL (데이터 및 조회)
   ↓
Django Template (HTML 출력)

🥵 어려웠던 점

  • 디렉토리 구조가 너무 복잡함

    • 기존 flask를 쓸 때는 app.pyindex.html만 있으면 됐었음

    • django는 기본 세팅부터가 어려웠음

  • flask보다는 무거웠음 (용량이 모자란 상황이었어서) docker 용량에 부담

  • tailwind를 시도해보려다가 절차가 너무 복잡하고 어려워서 (시간상) 포기

🛫 Django 배포 방법

  • 배포 로컬 개발환경에서 만들던 웹앱을 실제 서버에서 작동하도록 설정하는 일

방법

특징

추천 대상

Render

무료, 간편, github 연동, 자동 배포

입문자, 포트폴리오, 데모용

Heroku

쉬운 설정, 자동화된 배포 파이프라인

입문자, 학습용, 소규모

PythonAnywhere

무료 플랜 있음, 간단한 설정

아주 간단한 웹앱

VPS(예. AWS EC2, DigitalOcean)

완전한 자유, 성능 좋음

실무용, 상용 서비스

Docker + Cloud(AWS, GCP 등)

유연성 최고, 복잡함

대규모, DevOps 경험자

📎 예. Render를 통한 배포

  • Render은 Github와 연동해서 자동으로 배포해주는 호스팅 플랫폼

  1. 필수 파일 추가

requirements.txt 생성

pip freeze > requirements.txt

Procfile 생성 (Render용):

web: gunicorn yourproject.wsgi

build.sh (권장):

#!/usr/bin/env bash
# Collect static files and migrate DB
python manage.py collectstatic --noinput
python manage.py migrate

  1. Github에 푸시

git init
git add .
git commit -m "init"
git remote add origin https://github.com/yourname/yourproject.git
git push -u origin main

  1. Render에 설정

./build.sh
  • Start Command

gunicorn yourproject.wsgi
  • 환경변수 설정 (예. SECRET_KEY, DEBUG=False, ALLOWED_HOSTS, DATABASE_URL 등)

📂 배포 전 필수 설정 (모든 플랫폼 공통)

  • settings.py 변경

DEBUG = False
ALLOWED_HOSTS = ['yourdomain.com', 'your-render-url.onrender.com']
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
  • 정적 파일 수집

python manage.py collectstatic
  • 데이터베이스 마이그레이션

python manage.py migrate

🛡 보안 주의사항

  • .env 또는 환경변수로 SECRET_KEY, DB 비밀번호, DEBUG 등 관리

  • DEBUG=False 꼭 설정

  • ALLOWED_HOSTS 꼭 지정

Django에서 REST API를 만드는 방법은 일반적으로 Django REST framework을 사용하는 것이 가장 강력하고 널리 쓰이는 방식`

🦥 REST API란?

REST API는 웹에서 데이터를 주고받는 방식 중 하나

클라이언트(프론트엔드, 앱 등)가 서버에 GET/POST/PUT/DELETE 요청을 보내고, 서버는 JSON 형식으로 응답

🍄 Django REST API 만들기 - 핵심 흐름

  1. Django 프로젝트와 앱 생성

django-admin startproject myapi
cd myapi
python manage.py startapp blog
  1. Django REST framework 설치

pip install djangorestframework

settings.py에 추가:

INSTALLED_APPS = [
    ...
    'rest_framework',
    'blog',
]
  1. 모델 만들기 blog/models.py

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
python manage.py makemigrations
python manage.py migrate
  1. Serializer 만들기 blog/serializers.py

from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'
  1. view 만들기 blog/views.py

from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
  1. URL 연결

blog/urls.py 생성:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostViewSet

router = DefaultRouter()
router.register(r'posts', PostViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

myapi/urls.py 수정:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('blog.urls')),
]
  1. 서버 실행하고 테스트

python manage.py runserver