요즘 n8n 사용기 (2024)
n8n은 1년 넘게 제 자동화의 핵심을 차지하고 있습니다. 일단 이걸 돌릴 수 있는 기계만 있다면 도커 기반으로 편안하게 돌려 놓고 어지간한 자동화를 한 곳에 집중 시킬 수 있습니다.

작년(2023년) 연말에 자동화 도구 n8n 사용기에서 제가 개인적인 자동화에 n8n이라는 도구를 사용하고 있다는 점을 소개했습니다. 이후 여러 가지 관련 검색어에 의한 유입이 일어났다는 것을 알게 됐는데 이들 중 일부는 n8n을 무료로 사용하는 방법에 대한 것, 그리고 나머지 대부분은 n8n을 활용하는 방법에 대한 것이었습니다. n8n은 완전관리되는 호스팅 환경을 제공하는데 이를 사용하려면 최소 월 24유로를 지불해야 합니다. 월 24유로를 지불하면 워크플로우를 월 2500회 실행할 수 있어 실행 횟수 자체는 그럭저럭 괜찮아 보이지만 자동으로 실행되도록 설정할 수 있는 워크플로우 수가 5개로 제한되어 그 제약이 상당히 큽니다. 수동으로 실행되는 워크플로우를 여럿 만들어 사용한다면 액티브 워크플로우 5개 제한이 그리 크게 다가오지 않을 수 있지만 여러 행동들이 자동으로 수행되기를 원한다면 워크플로우 제한은 거의 지불 의사를 꺾어 버리는 수준입니다. 그렇다고 월 60유로를 지불하더라도 액티브 워크플로우 수는 기껏해야 15개로 늘어날 뿐이어서 이 역시 좋은 선택은 아니어 보입니다.

하지만 n8n은 직접 설치해 사용할 수 있어 이런 제한으로부터 완전히 벗어날 수 있습니다. 특히 'Docker Installation' 문서를 참고해 도커를 이용해 설치하면 설치 및 관리가 굉장히 편해져 추천하며 저 역시 n8n을 이 방법으로 설치해 사용하고 있습니다. 실행 환경은 장기적으로 비용을 낮추기 위한 온프레미스 전환에 소개한 4년 전 출시된 M1 맥미니에 도커 데스크탑을 설치해 사용하는데 메모리가 8기가만 달려 있는 기본 모델에서도 충분히 잘 동작하기 때문에 n8n을 돌리기 위한 서버 하드웨어로도 추천합니다. 서버로 사용할 맥미니에 도커 데스크탑을 설치하고 n8n 도커 이미지를 사용해 서비스를 띄운 다음 보안을 위해 인터넷에 서버를 노출 시키지 않고 클라우드플레어 터널을 통하게 만들면 기술적으로 공유기 설정을 변경해 포트포워딩을 하는 등의 귀찮은 설정을 건드릴 필요 없이 그냥 아무 포트도 열지 않은 상태로도 서버에 도커로 돌아가는 n8n 서비스를 인터넷에 노출 시킬 수 있습니다. 또한 일단 도커를 통해 n8n이 돌아가기 시작하면 같은 기계에 mysql 같은 다른 서비스를 띄워 n8n에 연동해 함께 사용할 수 있는데 특히 n8n 엔터프라이즈 버전에서만 제공하는 글로벌 변수 같은 기능을 사용할 수 없기 때문에 mysql 데이터베이스에 연동해 특정 테이블을 글로벌 변수 스토리지처럼 사용할 수 있어 굳이 n8n 엔터프라이즈 버전을 사용해야만 할 이유도 없습니다.
자. 이제 최근 검색어에 나타난 ‘n8n 무료 사용’에 대한 설명을 했으니 오늘은 제목 대로 이전 자동화 도구 n8n 사용기 이후 요즘 n8n을 어떻게 사용하고 있는지 가볍게 소개하겠습니다. 다만 n8n 워크플로우 제작 방법, 노드 별 설정 방법을 하나하나 소개할 생각은 없습니다. 이런 튜토리얼에 가까운 정보는 n8n 자체의 문서를 참고하거나 다른 웹사이트에서 제공하는 잘 작성된 다른 튜토리얼을 참고하는 쪽을 추천합니다. 저는 그런 튜토리올을 건너뛰고 논 코더 관점에서 이 자동화 도구를 어떤 식으로 활용하고 있는지 사례를 설명하는데 집중하려고 합니다. n8n이 어떻게 돌아가는지, 그리고 대강 어떻게 사용하는지 이해했지만 무엇을 어떤 식으로 자동화 해야 할 지 감이 잘 안 오는 상황이라면 도움이 될 수도 있을 겁니다.

