Claude Code 플러그인, 통째로 깔지 않고 알맹이만 빼왔다

지난 편 → 6편 — 챗GPT랑 클로드, 왜 서로 대화는 못 시킬까 Claude Code로 한동안 일하다 보면, 남이 만들어 둔 도구를 가져다 쓰고 싶어지는 순간이 옵니다. 마켓플레이스에 올라온 플러그인 중 하나가 눈에 들어왔습니다. 코드를 필요 이상으로 부풀리지 않게, "게으른 시니어 개발자"처럼 최소로만 짜도록 붙잡아 주는 도구였습니다. 마음에 들었습니다. 그런데 막상 설치하려니 손이 멈췄습니다. 제가 원한 건 그 안에 담긴 원칙 하나 였는데, 플러그인은 그것 말고도 이런저런 것들을 통째로 데려옵니다. 안 쓸 기능까지 제 환경에 얹히는 게 영 내키지 않았습니다. 그래서 깔지 않고, 열어서 필요한 알맹이만 빼내기로 했습니다. 그러려면 먼저 "플러그인"과 "스킬"이 뭐가 다른지부터 알아야 했습니다. 스킬과 플러그인은 뭐가 다른가 한 줄로 하면 이렇습니다. 스킬은 부품 하나, 플러그인은 부품을 담은 상자. 스킬(Skill) 은 최소 단위입니다. SKILL.md 라는 마크다운 파일 하나가 전부고, 필요하면 옆에 보조 파일(스크립트·데이터)을 둘 수 있습니다. 두는 곳도 단순합니다. 개인용: ~/.claude/skills/<이름>/SKILL.md 프로젝트용: .claude/skills/<이름>/SKILL.md 파일 맨 위 frontmatter에 "이 스킬을 언제 써야 하는지"를 적어두면, Claude가 상황을 보고 알아서 불러 씁니다. 아니면 /스킬이름 으로 직접 부를 수도 있습니다. 말하자면 "이 일은 이렇게 처리해라"라고 적어둔 지침 한 장 입니다. 플러그인(Plugin) 은 그 부품들을 담아 배포하는 상자입니다. .claude-plugin/plugin.json 이라는 매니페스트를 중심으로, 여러 종류의 구성요소를 한 번에 묶습니다. skills/ — 스킬들 agents/ — 커스텀 에이전트(서브에이전트...

공고 알림봇 만들기 (5편) — 같은 공고가 계속 왔습니다

4편에서 소스마다 다른 응답 구조를 겨우 맞췄다고 했죠. 이제 알림이 오기 시작했어요. 그런데 한 시간 뒤에 똑같은 공고가 또 왔습니다. 그다음 시간에도요.

지난 편 → 4편 — API마다 응답 구조가 달랐습니다

API는 "새로 올라온 것"만 주지 않아요

제가 착각한 게 있었어요. 요청하면 새 공고만 골라서 줄 거라고 막연히 생각했거든요.

아닙니다. 공고 API는 지금 열려 있는 목록 전체를 줍니다. 어제 본 것도, 그제 본 것도 마감 전이면 계속 들어 있어요. "이전에 가져간 것 이후로만 주세요" 같은 옵션은 없었습니다.

제 봇은 한 시간마다 물어보는데, 매번 이만큼이 옵니다.

소스한 번에 오는 양
든든전세300건
기업마당100건
K-Startup · LH각 10건
마이홈8건
합계428건

하루 24번이면 1만 건 넘게 받아보는 셈이에요. 그런데 그중 진짜 새 공고는 하루에 많아야 수십 건입니다.

즉 "무엇이 새 것인가"는 API가 알려주지 않아요. 내가 판단해야 합니다.

그래서 "이미 본 것"을 기억하기로 했어요

방법은 단순합니다. 알림을 보낸 공고를 어딘가 적어두고, 다음에 받은 목록과 대조해서 적혀 있지 않은 것만 새 것으로 치는 거죠.

문제는 무엇을 적을 것이냐였어요.

무엇이 같으면 "같은 공고"인가

처음엔 제목만 적으려고 했어요. 그런데 금방 걸리더라고요.

  • 제목만 쓰면: 기관이 다른데 제목이 같은 공고가 있어요. 2026년 창업지원사업 모집 공고 같은 건 여기저기서 씁니다. 하나를 받으면 나머지가 묻혀요.
  • 주소만 쓰면: 같은 공고인데 주소 뒤에 파라미터가 붙었다 말았다 하면 매번 다른 것으로 보입니다.

그래서 제목과 주소를 붙여서 하나의 열쇠로 만들었어요. 둘 다 같아야 같은 공고로 봅니다.

실제로 저장되는 모양은 이렇습니다.

[경기] 포천시 2026년 2차 중소기업 전시회 출전 지원사업 모집 공고|https://www.bizinfo.go.kr/...pblancId=PBLN_000...

가운데 세로줄 하나로 이어붙인 게 전부예요. 이 문자열이 이미 있으면 건너뛰고, 없으면 알림을 보낸 뒤 목록에 추가합니다.

파일 하나면 충분했어요

여기서 데이터베이스를 붙일까 잠깐 고민했어요. 결론은 안 붙였습니다.

지금 그 목록은 이 정도예요.

항목 수   2,634건
파일 크기   480KB

두 달 넘게 돌린 결과가 이겁니다. 텍스트 파일 하나에 담기고, 시작할 때 통째로 읽어도 순식간이에요. 이 정도 규모에 DB를 얹는 건 과했습니다.

물론 영원히 이럴 순 없어요. 몇 년 쌓이면 손봐야 하겠지만, 그건 그때 가서 할 일입니다.

재시작해도 기억해야 해요

이게 파일로 저장하는 진짜 이유입니다.

프로그램 안에서만 기억하면, 껐다 켜는 순간 전부 잊어버립니다. 그러면 재시작할 때마다 열려 있는 공고 428건이 몽땅 "처음 보는 것"이 돼서 알림이 쏟아지죠.

실제로 저는 PC를 끄고 켤 때마다 봇이 다시 시작합니다. 오늘 아침에도 그랬어요. 그런데 알림은 조용했습니다. 파일에 적어둔 걸 다시 읽어와서 "이건 어제 이미 보냈네" 하고 넘어간 덕분이에요.

정리 — 새 것을 아는 건 내 몫이었어요

돌아보면 이 편의 교훈은 하나예요. 바깥에서 오는 데이터는 "무엇이 달라졌는지"를 말해주지 않습니다. 늘 현재 상태 전부를 줄 뿐이죠.

달라진 것을 알고 싶으면 이전 상태를 내가 들고 있어야 합니다. 알림봇의 핵심은 사실 알림이 아니라 이 기억 장치였어요.

그런데 이 열쇠 방식에도 구멍이 있었습니다. 다음 편에서 그 얘기를 해볼게요.

다음 편

한 공고가 알림 일곱 개로 쪼개질 뻔했어요. 분명 중복을 걸렀는데도요. 같은 공고가 다른 것처럼 보이는 경우가 있었습니다. → 6편 — 한 공고가 일곱 번 올 뻔했습니다


(이전 편: 4편 — API마다 응답 구조가 달랐습니다)

댓글