Jarvis 프로젝트는 멋쟁이사자처럼 명지대 10기 슬랙봇이다.
개발 기간 : 2022. 04. 04 ~ 2022. 05. 11
처음 슬랙봇 프로젝트를 시작하기 전에 듣기로는 별로 어렵지 않은 난이도의 프로젝트라고 들었었다. 하지만... typescript도 처음 써보고 데이터베이스를 직접 다뤄본 것도 처음이었고 항상 프론트 개발을 많이 해보던 나로써는 백엔드에 가까운 슬랙봇 개발을 처음 해보는 거라 예상보다 시간도 많이 걸렸고 개발을 처음 시작하는 데에서도 많이 해맸다.....
주요 기능으로 여러가지 기능이 있는데 내가 도맡았던 기능은 생일 축하 알림기능이다. 다른 슬랙봇 기능들과는 개발하는 과정이 좀 달랐다.
다른 기능들부터 어떤 식인지 알아보자.
주사위 게임 기능
- 숫자는 1~100까지의 숫자를 보여주고 이 내에서 범위를 나눠 결과를 반환해준다.
- 여기서 반환되는 결과에 따라서 각각
id
를 부여해주고id
별로 출력할text
를 지정해준다.- 슬랙에서 지정된 명령어를 입력받으면(
app.message
) 랜덤으로 숫자를 뽑아주고 이 값에 따른 범위에 해당하는text
를answer
라는 변수에 담아 슬랙에 메시지를 보내(say
) 응답해준다.
Exampleapp.message(/입력받을 명령어/, async({message, say}) => { await say('답변'); }
자비스 부르기 기능
app.message
로 받을 명령어에 따른 답변(say
)을 지정해준다.- 몇 시인지 물어보면 시간을 알려주는 기능
- 내장함수인getHours()
함수를 사용해 현재 시간을 받아오는 변수의 값과 시간 범위에 따른 답변을 지정해둔 후 이를 변수에 넣어주고 시간과 함께 응답을 보낸다.
example)0-6시 사이라고 하면, `if(h>=0 && h<=6) return '보내고 싶은 텍스트';- 뭐할지를 물어볼 경우, 이에 대한 답변을 랜덤으로 3가지 중 하나를 출력할 수 있게 지정해놓고 random함수를 통해 이 중 하나를 뽑아 변수에 넣어주고 해당 변수를
say
로 말해주도록 한다.
자비스의 기능 보기
- 명령어를 입력했을 때(
app.message
) 마크다운 형식으로 텍스트와 버튼을 먼저 응답(say
)해준다.- 이후 버튼을 클릭하면 이에 대한
action
을 보여준다.app.action
기능으로action_id
를 처음 인수로 받는다.- 버튼 클릭에 대한 action으로 어떤 기능이 있는지에 대한 텍스트를 응답해준다(
say
)
이렇게 위의 세 가지의 기능만 보더라도 사용자에게 명령어를 받는 즉시 이에 대한 응답을 보내주는 형식으로 슬랙봇이 작동한다.
하지만 생일 축하 알림의 경우 사람들의 생일 데이터가 있을 때, 현재의 날짜와 생일 데이터를 비교해 보았을 때 생일인 사람이 있을 경우 생일 축하 알림을 보내주는 기능으로 항상 명령어를 보내고 응답을 받는 형식이 아니다!!!
처음에 내가 생각했던 구현 방식은 아래와 같다.
node-schedule
이라는 모듈을 사용하여 매일 똑같은 시간에 작동하도록 설정해둔다.하지만 슬랙봇은 명령어를 받고 그때 깨어나서 작동을 하는 것인데 어떻게 명령어를 보낼 지가 문제였다. 그렇다보니 say를 사용하지도 못했다.
그래서 변경한 방법이 아래와 같다!
- 데이터베이스를 받아오고 생일인 사람의 데이터를 select한다.
- 선택된 데이터들을 promise 형태로 반환한다.
- 슬랙에서 제공하는
client.chat.scheduleMessage()
를 사용하면 앞의 문제들이 해결된다.- 이 메서드는 쉽게 말해 명령어를 한 번 입력하면 메시지 기능을 예약할 수 있는 기능이라고 생각하면 된다.
- 이 메서드의 필수 인자로는
channel
,post_at
,text
이렇게 세 가지가 있다.
- 여기서
channel
은 우리가 이를 사용하는 채널이고text
는 보낼 메시지를 생각하면 된다.post_at
은 보내는 시기인데 이게 관건이었다..!!- 시기를 생각하면 당연히 날짜와 시간만 생각을 했다. 그리고 여기에 들어가야 하는 값의 타입은 string이거나 number여야 했는데 string 형태로 넣었을 때도 돌아가지 않아서 number 형태로 하기 위해 여러 방법을 시도해 보았는데 공식문서를 보니 초를 넣어주어야 했다. 그래서
getTime()
함수를 사용해 1000으로 나눠주는 과정을 거쳐야 했다.
Ex)new Date(2022, b.month - 1, b.day, 14, 0).getTime() / 1000
- 또한
client.chat.scheduleMessage()
는 너무 먼 미래와 과거의 데이터를 불러와서 실행할 경우too_past
,too_far
이런 에러가 발생하게 된다.- 처음에 모든 생일 데이터를 가져왔을 때 발생한 에러이다. 그래서 모든 데이터를 가져오는 것이 아닌 현재 월을 기준으로 다음달의 데이터까지 약 2달 치의 데이터를 불러오니 에러가 발생하지 않았다.
- 그러다 보니 현재로써는 6월까지의 데이터를 불러왔는데 7월이 되면 7-8월까지의 데이터를 불러와 다시 실행하도록 한 번 더 명령어를 입력해 주어야 한다. 이 이상 기간의 데이터를 불러 올 수 있는 지는 여러 번 고쳐가면서 시도해보면 좋을 거 같다.
바로 오늘 마지막 스크럼을 끝으로 한 달 간의 Jarvis 프로젝트가 끝났다!
큰 기능도 아니고 규모도 작지만 처음으로 해 본 백엔드 프로젝트이자 typescript도 처음 사용해 본 프로젝트라 까먹지 않기 위해 바로 회고록을 작성해보았다:)
원래 처음 개발 시작할 때 사람들의 이름과 숫자를 입력하면 입력한 숫자만큼의 조를 나눠주는 기능도 만들자는 말이 나왔었다.
이를 기세로 앞으로 이 기능도 구현해 보아야겠다🤗
멋지네요! 🤗