<< 학습 목표 >>

1. 파일을 서버로 보낼 수 있다.

2. 서버가 보낸 파일을 다운 받을 수 있다.


리엑트를 사용해서 파일을 업/다운로드 하는 방법은 기존의 JS의 방법과 동일함


<< 파일 업로드 >>

 

프로젝트 -> src -> chapter05 -> Component11.jsx 파일을 추가하고 아래 코드를 추가하자

실제로 파일이 업로드가 되도록 하려면 서버에서 복잡한 과정을 거쳐야하므로 파일 업로드가 가능한 서버가 있다고 상상하자

아래 컴포넌트는 파일 업로드가 가능한 상상의 서버로 요청을 보내는 것

import React, {useState} from 'react';
import axios from 'axios';

function Component11() {
    const submit = (e) => {
        e.preventDefault();
    
        let formData = new FormData();
        formData.append("서버가 파일을 받기 위한 파라미터 이름", document.frm.uploadFile.files[0]);
    
        const fetch = async() => {
          await axios.post("파일 업로드가 가능한 상상의 서버", formData).then(response => {
            alert("성공!");
          }).catch((error) => {
            alert("실패!");
          });
        }
    
        fetch();
    }

    return(
        <div style={{"margin": "50px"}}>
            <form name="frm" onSubmit={submit}>
                <label>업로드 할 파일 : <input type="file" /> </label>
              <div>
                  <button type="submit">서버로 요청 보내기</button>
              </div>
            </form>
        </div>
    );
}

export default Component11;

한가지 특징적인 점은 JS로 파일을 보낼 때는 여러 설정을 해줘야하지만 axios 로 파일을 보낼 때는 보낼 파일을 담기만 하면 됨(1)


<< 파일 다운로드 >>


프로젝트 -> src -> chapter05 -> Component12.jsx 파일 추가하고 아래 코드를 추가하자

파일 다운로드 역시 일반적인 방법임

import React from 'react';

function Component12() {
    const download = async() => {
      let filename = "zoom.txt";

      const url = "http://localhost:3000/fileDownload?filename="+filename;

      // 리엑트에서는 location을 사용할 때 반드시 window. 을 붙여줘야함
      window.location.href = url;
    }

    const autoDownload = async() => {
        // a 태그 생성 및 자동 실행(클릭)
        const down = document.createElement("a");
        down.setAttribute("href", url);
        down.setAttribute("download", filename);
        down.setAttribute("type", "application/json");
        down.style.display = "none";
        down.click();
    }

    return(
        <div style={{"margin": "50px"}}>
            <div>
              <h1>a 태그로 다운로드</h1>
              <a href="다운로드 받을 파일의 경로" download={"다운로드 받을 파일의 이름"} type="다운로드 받을 파일의 형식">다운로드</a>
            </div>

            <div>
              <h1>클릭 시 다운로드로 이동</h1>
              <button type="button" onClick={download}>다운로드</button>
            </div>

            <div>
              <h1>클릭 시 다운로드로 이동</h1>
              <button type="button" onClick={autoDownload}>다운로드</button>
            </div>
        </div>
    );
}

export default Component12;

 

여기서 특징적인건 JS에서는 location 객체를 사용할 때 바로 사용할 수 있었지만 리엑트는 반드시 window.location 으로 접근(1)해야함

버튼 클릭 시 파일 자동 다운로드(2)도 추가적으로 넣었음

728x90
LIST

<< 학습 목표 >>

1. 쿠키를 생성해 데이터를 저장할 수 있다.

2. 쿠키에 저장된 데이터를 꺼낼 수 있다.

3. 서버가 보낸 쿠키 데이터를 꺼낼 수 있다.


이번 Chapter 를 시작 하기 전 프로젝트 -> src 에 chapter05 폴더를 추가하자

 

리엑트에서 쿠키를 사용하려면 프로젝트에 쿠키 라이브러리를 설치해야함

터미널에서 프로젝트 경로로 이동 후 쿠키 라이브러리를 설치하자

(1). 프로젝트 경로로 이동

(2). 쿠키 라이브러리 설치 명령


우선 리엑트에서 쿠키를 생성하고 꺼내 보고 그 다음 서버에서 보낸 쿠키를 꺼내보자

 

<< 리엑트에서 쿠키 생성 >>

리엑트에서 쿠키를 사용하기 위해서는 다음의 import 문을 추가해야함

  import { useCookies } from 'react-cookie';

 

쿠키를 사용할 는 다음의 코드를 사용함

  const [cookies, setcookies] = useCookies([]);

 

쿠키를 생성할 때는 setter 를 사용해 쿠키를 생성함

  setcookies("쿠키명", "값");

 

이제 실습을 해보자

