📘 DRF  📒 JavaScript 

DRF(Django REST Framework)와 JavaScript 프런트엔드 작업을 연결을 위해 알아야 할 중요한 개념들


1️⃣ REST API 개념

  • DRF : 데이터를 제공하는 API 서버 역할
  • JavaScript(예: React, Vue, Vanilla JS) : DRF로부터 데이터를 받아서 화면에 보여주는 역할
  • API 요청 방식:
    •  GET  : 데이터를 가져옴 (예: 게시글 목록 조회)
    •  POST  : 데이터를 생성 (예: 회원가입)
    •  PUT/PATCH  : 데이터를 수정 (예: 프로필 수정)
      •  PUT 
      •  PATCH 
    •  DELETE  : 데이터를 삭제 (예: 댓글 삭제)

2️⃣ CORS (Cross-Origin Resource Sharing)

  • DRF 서버와 JavaScript 프론트가 다른 도메인(출처)에서 실행될 때 발생하는 보안 문제.
  • 해결 방법: django-cors-headers 라이브러리를 설치하고 허용 설정 추가.
    • JavaScript가 다른 도메인(예: localhost:5500 같은 곳)에서 실행된다면, DRF에 django-cors-headers를 설치하고 설정

▼ 설정 방법

더보기
pip install django-cors-headers
# settings.py
INSTALLED_APPS = [
    "corsheaders",
    "rest_framework",
    ...
]

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    ...
]

CORS_ALLOW_ALL_ORIGINS = True  # 개발 중에는 허용

 

특정 도메인만 허용하는 경우
# settings.py
CORS_ALLOWED_ORIGINS = [
    "http://127.0.0.1:5500",  # JS 실행되는 주소
]

3️⃣ JSON 형식 데이터

  • DRF는 데이터를 JSON 형태로 반환함.
# JSON
{
  "id": 1,
  "title": "Hello, DRF!",
  "content": "This is my first post."
}
  • JavaScript에서는 fetch 또는 axios를 이용해 이 JSON 데이터를 가져옴.

✨ 예제

1️⃣ DRF에서 게시글 API 만들기

DRF에서 게시글 데이터를 제공하는 API를 만들었다고 가정.
# views.py
from rest_framework.response import Response
from rest_framework.decorators import api_view

posts = [
    {"id": 1, "title": "첫 번째 글", "content": "안녕하세요!"},
    {"id": 2, "title": "두 번째 글", "content": "반가워요!"},
]

@api_view(["GET"])
def get_posts(request):
    return Response(posts)

 

2️⃣ JavaScript에서 API 데이터 가져와서 화면에 표시

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>게시글 리스트</title>
</head>
<body>
    <h1>게시글 목록</h1>
    <!-- 게시글 목록을 표시할 <ul> 태그 -->
    <ul id="post-list"></ul>

    <script>
        // 게시글 데이터를 가져오는 비동기 함수
        async function fetchPosts() {
            try {
                // DRF에서 제공하는 API 엔드포인트로 GET 요청을 보냄
                let response = await fetch("http://127.0.0.1:8000/api/posts/");

                // 서버 응답을 JSON 형식으로 변환
                let posts = await response.json();

                // <ul> 요소 가져오기 (게시글 목록이 표시될 곳)
                let postList = document.getElementById("post-list");

                // 기존 목록을 지우고 새로운 데이터를 표시하기 위해 초기화
                postList.innerHTML = "";

                // API에서 받은 게시글 목록을 하나씩 반복하며 화면에 추가
                posts.forEach(post => {
                    let li = document.createElement("li"); // <li> 요소 생성
                    li.textContent = `${post.id}. ${post.title}`; // 게시글 번호와 제목 추가
                    postList.appendChild(li); // <ul>에 추가
                });
            } catch (error) {
                // 오류 발생 시 콘솔에 로그 출력
                console.error("데이터를 가져오는 중 오류 발생:", error);
            }
        }

        // 페이지가 로드되면 fetchPosts 함수 실행 (게시글 목록 불러오기)
        fetchPosts();
    </script>
</body>
</html>

 

💡 코드 설명

  1. HTML 구조
    • <h1> : 제목 표시
    • <ul id="post-list"> : 게시글 목록이 추가될 공간
  2. fetchPosts() 함수
    • fetch("http://127.0.0.1:8000/api/posts/") : DRF 서버에서 게시글 데이터를 가져옴.
    • response.json() : JSON 형식으로 변환.
    • document.getElementById("post-list") : <ul> 요소를 가져옴.
    • postList.innerHTML = "" : 기존 목록을 초기화.
    • forEach(post => {...}) : API에서 받은 게시글 데이터를 <li> 요소로 추가.
  3. 오류 처리
    • try...catch를 사용하여 API 요청 중 오류가 발생하면 콘솔에 로그를 출력.
  4. 자동 실행
    • fetchPosts();가 실행되면서 페이지가 로드될 때 자동으로 게시글 목록을 가져옴.

 

'🔥 공부 > 🎨 Front-end' 카테고리의 다른 글

[🎨Front-end] HTML/CSS/JS, JavaScript 통신  (0) 2025.03.17
[🎨Front-end] HTML, CSS 기초  (0) 2025.02.20

🐾Recent posts