일단 이전 개인 할일관리에 지라 사용을 통해 여러 개인 수준의 할일 관리 도구를 놔두고 주로 소프트웨어 개발이나 업무용으로 사용되는 지라를 개인 할일 관리에 사용한다고 소개했고 지금도 그러고 있습니다. 처음에는 지라를 그저 할일을 태스크로 만들었다가 이들을 하나씩 완료 처리 하는 일종의 투두리스트로 활용하는 수준에서 시작했지만 지라 태스크 각각에 상태가 있고 메모의 대부분은 단순 정보 전달 보다는 어떤 행동을 하게 만들기 위해 작성한다는 점에 착안해 지라는 메모에도 유용해요에 소개한 대로 짤막한 메모를 작성했다가 메모에 근거한 행동을 기록하는 것으로 사용 영역을 확장합니다. 여기서 조금 더 나아가면 지라에 그날 그날 제가 해야 할 일이 자동으로 추가되기를 원했습니다. 가령 저는 일 하다 보면 식사 할 때를 놓치곤 했습니다. 제 태생적 한계는 제가 그 무엇에도 오롯이 집중할 수 없게 만들지만 때때로 어떤 주제에 대해서는 너무 심하게 집중한 나머지 그 일을 하는 제가 신체를 가진 인간이며 그 인간의 신체는 음식이나 물 섭취, 일정 시간마다 스트레칭하기, 화장실 가기 같은 기초적인 관리가 필요하다는 사실을 잊은 채 계속해서 일에 집중할 때도 있습니다. 때문에 일상 생활에서나 업무에서 다음 할일을 거의 무조건적으로 지라에 의존하기 시작한 다음부터는 지라에 그날 그날 제가 할 일이 자동으로 나타나게 만드는데 노력을 기울였습니다. 가령 식사를 스킵하고 그냥 지나가는 문제를 해결하기 위해 주변 사람들이 밥 먹으러 갈 때 부지런하게 따라다니려고 노력하기는 하지만 만약 그러지 못했을 때를 대비해 매일 밥 먹으라는 태스크가 그날 할 일에 계속해서 추가되도록 만들었습니다. 기껏해야 지라 오토메이션에서 매일 매일 똑같은 이름의 태스크를 생성하는 자동화에 불과하지만 덕분에 끼니를 빠뜨리지 않고 챙길 수 있게 되었습니다.
개인 영역에서 할일을 만드는 중요한 근거는 메일입니다. 메일을 받으면 그에 따라 할일이 생기기도 하는데 가령 신용카드 이용대금 명세서가 메일을 통해 도착하면 이를 확인해 제 가계부를 통해 예상한 금액과 대략 일치하는지 확인하고 또 이번 달에 사용한 금액 중 규모가 큰 금액이나 불필요했을 수도 있는 금액을 검토하고 있습니다. 그런데 받은편지함을 확인해 메일을 살펴보고 메일에 따라 뭔가 행동을 수행하는 것은 개인 수준의 일상 대부분을 지라 태스크에 기반해 행동하고 있는 제 입장에서 그리 좋은 접근은 아니었습니다. 또한 메일을 확인한다 하더라도 메일을 확인하는 그 시점에 바로 메일 각각이 요구하는 할일을 수행할 수 있는 상황이 아닐 때도 많아서 이 할일이 어딘가에 쌓여 있기를 원했습니다. 사실 구글 메일이나 아웃룩 같은 메일 클라이언트는 메일에 체크 표시를 남겨 이 메일에는 뭔가 할일이 남아 있음을 나타낼 수 있지만 이런 도구는 메일을 핵심 할일 관리 도구로 사용하는 사람들에게 어울릴 뿐 저처럼 메일이 아닌 다른 도구를 사용해 할일을 관리하는 사람들에게는 별 도움이 되지 않았습니다. 그래서 n8n이 메일을 확인하고 있다가 제가 어떤 행동을 수행해야 하는 메일이 도착하면 메일 제목을 확인해 제 개인 영역의 지라 할일 목록에 추가하도록 했습니다. 그저 약속한 이름의 메일이 도착하면 지라 쪽에 태스크를 만들고 첨부파일 주소를 자동으로 기입해 주는 것이 전부인 단순한 워크플로우이지만 여러 메일에 걸쳐 비슷한 워크플로우가 동작해 메일을 확인하지 않고 그냥 지라만 보고 있어도 알아서 메일로부터 발생한 할일이 나타나 큰 도움을 받고 있습니다.