프로젝트 -> src -> chapter05 -> Component07.jsx 파일을 추가하고 아래 코드를 추가하자

import React, {useState} from 'react';
import { useCookies } from 'react-cookie';

function Component07() {
    const [name, setName] = useState();
    const [value, setValue] = useState();
    const [cookies, setCookies] = useCookies();

    function saveAtCookie() {
        setCookies(name, value);
    }

    return(
        <div style={{"margin": "50px"}}>
            <div style={{"margin": "20px"}}>
                <label htmlFor="name">쿠키 명 :&nbsp;&nbsp;</label>
                <input type="text" id="name" onChange={(e) => setName(e.target.value)}  />
            </div>

            <div style={{"margin": "20px"}}>
                <label htmlFor="value">쿠키에 저장할 데이터 :&nbsp;&nbsp;</label>
                <input type="text" onChange={(e) => setValue(e.target.value)} />
            </div>

            <div style={{"margin": "20px"}}>
                <button type="button" onClick={saveAtCookie}>쿠키에 저장</button>
            </div>
        </div>
    );
}

export default Component07;

<< 코드 설명 >>

 

(1). 쿠키를 사용하기 위한 import

(2). 쿠키를 사용하기 위해 useCookies 훅을 사용함

  지금은 쿠키를 생성하는 방법을 배우고 있기 때문에 setter만 사용함

(3). 이름이 name인 쿠키에 value를 저장함

 

이제 리엑트 프로젝트를 실행시키고 이 컴포넌트를 웹 페이지에 출력하자

쿠키 명과 저장할 데이터를 임의로 입력 후 [ 쿠키에 저장 ] 버튼을 눌러보자

화면에 보이는 변화는 없지만 내가 지정한 이름의 쿠키에 값이 저장되 있음

 

쿠키를 확인하기 위해서는 브라우저의 개발자 도구를 사용해야함

개발자 도구는 브라우저 내에서 [ F12 키 ] 를 누르거나 아래 순서를 따라가면 됨

 

개발자 도구 내에서는 엣지와 크롬 브라우저 모두 동일하므로 아래 설명을 따라가자

개발자 도구 내에서 쿠키를 확인하려면 [ 응용 프로그램 ] 또는 [ 애플리케이션 ] 또는 [ Application ] 탭으로 이동(1) -> [ 쿠키 ] (2) -> 쿠키 목록(3) 확인

 

지금 우리가 생성한 쿠키는 만료 시간이 없기 때문에 브라우저를 닫으면 사라지는 쿠키임

일정 기간 동안 쿠키를 유지하고 싶다면 다음과 같이 만료 시간을 지정해줘야함

만료 시간은 setter 의 세번째 인자로 넣어주며 "maxAge" 속성의 값으로 초단위의 만료 시간을 지정함

3600은 1시간을 초로 변환한 것

  - 1분 = 60초

  - 1시간 = 60분

  - 1시간은 1분이 60개 있는거니 60(1분의 초) * 60 => 3600


<< 쿠키에 저장된 값 가져오기 >>

 

이번에는 위에서 생성한 쿠키의 값을 가져오자

프로젝트 -> src -> chapter04 -> Component08.jsx 를 추가하고 아래 코드를 추가하자

import React, {useState} from 'react';
import { useCookies } from 'react-cookie';

function Component08() {
    const [name, setName] = useState();
    const [value, setValue] = useState();
    const [cookies, setCookies] = useCookies();

    function getAtCookie() {
        if(name in cookies) {
            setValue(cookies[name]);
        } else {
            setValue("쿠키 명이 잘못되었습니다.");
        }
    }

    return(
        <div style={{"margin": "50px"}}>
            <div style={{"margin": "20px"}}>
                <label htmlFor="name">쿠키 명 :&nbsp;&nbsp;</label>
                <input type="text" id="name" onChange={(e) => setName(e.target.value)}  />
            </div>

            <div style={{"margin": "20px"}}>
                <p>쿠키에 저장한 데이터 : {value}</p>
            </div>

            <div style={{"margin": "20px"}}>
                <button type="button" onClick={getAtCookie}>가져오기</button>
            </div>
        </div>
    );
}

export default Component08;

<< 코드 설명 >>

(1). 쿠키를 사용하기 때문에 useCookies 훅 사용

(2). [ 가져오기 ] 버튼 클릭 시 (3)의 함수 호출

(3). 화면에 입력한 쿠키 명이 쿠키 목록 안에 있는지 확인 후 있다면 해당 쿠키의 값을 value 변수에 저장함

  화면에 입력한 쿠키 명이 쿠키 목록 안에 없다면 value 변수에 "쿠키 명이 잘못되었습니다." 를 저장함


