자동화 도구 n8n 사용기

IFTTT나 Zapier의 너무 좁은 무료 영역 때문에 다양한 자동화 시도를 해 보기 어려웠다면 n8n을 통해 아주 낮은 비용으로 다양한 시도를 해 볼 수 있습니다.

자동화 도구 n8n 사용기

개인적으로 자동화에 관심이 있습니다. 이전부터 아주 간단하지만 광범위한 기능을 자동화 할 수 있는 IFTTT를 즐겨 사용해 왔고 또 근래에는 비슷한 도구인 Zapier를 활용하기도 했습니다. 또 애플 플랫폼에서 동작하는 단축어 앱을 적극적으로 활용해 일상을 기록하거나 자질구레한 반복되는 행동을 자동화 해 아예 그 행동이 없던 것처럼 만들기도 했습니다. 우리 생활에는 생각보다 자동화를 시도해 볼 여지가 많으며 그저 지나치기만 하던 현상을 기록해 의미 있는 데이터로 만들어볼 수도 있고 또 자동화를 시도해 보면서 뉴스레터 20주 리뷰 (2)에서 소개한 컨플루언스 화이트보드 기능처럼 어떤 일의 구조를 파악하는 계기가 되기도 해서 재미있어 합니다.

이전에 주로 사용해 왔고 또 지금도 종종 사용하곤 하는 정치적으로 업무 자동화가 좋기만 하지는 않음에서 짧게 소개한 Autoit 같은 좀 더 본격적인 도구는 사실상 윈도우 운영체제의 동작 방식에 대한 이해와 일정 수준 이상의 프로그래밍 스킬을 요구하기 때문에 생활 속에 일어나는 다양한 자동화 요구를 충족하기는 쉽지 않습니다. 종종 엑셀 VBA 환경이 너무 낡았으니 차라리 파이썬 라이브러리로 엑셀 파일을 읽어 핸들링 하는 편이 더 낫겠다는 의견을 볼 때가 있는데 실제로 해 보면 파이썬을 능숙하게 다룰 수 있는 사람 관점에서만 이 말이 옳고 엑셀만 다룰 수 있는 사람에게는 완전히 새로운 환경을 익히는 부담을 동반한 별로 옳지 않은 접근이라고 생각합니다. 시작할 때 소개한 IFTTT나 Zapier는 자동화 하려는 서비스를 연결해 놓은 다음 아주 간단한 자동화를 만들 수 있습니다. 이 간단한 자동화는 조금 더 다양한 자동화에 대응하기에는 한없이 부족하게 느껴질 수도 있지만 프로그래밍 스킬이 거의 없는 사람 수준에서는 이 정도 수준이 딱 적당하다고 생각합니다.

IFTTT와 Zapier의 핵심은 서로 다른 자동화 체계를 가진 수많은 서비스와 시스템에 일관된 방식으로 접근하는 추상화된 인터페이스를 제공하는 것입니다. 가령 구글 스프레드시트에 있는 스프레드시트를 읽고 수정하는 작업에는 구글 계정을 인증하고 특정한 스프레드시트를 찾은 다음 여기에 데이터를 추가하기 위해 구글이 만들어 놓은 API를 사용해야 합니다. 또 슬랙에 메시지 하나를 보내려면 슬랙 워크스페이스, 채널, 계정을 사용한 접근 권한을 상징하는 문자열을 받아야 하고 이를 슬랙과 통신할 때마다 주고 받아야 합니다. 이런 방식은 온갖 서비스마다 인증하는 방식부터 기능에 접근하는 방식까지 모두 제각각이어서 이들 하나하나를 제작사가 제안한 방법에 따라 자동화 하려면 상당한 수준의 프로그래밍 스킬이 필요합니다. 고작 슬랙에 메시지 하나 보내자고 특정 언어의 개발환경을 구축해야 하는 상황부터 이미 자동화 시도를 포기하게 만들 수 있습니다. 하지만 IFTTT, Zapier 같은 서비스는 이들을 추상화 해 서비스마다 서로 다른 사용 방식을 일관된 경험으로 만들어 자동화할 서비스가 제시한 특정 개발환경을 구축할 필요 없이 그냥 다음 버튼을 누르며 로그인 해 놓으면 준비가 끝나 사용자는 오직 아주 단순한 로직 자체에만 집중하게 해 줍니다.

