slack1
Slacking Jenkins

Slacking Jenkins를 개발하게 된 계기는 무엇인가요?

금융 정보 중 수익률 계산에 관련한 데이터를 크게 분류하면 규칙적으로 바뀌는 부분(일일 주가, 정규 배당금)과 불규칙적으로 바뀌는 부분(비정규 배당금, 주식분할, 과거 주가)으로 쪼개어 볼 수 있습니다. 보통 불규칙적인 부분에 의해서 에러가 발생하는데, 이 경우 에러가 발생한 증권에 대해서 여러 가지의 데이터 소스들을 가져와 조합해서 비교하는 강도 높은 테스트를 하게 됩니다.

처음에는 그때마다 데이터베이스에 접속해서 쿼리를 통해서 확인하고 고치던 것을, 비슷한 패턴이 반복되고 점점 복잡해지자 아예 커맨드 라인 툴을 만들게 되었습니다. 원래 SSH로 서버에 접속해서 실행해야만 했던 것을 젠킨스 빌드에 올려서 웹 브라우저에서도 실행할 수 있게 했는데, 툴이 점점 복잡해지면서 실행하기 전에 몇 개의 옵션을 지정해줘야 하게 되었고, 결과적으로 커맨드 라인 툴일때와 똑같이 “내가 만들어서 나만 실행하는” 툴이 되어버렸습니다.

예를 들면, 마이크로소프트의 수익률이 이상해서 테스트를 해보고 싶다면

tools/fix_security.py --stock-symbols MSFT --period d --verbose

이런(…) 커맨드를 입력하는 식입니다. tools/fix_security.py 뒤에 딸린 옵션의 의미를 설명하자면:

  • --stock-symbols MSFT: MSFT는 전세계 증권시장에서 사용하는 마이크로소프트 주식의 id입니다. 이것만을 테스트하고 싶다는 뜻입니다.
  • --period d: 일일 수익률, 월별 수익률, 분기별 수익률 중에서 일일 수익률(daily)에 대한 테스트를 하겠다는 뜻입니다.
  • --verbose: 생각보다 금융 데이터는 정의가 모호하거나, 불완전하거나, 틀린 경우가 많습니다. 당연히 제가 쓴 코드엔 그에 해당하는 가정들이 세워져 있습니다. 이 옵션은 제가 미리 세운 가정이 틀린 경우, 어느 부분이 틀린 것인지 화면에 출력하라는 뜻입니다. 이런 가정의 예를 하나 든다면… “해당 주가보다 더 큰 배당금은 존재하지 않는다.” 정도가 있습니다. 기대를 저버리지 않고 종종 깨집니다(…)

…그렇습니다. 여러개의 옵션, 실행시 화면에 날아다니는 수많은 로그들…은 이 툴을 저만 쓸수 있는 애물단지로 만들었습니다. 게다가 테스트에 저 툴만 쓰는 것도 아니고, 최종적으로 헬로머니에 반영시키려면 저런 식의 툴을 여러개 실행하게 됩니다. 주식 하나의 수익률이 업데이트되면 그 주식이 포함된 포트폴리오의 수익률도 바뀌어야 하기 때문입니다.

게다가 마리아님의 등판 이후 점점 레딧을 위시한 온라인 커뮤니티에서 헬로머니의 인기가 높아져가면서 실시간으로 날아드는 유저 문의에 응대하는 빈도가 늘어나게 됨에 따라, 누구나 쉽고 빠르게 실행할 수 있는 데이터 관리 도구의 필요성이 높아지게 되었습니다.

어떻게 개발했나요?

팀 전체가 쓰고 있는 툴이 뭔가 하고 봤더니 팀 채팅을 위한 슬랙이었습니다. 이메일이 좀더 포멀하고 기록해둘만한 내용들을 전달한다면, 슬랙은 밤새 꺼지지 않는 등대같은 툴입니다. (밤에도 시끌벅적합니다. 우리 유저들은 미쿡사람들이라 그때 일어나거든…)

그래서 생각한 것이, ‘슬랙으로 젠킨스를 실행하게 만들자’ 였습니다.

Reddit에 올라오는 사용자의 반응을 실시간으로 슬랙에서 확인하고, 데이터 문제가 있다면 슬랙에서 바로 고쳐버리자!

고맙게도 슬랙은 Custom Integration을 위한 다양한 API를 제공합니다. 한마디로, 네가 필요한거 다 슬랙에 띄울 수 있으니 제발 슬랙 끄지 말고 켜두라는 깊은 뜻이 담긴 배려들이죠. 슬랙에 특정 커맨드를 등록하고, 그 커맨드를 실행하면 슬랙에서 대신 해당 웹 요청을 보내줍니다. 코드 한 줄 안 짜도 됩니다. 그냥 홈페이지에서 설정만 하면 됩니다.

