Express로 만드는 CRUD Rest Api

Emma Ou from Unsplash

Express 공식문서와 블로깅을 하면서 간단한 CRUD REST API를 생성해보았다.

Toc


Install Express

1
npm i -g express
  • i : install
  • -g : global, 전역에서 사용할 수 있도록 설치한다는 의미

Create project

명령어 한 줄로 Express 프로젝트를 시작할 수 있다.

1
express PROJECT_NAME --view=pug

run project

1
node /bin/www

www 파일엔 http 모듈을 불러와서 app.js를 기반으로 서버를 생성하는 코드가 담겨있다. 여기서 포트번호를 바꿀수도 있다.

Create CRUD API

CRUD를 하는 아주 간단한 REST API를 만들어본다.

express 프로젝트를 막 생성했다면, 프로젝트 디렉토리에 /routes 디렉토리가 있을것이고, 이 안에 index.jsusers.js가 있다.

users.js에 user 관련 라우터들이 포함되어 있다.

node.js에서 라우팅이란 URI나 HTTP 요청 메소드의 엔드 포인트에 대한 클라이언트 요청에 웹 애플리케이션이 응답하는 방법이라고 한다.

출처 : expressjs - 기본 라우팅

스프링부트를 사용할때 컨트롤러(Controller)라고 했던 개념이 Node.js에서는 라우터(Router)라고 표현하는 것 같다.

Refactor minor

먼저 CRUD 대상 객체를 만들어보자.

이 글을 작성하는 시점에 2020 도쿄 올림픽이 진행중이니 올림픽에 참가중인 국가 이름을 담은 배열을 선언해보겠다. users.js 파일 상단에 배열을 생성해두자.

1
2
3
4
5
6
7
8
9
10
const express = require('express');
const router = express.Router();

let participants = [
{ id: 1, nation: 'Republic of Korea'},
{ id: 2, nation: 'United States'},
{ id: 3, nation: 'Great Britain'},
{ id: 4, nation: 'Canada'},
{ id: 5, nation: 'Japan'}
]

자 근데 배열을 만들고 보니 /user 라는 URI와 파일명이 어울리지 않게되었다. 여기서부터 천천히 리팩토링(?)을 시작해보자.

먼저 파일명을 수정하자.

파일명을 수정했다면, 이제 URI도 수정할 차례이다. URI는 app.js 에서 수정하면 된다.

1
2
3
4
5
6
7
...
var indexRouter = require('./routes/index');
var nationRouter = require('./routes/participants');
var app = express();
...
app.use('/', indexRouter);
app.use('/participants', nationRouter);

이렇게 하면 라우터의 요청 URI까지 수정이 되었다.

이제 만들어야 할 라우터는 5개이다.

  • 전체 참가국 조회 라우터
  • 단일 참가국 조회 라우터
  • 참가국 등록 라우터
  • 참가국 국가명 수정 라우터
  • 참가국 국가 삭제 라우터

GET - 전체 참가국 조회 API

전체 참가국 조회 라우터는 따로 생성하지 않아도 이미 users.js에서부터 존재하고 있다. 함수 내 변수명만 수정해주면 된다.

HTTP 메소드 : GET

요청 URI : /participants

Query String :

Request 객체에 포함된 파라미터 :

1
2
3
4
/* 전체 참가국 조회 */
router.get('/', (req, res, next) => {
res.json(participants)
});

participant의 기본 요청 URI가 /participant므로 /participant 로 요청을 하면, 응답객체(res)에 participants라는 객체를 담아서 json 타입으로 응답한다는 코드이다.

여기서 participants는 우리가 가장 먼저 작성한 배열 객체이다.

Postman 요청 결과

GET API

여기서 잠깐.

응답을 보낼때 사용하는 json()는 content-type 헤더를 application/json으로 고정해서 객체 타입을 json형식으로 바꿔주는 역할을 해준다. 그런데 결국 반환을 하기 위해 마지막에 send()를 호출한다.

