2022. 8. 18. 02:39ㆍFront-end/React.js
React는 클라이언트를 만드는 프레임워크입니다. 따라서 웹서버를 따로 만들어서 이 서버와 클라이언트를 연동해야 합니다. 지난번 게시글에서는 자바스크립트 기반의 Node.js와 연동했지만 Python 기반의 Django와 연동할수도 있습니다.
일반적으로 Django와 React간에 값을 주고받을때 Django-Rest-Framework를 사용하여 API를 호출하지만 이 게시글에서는 조금 더 간단하고 기초적인 방법을 사용하였습니다.
Django
- Python 기반 웹 프레임워크입니다.
- 클라이언트, 서버를 모두 만들 수 있습니다.
- Python 기반의 다양한 라이브러리를 사용할 수 있습니다.
Django 프로젝트 및 앱 생성
- Django를 설치합니다.
- 터미널에서 "django-admin startproject 프로젝트이름"을 실행합니다. "프로젝트이름"에 해당하는 폴더가 생성됩니다.
- "프로젝트이름" 폴더 내부로 이동합니다.
- 터미널에서 "python manage.py startapp 앱이름"을 실행합니다. "앱이름"에 해당하는 폴더가 생성됩니다.
- 터미널에서 "python manage.py runserver"를 실행합니다.
인터넷 브라우저로 http://127.0.0.1:8000에 접속하여 Django 템플릿이 실행되는 모습을 확인합니다.
Django - setting.py CORS 설정
이전 게시글의 Node.js와 마찬가지로, Django에서도 CORS 오류를 해결해야 합니다.
1. 터미널에서 다음을 실행하여 django-cors-headers를 설치합니다.
pip install django-cors-headers
2. 프로젝트 폴더의 settings.py를 다음과 같이 수정합니다. 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware'는 MIDDLEWARE 내부에서 가장 상위에 위치해야 합니다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
########
'tempApp', # APP 이름
'corsheaders' # CORS 추가
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # CORS 추가
'django.middleware.common.CommonMiddleware', # CORS 추가
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# CORS 추가
CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:8000', 'http://localhost:3000')
CORS_ALLOW_CREDENTIALS = True
Django 앱 만들기
React가 Django에 axios로 요청하면 Django가 React에 응답하는 앱입니다.
1. 프로젝트이름/ urls.py 를 수정합니다.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('tempApp.urls')),
]
http://127.0.0.1:8000/ 으로 요청받으면 프로젝트 폴더 내의 "앱이름/ urls.py"를 실행합니다.
2. 프로젝트이름/ 앱이름/ urls.py 를 추가합니다.
from django.urls import path, include
from . import views
urlpatterns = [
path('', views.main),
]
앱의 url을 다양하게 추가할 수 있습니다. path의 첫번째 argument는 http://127.0.0.1:8000/ 부분에 해당합니다. 이 부분에 아무것도 입력이 되지 않을 경우에는 views.py의 main이 실행됩니다.
3. 프로젝트이름/ 앱이름/ views.py 를 수정합니다.
from django.shortcuts import render
from django.http import HttpResponse
def main(request):
message = request.GET.get('abc')
print(message)
return HttpResponse("안녕?")
Django가 http://127.0.0.1:8000으로 GET 요청을 받았을 때, 그 GET 요청과 함께 전달된 값을 가져올 수 있습니다. dictionary 구조로 받는다고 가정했을 때, 키 'abc'에 대응하는 값을 message에 저장합니다. 터미널에서 message를 확인할 수 있습니다.
요청한 클라이언트에 HttpResponse로 응답을 보낼 수 있습니다.
React 프로젝트 - App.js 수정
import "./App.css";
import React, { useState } from "react";
import axios from "axios";
function App() {
const [text, setText] = useState("없음");
const clicked = () => {
axios
.get("http://127.0.0.1:8000", {
params: {
abc: "가나다",
},
})
.then((response) => setText(JSON.stringify(response.data)));
};
return (
<div>
<h1>{text}</h1>
<button onClick={clicked}>클릭</button>
</div>
);
}
export default App;
실행한 모습은 다음과 같습니다.
버튼을 클릭하면 http://127.0.0.1:8000에 GET 요청을 합니다. 이 때 자바스크립트 기반의 내장된 fetch를 사용할 수도 있지만 여기서는 axios를 사용했습니다. 요즘은 axios가 fetch보다 더 자주쓰이는 추세입니다.
Axios
- HTTP 통신, 비동기 라이브러리입니다.
- 요청에 대한 응답을 JSON 형태로 변경해줍니다.
- Fetch보다 코드가 단순합니다.
axios.get()의 두번째 argument로 값을 전달할 수 있습니다. params : { 키: 값 } 의 형식입니다.
요청에 대한 응답을 받으면 .then()으로 응답을 처리할 수 있습니다. 여기서는 response라는 매개변수로 응답을 지칭하여 JSON 형식의 response로부터 값을 꺼냅니다.
'Front-end > React.js' 카테고리의 다른 글
[React] 함수형 컴포넌트에서 상태를 변화시키기: useState() (0) | 2022.08.31 |
---|---|
[React] 컴포넌트가 렌더링 될 때 작업 실행하기: useEffect() (0) | 2022.08.30 |
[React] Node.js와 연동하기: 값 주고 받기 (0) | 2022.08.15 |
[React] 페이지를 이동하면서 값 전달하기: useNavigate()와 useLocation() (0) | 2022.08.10 |
[React] 페이지의 URL을 설정하기: Route를 사용 (0) | 2022.08.09 |