데브코스

[4주차 - DAY3] Node.js 및 Express.js를 사용한 서버 개발 실습(1)

미안하다 강림이 좀 늦었다 2024. 3. 20. 14:11

 

 

POST Method

GET 메서드에서는 데이터가 URL에 적혀서 전달된다. 회원가입을 한다고 생각해 보자. 우리의 아이디, 비밀번호, 전화번호 등의 개인정보가 남들도 다 볼 수 있는 URL에 적혀있어도 될까? 그렇게 된다면 큰 문제가 발생할 것이다. 그래서 데이터를 생성하거나 등록할 때, URL에 보여서는 안 되는 데이터를 전달해 줄 때 POST 메서드를 사용한다. POST 메서드를 사용하면 전달할 데이터가 body에 숨겨져서 보내진다.

const express = require('express');
const app = express();
app.listen(3000);

app.post('/post-test', function (req, res) {
    // ...
})

 

 

Postman

GET 메서드를 테스트할 때는 URL 치는 곳에 "localhost:포트번호/경로"를 입력하면 됐었다. 하지만 POST 메서드도 이렇게 테스트하면 아래와 같이 GET 메서드인 해당 경로를 찾을 수 없다고 한다.

 

따라서 POST 메서드를 테스트하기 위해서는 API 테스트 도구를 사용해야 한다. 우리는 Postman을 사용할 것이다. 구글에 검색해서 다운받으면 되고, 웹사이트에서도 사용할 수 있지만 다운로드하여야 더 많은 기능을 사용할 수 있다.

화면의 위는 요청, 아래는 응답을 나타낸다.

 

 

미들웨어

미들웨어는 들어온 요청과 보낼 응답의 중간에 위치하여 동작하는 함수를 말한다. 미들웨어는 다음과 같이 설정한다.

app.use(함수);

 

요청으로 들어온 JSON을 파싱하는 미들웨어를 설정해 보자. express에서 JSON 형태의 body를 요청으로 받는다면 아래 코드를 사용해야 한다. 사용하지 않으면 예상하지 못한 에러가 발생할 수 있다.

app.use(express.json());

첫 번째 실행은 JSON을 파싱하는 미들웨어를 사용하지 않은 경우이고, 두 번째 실행은 사용한 경우이다. 두 경우 req.body를 출력한 결과다.

 

 

유튜버 API 설계

코드에서 express 모듈을 불러오는 부분은 생략했다.

 

DB

아직 데이터베이스를 연동하지 않았기 때문에 Map으로 대신한다. key는 정수인 id, value는 채널명, 구독자 수, 영상 수 정보를 가지는 객체이다. 3개의 쌍을 넣어놓은 상태이다.

const db = new Map();
let id = 1;

const youtubers = [
    { channelTitle: "십오야", sub: "593만명", videoNum: "993개" },
    { channelTitle: "침착맨", sub: "227만명", videoNum: "6.6천개" },
    { channelTitle: "테오", sub: "54.8만명", videoNum: "726개" }
];

youtubers.forEach(youtuber => {
    db.set(id++, youtuber);
})

 

전체 유튜버 조회

조회이므로 GET 메서드를 사욯한다.

전체 유튜버 목록을 객체의 value로 전달한다.

app.get('/youtubers', function (req, res) {
    const messageArr = [];
    db.forEach(function (value, key) {
        messageArr.push({ id: key, ...value });
    })

    res.json({
        message: messageArr
    });
})

 

유튜버 등록

등록하는 것이므로 POST 메서드를 사용한다.

요청에서는 body의 channelTitle(채널명)만 전달받는다. req.body에 정상적으로 접근하려면 JSON을 파싱 하는 미들웨어가 설정되어 있어야 한다. postman에서도 요청의 body가 JSON으로 설정되었는지 확인해야 한다.

app.post('/youtubers', function (req, res) {
    db.set(id, { ...req.body, sub: 0, videoNum: 0 }); // db에 등록
    console.log(db);
    res.json({
        message: `${db.get(id++).channelTitle}님, 유튜버 생활을 응원합니다!`
    });
})

postman
console

 

유튜버 개별 조회

조회이므로 GET 메서드를 사용한다.

하나의 유튜브 채널만 조회할 수 있도록 해보자. params의 값들은 모두 문자열로 되어있기 때문에 숫자로 변환해주어야 한다. 존재하지 않는 채널의 id에 대해 조회할 경우 'not found' 메시지를 발송한다.

app.get('/youtubers/:id', function (req, res) {
    const id = parseInt(req.params.id);

    if (db.has(id)) {
        res.json({ id: id, ...db.get(id) });
    } else {
        res.json({ message: 'not found' });
    }
})