어차피 json으로 요청, 응답하는 REST API를 만들것이므로 큰 상관은 없지만 알아둬야 할 것 같다.

GET - 단일 참가국 조회 API

이번엔 URI에 id를 요청하면 해당 id의 객체를 반환해서 응답하는 API이다.

HTTP 메소드 : GET

요청 URI : /participants/{id}

Query String : id

Request 객체에 포함된 파라미터 :

1
2
3
4
5
/* 참가국 조회 */
router.get('/:id', (req, res, next) => {
const participant = participants.find(p => p.id === parseInt(req.params.id));
res.json(participant);
});

/participants/{id}로 GET 메소드로 요청이 들어오면, 요청객체(req)에 담긴 id를 가져와서 participants 배열 객체에서 해당 id에 일치하는 객체를 찾아서 이를 응답객체(res)로 반환하는 코드이다.

Postman 요청 결과

GET API

POST - 참가국 등록 API

요청객체에 객체를 담아 POST 메소드를 요청하는 API이다.

HTTP 메소드 : POST

요청 URI : /participants

Query String :

Request 객체에 포함된 파라미터 : object { nation }

1
2
3
4
5
6
7
8
9
/* 참가국 추가 */
router.post('/', (req, res, next) => {
const participant = {
id: participants.length+1,
nation: req.body.nation
}
participants.push(participant);
res.json(participant);
});

이번엔 참가국을 등록하는 API이다. POST 메소드를 사용하기 때문에 router.post()로 개발해야 한다.

사실 등록 API는 응답할 필요는 없지만, Post Man에서 제대로 등록이 되었는지 확인하기 위해 응답객체에 participants 객체에 추가된 객체를 담아서 반환하기로 했다.

Postman 요청 결과

POST API

PUT - 참가국 국가명 API

이번엔 존재하는 객체를 PUT 메소드로 요청하여 수정하는 API이다.

HTTP 메소드 : POST

요청 URI : /participants/{id}

Query String : id

Request 객체에 포함된 파라미터 : object { nation }

1
2
3
4
5
6
7
8
9
10
/* 참가국 수정 */
router.put('/:id', (req, res, next) => {
const participant = participants.find(p => p.id === parseInt(req.params.id));
if(!participant) {
return res.status(404).send('ID was not found.');
}
participant.nation = req.body.nation;
res.json(participant);
console.log("participants : "+participants);
});

QueryString으로 들어온 id값으로 배열 객체에서 조회후, 존재하지 않는다면(undefined) 응답객체에 상태코드 404와 함께 'ID was not found'라는 문구를 보낸다.

그리고 early return 되지 않았다면, participant가 존재하므로 다음 로직이 동작한다. 응답객체의 Body에서 nation을 가져와서 배열에서 id값으로 찾은 객체의 nation에 덮어씌운다. 그리고 응답객체에 새 participant를 json 타입으로 보내고 콘솔에도 log를 남기는 코드이다.

Postman 요청 결과

PUT API

DELETE - 참가국 국가 삭제 API

HTTP 메소드 : POST

요청 URI : /participants/{id}

Query String : id

Request 객체에 포함된 파라미터 :

1
2
3
4
5
6
7
8
9
10
/* 참가국 삭제 */
router.delete('/:id', (req, res, next) => {
const participant = participants.find(p => p.id === parseInt(req.params.id));
if(!participant) {
return res.status(404).send('ID was not found.');
}
const index = participants.indexOf(participant);
participants.splice(index, 1);
res.json('deleted!');
});

PUT 요청 API와 마찬가지로 id값으로 객체가 존재하는지 여부를 확인후, 존재하지 않으면 상태코드 404를 반환하고, 객체가 존재하면 해당 객체를 배열에서 제거하고 제거되었음을 알리는 문자열(deleted!)을 반환했다.

Postman 요청 결과

DELETE API


Reference