앞서 맥미니 서버에 도커 데스크탑을 통해 n8n을 구동하고 있다고 소개했는데 같은 기계에서 도커 데스크탑에 기반해 다른 서비스도 돌고 있고 그 중 하나는 팰월드 게임 서버입니다. 팰월드 게임 서버는 아마도 언리얼 데디케이트 서버 기반으로 만들어진 것 같은데 덕분에 꽤 높은 사양을 요구하고 특히 플레이어 수에 따라 큰 메모리를 요구합니다. 그런데 개인 수준에서 주변에 아는 사람들이 모여 플레이 하기에는 맥미니 기본 모델로도 나쁘지 않은 성능을 내 주고 있어 항상 켜 두는 기계가 있는 제가 팰월드 멀티플레이 서버를 호스팅 하기로 합니다. 게다가 누군가 팰월드 서버를 도커 기반으로 돌릴 수 있도록 예쁜 컨테이너를 만들어 둔 덕분에 저는 정말 아무것도 안 하고 그냥 컨테이너만 받아 실행했을 뿐인데 아는 사람들이 모여 소소하게 플레이 할 팰월드 서버가 생겼습니다. 다만 언리얼 데디케이트 서버 문제인지 아니면 팰월드가 이를 커스터마이징 한 부분의 문제인지는 모르겠지만 서버를 기동하고 시간이 지나면 서버 응답이 점점 느려지는 현상을 발견했고 업타임이 48시간 이상 지속될 때 이런 현상이 눈에 거슬리기 시작하는 것 같았습니다. 사실 이런 문제에 대비해 제가 사용하는 팰월드 컨테이너 자체에도 일정 주기마다 서버를 재시작 하는 옵션을 포함하고 있기는 하지만 저는 이런 자잘한 관리 사항을 도커 컨테이너마다 제각각 분산해 놓지 않고 한 곳에서 관리하기를 원했고 마침 n8n으로도 같은 역할을 할 수 있다는 것을 알게 됩니다. 간단히 매일 같은 시간에 팰월드 컨테이너 터미널에 연결해 팰월드 서버를 재시작 하는 커맨드를 날리는 것이 전부이지만 이걸로 팰월드 서버가 업타임 증가에 따라 응답이 느려지는 문제를 해결함과 동시에 이런 관리를 n8n 한 곳으로 집중 시켜 관리 부담을 줄이고 있습니다.

