윤누리
윤누리
Admin
🧙 AI 위자드
🎻 루키 파트너
🌈 지피터스금손
🚀 SNS 챌린지 달성자
☕ 커피챗 오픈

단톡방 챌린지 리더를 AI 에이전트로 대체한 후기 — 3개 방을 맥 한 대로 운영하는 법

📝 한줄 요약

저희 회사는 Rona(rona.so) 라는 AI 실습 플랫폼을 운영하면서, 참여자들이 매일 콘텐츠를 읽고 실습하는 AI 챌린지를 3개(사내 직원 대상 / 바이브코딩 / 아티클 읽기) 굴리고 있습니다. 이 3개 카카오톡 단톡방의 매일 공지·독려·인증 집계를 사무실 유휴 맥 한 대에 올려둔 AI 에이전트 "로찌" 가 24시간 대신 돌려주고 있어요. 사람 리더가 하던 단순 반복 업무에서 해방됐고, 로찌가 매일 말을 걸어주는 덕에 단톡방이 조용해지지 않습니다.

고양이가 책상 위에 휴대폰을 올려놓고 앉아 있어요

🎯 이런 분들께 도움돼요

  • 단톡방 챌린지/스터디 운영자

  • AI 에이전트를 실제 운영에 붙인 사례가 궁금한 부트캠프·스터디 리더

  • 카카오톡 자동화, 원격 Mac 운영에 관심 있는 비개발자

😫 문제 상황 (Before)

저희가 운영하는 Rona 플랫폼에선 참여자가 매일 AI 콘텐츠(아티클·실습)를 읽고 카톡방에 인증하는 챌린지를 돌립니다. 종류는 3개:

  • 사내 직원 대상 — 지피터스 직원들의 1주간 AI 뽀개기 챌린지

  • 바이브코딩 챌린지 — 외부 참여자 대상, 주말 건너뛰고 5영업일

  • 아티클 읽기 챌린지 — 외부 참여자 대상, 주말 포함 7일 연속

무릎 위에 고양이를 안고 책상에 앉아 있는 소녀

그동안 이 챌린지들은 "챌린지 리더" 를 사람으로 뽑아 운영했습니다. 가장 중요한 업무는 독려. 매일 아침 오늘 미션 공지, 저녁에 인증 현황 집계(채팅방 대화를 export해서 수작업), 완주자 축하. 한 방만 해도 번거로운데, 3개 방이 동시에 돌아가기 시작 하자 한계가 왔어요.

다 직접 붙들 생각은 없었습니다. 챌린지도 사람 냄새가 나면 좋지만, 기본 공지·독려·인증 집계 같은 반복 업무는 AI 에이전트가 충분히 할 수 있는 일이라고 봤어요. 그래서 "로찌"라는 챌린지 매니저 봇을 세팅하기로 했습니다.

🛠️ 사용한 도구

  • 도구: Claude Code

  • 카카오톡 제어: kmsg / KakaoCLI (오픈소스)

  • 운영 환경: 사무실에 남아있던 맥 한 대 + macOS launchd

  • AI 응답: Claude CLI (로찌가 참여자 질문에 답할 때)

  • 연동: Linear (이슈 자동 등록), Neon PostgreSQL

별도 서버 없이 회사 유휴 맥에 전원만 꽂아두고 24시간 가동 중입니다.


🔧 작업 과정

1. "맥 한 대 + launchd"로 최소 가동 세팅

서버 대신 사무실 유휴 맥에 카카오톡 PC 버전을 띄우고, kmsg로 메시지 발송, launchd로 "매일 아침 9시 실행" 타이머를 걸었습니다.

사내 챌린지용 봇 만들고 싶어. 매일 아침 9시에 오늘 미션 공지, 저녁 7시에 인증 현황 요약, 완주자 나오면 축하 메시지. 원격 맥에 launchd로 돌릴 거야.

Claude가 데몬 구조, 타이머 로직(미션·현황·완주 체크 3개), 챌린지-방 연결 설정 파일까지 한 번에 짜줬습니다. 내가 자고 있어도 아침 9시에 로찌가 미션을 올려주는 순간, "사람이 안 붙어 있어도 되는구나" 감각이 왔어요.


2. 맥 권한 지옥 — 기술적 장벽의 절반

진짜 벽은 macOS 접근성 권한이었습니다. SSH로 원격 맥에 접속해서 실행하면 계속 Accessibility permission required (1002) 거부. 권한을 다 줬는데도요.

이유는 SSH 컨텍스트(sshd → shell → kmsg) 는 권한이 자동으로 깨진다는 것. 맥이 직접 띄우는 launchd 경유 로만 권한이 유지됩니다.

