Django에서 SSR vs CSR을 구현하는 방법
N
nuuthang
Comments
댓글 0
포스트 내용에 대한 의견이나 질문을 남길 수 있습니다. 답글과 좋아요는 로그인한 사용자 기준으로 기록됩니다.
새 댓글은 아래에서 바로 등록됩니다.
댓글 작성과 반응 기능은 로그인 후 사용할 수 있습니다.로그인하러 가기
첫 번째 댓글을 남겨보세요.
광고
이전 글과 다음 글
현재 글을 기준으로 앞뒤 글을 바로 이동해서 볼 수 있습니다.
Loading Services...
포스트 내용에 대한 의견이나 질문을 남길 수 있습니다. 답글과 좋아요는 로그인한 사용자 기준으로 기록됩니다.
현재 글을 기준으로 앞뒤 글을 바로 이동해서 볼 수 있습니다.

Django는 기본적으로 SSR(Server-Side Rendering) 방식으로 동작하는 웹 프레임워크입니다. 하지만 CSR(Client-Side Rendering) 방식이 필요한 경우에는 Django의 API 서버 역할을 활용하여 프론트엔드를 분리할 수도 있습니다.
Django의 기본 방식은 템플릿 엔진(Django Template Language, DTL) 을 이용하여 서버에서 HTML을 렌더링하는 SSR 방식입니다.
views.py에서 데이터를 가져와 HTML을 렌더링 후 응답from django.shortcuts import render
from .models import Product
def product_list(request):
products = Product.objects.all()
return render(request, 'products/list.html', {'products': products})
html
복사편집
<!-- products/list.html -->
<h1>상품 목록</h1>
<ul>
{% for product in products %}
<li>{{ product.name }} - {{ product.price }}원</li>
{% endfor %}
</ul>
render() 함수를 사용하여 서버에서 HTML을 완성한 후 클라이언트로 전달Django cache framework 를 활용하여 템플릿을 캐싱 가능from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 15분 캐싱
def product_list(request):
products = Product.objects.all()
return render(request, 'products/list.html', {'products': products})
Django는 백엔드 API 역할을 하고, 프론트엔드는 React 또는 Vue를 사용하여 클라이언트에서 데이터를 받아 CSR 방식으로 렌더링할 수도 있습니다.
# views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Product
from .serializers import ProductSerializer
@api_view(['GET'])
def product_list(request):
products = Product.objects.all()
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
# urls.py
from django.urls import path
from .views import product_list
urlpatterns = [
path('api/products/', product_list, name='product-list'),
]
# serializers.py
from rest_framework import serializers
from .models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
React 예제:
import { useEffect, useState } from "react";
function ProductList() {
const [products, setProducts] = useState([]);
useEffect(() => {
fetch("http://localhost:8000/api/products/")
.then(response => response.json())
.then(data => setProducts(data));
}, []);
return (
<div>
<h1>상품 목록</h1>
<ul>
{products.map(product => (
<li key={product.id}>{product.name} - {product.price}원</li>
))}
</ul>
</div>
);
}
export default ProductList;
Vue 예제:
<template>
<div>
<h1>상품 목록</h1>
<ul>
<li v-for="product in products" :key="product.id">
{{ product.name }} - {{ product.price }}원
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
products: [],
};
},
mounted() {
fetch("http://localhost:8000/api/products/")
.then((response) => response.json())
.then((data) => (this.products = data));
},
};
</script>
💡 SEO & 빠른 로딩 필요:
➡ Django 템플릿(SSR) 사용
💡 SPA & 대화형 웹앱 필요:
➡ Django + React/Vue (CSR)
💡 둘 다 필요 (SEO & SPA):
➡ Next.js/Nuxt.js + Django API (하이브리드)