작년(2023년) 이맘때 뉴스레터 20주 리뷰 (2)를 통해 제가 뉴스레터를 작성하고 관리하는 방법을 소개했습니다. 지금은 뉴스레터 시즌 2 계획 안내에 따라 2주에 한 번 뉴스레터를 발행하고 뉴스레터 본문을 제외하고 글 네 개를 포함하는 모양으로 발행하고 있지만 저 때만 해도 한 주에 한 번, 뉴스레터 본문을 제외한 글 다섯 개를 포함하는 모양으로 발행하느라 글을 만드는 일, 만든 글 각각이 현재 어떤 상태인지 관리하는 일, 뉴스레터 발행에 필요한 자잘한 준비, 가령 글 각각의 링크 이름을 만들고 이번 뉴스레터 회차의 태그를 생성하고 글 각각의 삽화를 준비하는 일 따위의 진행을 관리하는 일이 지금보다 두 배 정도 중요했습니다. 이 일들 역시 뉴스레터 글 작성과 발행 진행을 관리하는 지라 프로젝트를 만들어 관리했는데 이 지라 프로젝트에는 그때그때 글 쓸 거리를 메모하기도 하지만 각 뉴스레터 회차에 따라 꼭 해야 하는 일을 태스크 모양으로 발행해 뉴스레터 태스크의 서브태스크로 만들어 하나씩 클리어 해 나가는 방식으로 뉴스레터를 발행해 왔습니다. 극초반에는 이런 프로세스가 잘 정립되지 않았기 때문에 그때그때 할일을 서브태스크로 추가하곤 했지만 시간이 지나자 매주 해야 하는 일이 어느 정도 정립되었고 이 시점부터 제가 뉴스레터 한 회차를 발행하기 위해 해야 하는 일을 한번에 서브태스크로 만들기 시작합니다. 이 워크플로우는 제가 수동으로 시작하는데 일단 데이터베이스를 참고해 새로 만들 뉴스레터가 몇 회인지 확인한 다음 이 회차에 기반해 각 지라 태스크 이름을 만듭니다. 만약 제가 n8n 엔터프라이즈 버전을 사용했다면 이 때 데이터베이스에 접근해 값을 가져오는 대신 변수 기능을 사용했겠지만 도커를 통해 구동할 수 있는 오픈소스 버전에는 이 기능이 없어 변수가 필요할 때마다 같은 기계에서 구동되는 mysql 데이터베이스 신세를 지고 있습니다.

저는 후잉 가계부를 사용하는데 신용카드 메시지를 지정된 메일 주소로 전송하면 알아서 입력 대기 상태로 만들어 줘 신용카드 사용 내역을 가계부에 입력하기 굉장히 편리합니다. 처음 한동안은 카드 사용 메시지를 받을 때마다 MMS를 통해 후잉에 전송했는데 매번 그러는 것은 좋은 아이디어가 아닌 것 같았습니다. 그 다음 한동안은 아이폰의 단축어 기능을 사용해 신용카드 사용 메시지가 도착하면 이를 후잉에 전송하는 단축어를 만들어 사용했습니다. 그런데 애플 기계들에서 사용할 수 있는 단축어 기능은 꽤 강력하기는 하지만 워크플로우가 길어지면 노드와 그래프를 관리하기 아주 어려웠고 버전 관리 개념 자체가 없고 또 단축어를 작성할 때 디버깅 기능이 전혀 없어 기능을 유지보수 하기가 어려웠습니다. 또한 앞서 팰월드 서버를 재시작하기 위해 팰월드 컨테이너에 내장된 기능을 사용하는 대신 n8n 같은 도구에 이런 관리 요구사항을 통합하기를 원했는데 다행히 n8n으로도 똑같은 일을 할 수 있었습니다. 다만 완전히 n8n으로만 동작하지는 않고 아이폰에서 신용카드 메시지를 받으면 이전에는 아이폰 단축어 수준에서 모든 동작을 처리했지만 지금은 아이폰은 그저 이벤트를 받는 역할만 하고 아이폰 단축어 앱에서는 받은 메시지를 n8n의 웹훅을 통해 전송하는데 까지만 동작합니다. 나머지 기능은 웹훅을 통해 받은 메시지에 기반해 n8n에서 처리하기 대문에 아이폰에서 본 단축어는 이전에 비해 극도로 단순해졌습니다.
이 워크플로우는 크게 두 갈래로 나뉘어 있는데 일단 웹훅을 통해 아이폰으로 받은 신용카드 사용 내역 메시지를 전달 받으면 간단한 예외처리를 거친 다음 첫 번째 갈래에서는 mysql 데이터베이스에 메시지 자체를 기록합니다. 사실 이렇게 별도로 메시지를 모을 필요는 전혀 없습니다. 저는 신용카드 사용 내역을 후잉 가계부에 기록하는 것이 핵심이므로 이 쪽이 잘 동작하면 되지만 혹시 나중에 뭔가 가지고 놀 만한 자료가 되지 않을까 싶어 테이블에 쌓고 있습니다. 두 번째 갈래에서 먼저 제 가계부에 부여된 전용 이메일 주소를 가져옵니다. 여기서도 저는 n8n 엔터프라이즈 버전의 변수 기능을 사용할 수 없기 때문에 mysql 데이터베이스에 기록해 둔 이메일 주소를 가져와야 합니다. 하지만 보시다시피 그냥 노드 하나를 추가하면 끝나는 일이어서 n8n 엔터프라이즈 버전의 변수 기능이 그리 절실하지 않습니다. 메일 주소를 가져온 다음에는 구글 워크스페이스 메일을 통해 제 후잉 메일 주소로 신용카드 사용 내역 메시지를 전송합니다. 그러면 후잉 가계부 쪽에 알아서 나타나므로 굉장히 편안하게 가계부를 정리할 수 있습니다.

