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.js
와 users.js
가 있다.
users.js에 user 관련 라우터들이 포함되어 있다.
node.js에서 라우팅이란 URI나 HTTP 요청 메소드의 엔드 포인트에 대한 클라이언트 요청에 웹 애플리케이션이 응답하는 방법이라고 한다.
출처 : expressjs - 기본 라우팅
스프링부트를 사용할때 컨트롤러(Controller)라고 했던 개념이 Node.js에서는 라우터(Router)라고 표현하는 것 같다.
Refactor minor
먼저 CRUD 대상 객체를 만들어보자.
이 글을 작성하는 시점에 2020 도쿄 올림픽이 진행중이니 올림픽에 참가중인 국가 이름을 담은 배열을 선언해보겠다. users.js
파일 상단에 배열을 생성해두자.
1 | const express = require('express'); |
자 근데 배열을 만들고 보니 /user
라는 URI와 파일명이 어울리지 않게되었다. 여기서부터 천천히 리팩토링(?)을 시작해보자.
먼저 파일명을 수정하자.
파일명을 수정했다면, 이제 URI도 수정할 차례이다. URI는 app.js
에서 수정하면 된다.
1 | ... |
이렇게 하면 라우터의 요청 URI까지 수정이 되었다.
이제 만들어야 할 라우터는 5개이다.
- 전체 참가국 조회 라우터
- 단일 참가국 조회 라우터
- 참가국 등록 라우터
- 참가국 국가명 수정 라우터
- 참가국 국가 삭제 라우터
GET - 전체 참가국 조회 API
전체 참가국 조회 라우터는 따로 생성하지 않아도 이미 users.js에서부터 존재하고 있다. 함수 내 변수명만 수정해주면 된다.
HTTP 메소드 : GET
요청 URI : /participants
Query String :
Request 객체에 포함된 파라미터 :
1 | /* 전체 참가국 조회 */ |
participant의 기본 요청 URI가 /participant
므로 /participant
로 요청을 하면, 응답객체(res)에 participants
라는 객체를 담아서 json 타입으로 응답한다는 코드이다.
여기서 participants
는 우리가 가장 먼저 작성한 배열 객체이다.
Postman 요청 결과
여기서 잠깐.
응답을 보낼때 사용하는 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 | /* 참가국 조회 */ |
/participants/{id}
로 GET 메소드로 요청이 들어오면, 요청객체(req)에 담긴 id를 가져와서 participants
배열 객체에서 해당 id에 일치하는 객체를 찾아서 이를 응답객체(res)로 반환하는 코드이다.
Postman 요청 결과
POST - 참가국 등록 API
요청객체에 객체를 담아 POST 메소드를 요청하는 API이다.
HTTP 메소드 : POST
요청 URI : /participants
Query String :
Request 객체에 포함된 파라미터 : object { nation }
1 | /* 참가국 추가 */ |
이번엔 참가국을 등록하는 API이다. POST 메소드를 사용하기 때문에 router.post()
로 개발해야 한다.
사실 등록 API는 응답할 필요는 없지만, Post Man에서 제대로 등록이 되었는지 확인하기 위해 응답객체에 participants
객체에 추가된 객체를 담아서 반환하기로 했다.
Postman 요청 결과
PUT - 참가국 국가명 API
이번엔 존재하는 객체를 PUT 메소드로 요청하여 수정하는 API이다.
HTTP 메소드 : POST
요청 URI : /participants/{id}
Query String : id
Request 객체에 포함된 파라미터 : object { nation }
1 | /* 참가국 수정 */ |
QueryString으로 들어온 id값으로 배열 객체에서 조회후, 존재하지 않는다면(undefined
) 응답객체에 상태코드 404
와 함께 'ID was not found'
라는 문구를 보낸다.
그리고 early return 되지 않았다면, participant
가 존재하므로 다음 로직이 동작한다. 응답객체의 Body에서 nation
을 가져와서 배열에서 id
값으로 찾은 객체의 nation
에 덮어씌운다. 그리고 응답객체에 새 participant
를 json 타입으로 보내고 콘솔에도 log를 남기는 코드이다.
Postman 요청 결과
DELETE - 참가국 국가 삭제 API
HTTP 메소드 : POST
요청 URI : /participants/{id}
Query String : id
Request 객체에 포함된 파라미터 :
1 | /* 참가국 삭제 */ |
PUT 요청 API와 마찬가지로 id값으로 객체가 존재하는지 여부를 확인후, 존재하지 않으면 상태코드 404
를 반환하고, 객체가 존재하면 해당 객체를 배열에서 제거하고 제거되었음을 알리는 문자열(deleted!
)을 반환했다.
Postman 요청 결과