하지만 개발비를 절약해 봅시다 같은 생각을 해야 하는 가난뱅이 입장에서 이런 서비스를 적극적으로 활용하기에는 작은 문제가 있는데 바로 이 서비스들을 본격적으로 활용하기 위해서는 적지 않은 요금을 지불해야 한다는 점입니다. 이런 서비스 모두 자동화 종류 당, 그리고 자동화 실행 횟수 당 요금을 지불하도록 되어 있는데 정치적으로 업무 자동화가 좋기만 하지는 않음에 소개한 회의록을 슬랙 채널에 올려 주는 아주 간단한 자동화를 만들더라도 이 자동화가 여러 번 동작하면 무료 사용 범위를 넘어서 월 단위로 꽤 큰 돈을 지불해야만 합니다. 또 이런 요금 체계는 자동화에 대한 다양한 접근을 가로막는데 원격 회의 시간이 되면 회의 접속 링크를 슬랙에 보내거나 퇴근 시간이 되어 갈 때 밖에 비가 오면 슬랙에 이를 알려주는 아주 간단한 기능을 만들고 싶더라도 자동화 갯수 제한과 실행 횟수 제한을 생각하면 굳이 이따위 기능을 만들어 실행 횟수를 낭비해서는 안되겠다는 생각에 이런 시도 자체를 잘 안 하게 만들었습니다. 한번은 Zapier에 돈을 내기는 싫지만 별 것 아닌 자동화를 유지하고는 싶어서 한 계정에 모든 자동화를 만들어 놓는 대신 여러 계정을 만들어 각 계정마다 무료 사용 범위의 실행 횟수로만 동작하는 자동화를 각각 만들어 관리해 보기도 했는데 별로 좋은 경험은 아니었습니다.

그래서 거의 지난 1년 넘는 기간에 걸쳐서는 본격적인 자동화가 필요할 때 애플 단축어 앱을 활용했습니다. 애플 단축어 앱은 아이폰에 설치된 여러 앱이 제공하는 자동화 기능을 편리하게 가져다 사용할 수 있었는데 가령 슬랙 API에 접근해 슬랙에 글을 쓰고 하루하루 할일을 할일 목록에 등록하고 퇴근하면 가족들에게 집에 도착했다는 메시지를 보내고 캘린더를 읽어 소셜 네트워크 서비스에 블로그 글을 매일 공유하고 회사 슬랙에 휴가 메시지를 보내고 출퇴근 시각을 기록했다가 통계를 내는 등등의 용도로 사용했습니다. 단축어 앱은 대부분 원하는 대로 동작했지만 로직을 작성하는 환경이 그리 편리하지 않아 로직이 조금만 길어져도 파악하기 어려울 뿐 아니라 코드를 모듈화 하기도 어렵고 디버깅 하기도 어려워 기능이 조금만 복잡해지면 순식간에 그래프와 노드로 얽힌 난장판에 빠지게 만들었습니다. 또 거의 항상 켜져 있는 아이폰에서 이런 모든 자동화가 동작하는 점은 나쁘지 않았지만 제 아이폰은 여러 가지 이유로 꺼질 수도 있었고 또 네트워크에 연결되지 않은 장소에 있을 수도 있었으며 여러 앱이 제공하는 기능은 종종 앱의 업데이트에 따라 잘 동작하지 않을 때도 있어 아주 안정적이지는 않았습니다. 또 아이폰에서 단축어 수 십 개가 동작하는 상황에 이르자 배터리 수명에도 뚜렷한 영향을 끼쳤습니다.