올해(2024년) 초 잠에서 깨는 습관, 폰을 집어드는 습관에서 아이폰을 통해 기록한 이벤트를 모았다가 가지고 노는 이야기를 소개했습니다. 아이폰의 단축어 앱을 통해 아이폰에 일어나는 여러 가지 이벤트를 기록할 수 있는데 가령 잠자기 시작하는 시각, 일어나는 시각, 아이폰을 집어 드는 시각 따위를 기록할 수 있습니다. 사실 이런 기록은 그냥 스쳐 지나가면 아무 것도 아니게 되지만 이들을 차곡차곡 기록했다가 기간 단위로 조회해 그림으로 만들어 보면 경향성이나 제가 겪었던 이벤트에 의한 효과 따위를 되새길 수도 있어 아예 의미가 없지는 않고 또 재미있기도 합니다. 위 글에 소개한 대로 이 때는 이벤트를 기록하는데 아이폰 단축어 앱에 전적으로 의존했습니다. 이벤트가 일어나면 이벤트 이름과 발생 시각을 데이터베이스에 기록했는데 이 때 서버에서 돌고 있는 mysql 데이터베이스를 부르기 위해 그래서는 안되지만 날것의 쿼리를 보내면 곧이곧대로 받아 실행하는 웹 스크립트를 서버에 띄워 놓고 이를 불러 사용합니다. 최소한의 보안 기능은 필요했는데 어설프게 제가 만드는 것 보다는 남이 만든 것을 사용하는 쪽이 더 안전할 것 같아 웹 스크립트 앞에 클라우드플레어 액세스를 붙여 쿼리를 받으면 곧이곧대로 실행하는 위험하기 짝이 없는 스크립트를 인터넷에 노출 시키고 있으면서도 최소한의 보안을 유지할 수 있었습니다. 지금은 단축어 앱에 전적으로 의존하는 대신 앞에 소개한 신용카드 사용 내역을 전송하는 경우와 같이 아이폰은 이벤트를 받은 다음 지정된 웹훅 주소로 전송하는 역할만 하며 이들을 서로 다른 이벤트 이름, 이벤트 내역, 발생 시각에 따라 기록하는 역할은 전적으로 n8n에 의존하고 있습니다. 단축어 앱에서 n8n으로 옮겨 온 덕분에 웹에서 로직을 훨씬 더 편안하게 작성할 수 있고 아이폰에서는 이벤트를 받아 전송하는 부분 까지만 단축어로 작성하면 되어 버전 관리 기능이나 디버깅 기능이 없어도 딱히 불편하지 않게 되었습니다.

이건 생산성을 위한 기능이라기 보다는 재미를 위한 기능인데 회사 슬랙에 자잘한 기능을 넣고 있습니다. 슬랙으로부터 메시지 이벤트를 구독하다가 조건에 맞는 메시지를 발견하면 그에 따른 정보를 수집한 다음 제가 말하는 것처럼 말하고 있습니다. 봇을 만들 수도 있지만 그냥 제가 말하게 하는 편이 제 입장에서 덜 부담스러워서 제가 말하는 방식을 사용하고 있는데 사람들이 정보를 요청하면 봇이 말하는 대신 제가 말하는 것처럼 모여 재미있기도 합니다. 이건 누군가 로또 번호가 표시되기를 원하시는 것 같아 기능을 추가한 것입니다. 간단히 오늘 날짜를 구한 다음 각 회차 로또 번호를 알려주는 공식 API를 통해 조회하고 있습니다. 특이할 점은 이번 주가 몇 회차인지 알아내야 하는데 간단히 오늘 날짜와 로또가 처음 시작된 2002년 12월 7일 사이에 몇 주가 지났는지 계산하면 이번 주 로또 회차를 알 수 있어 이를 조회하면 됩니다. 하지만 알고 보니 그 분이 원하신 것은 이미 추첨이 끝난 다음의 로또 번호가 아니라 아직 추첨하지 않은 이번 주 로또 번호를 원하시는 것이어서 요구사항에 만족하는 결과를 만들어내는데는 실패합니다.

