1. Get & Post

  • Get : 클라이언트에서 서버로부터 정보를 받아올 때 사용. Body가 없으며, 사용자가 입력한 데이터는 ‘쿼리 문자열’로 들어간다. → 결론적으로 Get 은 서버에 영향을 주지 않는다.
  • Post : 클라이언트에서 서버로 파일을 전송할 때 사용. Body가 있어 다양한 형태의 파일을 서버로 전송할 수 있고, ‘쿼리 문자열’도 가진다. → 결론적으로 Get 은 서버에 영향을 준다.

2. 리액트와 Express Get, Post 경로 정의하기

  • [ client.js ]
import axios from "axios";

const URL = "http://localhost:3000";

const Client = () => {
    const onClickGet = () => {
        axios.get(URL+'/user')
        .then((res)=>
        {
            console.log(res.data);
        }).catch((err)=>{
            console.log(err);
        })
    }

    const onClickPost = () => {
        axios.post(URL+'/user')
        .then((res)=>
        {
            console.log(res.data);
        }).catch((err)=>{
            console.log(err);
        })
    }

    return (
        <>
            <input type="text" name="ID"></input>
            <input type="text" name="PW"></input>
            <button onClick={onClickGet}>Get</button>
            <button onClick={onClickPost}>Post</button>
        </>
    );  
}

export default Client;
  • [server.js]
const express = require('express');
const app = express();
const port = 3000;

// 서버는 같은 경로라도 get과 post를 구분하여 응답
app.get('/user', (req, res) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.send("GET /user response")
})

app.post('/user', (req, res) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.send("POST /user response")
})

app.listen(port, () => {
    console.log("Listening...")
})

3. 클라이언트(리액트 앱)에서 서버로 FormData 전송하기

  • post 는 서버에 데이터를 보내기 위해, Body가 필요하다. 하지만, 아래와 같이 post 요청하면, 서버 콘솔에서 req.body가 undefined로 에러가 발생한다.
  • Express 공식 웹에서 req.body 에 대해 조사하면, 아래와 같이 설명이 나와 있는데 정리해보자면, “req.body는 기본적으로 제공되지(undefiend) 않으며, key-value로 구성해야하는 데이터 구조이다. 그리고 이 req.body를 사용하기 위해서는 express.json() 이나 exporess.urlencoded()가 필요하다는 말이다”

[ 원문 ]

Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().

[ req.body 파싱을 위한 코드 ]

app.use(express.json()) // req.body를 생성하고, json 파싱
app.use(express.urlencoded({ extended: true })) // req.body를 생성하고, formData 파싱
  • 아래 순서에 따라 클라이언트에서 서버로 데이터를 전송해보겠다.
  • 순서 1) 클라이언트에서 Post 버튼을 클릭했을 때, 전송할 데이터를 formData(key-value)로 생성한다

[ Client.js ]

import axios from "axios";

const URL = "http://localhost:3000";

const Client = () => {
    const onClickPost = () => {
        // 키와 값을 갖는 formData 생성
        const formData = new FormData();
        // 여러 값을 보내려면, append()를 사용하여 결합
        formData.append("ID", "DK");
        formData.append("PW", "3663");

        // API URL로 formData 전송
        axios.post(URL+'/user', formData)
        .then((res)=>
        {
            console.log(res.data);
        }).catch((err)=>{
            console.log(err);
        })
    }

    return (
        <>
            <input type="text" name="ID"></input>
            <input type="text" name="PW"></input
            <button onClick={onClickPost}>Post</button>
        </>
    );  
}

export default Client;
  • 순서 2) 서버에서 body 객체를 req에 추가하기 위해, ‘multer’ 모듈을 설치하고 아래와 같이 코드를 작성해준다.
  • Express req.body 문서 링크: https://expressjs.com/ko/4x/api.html#req.body
  • multer 문서 링크: https://github.com/expressjs/multer/blob/master/doc/README-ko.md

[ Server.js ]

const express = require('express');
const app = express();
const port = 3000;

// multer: body 객체와 한 개의 file 혹은 여러개의 files 객체를 request 객체에 추가
const multer = require('multer');
// 업로드 위치 지정(파일을 저장하는 경우)
const upload = multer({ dest: 'uploads/' })

app.use(express.json()) // req.body를 생성하고, json 파싱
app.use(express.urlencoded({ extended: true })) // req.body formData 파싱

// 클라이언트에게 req.body 응답  
app.post('/user', upload.array(), (req, res) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.send(req.body)
})

app.listen(port, () => {
    console.log("Listening...")
})

4. REST 와 RESTful API

  • REST 란? Representational State Transfer 약자로 어떻게 클라이언트와 서버가 소통해야하고, 어떻게 CRUD를 수행해야하는지의 가이드라인을 말한다.
  • RESTful API 란? REST하게 잘 작성된 API를 말하며, 이렇게 잘 작성된 API는 유지보수하고 다른 사람이 업데이트하기에 좋다.
  • 모범 사례 링크 : https://api.ncloud-docs.com/docs/ai-naver-clovafacerecognition

[ RESTful 주석 index 예시]

// 구조(이름, path, verb, purpose)

태그:

카테고리:

업데이트:

댓글남기기