<< 컴포넌트가 마운트 되며 쿠키의 값 가져오기 >>

 

이 부분을 배우기 전 Component07 컴포넌트를 페이지에 출력하고 이름이 name1인 쿠키에 data1 을 저장하자

 

위에서는 컴포넌트가 마운트 된 후 쿠키의 값을 가져와봤음

여기서는 컴포넌트를 마운트 하면서 쿠키의 값을 가져와보자

 

프로젝트 -> src -> chapter05 -> Component09.jsx 파일을 추가 후 아래 코드를 추가하자

import React, {useState, useEffect} from 'react';
import { useCookies } from 'react-cookie';

function Component09() {
    const [value, setValue] = useState();
    const [cookies, setCookies] = useCookies(["name1"]);

    useEffect(() => {
        setValue(cookies["name1"]);
    }, []);

    return(
        <div style={{"margin": "50px"}}>
            <div style={{"margin": "20px"}}>
                <p>name1 쿠키에 저장한 데이터 : {value}</p>
            </div>
        </div>
    );
}

export default Component09;

<< 코드 설명 >>

 

(1). 지금까지 우리는 useCookies 훅을 사용할 때 인자로 아무것도 넣지 않았음

  useCookies 훅을 사용할 때 인자를 아무것도 넣지 않으면 모든 쿠키들을 불러와 cookies 변수에 저장함

  useCookies 훅을 사용할 때 문자열 배열을 인자로 넣으면 해당하는 이름의 쿠키들만 불러와 cookies 변수에 저장함

(2). useEffect 훅을 사용해 컴포넌트가 마운트될 때 불러온 name1 쿠키의 값을 value 변수에 저장함

 

여기서 이제 useCookies 훅을 사용할 때 두 가지 방법이 있다는걸 알았음

바로 위 코드 설명에서 언급한것처럼 useCookies 훅에 인자를 넣지 않으면 모든 쿠키들을 불러와 cookies 변수에 저장함

useCookies 훅에 인자를 넣으면 해당 하는 쿠키들만 불러와 cookies 변수에 저장함

 

사이트 내 쿠키가 너무 많거나 잘못된 쿠키에 접근하면 안된다 라면 useCookies 훅에 인자로 문자열 배열을 넣어서 필요한 쿠키만 불러와서 사용하면 됨

사이트 내 모든 쿠키를 불러와 찾아봐야한다면 useCookies 훅에 인자를 넣지 않으면 됨

 

 

이라고 다른 블로그나 ChatGPT가 그렇게 설명을 해주는데 인자를 넣어도 모든 쿠키를 불러와 저장하고 있음

 

위와 같이 Component09 에 console.log 를 사용해 불러온 쿠키를 출력해보면 모든 쿠키가 출력되는걸 알 수 있음

만약 생성한 쿠키가 없다면 Component07 컴포넌트를 추가하고 쿠키를 몇 개 추가하고 Component09 컴포넌트에서 확인해보자

쿠키의 값을 불러오는 부분을 배우고 있으므로 "왜 여러번 출력되지?" 보다 출력된 쿠키를 주목하자

우리는 분명 인자에 ["name1"] 을 넣어 이름이 name1인 쿠키만 불러왔는데 cookies 변수 안에는 모든 쿠키가 저장됬음

 

쿠키가 더 많아져야 하는건지, 어떤 변경 사항 때문인지는 잘 모르겠으나 인자를 넣어도 모든 쿠키를 불러오고 있음

 

그래도 특정 쿠키가 필요할 때는 문자열 배열을 인자로 넣자


<< 서버가 보낸 쿠키 확인하기 >>

 

-- 이번 내용을 배우기 전 서버에서 준비해야될 사항 --

더보기

노드 서버의 컨트롤러에 아래 코드 추가

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3001;

app.use(cors());

app.get('/cookie/save', (req, res) => {
    res.cookie("someCookie", "someData");
    res.end();
});

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

<< 코드 설명 >>

(1). somCookie 라는 이름의 쿠키에 "someData" 데이터를 저장해 클라이언트에게 보냄


 

지금까지 쿠키를 생성할 때 리엑트(클라이언트)에서 직접 쿠키를 생성했는데 서버가 쿠키를 생성해 전달하고 리엑트에서는 서버가 전달한 쿠키를 꺼내야하는 경우도 생김

이번에는 쿠키를 생성해 전달하는 서버로 요청을 보내고 응답을 받았을 때 서버가 보낸 쿠키를 꺼내보자

 

프로젝트 -> src -> chapter05 -> Component10.jsx 파일을 추가하고 아래 코드를 추가하자

import React, {useState} from 'react';
import { useCookies } from 'react-cookie';
import axios from 'axios';

