song.log

[React x Node.js] React와 Node.js 연동하는 방법 본문

DevLog/Node.js

[React x Node.js] React와 Node.js 연동하는 방법

SingaKorean 2020. 1. 15. 22:07
반응형

본격적인 프로젝트에 앞서 Front-end(Client), Back-end(Server) 의 뼈대를 만들기 위해 틀을 만들어야 한다.

React의 create-react-app과 Node.js의 미들웨어 'express', 'http-proxy-middleware'를 활용하여 연동해보자.

 

1. create-react-app 설치


 

npm install -g create-react-app

create-react-app을 설치할 때 자동으로 설치되는 파일을 받기 위한 폴더에 다운로드 한다.

create-react-app myexample

 

모든 다운로드가 끝나면 아래와 같이 자동으로 파일들이 생성 되어있다. 

 

 

 

'npm start'로 리액트가 제대로 실행되는지 확인. 매번 리액트 작업을 확인하고자 할 때에는 'npm start'로 체크한다.

npm start

 

리액트는 포트번호 3000번으로 자동 연결되고 앞으로 설치할 Node.js의 express는 다른 포트번호를 설정해줄 것이다. 

 

2. Node.js express 설치 


Back-end의 프레임워크로 express를 활용하고자 한다. 

npm install express --save

 

서버를 생성하기 위해 라우터가 들어있는 폴더에 index.js 파일을 생성하고, 라우팅을 할 server.js파일을 생성한다. 

 

 

<index.js>

var express = require('express');
var router = express.Router();


router.get('/', function(req, res) {
  
  res.send({greeting:'Hello React x Node.js'});
});

module.exports = router;

 

<server.js> - 이 때 리액트의 포트번호와 충돌나지 않게 다른 번호로 할당한다. 

const express = require('express');
const app = express();
const api = require('./routes/index');

app.use('/api', api);

const port = 3002;
app.listen(port, ()=>console.log(`Listening on port ${port}`));

 

콘솔을 통해 서버가 제대로 돌아가는지 확인할 수 있다. 

 

3. Proxy 설정


프록시(Proxy) 는 사전적인 의미로 '대리'를 뜻한다. 직접 통신할 수 없는 Client와 Server 사이의 중계기 역할로, 네트워크 통신을 대리로 수행하는 것을 의미한다.  

 

 

우리는 React(Client)와 Node.js(Server)를 연동하기 위해  'http-proxy-middleware'를 설치하고자 한다. 

 

npm install http-proxy-middleware --save

 

프록시를 설정하기 위한 setProxy.js를 src 폴더내에 생성한다. 

 

 

<setProxy.js>

const proxy = require('http-proxy-middleware');

module.exports = function (app) {
    app.use(
        proxy('/api', {
            target: 'http://localhost:3002/'
        })
    );
};

 

 

 

package.json에서 start를 npm-run-all 로 설정하면 React와 Node.js를 동시에 시작할 수 있다. 

<package.json>

  "scripts": {
    "start": "npm-run-all --parallel start:**",
    "start:client": "react-scripts start",
    "start:server": "node ./server/app.js",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

 

하지만 React와 Node.js를 따로따로 시작할 수 있는 것이 중간중간 확인하기 편하기 때문에, 

React : npm start

Node.js : node ./server/server.js 또는 pm2 start ./server/server.js --watch 

로 시작하는 것을 권장한다. 

 

 

서버를 켜보면 데이터가 나오고 있고 

 

클라이언트를 켜보면..... 에러가 난다. 

Cross-Origin Resource Sharing (CORS) 정책 상 요청한 데이터를 나타낼 수 없다는 오류가 뜨고 있다. 

 

다른 포트 번호를 사용하는 웹페이지에서 데이터에 접근할 때 보안상 같은 출저의 페이지에서만 접근 할 수 있도록 매커니즘이 만들어져 있기 때문에 위와 같은 오류가 나는 것이다.

 

더 자세한 내용은 아래의 URL을 참고

https://wanago.io/2018/11/05/cors-cross-origin-resource-sharing/ 

 

 

해결방법은 cors를 설치하는 것이다. server.js파일을 아래와 같이 수정해준다.  

npm install cors --save
const express = require('express');
const app = express();
const api = require('./routes/index');
const cors = require('cors');

app.use(cors());
app.use('/api', api);

const port = 3002;
app.listen(port, ()=>console.log(`Listening on port ${port}`));

 

모두 적용시키고 클라이언트/서버 양쪽 모두 실행하면,

 

정상적으로 데이터가 서버쪽에서부터 클라이언트쪽으로 넘어온다. 

 

연동 끝.

 

반응형
Comments