오늘의 기쁨
dev
게시글 링크가 복사되었습니다.

자동화 스크립트 개발 - "딸깍"이 될 때까지

AIPM시각바이브코딩사이드프로젝트

notion image

들어가며

매주 목요일, 나는 노션 회의록과 Slack을 번갈아 띄워놓는다.
회의록에서 아직 작성 안 한 사람을 하나하나 색출(?)하고, dm창에 메시지를 작성하고, 노션 회의록 링크와 회의록 작성 도우미(Notebooklm) 링크를 붙여넣고 발송. 보낸 메시지를 복사한 뒤 다음 사람한테 붙여넣고 이름 바꿔 넣고 발송. 어떤 날은 5분, 어떤 날은 15분. 중요하지만, 쓸데없는 반복 업무 중 하나.
 
이거 어떻게 안되나, 바야흐로 딸깍의 시대인데.
 
플랫폼에서 제공해주는 자동화 기능을 이리 저리 조합해서 사용하고 있지만, "개별 슬랙 DM 보내기"를 자동화할 생각은 못하고 있었다. 이런 나에게 날개를 달아준 건 Claude, 클로드 팀 플랜 도입하자마자 "귀찮은 반복 업무"부터 리스트업 시작! 딸깍이 될 때까지 가보자고!
 

뭘 만들지부터 그려봤다

가장 먼저 할 일은 지금 내가 손으로 하는 것들을 언어화하고, 언어를 그대로 코드로 옮기는 것.

반복 작업

  • 목적 : 위클리 미팅을 위한 회의록 작성 독려 및 최종 회의록 가공
  • 목표 일정 : 매주 금요일 11시 (최종본 가공까지 완료)
  • 작업 내용 :
      1. 목요일 오전: Notion이 Slack 채널에 이번 주 회의록 링크를 자동 발송 (기존 자동화)
      1. 목요일 오후: 미작성자를 체크해서 개별 DM으로 리마인드 (수기 처리)
      1. 금요일 오전: 완성된 회의록을 AI로 가공해서 회의록 업데이트 (수기 처리)
 
1번은 회의록 세팅할 때부터 자동화해둔 영역이었고, 2-3번은 문서 담당자가 되면서 새로 생긴 범위였다. 3주 정도 수동으로 처리하면서도 가공 템플릿을 노트북LM으로 세팅해 두면서 "이 정도면 꽤 효율적이네" 라고 생각했지만 더 단순화 시키고 싶었다. 내 손을 안타면 더 좋고.
 
그러다 팀에 Claude Team Plan이 도입되면서 게임이 바뀌었다. 노션에서 미작성자를 찾아내는 것도, 슬랙으로 메시지를 보내는 것도 클로드와의 대화로 처리하면서 느꼈다. 노션 MCP 연결을 하면서 노트북 LM에 다녀오는 대신 클로드로 회의록 가공도 대화만으로 해결했다. 그리고 그 순간 깨달았다. 이거 된다.
스케줄 돌리면 손 안대고 코풀 수 있겠는데?
 
도구 스택은 MCP에 연결된 Notion API, Slack API를 그대로 쓰고, 스케줄링은 GitHub Actions, 회의록 가공은 LLM을 붙여보자!
머릿속의 퍼즐이 맞춰지자마자 claude-code 설치를 시작하고, 프로젝트를 만들었다. weekly-automation
 

기술스택별 트러블 슈팅, 뭐 그런 것들.

프로젝트 weekly-automation 시작!

Slack Bot

기존에 다른 자동화 PoC 때문에 팀 이름으로 만들어둔 슬랙 봇을 그대로 사용하기로 했다. 토큰 그대로 가져다 쓰고, 권한만 추가로 수정했다. 부서 채널에 댓글을 다는 역할이기 때문에 빠르게 다음으로.
 

Notion API

Notion API key 생성 → 데이터베이스 연결 자체는 개인 블로그 개발을 진행하면서 이미 해본 내용이라 막힘없이 진행됐다. 다만 손으로 복사 붙여넣기 하던 회의록 가공 을 노션 API로 전환하면서 한 가지 흥미로운 제약이 있었는데, API로는 노션 블록 이동 Action이 안된다는 것.
 
