럿고의 개발 노트
Slack Bot 제작기 2편 - Node.js 프로젝트 설정 본문
Slack Bot 제작기 2편 - Node.js 프로젝트 설정
프로젝트 설정
- 처음에 사실 자바로 구현하려고 하다가 자바에 대한 지식이 너무 부족해서
Node.js
로 갈아탔습니다..ㅎㅎㅎ - Node.js를 처음 사용해 프로젝트를 구현했는데, 편안함이 느껴졌습니다.
- 사실 프로젝트 자체가 작은 규모여서 더 그랬을 수도 있겠습니다.
- 일단 저희가 사용한 기술들을 알려드리겠습니다.
- Node.js
- Express
- Heroku
- 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"
}
}
- "axios" : 슬랙 API와 통신하기 위해서 설치합니다.
- "body-parser" :
request.body
를 파싱하기 위해서 사용합니다. - "dotenv" : 환경변수를 사용하기 위해 설치합니다.
- "express" : 웹 프레임워크
- "mongoose" : 몽고 DB를 사용하기 위해 설치합니다.
- "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 요청이 들어왔을때
type
이url_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
사용법을 알아봤습니다.
'Project Note' 카테고리의 다른 글
Slack Bot 제작기 1편 - 슬랙 봇 앱 설정 (0) | 2020.03.06 |
---|---|
[2020년 1월 사이드 프로젝트] [groom][웹퍼블리싱 실습] 웹 표준 사이트 만들기(동영상강의) (0) | 2020.01.06 |
Comments