이런 도중 ‘n8n - Workflow automation for technical people’이라는 자동화 도구가 있다는 사실을 알게 되었습니다. 이 도구는 앞서 소개한 IFTTT와 Zapier처럼 여러 서비스마다 서로 다른 자동화 사용 방법을 추상화한 다음 사용자는 오직 로직 작성에만 집중하도록 만들어졌습니다. 이 도구 역시 다른 도구처럼 자동화 갯수, 그리고 실행 횟수에 따라 요금을 지불해야 하지만 정말 놀랍게도 오픈소스이며 직접 호스팅 할 수도 있었습니다. 그렇잖아도 기존 애플 단축어 앱의 기능 한계를 우회하는데도 사용하던 장난감 서버가 AWS에 항상 떠 있었는데 여기에 이 소프트웨어를 설치해 24시간 돌리면 굉장히 좋겠다는 생각을 했습니다. n8n은 node.js 환경에서 구동되는데 다행히 장난감 서버에는 다른 서비스를 모니터링 하는데 사용하는 Uptime Kuma라는 도구를 설치해 사용하고 있었고 이 도구가 node.js 환경에서 구동되고 있어 n8n을 서버에 직접 설치하는데는 별 지장이 없었습니다. 이 소프트웨어를 직접 설치해 사용하면 완전 관리형 서비스가 제공하는 편안함은 없지만 자동화 갯수와 실행 횟수에 제한이 없어 앞에서 아쉬워했던 온갖 자잘한 자동화를 마음 편히 만들 수 있을 거라고 기대했습니다.

그리고 n8n은 그런 기대에 아주 잘 부응합니다. 자동화 실행 횟수에 제한이 없어지자 그동안 아이폰에서 애플 단축어 앱을 통해 돌리던 자동화를 n8n으로 옮기기 시작했는데 그 중 하나는 회사 슬랙에 휴가 메시지를 보내는 자동화였습니다. 휴가 사용 및 집계는 전용 소프트웨어를 통해 입력하고 관리하지만 누군가가 오늘 휴가인지 아닌지를 알기는 쉽지 않았습니다. 휴가 관리 소프트웨어의 연동 기능을 사용해 어떻게든 만들 수도 있을 것도 같았지만 그걸 바쁜 우리들 중 누가 만들 수 있을지를 생각해보면 사실상 만들 수 없는 것과 같았습니다. 그래서 휴가를 사용하는 사람은 오늘 휴가라고 슬랙 채널에 말하기로 했는데 이 규칙의 필요성에는 깊이 공감하지만 항상 이를 사람이 직접 해야 한다는 점은 그리 마음에 들지 않았습니다. 그래서 애플 단축어 앱으로 새벽에 오늘 캘린더를 읽어 휴가나 반차 일정이 있으면 이를 슬랙에 말하도록 해 왔는데 이 기능을 n8n으로 옮겼고 자동화가 실행되는 위치가 제 아이폰에서 장난감 서버 상의 n8n으로 옮겨져 동작하는 형태가 완전히 달라졌지만 겉으로 보이는 동작은 똑같았습니다.

이전 같으면 비용 문제로 만들지 않았을 자동화를 만들 수 있게 되었습니다. 프로젝트에 사람들이 늘어나고 이들이 한 번에 모일 수 있는 장소를 회사 건물 안에서는 찾을 수 없게 되어 모든 사람들이 한 번에 모이는 주간회의는 항상 원격으로만 진행하고 있는데 평소에는 슬랙 허들을 사용하던 사람들은 이 회의만은 어쩌다 보니 줌으로 진행하고 있어 회의 때 줌을 실행해야 함을 잘 인식하지 못할 때가 있었습니다. 종종 안 온 사람들을 찾아가 줌을 실행해야 함을 안내하며 진행이 늦어지곤 했는데 그냥 회의 시간 직전에 줌 링크를 슬랙에 보내기만 하면 간단히 해결할 수 있는 문제처럼 보였습니다. 하지만 이런 기능을 Zapier에 의존할 때는 무료 계정에 최대 다섯 개 까지만 만들 수 있는 자동화 갯수 제한 때문에 이를 실행하기 어려웠는데 자동화 갯수 제한과 실행 횟수 제한이 모두 사라진 지금은 이런 아주 사소한 자동화를 마음 편히 만들어 회의 시작이 늦어지는 문제를 크게 줄일 수 있게 됩니다.