회의록을 가공한 뒤, 가공된 버전을 메인 페이지에 배치하고 팀원들이 원래 작성했던 내용은 토글을 만들어 드래그 앤 드랍으로 밀어넣고 있었는데, API로는 토글 이동이 안돼서 기존 내용을 삭제하고 새로운 블럭으로 생성하는 로직에서 raw 메시지가 깨지는 현상이 생겼다. 블록 이동은 UI단에서만 가능하다는 점은 흥미로운 발견이다.
 
토글을 만들고 블럭을 이동하는 액션은 자동화에서 제외하고, 그냥 페이지를 길게 쓰기로 했다.
 
안 되면 안 되는 대로, 가능한 범위 내에서 최선을 찾는 것이 나의 방식이니까.
 

Gemini API

처음엔 클로드 코드에서 추천한대로 Antrophic API를 연동하고 싶었지만, Claude Team 플랜 토큰이 공유가 안 된다는 걸 알고 잠깐 멘붕. 개인 업무 자동화에 쓸 목적으로 비용을 올리는 건 부담스러워서 개발팀에 API 토큰 있냐고 물어볼까 잠깐 고민하다, 무료 API를 찾아봤다. Gemini 무료 플랜이 있다길래 aistudio에서 프로젝트 만들고 키 생성하고 영차영차 했는데 Limit이 자꾸 0이 뜨면서 또다시 멘붕.
알고 보니 회사 계정으로 회사 워크스페이스에 소속되면서 무료 플랜 생성이 안 됐던 것. 결국 개발팀에서 쓰는 Gemini api키를 공유받아서 해결했다.
돈 안 내고 LLM API 붙이기 미션이 제일 어려웠다.
모델은 Gemini 2.5 flash로! 노트북 LM으로 수동으로 처리할때보다 퀄리티가 좀 떨어지긴 하지만, 프로젝트 매핑 테이블을 프롬프트에 추가하여 보강했다.
 

GitHub Actions

클로드 코드가 세팅해준 대로 그대로 적용해서 일사천리. 기획할때 매일 스케쥴마다 어떤 액션이 돌아가야하는지 정리만 해봤지 크론 스케쥴러 코드를 직접 보는건 처음이라 재밌었다.
새로운 지식은 언제나 환영이야!
 
클로드 코드가 생성해준 yml 파일을 눈으로 훑어보고, 일단은 바로 푸시. 깃허브 액션에 Secrets 등록까지 완료하고 돌려봤는데 또 문제가 생겼다.
깃허브 액션은 내가 예약한 시간에 실행하려고 노력(?)하지만, 딜레이가 생기기도 한단다. 아니 그럼 이걸 왜 스케쥴이라고 부르는건데요. 🤷‍♀️
 
notion image
심지어 처음 자동 실행할땐 안돌아가서 10시 10분에 수동으로 run workflow 돌렸는데, 두시간 뒤에 10시 예약된 스케쥴이 실행됐다.
 
클로드를 닥달해서 cron-job.org 라는 오픈 소스가 무료라는 사실을 알아냈다. 크론은 제거하고, 수동으로 run 하는 버튼만 남겨 업데이트. cron-job에 새로운 스케쥴을 세팅했다. 돈안내고 배치 돌리기도 어찌저찌 성공.
 

AI랑 같이 생각한다는 것

순수 작업 시간으로 따지자면 2-3시간, 영업일 0.25일 정도의 리소스를 투자했다. 중간 중간 다른 작업도 하고, 스크립트 작성은 언어화한 프로세스가 코드로 잘 옮겨졌는지 눈으로 검수하고, 프롬프팅 한두번 핑퐁으로 쉽게 끝났다. 2개의 스크립트, LLM 전달용 프롬프트 1개, 깃허브 액션용 yml 2종. 이 시간에 이게 된다고? 하는 것들이 가능해졌다.
 