function Component10() {
    const [value, setValue] = useState();
    const [cookies, setCookies] = useCookies();

    const success = (response) => {
        setValue(cookies["someCookie"]);
    }

    const error = () => {
        console.log("문제가 발생했습니다.");
    }

    const sendRequest = () => {
        axios.get("http://localhost:3001/cookie/save", { withCredentials: true }).then(success).catch(error);
    }

    return(
        <div style={{"margin": "50px"}}>
            <div>
                <button type="button" onClick={sendRequest}>서버로 요청 보내기</button>
            </div>

            {
                value != null && (
                    <div style={{"margin": "20px"}}>
                        <p>서버가 이름이 someCookie인 쿠키에 저장한 데이터 : {value}</p>
                    </div>
                )
            }
        </div>
    );
}

export default Component10;

<< 코드 설명 >>

(1). axios 로 요청을 보낸 후 서버가 보낸 쿠키를 받으려면 반드시 withCredentials 옵션을 true 로 설정해 요청을 보내야함

  이 옵션이 빠지면 서버는 쿠키를 보내지만 클라이언트에서 쿠키를 저장하지 않음

728x90
LIST

<< 학습 목표 >>

1. GET 방식으로 파라미터 없이 요청을 보낼 수 있다.

2. GET 방식으로 파라미터를 담아 요청을 보낼 수 있다.

3. POST 방식으로 요청을 보낼 수 있다.

4. 응답 상태 코드에 따라 서로 다른 처리를 할 수 있다.

5. 응답 데이터를 받을 수 있다.


-- 이번 내용을 배우기 전 서버에서 준비해야될 사항 --

더보기

노드 서버를 사용하고 있다면 아래 과정을 따라오고 다른 서버를 사용하고 있다면 따라오지 않아도 됨

1. 노드 서버 프로젝트에 cors 라이브러리 설치

 

1-1. 터미널에서 노드 서버 프로젝트로 이동 : cd (노드 서버 프로젝트 명)

1-2. cors 라이브러리 설치 : npm install cors

 

 

2. 노드 서버의 컨트롤러에서 cors 라이브러리를 사용하도록 설정


 

리엑트가 서버로 요청을 보낼 때는 Axios 를 사용해 보낼 수 있음

 

Axios 를 사용하려면 우선 프로젝트에 Axios 를 설치해야함

  Axios 설치 명령 : npm install axios

 

Axios를 설치 할 때는 지금까지와 마찬가지로 터미널에서 명령을 입력해 설치함

터미널 창에서 프로젝트로 이동 후 Axios 를 설치하자


Axios 를 사용해 서버로 GET, POST 요청을 보내고 응답을 받을 수 있음

 

서버로 요청을 보낼 때는 제일 먼저 Axios 를 import  해야함

  Axios import 코드 : import axios from 'axios';

 

서버로 GET 요청을 보낼 때는 Axios 의 get 함수를 사용함

  axios.get("url").then(성공 응답을 받았을 때 처리할 함수).catch(실패 응답을 받았을 때 처리할 함수)

 

서버로 POST 요청을 보낼 때는 Axios 의 post 함수를 사용함

  axios.post("url").then(성공 응답을 받았을 때 처리할 함수).catch(실패 응답을 받았을 때 처리할 함수)

 

위 GET, POST 방식 요청 방법은 간단하게만 언급한 것으로 본격적으로 요청을 보내고 응답을 받는 방법을 배워보자


<< GET 방식으로 요청하고 다양한 상태 코드로 응답 받기 >>

 

-- 이번 내용을 배우기 전 서버에서 준비할 사항 --

더보기

노드 서버의 컨트롤러에 아래 코드 추가

( 노드 서버를 사용하고 있다면 아래 코드를 그대로 따라 입력하고 다른 서버를 사용하고 있다면 해당 서버의 언어에 맞게 바꿔 입력하기 )

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3001;

app.use(cors());

app.get('/get/simple/200', (req, res) => {
    console.log("클라이언트의 요청을 받았습니다.");
    console.log("상태 코드 200 으로 응답합니다.");
    res.status(200).send();
});

app.get('/get/simple/300', (req, res) => {
    console.log("클라이언트의 요청을 받았습니다.");
    console.log("상태 코드 300 으로 응답합니다.");
    res.status(300).send();
});

app.get('/get/simple/400', (req, res) => {
    console.log("클라이언트의 요청을 받았습니다.");
    console.log("상태 코드 400 으로 응답합니다.");
    res.status(400).send();
});

app.get('/get/simple/500', (req, res) => {
    console.log("클라이언트의 요청을 받았습니다.");
    console.log("상태 코드 500 으로 응답합니다.");
    res.status(500).send();
});

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

 << 코드 설명 >>

 