이런 용도 외에도 개인적으로 뉴스레터를 발행하며 겪는 여러 가지 반복적인 작업 역시 아이폰에서 애플 단축어 앱을 통해 자동화 하고 있었는데 이들도 전부 n8n으로 옮겨 24시간 켜져 있고 또 24시간 인터넷에 연결된 서버 상에서 더 안정적으로 동작하게 되었습니다. 가령 뉴스레터에 새 글을 공개하면 이 글을 캘린더에 등록해 놓은 다음 매일 아침마다 캘린더를 읽어 소셜 네트워크 서비스에 글을 공유하고 있는데 캘린더를 읽어 글을 공유하는 부분을 애플 단축어 앱을 통해 자동화 하고 있었습니다. 그런데 새 글을 공개할 때 글을 캘린더에 등록하는 부분은 그동안 수동으로 해 오고 있었는데 이런 동작들도 n8n에서 자동으로 수행하게 해 뉴스레터와 블로그를 운영하는데 중요하지만 반복적인 동작에 더 이상 신경 쓰지 않고 그냥 알아서 동작하게 됐습니다.

물론 모든 부분이 다 행복하지는 않은데 n8n 역시 완전 관리형 서비스를 유료로 제공하다 보니 직접 설치해서 무료로 사용할 수 있는 버전과 완전 관리형 서비스 사이에 기능 차이가 있습니다. 대표적으로 무료인 호스팅 버전에는 변수 기능이 빠져 있습니다. 그래서 이번 실행이 몇 번째 실행인지, 이번에 자동화가 실행된 날짜는 며칠인지 같은 정보를 n8n만 사용해서 기록할 수 없고 또 무료 버전에는 ‘변수’라는 개념 자체가 아예 없어 중간에 값을 잠깐 저장하거나 여러 값을 연결해 새 값을 만들거나 값의 일부를 잘라내는 등의 문자열 처리에 자주 사용되는 기능이 모두 빠져 있고 이 기능을 사용하기 위해서는 유료 버전을 사용해야만 합니다.

하지만 이런 도구의 제한이 늘 그렇듯 우회할 방법은 당연히 있는데 다른 방법도 있겠지만 개인적으로는 MySQL 노드를 사용해 같은 서버에서 돌고 있는 데이터베이스에 n8n으로부터 변수를 기록하는데 사용할 Key-Value 테이블을 만들어 놓고 변수를 기록하고 또 불러오는데 사용해 n8n의 변수 기능 제한을 우회하고 있습니다. 또 문자열 처리 역시 효율적이지 않기는 하지만 데이터베이스에 보내 처리한 다음 결과를 다시 가져오는 방식을 사용해 변수 관련 기능 제한에도 불구하고 아무 문제 없이 로직을 만들고 있습니다.

또 반복 처리가 명시적이지 않다는 문제가 있습니다. 이건 문제라고 해야 할 지 아니면 특징이라고 해야 할 지 잘 모르겠지만 제 개인적으로는 문제라고 느껴졌습니다. 이 역시 유료 버전에서만 변수 기능을 제공하기 위해 어쩔 수 없이 이렇게 된 것 같아 보이는데 어떤 노드를 실행한 결과가 여러 개로 되어 있다면 이 노드 다음에 연결되는 노드는 이전 노드의 실행 결과 갯수만큼 묵시적으로 반복 실행됩니다. 이는 굳이 명시적인 반복을 사용하지 않고 당연히 리스트의 모든 항목에 걸쳐 반복을 수행해야 하는 대부분의 상황에는 장점일 수 있지만 리스트 중 조건에 맞는 일부 항목에 한해 처리해야 하거나 현재 반복 상태를 파악해 반복을 계속할지 종료할지를 파악할 수 없게 합니다. 이 역시 바로 위에서 설명한 방식으로 우회할 수 있기는 하지만 그 모양이 썩 예쁘지 않고 편안하지도 않으며 고작 반복 제어를 위해 지속적으로 외부 데이터베이스에 의존해야 해서 실행이 그리 안정적이거나 안전하지 않을 수도 있습니다. 또 자잘하게는 여러 서비스에 대한 인증 정보를 옮길 수 없고 깃을 통한 그래프 버전 관리 역시 제한되어 있습니다.

