코딩 발걸음 - 한발두발개발

React Api를 이용하여 Database에서 Data 가져오기 본문

개발/React.js

React Api를 이용하여 Database에서 Data 가져오기

한발두발개발 2021. 7. 15. 14:52
728x90

클라이언트 서버가 아닌

먼저 Database에 접근할 백엔드 서버를 구축한다.

리액트로 만든 서버 바깥에 백엔드서버를 구축했음

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = 3001;
const mysql = require('mysql');
const db = mysql.createPool({
    host : '127.0.0.1',
    user : 'root',
    password : 'root',
    database : 'react_db'
});

app.get('/', (req, res) => {
    res.send('연결 되었습니다.')
});

app.get('/api/userList', (req, res) => {
    db.query("SELECT * FROM react_db.user", (err, data) => {
        if (err) {
            console.log('err');
            res.send(err);
        } else{
            console.log('success');
            res.send(data);
        }
    });
});

app.listen(port, ()=>{
    console.log(`Connect at http://localhost:${port}`);
});

2.프론트서버 package.json에 proxy를 설정해준다.

{
  "name": "reactstudy",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.14.1",
    "@testing-library/react": "^11.2.7",
    "@testing-library/user-event": "^12.8.3",
    "express": "^4.17.1",
    "mysql": "^2.18.1",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^5.2.0",
    "react-scripts": "4.0.3",
    "web-vitals": "^1.1.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  //프록시 설정!
  "proxy" : "http://localhost:3001/"
}

프록시를 설정하지 않고 아래처럼 요청할 경우 

fetch("http://localhost:3001/api/userList", reqOption).then((res) => res.json())
.then(data => console.log(data));

cors error

위와 같은 오류가 발생한다.

'교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)'정책을 위반했다는 내용이다.

간단히 요청하는 서버의 포트와 응답해주는 서버의 포트가 다를 때 응답을 해줄수 없다는 내용이다. 이러한 문제를 해결하기 위에 위의 package.json에서 proxy를 설정했다.

 

proxy를 설정하고 아래와처럼 요청 url를 수정해준다.

fetch("/api/userList", reqOption).then((res) => res.json())
.then(data => console.log(data));

 

프론트 서버에서 fetch(혹은 axios )를 이용하여 data를 가져온다.

import './css/common.css';
import { useState} from 'react';

function UserList() {

  //정보가져오기
  function getUserList () {
  
    let reqOption = {
      method : "get",
      headers : {
        "content-type" : "application/json"
      }
    }

    fetch("/api/userList", reqOption).then((res) => res.json())
    .then(data => console.log(data));

  }
  getUserList();
  
  return (
    <div className="contents">
      
    </div>
  )
}

export default UserList;

잘가지고 온 화면이다.

mysql 데이터베이스 내용
콘솔에 찍힌 데이터