(1). 클라이언트가 GET 방식으로

(2). http://localhost/get/simple/200 경로로 요청을 보낸다면

(3). 상태 코드 200으로 응답하겠다.

 

이제 노드 서버를 실행시키자

노드 서버를 실행시키는 명령 : node (컨트롤러 파일명)


 

먼저 가장 간단한 형태인 데이터 없이 GET 방식으로 서버에 요청을 보내보자

요청 경로에 따라서 서버는 200, 300, 400, 500 상태 코드로 응답함

 

프로젝트 -> src -> chapter04 -> Component01.jsx 파일을 추가하고 아래 코드를 추가하자

import React from 'react';
import axios from 'axios';

function Component01() {
    function success() {
        console.log("응답을 받는데 성공했습니다.");
    }

    function error() {
        console.log("응답을 받았지만 문제가 생겼습니다.");
    }

    let sendRequest1 = () => {
        axios.get("http://localhost:3001/get/simple/200").then(success).catch(error);
    };

    let sendRequest2 = () => {
        axios.get("http://localhost:3001/get/simple/300").then(success).catch(error);
    };

    let sendRequest3 = () => {
        axios.get("http://localhost:3001/get/simple/400").then(success).catch(error);
    };

    let sendRequest4 = () => {
        axios.get("http://localhost:3001/get/simple/500").then(success).catch(error);
    };

    return(
        <div>
            <p>axios를 사용해 파라미터 없이 요청 보내기</p>
            <div><button type="button" onClick={sendRequest1}>요청 보내고 상태 코드 200 으로 응답 받는 상황</button></div>
            <div><button type="button" onClick={sendRequest2}>요청 보내고 상태 코드 300 으로 응답 받는 상황</button></div>
            <div><button type="button" onClick={sendRequest3}>요청 보내고 상태 코드 400 으로 응답 받는 상황</button></div>
            <div><button type="button" onClick={sendRequest4}>요청 보내고 상태 코드 500 으로 응답 받는 상황</button></div>
        </div>
    );
}

export default Component01;

<< 코드 설명 >>

(1). axios 를 사용하기 위해 import

(2). axios 로 요청을 보내고 200번대 상태 코드로 응답을 받았을 때 동작할 함수

(3). axios 로 요청을 보내고 300, 400, 500번대 상태 코드로 응답을 받았을 때 동작할 함수

(4). axios 로 요청을 보내는 함수

(5). 버튼을 클릭했을 때 적절한 함수를 호출 해 요청을 보냄

 

이제 리엑트 프로젝트를 실행시키고 이 컴포넌트를 출력해 각 버튼을 눌러보자

 

당연히 눈에 보이는 결과는 없음

왜? 위 코드 설명의 (2), (3) 을 다시 봐보면 응답을 받았을 때 console.log 로 출력하라고 되어있으므로...

 

브라우저 내 개발자 도구를 열고 [ console 패널 ] 로 가보자

서버가 상태 코드 200으로 응답했을 때만 success 함수가 호출되고 나머지 경우는 모두 error 함수가 호출된걸 알 수 있음

 

300, 400, 500 상태 코드는 특별한 경우이고 내가 서버에 대한 지식이 있거나 서버 개발자와 소통 해야되는 부분이므로 이제 언급하지 않겠음


<< GET 방식으로 요청하고 다양한 데이터를 응답 받기 >>

 

-- 이번 내용을 배우기 전 서버에서 준비할 사항 --

더보기

노드 서버의 컨트롤러에 아래 코드 추가

( 노드 서버를 사용하고 있다면 아래 코드를 그대로 따라 입력하고 다른 서버를 사용하고 있다면 해당 서버의 언어에 맞게 바꿔 입력하기 )

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3001;

app.use(cors());

app.get('/get/data/simple', (req, res) => {
    console.log("클라이언트의 요청을 받았습니다.");
    res.send("123");
});

app.get('/get/data/obj', (req, res) => {
    console.log("클라이언트의 요청을 받았습니다.");
    const obj = {
        name: "홍길동",
        age: 23
    };

    res.send(obj);
});

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

<< 코드 설명 >>

 

(1). 클라이언트에게 단순한 데이터를 보냄

(2). 클라이언트에게 객체를 보냄

 

노드 서버를 재시작 하자


 

아까와 마찬가지로 GET 방식으로 서버에 요청을 보내보자

이번에는 요청 경로에 따라서 서버는 데이터, 객체를 보냄

 

프로젝트 -> src -> chapter04 -> Component02.jsx 파일을 추가하고 아래 코드를 추가하자

import React from 'react';
import axios from 'axios';

