럿고의 개발 노트

Slack Bot 제작기 2편 - Node.js 프로젝트 설정 본문

Project Note

Slack Bot 제작기 2편 - Node.js 프로젝트 설정

KimSeYun 2020. 3. 10. 19:39

Slack Bot 제작기 2편 - Node.js 프로젝트 설정

프로젝트 설정

  • 처음에 사실 자바로 구현하려고 하다가 자바에 대한 지식이 너무 부족해서 Node.js로 갈아탔습니다..ㅎㅎㅎ
  • Node.js를 처음 사용해 프로젝트를 구현했는데, 편안함이 느껴졌습니다.
  • 사실 프로젝트 자체가 작은 규모여서 더 그랬을 수도 있겠습니다.
  • 일단 저희가 사용한 기술들을 알려드리겠습니다.
    1. Node.js
    2. Express
    3. Heroku
    4. Mongo DB
  • 그럼 이제 Slack Bot 구현을 해보도록 하겠습니다.
  • 일단 Module 구성부터 하겠습니다.
{
  "dependencies": {
    "axios": "^0.19.2",
    "body-parser": "^1.19.0",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "mongoose": "^5.9.2",
    "qs": "^6.9.1"
  }
}
  1. "axios" : 슬랙 API와 통신하기 위해서 설치합니다.
  2. "body-parser" : request.body를 파싱하기 위해서 사용합니다.
  3. "dotenv" : 환경변수를 사용하기 위해 설치합니다.
  4. "express" : 웹 프레임워크
  5. "mongoose" : 몽고 DB를 사용하기 위해 설치합니다.
  6. "qs" : 쿼리스트링 파서

몽고 DB 연결

  • 서버편에서 설명하겠지만, 저희는 Heroku mLab MongoDB를 사용했습니다.
  • 설정 방법은 나중에 설명하겠습니다.
  • Node.js 서버와 몽고 DB를 연동하는 코드입니다.
const mongoose = require('mongoose');

const db = mongoose.connection;
db.on('error', console.error);
db.once('open', function () {
    // CONNECTED TO MONGODB SERVER
    console.log("Connected to mongod server");
});

mongoose.connect(process.env.MONGODB_URI);
  • 위와 같이 적어준다면 몽고 DB와 연동이 되었을 것입니다.
  • process.env.MONGODB_URI여기에 몽고 DB URI를 넣으면 되는데, Github에 배포하고 있기 때문에 환경변수를 이용해서 값을 숨겼습니다.

Schema 설정

  • Mongo DB는 NoSQL 시스템으로 테이블끼리 아무런 관계가 없는 시스템입니다.

  • 관계지향적인것을 버리고 가용성을 높이고 어떤상황에서도 crash가 발생하지 않고 빠른거에 초점을 맞춘 DB라고 생각하면 됩니다.

  • MongoDB의 구조

    • DB
    • Collection(RDBMS - table)
    • Document(RDBMS - row)
  • 이런 형식으로 구성되어 있습니다.

  • document는 단수형이 되어야 하며, collection은 복수형이 되어야 합니다.

  • 처음에 인식할때 그렇게 인식합니다.

  • models라는 폴더를 만들어서 거기서 document Schema를 관리하겠습니다.

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var songSchema = new Schema({
    link: String,
    genre: String,
    review: String
});

module.exports = mongoose.model('song', songSchema);
  • 일단, 노래 링크와 장르와 한줄평을 받아와야 하기 떄문에 그에 맞는 Schema를 설정해놓은 것 입니다.
  • 이렇게 하나의 Document를 만들수 있고 이것이 모여서 Collection이 되어가는 것 입니다.
  • 따라서 여기서 song은 Document가 되고, songs는 Collection이 됩니다.

Routes

  • 이번에 제작한 슬랙봇은 URL이 두개만 필요합니다. /actions/evetns만 필요합니다.
  • 따라서 router에서도 그 두개만 일단 지정해놨습니다.
const express = require('express');
const router = express.Router();

// Actions
router.use('/actions', require('./actions'));

// Events
router.use('/events', require('./events'));

module.exports = router;

Events Request URL Verified

  • Events를 Request 받기 위해서는 Event Subscriptions에서 URL을 지정해줘야 하는데, 그때 Challenge Parameter를 보내주고, 우리는 다시 Challenge 의 값을 보내줘야 합니다.
require('dotenv').config();
const express = require('express');
const router = express.Router();

const events = router.post('/', (req, res) => {
    if (req.body.challenge && req.body.type == "url_verification") {
        res.json({challenge: req.body.challenge});
    }
});

module.exports = events;
  • 위의 코드처럼 URL 요청이 들어왔을때 typeurl_verification이 됩니다.
  • /events URL은 나중에 event들을 받을때도 사용해야 하기 때문에, 따로 조건문으로 type에 따라 처리해줘야 합니다.
  • 받은 값을 다시 돌려주기만 하면 되기 때문에, 어려운 점은 없을꺼라고 생각합니다.
  • 이때 가장 큰 특징은 Https만 URL을 지원한다늕 점입니다.
  • 로컬에서 서버를 돌려서 테스트 할때는 https를 쉽게 붙일 수 있는데, 그것을 가능하게 하는 것이 ngrok입니다.

ngrok

  • ngrok 다운로드
  • 위의 링크에 들어가서 다운로드 받으시면 됩니다.
  • 다운받은 파일을 실행한다면, 아래와 같은 화면이 나오게 될 것입니다.
  • ![1번사진]
  • 다음과 같은 명령어를 사용하시면 됩니다.

    ngrok http 포트번호

  • 저는 app.js에서 포트번호를 3000으로 지정해놨기 때문에 포트 번호를 3000으로 하겠습니다.
  • 명령을 친 다음에 나오는 화면이 아래처럼 나옵니다.
  • ![2번 사진]
  • 이 프로그램의 기능은 localhost주소를 특정 주소로 변경해주는 것인데, 이번에는 https://b1d0ba72.ngrok.io이런식으로 변경이 된 것입니다.
  • 계속 켜놓고 있어야 이 주소가 계속 유지가 되는 것이고, 새로 명령어를 치면 주소는 변경되기 때문에 Slack API에서 URL을 계속해서 변경해주는 것이 중요합니다.

정리

  • 기본 모듈 설정과 DB 연동과 Slack API에서 필요한 URL들을 정의했습니다.
  • 아울러 로컬에서 테스트 할 수 있는 환경을 만들 수 있는 ngrok 사용법을 알아봤습니다.
Comments