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}님, 유튜버 생활을 응원합니다!`
});
})
유튜버 개별 조회
조회이므로 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' });
}
})
'데브코스' 카테고리의 다른 글
[4주차 복습 발표] API 설계 실습 (0) | 2024.03.21 |
---|---|
[4주차 - DAY4] Node.js 및 Express.js를 사용한 서버 개발 실습(2) (0) | 2024.03.21 |
[4주차 - DAY2] REST API 디자인 및 구현(2) (1) | 2024.03.19 |
[4주차 - DAY1] REST API 디자인 및 구현(1) (0) | 2024.03.18 |
[3주차 - DAY5] Express.js 기반의 웹 서버 구축 및 응용(2) (0) | 2024.03.15 |