function Component02() {
    function success(response) {
        console.log("응답을 받는데 성공했습니다.");
        console.log(response);
        console.log(response.data);
    }

    function error() {
        console.log("응답을 받았지만 문제가 생겼습니다.");
    }

    const sendRequest1 = () => {
        axios.get("http://localhost:3001/get/data/simple").then(success).catch(error);
    }

    const sendRequest2 = () => {
        axios.get("http://localhost:3001/get/data/obj").then(success).catch(error);
    }

    return(
        <div>
            <p>axios를 사용해 파라미터 없이 요청 보내기</p>
            <div><button type="button" onClick={sendRequest1}>요청 보내고 데이터를 응답 받은 상황</button></div>
            <div><button type="button" onClick={sendRequest2}>요청 보내고 객체를 응답 받은 상황</button></div>
        </div>
    );
}

export default Component02;

<< 코드 설명 >>

 

(1). 서버가 보낸 데이터를 받기 위해 매개변수 를 추가했음

(2). 서버가 보낸 응답 정보를 출력함

(3). 서버가 보낸 응답 정보 안에서 데이터에 접근하고 있음

 

이 컴포넌트를 출력한 후 버튼들을 눌러보자

그 후 개발자 도구 내 [ console 패널 ] 을 확인해보면 서버의 응답 정보와 서버가 보낸 데이터가 출력되는걸 볼 수 있음


<< GET 방식으로 요청할 때 데이터를 담아 요청하기 >>

 

-- 이번 내용을 배우기 전 서버에서 준비할 사항 --

더보기

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3001;

app.use(cors());

app.get('/get/parameter', (req, res) => {
    console.log("파라미터 있는 요청을 받았습니다.");

    console.log("<< 클라이언트가 보낸 파라미터 >>");
    console.log("name => " + req.query.name);
    console.log("age => " + req.query.age);
    console.log("tel => " + req.query.tel);
    
    res.end();
});

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

<< 코드 설명 >>

 

(1). 클라이언트가 보낸 데이터는 req ( Request, 요청, 의 줄임말 ) 의 query 에 들어있음

  query.(파라미터명) 으로 클라이언트가 보낸 데이터에 접근할 수 있음

 

노드 서버를 재시작 하자


 

이번에는 요청을 할 때 데이터를 담아서 요청을 보내보자

프로젝트 -> src -> chapter04 -> Component03.jsx 파일을 추가하고 아래 코드를 추가하자

import React from 'react';
import axios from 'axios';

function Component03() {
    function success(response) {
        console.log("응답을 받는데 성공했습니다.");
    }

    function error() {
        console.log("응답을 받았지만 문제가 생겼습니다.");
    }

    const sendRequest1 = () => {
        let data = {
            name: "홍길동",
            age: 23,
            tel: "010-1111-1111"
        };

        let opt = {
            params: data
        }

        axios.get("http://localhost:3001/get/parameter", opt).then(success).catch(error);
    }

    return(
        <div>
            <p>axios를 사용해 파라미터와 함께 요청 보내기</p>
            <div><button type="button" onClick={sendRequest1}>파라미터(데이터)를 담아 요청을 보내는 상황</button></div>
        </div>
    );
}

export default Component03;

<< 코드 설명 >>

 

(1). 서버로 보낼 데이터

(2). 서버로 데이터를 보내기 위해 params 에 데이터를 담은 객체 생성

(3). 서버로 데이터를 보내기 위해 get 함수의 두 번째 인자로 opt 를 넣음

 

이 컴포넌트를 출력하고 버튼을 눌러보자

그 뒤 결과는 vs code 내 터미널에서 확인해야함

 

여기까지 GET 방식 요청을 통해

1. 서버로부터 상태 코드를 응답 받았을 때

2. 서버로부터 데이터를 응답 받았을 때

3. 서버에게 데이터를 보내는 방법

을 배웠음


이번에는 POST 방식 요청으로 서버에게 데이터를 보내는 방법을 알아보자

참고로 POST 방식 요청은 상태 코드를 응답 받았을 때, 데이터를 응답 받았을 때 처리는 GET 방식 요청과 완전히 동일함

 

<< POST 방식으로 요청할 때 데이터를 담아 요청하기 >>

 

-- 이번 내용을 배우기 전 서버에서 준비할 사항 --

더보기

const express = require('express');
const cors = require('cors');
const app = express();
const port = 3001;

app.use(cors());

app.post('/post/parameter',  (req, res) => {
    console.log("파라미터 있는 요청을 받았습니다.");
    console.log(new Date().toLocaleString());

    console.log("<< 클라이언트가 보낸 파라미터 >>");
    console.log("name => " + req.query.name);
    console.log("age => " + req.query.age);
    console.log("tel => " + req.query.tel);

    res.end();
});

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

