📚 이 글은 “개발자가 AI 자동화로 부업하는 실전 기록” 시리즈입니다.
- 📌 1편: AI 자동화로 개발자 부업하는 법 — 실패 3번 하고 나서야 알게 된 것들
- 📌 2편: WordPress + Claude API Day 1 세팅 기록
- 📌 3편: Slack 봇으로 블로그 자동 발행 트리거 만들기 — 개발자 부업 Day 2 (현재 글)
- 📌 4편: Threads API 연동 — SNS 자동 배포 (예정)
- 📌 5편: 구글 애드센스 승인 도전기 (예정)
← 2편: WordPress + Claude API Day 1 세팅 기록
Day 1에 WordPress REST API로 글 발행하는 데 성공하고 나서, 나는 잠깐 멍하니 화면을 바라봤다. 파이썬 스크립트를 터미널에서 직접 실행해서 글이 올라가는 걸 확인했는데 — 솔직히 뿌듯하긴 했는데, 동시에 이상한 느낌이 들었다.
“나 지금 매번 터미널 열고 명령어 쳐야 하는 거야?”
부업이라는 게 결국 시간을 아끼는 게 목적인데, 터미널 열고 스크립트 돌리는 게 반복되면 그게 자동화인지 반자동화인지 모르겠다는 생각이 들었다. 퇴근하고 지쳐서 누워 있다가도, 폰으로 “글 발행해줘”라고 슬랙 메시지 하나만 보내면 알아서 돌아가는 시스템 — 그게 진짜 내가 원하는 그림이었다.
그래서 Day 2의 목표는 하나로 정했다. Slack 봇을 인터페이스로 삼아서, 슬래시 커맨드 하나로 블로그 자동화 파이프라인을 트리거하는 것.
왜 Slack 봇인가 — 다른 선택지와 비교했을 때
처음엔 그냥 cron job으로 일정 시간마다 자동으로 돌리면 되지 않나 싶었다. 근데 생각해보니 문제가 있었다. 주제를 내가 그때그때 정하고 싶다는 것. 항상 같은 주제로 글이 나오면 블로그가 이상해진다. 그렇다고 주제 목록을 파일에 미리 다 써놓고 순서대로 발행하는 것도 너무 경직된 방식이고.
그래서 “내가 원할 때 원하는 주제로 트리거를 당길 수 있는 인터페이스”가 필요했다. 선택지를 몇 가지 놓고 비교해봤다.
| 방식 | 장점 | 단점 | 내 상황에 맞나? |
|---|---|---|---|
| cron job (자동 스케줄) | 신경 안 써도 됨 | 주제를 매번 고정해야 함, 유연성 없음 | ❌ |
| 웹 대시보드 만들기 | UI 편함 | 개발 시간이 너무 많이 든다 | ❌ |
| Telegram 봇 | API 간단 | 평소에 안 씀, 알림 분리 불편 | △ |
| Slack 봇 (slack-bolt) | 이미 업무용으로 쓰고 있음, 슬래시 커맨드 지원, Socket Mode로 서버 없이 가능 | 초기 설정이 조금 귀찮음 | ✅ |
결국 Slack으로 정한 이유는 단순했다. 내가 이미 하루에 수십 번 여는 앱이라는 것. 별도 앱을 켜야 한다면 귀찮아서 안 쓸 게 뻔하다. 부업 도구는 마찰이 적을수록 오래 간다는 걸 이전 실패들에서 배웠다.
그리고 `slack-bolt`의 Socket Mode는 진짜 신의 한 수였다. 별도 서버 없이, 웹훅 URL 없이, 내 로컬 머신에서 그냥 프로세스로 돌리면 된다.
자동화 인터페이스는 가장 자주 여는 앱이어야 한다. 마찰이 적을수록 지속된다.
Slack 앱 설정 — 여기서 30분 날렸다
슬랙 봇 만드는 건 처음이 아닌데도 설정에서 헤맸다. 특히 Socket Mode 관련해서 삽질을 좀 했다.
Slack API 앱 생성 순서를 간단히 정리하면:
- ✅ api.slack.com/apps에서 새 앱 생성 → “From scratch” 선택
- ✅ Socket Mode 활성화 → App-Level Token 발급 (scope:
connections:write) → 이걸SLACK_APP_TOKEN으로 저장 - ✅ OAuth & Permissions → Bot Token Scopes에
chat:write,commands추가 - ✅ 앱을 워크스페이스에 설치 → Bot User OAuth Token 복사 →
SLACK_BOT_TOKEN으로 저장 - ✅ Slash Commands →
/blog커맨드 추가 (Request URL은 Socket Mode에선 아무 값이나 입력해도 됨)
여기서 내가 날린 30분의 원인은 — App-Level Token과 Bot Token을 헷갈린 것. Socket Mode는 `SLACK_APP_TOKEN`이 따로 필요하다. 그냥 봇 토큰 하나면 되는 줄 알고 계속 인증 오류 봤다. 에러 메시지가 딱히 친절하지 않아서 더 헷갈렸다.
xapp-으로 시작하는 App-Level Token과 xoxb-로 시작하는 Bot Token. 둘 다 .env에 넣어두세요.Socket Mode는 토큰이 두 개다. 이걸 모르면 30분은 그냥 날아간다.
슬래시 커맨드로 Claude API 호출 → WordPress 발행까지
전체 흐름을 먼저 그려보면 이렇다.
`/blog [주제]` 입력 → slack-bolt가 수신 → Claude API에 주제 전달 → 블로그 글 생성 → WordPress REST API로 발행 → 슬랙에 결과 메시지 전송
코드를 두 부분으로 나눠서 설명하겠다. 먼저 `.env` 파일 구성, 그다음 메인 봇 코드.
⚙️ 사전 준비: pip install slack-bolt anthropic requests python-dotenv 설치 필요. .env에 SLACK_BOT_TOKEN, SLACK_APP_TOKEN, SLACK_SIGNING_SECRET, WP_URL, WP_USERNAME, WP_PASSWORD, ANTHROPIC_API_KEY 설정. WordPress 인증은 JWT Authentication for WP REST API 플러그인 기준.
# slack_bot.py — 실제 운영 중인 코드 기준
import os
from dotenv import load_dotenv
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from generate import generate_blog_post # devYul 스타일 SYSTEM_PROMPT 포함
from publish import publish_post # JWT 인증 기반 WordPress 발행
from threads_post import post_to_threads # Threads 자동 포스팅
load_dotenv()
app = App(
token=os.getenv("SLACK_BOT_TOKEN"),
signing_secret=os.getenv("SLACK_SIGNING_SECRET"),
)
@app.command("/blog")
def handle_blog(ack, respond, command):
ack() # Slack 3초 제한 내 즉시 응답
topic = command.get("text", "").strip()
if not topic:
respond("사용법:
예) ")
return
respond(f"⏳ ** 글 생성 중... 잠시만 기다려주세요.")
try:
# devYul 스타일 SYSTEM_PROMPT로 글 생성 (generate.py)
post_data = generate_blog_post(topic)
# WordPress REST API + JWT 인증으로 발행 (publish.py)
result = publish_post(
title=post_data["title"],
content=post_data["content"],
status="publish",
)
# Threads 자동 포스팅 (실패해도 WordPress 발행은 유지)
threads_url = ""
try:
t = post_to_threads(
title=result["title"],
content=post_data["content"],
url=result["url"],
)
threads_url = t["url"]
except Exception:
pass
respond(
blocks=[
{"type": "section", "text": {"type": "mrkdwn", "text": "✅ *블로그 글 발행 완료!*"}},
{
"type": "section",
"fields": [
{"type": "mrkdwn", "text": f"*제목*
{result['title']}"},
{"type": "mrkdwn", "text": f"*블로그*
{result['url']}"},
{"type": "mrkdwn", "text": f"*Threads*
{threads_url or '(생략)'}"},
],
},
]
)
except Exception as e:
respond(f"❌ *글 생성 실패*
주제: {topic}
오류: {e}")
if __name__ == "__main__":
handler = SocketModeHandler(app, os.getenv("SLACK_APP_TOKEN"))
print("Slack bot 시작 (Socket Mode, 로컬 실행)")
handler.start()
코드 자체는 길어 보여도 로직은 단순하다. `ack()`를 슬래시 커맨드 핸들러 맨 앞에 반드시 호출해야 한다는 것만 주의하면 된다. 슬랙은 3초 안에 응답이 없으면 타임아웃으로 처리하기 때문에, Claude API 호출처럼 시간이 걸리는 작업 전에 `ack()`로 먼저 “받았음”을 알려야 한다.
ack()를 먼저 호출하고, 무거운 작업은 그 다음에 — 슬랙 봇의 기본 중의 기본.
실제로 돌려봤을 때 — 감탄한 것과 아쉬웠던 것
터미널에서 `python bot.py` 실행하고, 슬랙에서 `/blog 개발자가 번아웃 극복하는 법` 입력했다.
“⏳ 글 생성 중…” 메시지가 뜨더니, 20~30초 뒤에 “✅ 발행 완료!” 메시지와 함께 URL이 딱 올라왔다. WordPress 대시보드 열어보니 진짜로 글이 올라가 있었다. 이 순간 진짜 소름이 돋았다. 폰으로 슬랙 켜서 해봐도 똑같이 됐다.
감탄한 것들:
- ✅ Socket Mode 덕에 서버 설정 없이 바로 동작
- ✅ 슬랙 어디서든 (폰 포함) 명령 가능
- ✅ 에러도 슬랙으로 바로 피드백이 와서 디버깅 편함
아쉬웠던 것들:
- ❌ 글 발행까지 20~30초 걸리는데, 슬랙 UI상 “처리 중” 느낌이 잘 안 남
- ❌ Claude가 생성한 마크다운이 WordPress에서 렌더링이 안 될 때가 있음 (마크다운 → HTML 변환 필요)
- ❌ 지금은 로컬에서만 돌아감 — 노트북 꺼지면 봇도 죽음
마지막 문제가 좀 걸렸다. 하지만 Socket Mode 덕분에 로컬에서 실행 중인 것만으로도 폰에서 슬랙 커맨드가 작동한다는 게 핵심이다. 24시간 상시 실행은 나중 과제다.
markdown 라이브러리로 HTML 변환 후 발행하는 게 낫습니다. pip install markdown 후 import markdown; html = markdown.markdown(content) 한 줄이면 됩니다.동작하는 걸 확인한 뒤, 부족한 부분은 리스트로 남겨두는 것 — 완벽주의 함정을 피하는 내 방식이다.
현재 시스템 비용 공개 — 솔직하게
자동화 부업이라고 하면 꼭 누군가는 “그래서 돈은 얼마 드냐”를 물어본다. 나도 처음에 그게 제일 궁금했으니까.
| 항목 | 비용 | 비고 |
|---|---|---|
| Hostinger 비즈니스 플랜 | $4.99/월 (약 6,700원) | 도메인 무료 포함 |
| Claude API (claude-sonnet-4-6) | 월 약 7,000~21,000원 | 글 수에 따라 변동, 하루 1~3편 기준 |
| Slack | 무료 플랜 | Socket Mode는 무료 플랜 가능 |
| 합계 | 약 14,000~28,000원/월 | 애드센스 수익으로 커버 목표 |
Claude API 비용이 사용량에 따라 변동이 있어서, 나는 지금 일단 하루 최대 3편 발행으로 제한을 걸어놨다. 월 고정비를 28,000원 이하로 유지하면서 애드센스 승인 받고 수익으로 커버하는 게 단기 목표다.
월 고정비 최대 28,000원 — 이게 손익분기점이자 내가 지켜야 할 마지노선이다.
Day 2를 마치며 — 솔직한 지금 상태
Day 2 끝내고 나서 드는 감정은 두 가지다.
하나는 “이거 진짜 되네” 하는 놀라움. 슬랙에서 커맨드 하나 치면 블로그 글이 발행된다는 게, 직접 해보니까 신기함이 가시질 않는다. 2년 전에 티스토리 자동화 시도했다가 API 막혀서 포기했을 때의 허탈함이 생각나면서, 이번엔 뭔가 다를 것 같다는 느낌이 든다.
다른 하나는 “아직 갈 길이 멀다”는 현실감. 봇이 로컬에서만 돌고, 마크다운 렌더링 이슈도 있고, 발행된 글의 SEO 최적화나 카테고리 설정도 아직 수동이다. 자동화라고 부르기엔 구멍이 많다.
그래도 Day 1에 “REST API 연결 성공”이었다면, Day 2에 “슬랙으로 원격 트리거 성공”까지 왔다. 완벽한 시스템보다 일단 돌아가는 것 먼저 — 이 원칙을 지키면서 한 층씩 쌓는 중이다.
다음 편에서는 Threads API를 연결해서 블로그 발행과 동시에 SNS 자동 배포까지 연결하는 걸 해볼 예정이다. 솔직히 이게 SEO보다 초반 트래픽을 끌어오는 데 더 빠를 것 같다는 판단이다.
📌 다음 편: Threads API 연동 — SNS 자동 배포
- Threads API 발급 과정 (Meta 개발자 콘솔 삽질 포함)
- 블로그 발행 → Threads 자동 포스팅 파이프라인 연결
- 슬랙 봇 명령어 하나로 블로그 + SNS 동시 발행하는 코드
- 초반 트래픽 0에서 벗어나는 데 SNS 연동이 실제로 효과 있었나?
Pingback: Task Scheduler로 블로그 자동 발행 완성 | Python 스케줄러 실전
Pingback: 블로그 SEO 최적화 실전 — Yoast SEO + 키워드 전략부터 검색 상위 노출까지 | devYul - devYul
Pingback: 쿠팡파트너스 가입부터 자동화까지 — 개발자가 수익화 채널 추가하는 실전기 - devYul
Pingback: 블로그 SEO 최적화 실전 — Yoast SEO + 키워드 전략 완벽 가이드 | devYul
Pingback: 블로그 자동화 2주 결과 공개 — 트래픽, 비용, 배운 것들 | devYul