SSH로 kmsg 호출하면 접근성 권한 1002 에러가 나. 맥 터미널에선 되는데. macOS TCC 권한 구조 관점에서 근본 원인 찾고 우회 방법 알려줘.

Claude가 TCC 정책 구조를 설명하고 launchd plist 패턴을 제시해줬어요.


3. 카톡 방 ID가 두 체계라는 미스터리

두 번째 벽은 카톡 방 식별자가 2개 체계로 존재한다는 것. 메시지 보낼 땐 chat_a4bbfa24da9b (hex), 받을 땐 18480544203632682 (bigint). 매핑표가 없었습니다.

결국 kmsg chats --json 으로 모든 방 제목을 끌어오고, 카카오톡 오픈채팅 URL에서도 제목 추출해서 방 이름 문자열 매칭으로 우회했어요. 깔끔하진 않지만 현실적 타협이었습니다.

이런 "공식 문서에 없는 껍데기 세팅"에서 시간의 절반이 갔습니다. 핵심 로직은 금방 짰는데, 권한·ID 매핑에서 진짜 녹아내렸어요.


4. 3개 방으로 확장 — 챌린지 추가 = 설정 한 줄

사내 챌린지만 돌던 로찌에 바이브코딩·아티클 읽기 챌린지까지 얹어야 했습니다. 문제는 세 챌린지 스케줄이 다 다르다는 것 (주말 포함 여부, 인증 일수, 완주 조건).

한 프로세스에서 챌린지 N개를 순회하며 각자 다른 스케줄로 돌리게 리팩터. 챌린지마다 발송 상태는 독립된 파일로.

Claude가 짠 구조는 이거였습니다:

  • 설정 파일 하나에 challenges[] 배열 — 챌린지마다 ID, 카카오톡 방 ID, 시작일, 총 일수, 주말 건너뛰기 여부를 한 덩어리로

  • 챌린지마다 독립 상태 파일 (state.{challengeId}.json) — 서로 간섭 없이 각자의 발송 이력 관리

  • 데몬이 기동 시 challenges[]를 순회하면서 챌린지마다 타이머(미션/현황/완주/콘텐츠)를 따로 등록

결과적으로 신규 방을 추가할 때 코드 수정 없이 설정에 한 덩어리만 추가하면 됩니다. 다음 날 아침 세 방에서 동시에 로찌가 각자 다른 스케줄로 말을 걸기 시작했어요.


5. 로찌가 대화하게 만들기 + Linear 이슈 자동 등록

공지가 안정화되자 참여자들이 "@로찌 좋은 아티클 추천해봐" 같은 질문을 던지기 시작했어요. Claude CLI를 붙이니 실시간 응답 가능.

더 나아가 이것도 붙였습니다.

로찌가 카톡방에서 받은 피드백을 Linear 이슈로 자동 등록. Product 팀, 프로덕트 통합 프로젝트, ny로 assign, 현재 사이클에 넣고, 누가 어느 방에서 남긴 피드백인지 description에 기록.

고양이가 전화기 옆 테이블에 앉아 있다

1시간짜리 작업. 이제 카톡 → Linear 이슈 트래커가 사람 손 없이 연결됩니다.


6. 배포 후 당일 핫픽스 — 버그 3종

현장에서 바로 터졌어요.

  1. 추천할 때 URL이 http... 로 잘림 (150자 강제 컷)

  2. 유저가 @로찌 멘션해도 무응답 (스팸 방지 쿨다운이 멘션까지 차단)

  3. 유저가 메시지 여러 개 보내면 가장 오래된 메시지에 엉뚱하게 답변

로찌가 URL 잘라먹고, 멘션 무시하고, 엉뚱한 메시지에 답해. 원인 찾아 수정. 멘션은 쿨다운 무시하고 무조건 답하게.

URL 자르기 함수 교체, 멘션 쿨다운 bypass, 최신 메시지 1건만 답변하도록 큐 처리 수정. 당일 배포 후 정상 동작 확인.


✅ 결과 (After)

항목

Before

After

챌린지 리더

사람 1명 (챌린지마다)

AI 에이전트 로찌 (3방 동시)

인증 집계

채팅 export → 수작업

자동 집계 + 저녁 현황 발송

운영 환경

—

사무실 유휴 맥 한 대

확장 비용

새 방마다 리더 뽑기

config.json 한 덩어리 추가

참여자 질문

리더가 시간 날 때

실시간 응답 + Linear 이슈 자동 등록

1
2개의 답글
지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 아침,
읽고 바로 써먹을 AI 소식만