<< 코드 설명 >>

 

(1). 클라이언트가 POST 방식으로 http://localhost/post/parameter 경로로 요청을 보냈을 때 처리하기 위한 코드


 

POST 방식으로 요청할 때 데이터를 담아 요청할 컴포넌트를 추가하자

프로젝트 -> src -> chapter04 -> Component04.jsx 파일을 추가하고 아래 코드를 추가하자

import React from 'react';
import axios from 'axios';

function Component04() {
    function success(response) {
        console.log("응답을 받는데 성공했습니다.");
    }

    function error() {
        console.log("응답을 받았지만 문제가 생겼습니다.");
    }

    const sendRequest = () => {
        let data = {
            name: "홍길동",
            age: 23,
            tel: "010-1111-1111"
        };

        let opt = {
            params: data
        }

        axios.post("http://localhost:3001/post/parameter", null, opt).then(success).catch(error);
    }

    return(
        <div>
            <p>axios를 사용해 파라미터와 함께 요청 보내기</p>
            <div><button type="button" onClick={sendRequest}>파라미터(데이터)를 담아 요청을 보내는 상황</button></div>
        </div>
    );
}

export default Component04;

<< 코드 설명 >>

 

(1). 두 번째 인자 자리는 비워두고 세 번째 인자 자리에 보낼 데이터를 담아서 보낼 수 있음

728x90
LIST

<< 학습 목표 >>

1. 노드 제이에스 서버를 설치할 수 있다.

2. 노드 제이에스 서버를 실행시킬 수 있다.

3. 노드 제이에스 서버에 컨트롤러를 만들 수 있다.

4. 노드 제이에스 서버가 클라이언트에게 쿠키를 보낼 수 있다.

5. 노드 제이에스 서버가 세션에 데이터를 저장할 수 있다.


이번 Chapter에서는 Cookie, Session, Axios, File Upload / Download 를 배울 것임

이러한 내용들을 배우려면 서버가 필요함

가장 빠르게 배워 간단하게 사용할 수 있는 서버가 node.js ( 이하 노드 제이에스 라 칭함 ) 이므로 이번 Chapter 를 시작하기 전 노드 제이에스를 간략하게 배우자

 

단, 여기서는 Cookie, Session, Axios 를 배우기 위해 노드 제이에스의 최소한만 배우는 것이니 노드 제이에스 서버와 관련된 지식을 쌓을 순 없음

또한 여기서 사용하고 있는 용어가 이해되지 않는다면 그냥 따라오기만 해도됨

꼭 이해하고 싶다면 별도로 JSP/Servlet 관련 서적을 보고 우선 서버를 공부하고 오자

 

노드 제이에스 외에 Servlet, Spring, Spring Boot 등으로 서버를 구축할 수 있다면 이번 글은 넘어가도 됨


노드 제이에스로 서버를 구축하기 위해 프로젝트를 만들자

우선은 빈 프로젝트를 만들고 그 안에 노드 제이에스를 설치하는 과정임

 

<< 빈 프로젝트 생성 >>

(1). vs code -> [ 탐색기 ] 내 빈 영역 우클릭 -> [ 새 폴더 ]

(2). 폴더 이름은 임의로 지정 / 여기서는 node_server 로 했음

 

<< 노드 제이에스 설치 >>

방금 생성한 빈 프로젝트에 노드 제이에스를 설치하자

(1). vs code 터미널 창에서 빈 프로젝트로 이동

 빈 프로젝트로 이동하기 위한 명령 : cd (프로젝트명)

(2). 노드 제이에스 서버 설치

  노드 제이에스 서버 설치 명령 : npm install express

 

 

이제 빈 프로젝트에 클라이언트의 요청을 받을 수 있도록 컨트롤러를 추가하자

 

<< 파일 추가 >>

(1). 노드 제이에스 서버를 설치한 프로젝트 명 우클릭 -> [ 새 파일 ]

(2). 파일 이름을 임의로 짓고 파일의 확장자는 반드시 js 어야함 / 여기선 app.js 로 만듬

 

<< 컨트롤러 코드 추가 >>

방금 추가한 파일에 아래 코드 추가

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

app.get('/', (req, res) => {
  res.send('Hello World!');
});

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

<< 코드 설명 >>

(1). 서버의 포트는 3001 번으로 지정

(2). 클라이언트가 GET 방식으로 http://localhost:3001/ 에 접근했을 경우 'Hello World!' 를 응답

 

여기까지 클라이언트의 요청을 받을 수 있는 준비가 다 됐음

 

 

이제 서버를 실행시키자

서버를 실행 시킬 때는 터미널 창에서 node (컨트롤러파일명) 명령을 입력하면 됨(1)

 