근데 "같이"가 항상 매끄럽진 않다는 것도 다시금 깨달았다.
내 워크플로우를 그대로 옮길 생각으로 DM 발송 액션으로 시작했다가 기획이 중간에 바뀌었다. 원래는 미작성자한테 개별 DM으로 리마인드를 보내려고 했는데, Claude가 "봇 토큰이 아니라 개인 OAuth 토큰을 써야 하고 주기적으로 만료되면 업데이트해야 한다"고 설명해줬다. 그래서 채널에 “작성 안내” 공지 스레드가 있으니, 원 스레드를 찾아서 댓글을 다는 방향으로 기획을 바꿨다.
 
그 이후 다른 세팅 작업과 메시지 커스텀을 진행하다가 Claude Code에 올릴 프롬프트 만들어달라고 했더니 개인 DM 발송에 맞춘 프롬프트를 반환했다. 컨텍스트가 길어지면서, 의사결정이 반영되지 않은 것. 지적했더니 돌아온 대답:
"맞다, 제가 제안했었던걸 깜빡했네요!"
 
컨텍스트 유실 시 볼 수 있는 LLM 특유의 뻔뻔함, 이래서 LLM을 사용할 때는 방심하면 안된다. 대화의 프레임을 쓰고 있지만, 본질적으로는 논리적 구조 아래의 요청 형식과 반환 형식, 조건을 명확하게 명시해야 한다.
대화하고 있다고 착각하지 말것. 방향은 내가 들고 있어야 한다. 이번 작업으로 한번 더 체감할 수 있었다.
 
작업 끝나고 업무용 Claude한테 감상을 물어봤다.
notion image
 
캡처를 보면서 피식했다. 틀린걸 알고는 있구만?
그리고, 실제로 내가 겪었던 트러블슈팅들은 원래 개발자들이 늘 겪고 있는 문제라는 점. 그리고 결국 우리가 목표한 결과물을 향해 달려간다는 점. 바이브 코딩도 결국 일하는 방식이 바뀌었을 뿐, 우리가 일을 한다는 점은 크게 다르지 않은것 같다.
 

결과 & 체감 효율

첫 실행은 로컬에서 수동으로 돌렸다.
부서 내의 메시지 발송이니, 별도의 테스트 없이 바로 스크립트 실행. 팀명으로 설정한 Bot이 기존 공지 스레드에 미작성자들을 태그하며 리마인드 댓글을 달았다. 잘 된다! 싶었는데 이모지가 마크다운 그대로 나와있었다. :달력: **마감 : 3월 13일 (금) 오전 10:00** 😫 테스트 생략한 대가를 바로 치렀다.
 
슬랙 앱에서 입력할때와 API로 전송할때의 메시지 스타일 차이를 반영하기 위해 테스트 스크립트를 분리하고, 개발용 테스트 채널에 테스트하며 메시지를 수정했다. GitHub 푸시, Secrets 등록, Actions yml 세팅까지 완료! 내일 오전 10시*, 첫 자동 실행 예정.
 
page icon
이 포스팅의 초안은 개발 직후에 작성했기 때문에, 다음날 3번 플로우는 “스케쥴” 첫 실행 시점이 될 예정이었다. 실제로는 원하는 시간에 실행이 되지않아 cron-job.org에서 github action “run” API를 호출하는 방식으로 변경했다.
 
노트북LM으로 수동 관리를 할때에도 프롬프트는 매주 조금씩 업데이트가 일어났다. 아마, 자동화를 세팅한 지금도 아마 매주 아침에 손으로 회의록을 조금 다듬고, 오후에는 수정한 내용을 바탕으로 프롬프트 고도화 작업이 이어질 것 같다.
 
AI를 활용하면 흔히들 딸깍 이라고 표현하는데, 결국 얼마나 심도 있는 고민을 했고 언어로 구체화했는지에 따라 클릭이 될 지, 더블 클릭이 될 지가 달라지는 법. 나는 늘 디테일까지 집착해왔고, 앞으로도 달라지지 않을 것이다. “이 정도면 됐다.” 대신 관습적으로 반복하고 있는 모든 것이 변화할 수 있다는 걸 잊지말자고.
 

dev의 다른 글