앞서 제가 할일을 거의 전적으로 지라에 의존하고 있다고 소개했는데 이를 지탱하기 위한 워크플로우도 있습니다. 전체를 표시하기에는 너무 개인적인 것들도 있어 그 일부를 소개해보면 한 주 단위로 특정 요일에만 해야 하는 일들이 있습니다. 가령 저는 회사에 출근하는 날 중 이틀에 한 번만 면도하고 또 출퇴근할 때 마스크를 쓰는데 이를 한 주에 한 번 교체하고 있습니다. 이런 할일을 자연스럽게 기억해 수행하는 사람들이 대부분인 것 같지만 저는 제가 그렇게 행동하기 어렵다는 사실을 잘 알기에 적당한 시점에 제 지라 태스크 목록에 여러 가지 할일이 추가되도록 했습니다. 여기서는 매주 요일에 따라 할일을 추가하는 부분을 소개하고 있는데 매월 특정 날짜와 가장 가까운 평일, 매월 특정 날짜에 할일, 매년 특정 날짜에 할일, 어떤 조건이 맞을 때 발생하는 할일 따위가 이 워크플로우에 의해 지라에 태스크 모양으로 등록됩니다. 그런데 이런 지라 태스크 생성 역시 지라 오토메이션을 통해 똑같이 수행할 수 있습니다. 하지만 이 역시 지라 오토메이션에 제 요구사항을 분산해서 관리하는 대신 어느 한 장소에 집중 시켜 관리하고 싶었고 n8n으로 할 수 있다는 것을 알게 된 다음에는 반드시 지라 오토메이션을 통해야만 하는 소수의 기능을 제외하고는 모두 n8n으로 옮겼습니다. 덕분에 저는 팰월드 서버를 재시작하는 일부터 제 일상생활을 영위할 수 있게 해주는 할일 생성에 이르는 다양한 작업들을 n8n 한 곳에 집중 시켜 처리할 수 있게 됩니다.
대강 좀 더 단순하고 또 편안하게 공개할 수 있는 것들에 한해 공개해 봤는데 훨씬 다양한 활용 가능성을 제시하는 IFTTT나 Zapier에 비할 바는 아니라는 사실을 잘 알고 있습니다. 하지만 이들은 개인 수준에서는 그 활용 범위에 비해 매월 상당히 높은 비용을 지불해야 하고 또 실행 횟수에 비해 액티브 상태로 둘 수 있는 워크플로우 수가 너무 적어 제 관점에서는 활용해 분명한 한계가 있었습니다. 이미 이 페이지에 소개한 액티브 워크플로우만 해도 n8n 완전관리 서비스의 가장 낮은 요금제 범위를 초과하며 그 다음 요금제 범위도 초과합니다. 이런 상황에서 제가 비용을 최소화 하며 선택할 수 있는 방법은 오픈소스 버전의 n8n 뿐이었습니다. n8n 오픈소스 버전의 기능 한계는 명확하지만 저 혼자 사용하기에는 엔터프라이즈 버전에서만 제공하는 버전 관리 기능이나 글로벌 변수 기능, 그리고 크리덴셜 임포트 및 익스포트 기능은 그리 절실하지 않았습니다. 특히 글로벌 변수 기능은 같은 기계에 도커 기반으로 mysql 서버를 사용해 완전히 대체할 수 있어 나쁘지 않습니다. 개인 수준에서 n8n을 좀 더 다양한 용도에 적극적으로 활용하고 싶다면 n8n 오픈소스 버전을 도커를 통해 구동하는 방식을 추천하며 실행횟수 제한, 액티브 워크플로우 제한이 없는 환경일 때 훨씬 다양한 활용 용도를 고민할 자유도가 생긴다는 점에서 이 사용 환경을 여전히, 그리고 강력히 추천합니다.