이제 브라우저를 열어 주소창에 http://localhost:3001/ 을 입력해 접근해보자

화면에 Hello World! 가 출력됐다면 노드 제이에스 서버가 제대로 실행된 것이고 그렇지 않다면 다시 이 글을 따라 올 것

이 글대로 따라오는데 되지 않는다면 따로 인터넷에 찾아보길


<< 클라이언트가 보낸 데이터 꺼내기 >>

클라이언트가 서버의 / 경로로 GET 방식으로 요청을 보낸다고 상상해보자

이때 클라이언트가 name=홍길동, age=20, tel=010-1111-1111 파라미터를 함께 보내는 상황임

클라이언트가 보낸 데이터를 꺼낼 때는 다음과 같음

 

아래 코드를 컨트롤러 파일에 덮어 씌우자

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

app.get('/', (req, res) => {
  const name = req.query.name;
  const age = req.query.age;
  const tel = req.query.tel;

  console.log("<< 클라이언트가 보낸 데이터 >>");
  console.log("name => " + name);
  console.log("age => " + age);
  console.log("tel => " + tel);

  res.sendStatus(200);
});

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

<< 코드 설명 >>

(1). 클라이언트가 보낸 데이터는 req.query.(name) 으로 꺼낼 수 있음

 

컨트롤러 코드가 변경 됐으니 노드 서버를 종료 시키고 다시 실행시키자

노드 서버를 종료 시킬 때는 터미널 창을 한번 클릭 한 후 Ctrl + C 를 누르면 됨

그 후 다시 노드 서버를 실행시키는 명령 ( node (컨트롤러 파일명) ) 을 입력하면 됨

 

브라우저의 주소창에 localhost:3001/?name=홍길동&age=20&tel=010-1111-1111 다음과 같이 입력해 클라이언트가 보낸 값이 제대로 꺼내지는지 확인해보자

 

노드 서버에서 console.log 로 출력하면 터미널 창에 출력되니 브라우저에서 위 URL을 입력해 요청을 보낸 뒤 터미널 창을 보면 클라이언트가 보낸 값이 출력될 것


<< 클라이언트에게 쿠키 보내기 >>

클라이언트에게 쿠키를 보낼 때는 다음과 같이 함

 

아래 코드를 컨트롤러에 덮어 씌우자

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

app.get('/', (req, res) => {
    const cookieOptions = {
        expires: new Date(Date.now() + 3600000)
    };
    
    res.cookie('myCookie', '12345', cookieOptions);

    res.sendStatus(200);
});

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

<< 코드 설명 >>

(1). 이름이 myCookie인 쿠키를 생성해 그 안에 12345 를 저장

(2). 쿠키의 옵션으로 만료 시간 지정

  만료 시간은 밀리초 단위로 여기서 설정한 만료 시간은 1시간(60 * 60 * 1000) 뒤 임

 

노드 제이에스 서버를 재시작 한 후 브라우저의 주소창에 http://localhost:3001/ 를 입력해 접근해보자

쿠키는 당연히 눈에 보이지 않으니 개발자 도구로 확인해야함

브라우저 내 개발자 도구 -> 응용 프로그램(1) -> 쿠키(2) 를 확인해보자


<< 세션에 데이터 저장하기 >>

 

노드 제이에스 서버에서 세션을 사용하려면 세션 라이브러리를 설치해야함

서버를 중지 시키고 세션 라이브러리를 설치하자

(1). 세션 라이브러리를 설치하는 명령

 

이제 컨트롤러 파일에 아래 코드를 덮어 씌우자

const express = require('express');
const session = require('express-session');
const app = express();
const port = 3001;

app.use(session({
    secret: 'key',
    resave: false,
    saveUninitialized: true
}));

app.get('/', (req, res) => {
    if(req.session.userId === undefined) {
        req.session.userId = 12345;
    } else {
        console.log(req.session.userId);
    }

    res.sendStatus(200);
});

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

<< 코드 설명 >>

(1). 세션을 사용하기 위한 import

(2). 세션의 보안 관련 설정

(3). 세션이 제대로 동작하는지 확인하기 위한 if문으로 세션이 제대로 동작한다면 두 번째 접근 부터는 터미널에 userId에 저장해둔 값인 12345 가 출력될 것

 

이제 서버를 재시작하고 브라우저의 주소창에 http://localhost:3001/ 를 입력해 접근해보자


여기까지 이번 Chapter에서 배울 내용을 위한 최소한의 노드 제이에스 서버 관련된 것들을 배웠음

이 글에 있는 내용을 이해하고 싶다면 별도로 노드 제이에스 또는 JSP/Servlet 관련 서적으로 서버에 대한 내용을 깊게 배우면 됨

728x90
LIST