젠킨스는 역사가 오래된 서비스답게 커스터마이징을 위한 거의 모든 것들이 준비되어 있습니다. 덕분에 Build Authorization Token Root Plugin을 설치하면 특정 URL에 접속하는 것만으로 해당 빌드를 실행 할 수 있습니다. 여기에 기본 빌드 설정에서 해당 빌드를 parameterize해주면 URL을 약간 고쳐주는 것만으로 빌드 실행에 필요한 환경변수를 넣어줄 수 있습니다!

이제 저만 잘하면 됩니다(…) 제일 먼저, 그동안 사용하고 있던 툴을 모두 한가지 옵션만 사용하도록 고쳐 썼습니다. 이런식으로 말이죠.

tools/fix_security.py --symbols MSFT

tools/update_portfolios.coffee --symbols MSFT

느낌이 오시죠? 모든 툴의 옵션을 통일시켜버린 다음에 URL을 통해 원하는 옵션을 환경변수로 전달해버리는 겁니다. 이제, 슬랙에 /fix MSFT라고 입력하면 … /fix_security_build/?build_args=MSFT 이런식의 URL로 웹 요청이 가고 해당 빌드가 실행될 거에요!

아 맞다

슬랙은 그것까진 안해줍니다. /fix MSFT라고 하면 미리 지정한 URL로만 요청을 보냅니다. URL을 바꿔서 요청을 보내주진 않아요. 하…

좌절하던 저에게 Lab80의 프론트엔드 마피아 김우진님이 슥 와서는

POST요청으로 해서 body에 옵션 넣어 보내면 그걸 우리서버가 받아서 처리하면 되잖아요

라고 쿨하게 한마디 해주셨습니다. 올ㅋ 뭐랄까, 배로 아프리카를 어떻게 돌아갈지 고민하고 있는데 “저기 파나마에 운하 있던데” 라고 말해주는 느낌이랄까. 개오바 덕분에 슬랙을 통해 옵션을 넣는 문제는 아주 쉽게 해결되었습니다.

슬랙이 lab80의 특정 url로 해당 옵션이 담긴 POST request를 날리면 lab80 서버가 그걸 받아서 해당 젠킨스 url로 바꾸어 다시 웹 요청을 날리고 빌드를 실행시키는 구조로, 드디어 Slacking Jenkins가 완성되었습니다.

이제 슬랙에 /fix history 증권id 를 입력하면 7개 정도의 툴이 실행되고 3~4분 정도면 그 결과를 사이트에서 확인할 수 있습니다. lab80 서버에서 처리해주는 덕에 수익의 프로필 데이터를 테스트하는 /fix profile 증권id 커맨드도 만든 것은 덤.

slack2
Slacking Jenkins를 팀원들에게 발표한 첫날, 격한 반응들

Depth & Breadth의 중요성을 다시 한번 느낀 경험이었습니다. 데이터 개발에 약간의 웹 개발을 얹어주니 팀원에게 사랑받는 툴이 탄생하고 Customer service process에도 큰 도움이 되었네요. 이렇게 좋아할 줄이야.

개발하고 나니 제가 제일 많이 씁니다. 이제 젠킨스 거지같아서 못쓰겠다. 한때 젠킨스 빌드 UI를 Maria님 한테 가르칠까 생각했던 제가 부끄러움… 어디 사람이 사람한테 할 짓인가…!

Slacking Jenkins의 혜택을 듬뿍 받고 계신 Maria 님의 간증

  • 혼자 할 수 있어! 아 이제 밤 11시에 낑낑거리다가 준희 님을 부르지 않아도 된다. 마이클이 자나 안 자나 슬랙에 불이 켜져 있나 보지 않아도 된다. 이제 혼자 데이터를 수정할 수 있게 되면서 사용자 문의에 빠르게 응대할 수 있게 되었다. 슬랙으로 이 모든 것을 실행할 수 있어서 시간과 공간의 제약이 확 줄어서 기쁘다.

  • 꺼진 데이터도 두 번 보자. 포트폴리오를 만들다가 숫자가 수상하면 일단 한 번 고쳐본다. 전보다 데이터가 정확한지 아닌지 확인하는데 들어가는 비용이 확 줄어서 자주 데이터를 확인하게 된다.

  • 헬로머니가 정확한 데이터를 준다는 믿음을 지킬 수 있다. 사용자는 헬로머니를 사용할 때 제시되는 금융 정보가 정확하다는 가정하에 사용한다. 데이터를 항상 신선하게 유지할 수 있도록 여러 장치가 마련되어 있다는 것이 정말 좋다.