이런 단점에도 불구하고 n8n은 직접 호스팅해 무료로 사용할 수 있는 버전을 제공해 자동화 갯수나 실행 횟수 제한 없이 마음 놓고 자동화를 만들 수 있게 해 줍니다. IFTTT나 Zapier가 훨씬 더 많은 서비스를 지원하는 점과 비교하면 지원하는 서비스 수가 더 적고 이들과 연동 과정이 아주 매끄럽지는 않은 점이 아쉽기는 하지만 이 정도 기능을 갖춘 서비스를 직접 호스팅 한다는 조건 하에 무료로 사용할 수 있다는 점은 정말 엄청난 장점입니다. n8n 덕분에 그동안 실행 횟수 제한과 자동화 갯수 제한 때문에 시도하지 않던 다양한 자동화를 만들어 일과 생활 구석구석에 적용하며 다양한 시행착오를 겪어 자동화에 대해 이전보다 더 많이 배우고 있습니다. 또 이전에는 애플 단축어 앱으로 만들어 아이폰에서 직접 돌리던 자동화들을 24시간 켜져 있고 또 인터넷에 연결된 데이터센터에 있는 서버에서 돌리면서 아이폰에서 직접 돌리는데 비해 훨씬 더 안정적으로 구동할 수 있게 됐습니다.

그렇다고 아이폰에서 직접 구동하는 단축어를 완전히 대체하지는 못했는데 이유는 아이폰에서만 발생하는 이벤트를 처리하기 위해서는 아이폰에서 직접 실행되어야 하기 때문입니다. 가령 아이폰이 지오펜스를 통과하거나 메시지를 수신하거나 특정 와이파이 네트워크에 접속되거나 NFC 태그를 스캔하거나 하는 등의 이벤트는 오직 아이폰 자체에서만 실행할 수 있습니다. 하지만 이 이벤트에 의한 동작 대부분은 n8n으로 옮겨 아이폰 상의 단축어에는 이벤트를 감지한 다음 n8n에 있는 자동화를 호출하는 식으로 훨씬 단순한 부분만 남기고 나머지 동작은 n8n에서 수행해 로직을 작성하고 관리하고 또 디버깅하기가 이전에 비해 훨씬 간편해졌습니다.

IFTTT나 Zapier 같은 자동화 서비스에 관심이 있지만 본격적으로 사용해 보기에는 무료 서비스 범위가 너무 좁아 다양한 시도를 해 보기 부담스럽다면 n8n을 추천합니다. 직접 설치해서 사용해야 하는 점이 걸리기는 하지만 이 장벽을 넘을 수만 있으면 그 다음은 자동화 갯수나 실행 횟수에 제한 없이 온갖 사사로운 일에도 자동화를 시도해 보며 시행착오를 통해 발전할 수 있어 자동화에 대한 이해가 깊어질 계기로 삼을 수 있습니다. 유료 버전과 비교해 직접 호스팅 해야 하고 변수 개념이 없으며 버전 관리 기능이 없고 라이브 디버깅 기능이 없고 또 여러 서비스에 대한 인증 정보를 가져오거나 내보낼 수 없기는 하지만 개인적인 수준에서 자동화를 만들고 관리하기에는 충분하다고 생각합니다. 자동화에 관심이 있고 기존 서비스의 가격이 불만이었다면 n8n을 사용해 보시기를 권합니다.