Fall in IT.

Koa를 사용하여 rest api 서버 만들기 본문

프로그래밍언어/Node.js

Koa를 사용하여 rest api 서버 만들기

D.Y 2018. 6. 6. 21:38

안녕하세요.

오늘은 Koa를 사용하여 rest api 서버 만들어 보겠습니다.

사용 기술스택
  • 데이터베이스는 MongoDB를 사용하고 Mongoose 라이브러리(MongoDB 기반 ODM)를 사용하여 DB와 통신하도록 하겠습니다.
  • 문법검사도구로 ESLint를 사용하겠습니다. 에러를 최소화하기 위해서 사용합니다.
  • 프로젝트 패키지 관리 툴로는 yarn을 사용하겠습니다. npm을 기반으로 만들어졌지만 더 속도가 빠릅니다.
  • 서버 코드 변경시 자동으로 재실행을 해주고, 서버의 상태를 관리 툴로는 pm2를 사용하도록 하겠습니다. pm2 외에도 nodemon, supervisor, forever 등 많은 관리 툴이 있습니다.

먼저 github에서 소스코드를 다운로드 받은 후, 내용과 함께 보면 더욱 이해하기 좋습니다.


목차
1. Koa를 사용하여 웹서버 만들기
2. Mongoose를 사용하여 MongoDB 연동
3. rest api 만들어보기 (기본 CRUD)
4. Insomnia()를 사용하여 만든 rest api 확인하기
5. JWT(Json Web Token)를 적용하여 회원 정보 인증하기
6. 참조



1. Koa를 사용하여 웹서버 만들기
    1) 프로젝트 생성
          - $ mkdir koa-mongo-seed
          - $ cd koa-mongo-seed
          - $ yarn init
          - $ yarn add koa

    2) ESLint 설정
          - $ npm install -g eslint
          - $ eslint --init (프로젝트 경로 내에서 실행하고, 본인이 원하는 설정으로 셋팅합니다.) 

    3) hello koa 출력하기
          - 프로젝트 디렉터리 내에서 src 디렉터리를 생성하고, index.js 파일을 생성합니다.
          - $ mkdir src
          - $ cd src
          - $ touch index.js
          - 내부에 아래와 같이 작성합니다.


          - 서버 실행하기
          - $ node src (또는 node src/index.js)
    4) 미들웨어 등록하는 방법
          - 미들웨어는 Koa 객체를 담고 있는 app이란 변수에 app.use 메소드를 사용하여 미들웨어를 등록해줍니다.
         
    5) pm2를 사용하여 코드 변경시 서버 자동 재시작 설정하기
          - $ npm install pm2 -g (pm2를 전역에 설치합니다.)
          - package.json 파일에 아래 내용을 추가합니다.
     6) koa-router 사용 방법
          - client에서 요청이 들어왔을때 경로에 알맞은 작업을 처리하기위해서 사용합니다.
          - $ yarn add koa-router      

        

    7) rest api에서 get 파라미터 받아오는 방법

          - 라우트 경로의 값을 받아오는 방법(/users/3): ctx.params
          - 쿼리스트링일 경우 받아오는 방법(/users?id=3): ctx.request.query



2. Mongoose를 사용하여 MongoDB 연동
(macOS를 기준으로 설명합니다. OS에 따라 방법이 조금씩 다를 수 있습니다.)
    1) mongoDB 설치하기
          - $ brew install mongodb
    2) mongoDB 실해하기
          - $ mkdir db
          - $ mongod --dbpath ./db
    3) Mongoose 설치하기
          - $ yarn add mongoose
    4) DB config 정보 또는 외부에 공개되면 안되는 정보들을 관리하기위해서 dotenv 라이브러리를 사용합니다.
          - $ yarn add dotenv
          - .env 파일에 환경변수로 config 정보들을 관리할 수 있습니다.

    5) 프로젝트의 루트경로에 .env 파일을 만들고 mongoDB의 웹서버의 포트번호와 DB주소를 넣습니다. 


    6) src/index.js 파일 상단에 dotenv 설정을 추가해줍니다.
          - require('dotenv').config();


    7) 환경변수에 의해 서버가 실행된 것을 확인 합니다.
    8) mongoose 를 통해 데이터베이스 연결하기
          - 반드시 mongoDB가 실행되고 있는 상태여야 동작합니다.

    9) mongoose를 사용하여 데이터베이스 스키마 모델링하기
     (이는 데이터베이스 스키마 구조를 잡는것과 동일합니다. javascript에서 객체를 생성하여 스키마 구조를 잡을 수 있습니다.)
          - 프로젝트 루트 디렉터리에서 models라는 이름의 디렉터리를 생성합니다.
          - $ mkdir models
    10) Account 모델 만들기
          - src/models/account.js 파일을 생성합니다.



3. rest api 만들어보기 (기본 CRUD)
    1) bodyParser 설치하기
          - api 기능을 구현하기 전에 bodyParser 라이브러리가 필요합니다.
          - HTTP 메소드 중 POST와 같이 Request Body에 담긴 데이터를 파싱해주는 라이브러리 입니다.
          - $ yarn add koa-bodyparser
    2) koa-bodyparser 적용하기


          - ctx.request.body 를 사용하여 request body에 들어온 데이터에 접근할 수 있습니다.

    3) 라우터를 사용하여 모듈화하기
          - src/api 디렉터리를 만들고 내부에 index.js 파일을 생성합니다.


         - src/api/auth 디렉터리를 생성합니다. 회원가입, 로그인 등 인증에 필요한 api를 구현합니다.
          - auth 디렉터리 하위에 index.js와 auth.ctrl.js를 생성합니다. 
          - index.js는 route 정보와 연결된 컨트롤러를 정의합니다.
          - auth.ctrl.js는 실제 로직을 구현합니다.




    4) SHA256 해시 함수 사용하기
         - Node에 내장모듈인 crypto를 사용하여 비밀번호를 암호화합니다.
         - cypto 모듈은 비밀번호를 해쉬알고리즘으로 암호화할때 salt로 사용될 secret key가 필요합니다.
         - .env 파일에 임의의 secret key를 등록합니다.


    5) src/models/account.js 스키마가 저장된 파일 안에 해시함수를 구현합니다.


    6) 모델 메소드 만들기
          - DB에 직접적으로 접근하여 데이터를 조회/수정/삭제 하기위한 모델 메소드를 구현합니다.
          - api controller에서는 모델 메소드를 통해 데이터를 받아오도록하여 코드를 깔끔하게 모듈화 할 수 있습니다.


    7) 이메일 회원가입/로그인/이메일, 아이디 존재 유무 확인/로그아웃 구현하기
          - github 소스를 확인해주세요. (코드의 길이가 긴 관계로..)

4. Insomnia()를 사용하여 만든 rest api 확인하기



5. JWT(Json Web Token)를 적용하여 회원 정보 인증하기
     - JWT 토큰을 인증하기 위해서 비밀키가 필요합니다. .env 파일에 비밀키를 설정해주세요.


    - JWT 라이브러리 설치
    - $ yarn add jsonwebtoken
    - src 디렉터리 하위에 lib 디렉터리를 생성합니다.
    - lib 디렉터리 하위에 token.js 파일을 생성합니다.
    - token 생성하는 함수를 만들고 미들웨어를 구현하고 루트 디렉터리의 index.js에 등록합니다. 
    - github 소스를 확인해주세요. (코드의 길이가 긴 관계로..)

6. 참조
https://github.com/leeduyoung/koa-mongo-seed (소스코드는 해당 링크를 참조해주세요.)


모두 즐거운 코딩하세요~



Comments