
🍹 갑자기 장고?
요즘 FISA 최종 프로젝트를 하고 있는데용
담당하게 된 기능이 시간 이슈로 하나하나 늘어가다 보니까 새로운 것을 시도해보고 싶다는 생각이 들었어유
플라스크로 두 기능을 띄워보고 나니까 이번엔 장고를 해볼까? 해서
장고를 해보기로 했습니다
🐈⬛ Django란?

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 역할을 함
🚀 개발 흐름 예시
모델 정의
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
뷰 작성
def post_list(request):
posts = Post.objects.all()
return render(request, 'blog/post_list.html', {'posts': posts})
URL 연결
urlpatterns = [
path('', post_list),
]
템플릿 작성
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.py
랑index.html
만 있으면 됐었음django는 기본 세팅부터가 어려웠음
flask보다는 무거웠음 ➡ (용량이 모자란 상황이었어서) docker 용량에 부담
tailwind
를 시도해보려다가 절차가 너무 복잡하고 어려워서 (시간상) 포기
🛫 Django 배포 방법
배포 로컬 개발환경에서 만들던 웹앱을 실제 서버에서 작동하도록 설정하는 일
방법 | 특징 | 추천 대상 |
Render | 무료, 간편, github 연동, 자동 배포 | 입문자, 포트폴리오, 데모용 |
Heroku | 쉬운 설정, 자동화된 배포 파이프라인 | 입문자, 학습용, 소규모 |
PythonAnywhere | 무료 플랜 있음, 간단한 설정 | 아주 간단한 웹앱 |
VPS(예. AWS EC2, DigitalOcean) | 완전한 자유, 성능 좋음 | 실무용, 상용 서비스 |
Docker + Cloud(AWS, GCP 등) | 유연성 최고, 복잡함 | 대규모, DevOps 경험자 |
📎 예. Render를 통한 배포
Render은 Github와 연동해서 자동으로 배포해주는 호스팅 플랫폼
필수 파일 추가
➡ 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
Github에 푸시
git init
git add .
git commit -m "init"
git remote add origin https://github.com/yourname/yourproject.git
git push -u origin main
Render에 설정
New Web Service
클릭Github 저장소 연결
Build command
./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 만들기 - 핵심 흐름
Django 프로젝트와 앱 생성
django-admin startproject myapi
cd myapi
python manage.py startapp blog
Django REST framework 설치
pip install djangorestframework
settings.py
에 추가:
INSTALLED_APPS = [
...
'rest_framework',
'blog',
]
모델 만들기
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
Serializer 만들기
blog/serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
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
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')),
]
서버 실행하고 테스트
python manage.py runserver