Loading...
나무위키 실시간 검색어 순위
실시간 영화 순위
1. 미키 17
2. 캡틴 아메리카: 브레이브 뉴 월드
3. 퇴마록
4. 괜찮아 괜찮아 괜찮아!
5. 그 시절, 우리가 좋아했던 소녀
6. 패딩턴: 페루에 가다!
7. 첫 번째 키스
8. 힘내라 대한민국
9. 이찬원 콘서트 찬가: 디어 마이 찬스
10. 컴플리트 언노운

Django에서 SSR vs CSR을 구현하는 방법

Django에서 SSR vs CSR을 구현하는 방법에 대한 img

🛠 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 구현 방법

  1. Django 템플릿 엔진 활용
  • views.py에서 데이터를 가져와 HTML을 렌더링 후 응답
  • 장점: 간단하게 SEO 최적화 가능, 초기 로딩 속도가 빠름
  1. 템플릿을 사용한 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을 완성한 후 클라이언트로 전달
  1. 템플릿을 캐싱하면 속도 향상 가능
  • 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 구현 방법

  1. Django에서 Django REST Framework(DRF) 를 이용하여 API를 제공
  2. 프론트엔드(React, Vue)에서 API 데이터를 가져와 렌더링
  3. 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 하이브리드 방식

  1. Django 템플릿을 이용해 SSR 기본 페이지를 제공
  2. React/Vue를 추가하여 CSR 방식으로 일부 UI 업데이트
  3. 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 (하이브리드)