럿고의 개발 노트
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을 지정해줘야 하는데, 그때ChallengeParameter를 보내주고, 우리는 다시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이 됩니다. /eventsURL은 나중에 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