🛠 Django에서 SSR vs CSR을 구현하는 방법
Django는 기본적으로 SSR(Server-Side Rendering) 방식으로 동작하는 웹 프레임워크입니다. 하지만 CSR(Client-Side Rendering) 방식이 필요한 경우에는 Django의 API 서버 역할을 활용하여 프론트엔드를 분리할 수도 있습니다.
✅ 1. Django에서 SSR을 사용하는 방법
Django의 기본 방식은 템플릿 엔진(Django Template Language, DTL) 을 이용하여 서버에서 HTML을 렌더링하는 SSR 방식입니다.
📌 SSR 구현 방법
- Django 템플릿 엔진 활용
views.py에서 데이터를 가져와 HTML을 렌더링 후 응답- 장점: 간단하게 SEO 최적화 가능, 초기 로딩 속도가 빠름
- 템플릿을 사용한 SSR 예제
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})
✅ 2. Django + React/Vue를 활용한 CSR
Django는 백엔드 API 역할을 하고, 프론트엔드는 React 또는 Vue를 사용하여 클라이언트에서 데이터를 받아 CSR 방식으로 렌더링할 수도 있습니다.
📌 CSR 구현 방법
- Django에서 Django REST Framework(DRF) 를 이용하여 API를 제공
- 프론트엔드(React, Vue)에서 API 데이터를 가져와 렌더링
- SEO가 필요한 경우, Next.js/Nuxt.js 같은 SSR 지원 프레임워크와 결합
🚀 Django REST Framework(DRF) 설정
- Django에서 API 서버를 만들고 CSR 프론트엔드가 데이터를 요청하도록 함
(1) Django에서 API 만들기
# 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__'
(2) React/Vue에서 API 요청
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>
✅ 3. Django에서 SSR + CSR 하이브리드 방식
- Django 템플릿을 이용해 SSR 기본 페이지를 제공
- React/Vue를 추가하여 CSR 방식으로 일부 UI 업데이트
- SEO가 중요한 경우 Next.js/Nuxt.js와 Django API 서버를 연결하여 SSR 적용
📌 SSR + CSR 조합이 필요한 경우
- 블로그, 뉴스 사이트: 초기 페이지는 SSR, 댓글 시스템은 CSR
- eCommerce(쇼핑몰): 상품 목록은 SSR, 장바구니는 CSR
- 관리자 페이지: 로그인 전 SSR, 로그인 후 CSR(SPA)
✅ 결론: Django에서 어떻게 선택해야 할까?
💡 SEO & 빠른 로딩 필요:
➡ Django 템플릿(SSR) 사용
💡 SPA & 대화형 웹앱 필요:
➡ Django + React/Vue (CSR)
💡 둘 다 필요 (SEO & SPA):
➡ Next.js/Nuxt.js + Django API (하이브리드)

댓글
댓글 로딩 중...