React + Node.js(Express) 연동하기 (1)
React + Node.js(Express) 연동하기 (2)
여기까지 오는데 위의 두 게시물이 정말 큰 도움이 되었다 감사합니다🙇♀️
이하의 과정은 node.js가 설치 되어 있다는 가정 하에 진행됩니다.
npx create-react-app client
npm install express
Express는 node.js의 핵심 모듈인 http와 connect 컴포넌트를 기반으로 하는 웹 프레임워크로, 개발을 빠르고 손쉽게 할 수 있도록 도와주는 역할을 한다. 이는 미들웨어 구조 때문에 가능한 것.
미들웨어함수는 요청 오브젝트(req)와 응답 오브젝트(res), 그리고 어플리케이션 요청-응답 사이클 도중 그 다음의 미들웨어 함수에 대한 액세스 권한을 갖는 함수이다. 간단하게 말하면 미들웨어란 클라이언트에게 요청이 오고, 그 요청을 보내기 위해 응답하려는 중간(미들)에 목적에 맞게 처리를 하는, 거쳐가는 함수들이라고 볼 수 있겠다.
const express = require('express');
const app = express();
const test = require('.//Router/test');
app.use('/', test);
const port=5000; //React가 3000번 포트를 사용하기 때문에 node 서버가 사용할 포트넘버는 다른 넘버로 지정해준다.
app.listen(port, ()=>{console.log(`Listening on port ${port}`)});
const express = require('express');
const router = express.Router();
router.get('/', (req, res)=>{
res.send({ test: "hi"});
});
module.exports = router;
node ./server/server.js
http://localhost:5000/
으로 접속해서 "hi"가 뜬다면 성공nodemon: node 명령어는 파일을 변경할 때마다 이전 명령어를 종료하고 다시 실행해야하는 불편함이 있는데 nodemon을 이용하면 바로바로 업데이트 가능
concurrently: react 서버와 node 서버를 동시에 실행시키기 위한 모듈
npm install nodemon --save
npm install concurrently --save
(dev를 붙이면 local에서만 사용하겠다는 의미)
"scripts": {
"server": "cd server && nodemon server",
"client": "cd client && npm start",
"start": "concurrently --kill-others-on-fail \"npm run server\" \"npm run client\""
},
"devDependencies": {
"nodemon": "^2.0.7"
},
"dependencies": {
"concurrently": "^6.0.0",
"express": "^4.17.1",
},
npm start
를 실행하고 3000번, 5000번 포트로 접속해서 이상이 없다면 성공!react와 node 서버 간에 데이터를 주고 받기 위해서는 프록시 모듈이 필요하다
Proxy: '대신'이라는 사전적 의미를 가지고 있으며 클라이언트와 서버 사이의 네트워크 통신을 '대리'로 수행하는 미들웨어이다.
프록시 설치 npm install htpp-proxy-middleware --save
프록시 설정을 위해 client/src에 setupProxy.js를 생성
const proxy = require('http-proxy-middleware');
module.exports = (app) => {
app.use(
proxy('/api', { //도메인 api로 호출
target: 'http://localhost:5000/', //통신할 서버의 도메인주소
changeOrigin: true,
})
)
}
npm install axios
const express = require('express');
const router = express.Router();
router.get('/', (req, res)=>{
res.send({ test: "hi"});
});
module.exports = router;
import axios from "axios";
import { useEffect } from 'react';
function App() {
const callApi = async()=>{
axios.get("/api").then((res)=>{console.log(res.data.test)});
};
useEffect(()=>{
callApi();
}, []);
return (
<div className="App">
...
</div>
);
}
export default App;