한 줄 요약: 8주 동안 자동화를 만들면서 “돌아가나”만 봤지 “맞나”는 한 번도 안 봤다. 이번 주에 처음 눌러봤더니 링크 88개 중 27개가 엉뚱한 기사를 가리키고 있었다. 고치는 과정에서 배운 걸 정리한 글이다.
이런 분께 도움이 돼요: 자동화를 굴리는데 한 번도 결과물을 검증해본 적 없는 분, LLM에게 목록에서 뭔가를 “그대로 옮겨 적게” 시키고 있는 분, 그리고 에러는 안 나는데 왠지 찜찜한 파이프라인을 갖고 계신 분.
무슨 일이 있었는지 자세한 추적 과정은 근거 기사 링크가 엉뚱한 기사를 가리키고 있었다에 따로 써뒀어요. 이 글은 거기서 뭘 배웠나만 다룹니다.
Before → After
| Before (8/24 ~ 9/2) | After (9/3 이후) | |
|---|---|---|
| n8n 화면 | 열흘 내내 전부 초록색 | 그대로 초록색 |
| 링크 정확도 | 88개 중 27개 오배정 (31%) | 검증 대상 전부 정정 |
| 링크를 붙이는 주체 | AI가 130줄 목록을 보고 받아 적음 | 프로그램이 배열에서 꺼내 붙임 |
| 못 찾았을 때 | 아무거나 붙음 | 그날 그 섹터는 저장 안 함 |
| Claude 호출 | 하루 6번 | 하루 3번 |
에러율은 0%였는데 정확도는 69%였다. 이 둘이 다른 숫자라는 걸 8주 만에 처음 알았다.
배운 것 ① — 초록불은 “돌았다”는 뜻이다
자동화를 만들면 확인하게 되는 건 대개 이 셋이다. 에러가 났나 / 텔레그램이 왔나 / 커밋이 올라갔나. 셋 다 통과였다.
그런데 이 셋은 전부 **“과정이 끝까지 갔나”**를 보는 신호지, **“내용이 맞나”**를 보는 신호가 아니다. 링크가 틀려도 텔레그램은 오고, 커밋은 올라가고, 에러는 안 난다.
💡 자동화를 붙였으면 결과물을 직접 눌러보는 날을 따로 잡아야 한다. 초록불은 그걸 대신해주지 않는다.
배운 것 ② — LLM에게 짧은 ID를 목록에서 옮겨 적게 시키지 않는다
원인은 프롬프트 구조였다. AI에게 130줄짜리 번호. 제목 | 링크 목록을 보여주고, 기사를 고른 뒤 그 링크를 받아 적게 하고 있었다.
Before
기사 목록:
{{ $json.title.map((t, i) => `${i}. ${t} | ${$json.link[i]}`).join('\n') }}
- 원문: 그 기사의 링크
전화번호부 130줄을 보면서 번호를 눈으로 옮겨 적는 일이다. 사람도 틀린다.
After — AI에게 URL을 아예 안 보여준다
아래는 오늘 수집된 기사 목록입니다. 각 줄 맨 앞 [숫자]가 그 기사의 번호입니다.
{{ $json.title.map((t, i) => '[' + i + '] ' + t).join('\n') }}
- 기사번호: 위 목록에서 그 기사 앞에 붙은 번호 (숫자만)
- 기사제목: 그 기사의 제목을 위 목록에 있는 그대로 복사
중요: URL(링크)은 절대 쓰지 마세요. 목록에 없는 번호를 지어내지 마세요.
그리고 진짜 링크는 Code 노드가 배열에서 꺼내 붙인다.
💡 고르는 건 AI, 이어붙이는 건 프로그램. 판단은 AI가 잘하고, 정확한 복사는 프로그램이 잘한다. 잘하는 걸 시켜야 한다.
배운 것 ③ — 짐작을 숫자로 바꿔서 확인한다
“긴 목록에서 잘못 베낀 것”이라는 짐작이 맞는지 확인할 방법이 있었다. 그 말이 맞다면, URL이 헷갈리게 생긴 매체일수록 많이 틀렸어야 한다.
링크를 전부 열어서 매체별로 세어봤다.
| 매체 | URL 생김새 | 정확 | 오배정 | 오배정률 |
|---|---|---|---|---|
| ZDNet | ?no=20260903112619 (날짜+시각 14자리) | 39 | 1 | 2.5% |
| 한국경제 | /article/202609031504i (불투명) | 9 | 5 | 36% |
| 디일렉 | ?idxno=61717 (숫자 5자리) | 13 | 21 | 62% |
날짜가 통째로 박힌 ZDNet은 거의 안 틀렸고, 다섯 자리 숫자만 다른 디일렉은 62%가 틀렸다. 가설이 데이터로 확정되는 순간이었다.
💡 원인을 “짐작”에서 “확인”으로 올리려면, 그 짐작이 맞을 때 숫자가 어떻게 나와야 하는지를 먼저 정하고 세어보면 된다. 이게 있으면 고친 뒤에 “진짜 고쳐졌나”도 같은 방법으로 확인할 수 있다.
배운 것 ④ — 틀린 걸 남기느니 안 남긴다
링크를 찾는 코드를 3단으로 짰다.
1순위 제목이 정확히 일치하는 기사 (문장부호·공백·대소문자 무시)
2순위 번호가 가리키는 기사 (제목이 서로 품고 있으면 인정)
3순위 제목이 부분적으로 겹치는 기사 (AI가 제목을 줄여 쓴 경우)
────────────────────────────────────────
셋 다 실패 → null → 그 섹터는 그날 저장하지 않는다
마지막 줄이 핵심이다. 예전 구조는 “뭐라도 붙인다”였고, 새 구조는 **“확실하지 않으면 안 붙인다”**다. 하루 비는 것보다 틀린 게 남는 게 더 나쁘다.
번호만 받지 않고 제목까지 같이 받은 것도 이 안전망을 위해서다. 번호가 밀려도 제목으로 되찾을 수 있다.
배운 것 ⑤ — 고치러 들어간 김에 구조를 한 번 본다
노드를 뜯어보다가, 텔레그램용 LLM 노드와 위키용 LLM 노드가 같은 기사 목록을 두 번 물어보고 있다는 걸 알게 됐다. 원래 고치려던 것과 상관없는 발견이었다.
[Before] Aggregate ─┬→ 텔레그램_LLM → 텔레그램
└→ Wiki_LLM → GitHub
[After] Aggregate → Wiki_LLM ─┬→ Code(섹터분리+링크조회) → GitHub
└→ Code(문장조립+링크조회) → 텔레그램
- Claude 호출 하루 6번 → 3번 (비용 절반)
- 텔레그램과 위키가 항상 같은 키워드를 말하게 됨 (전엔 따로 물어봐서 다를 수 있었다)
💡 파이프라인을 뜯을 일은 자주 없다. 열었을 때 전체를 한 번 훑어보면 이런 게 나온다.
솔직하게 — 하루 동안 지뢰 다섯 개를 밟았다
고치는 게 30분이면 될 줄 알았는데 하루가 걸렸다. 대부분 n8n 자체와 싸운 시간이었다.
| 지뢰 | 뭘 몰랐나 |
|---|---|
노드 이름이 전부 Code in JavaScript, ...1, ...2 | 텔레그램용 코드를 섹터분리 노드에 붙여넣고 한참 헤맴 |
| 중간 노드를 지우면 양옆이 자동으로 이어짐 | 지우자마자 Aggregate → 텔레그램이 저절로 생김 |
| 노드를 연결선 위에 떨어뜨리면 그 사이에 끼워 넣어짐 | 섹터분리 노드가 텔레그램 전송 응답을 입력으로 받고 있었음 |
Received undefined 에러 | 화면에 보이던 줄은 그냥 스크롤 위치였고, 에러 난 줄이 아니었음 |
| 링크 원본을 못 찾은 항목 5개 | 복구를 포기하고 “봇의 링크 오배정 버그로 유실” 문구로 대체 |
발견했을 때는 솔직히 식겁했다. 포트폴리오로 보여줄 사이트인데, 링크를 눌러본 사람이 전자담배 기사를 보게 되는 상황이었으니까. 그래서 프롬프트만 살짝 고치고 넘어가지 않고 노드 구조까지 다시 짰다.
📷 여기에 n8n 워크플로 화면(합치기 전 → 합친 후)을 넣으면 좋아요.
이번 주에 하나 더 — 8주 치 교훈을 한자리에 모았다
이번 일을 겪고 나서 든 생각이 하나 있었다. “이런 걸 여러 번 배웠는데, 매번 어디 있는지 못 찾겠다.”
교훈이 주차별 사례글 안에 흩어져 있었다. 1주차 글 안에 Git 얘기, 4주차 글 안에 n8n 얘기, 7주차 글 안에 정보구조 얘기. 필요할 때 찾으려면 여덟 개 글을 다 뒤져야 했다.
그래서 8주 치를 주제별로 다시 묶어 개발 노트 일곱 개로 만들었다 — Git·배포 / n8n 자동화 / 자동화 속 AI / 정보구조 / 디버깅 태도 / AI 협업, 그리고 이 여섯을 한눈에 보는 지도 한 장.
만들어놓고 보니 이건 남한테 보여줄 글이 아니라 내가 꺼내 볼 서랍이라는 생각이 들어서, 학습일지처럼 나만 보는 쪽으로 돌렸다. 사이트에는 안 올라가고 내 컴퓨터에서만 열린다. (공개용 정리는 지금 읽고 계신 이 주간 회고글이 하고 있으니 중복이기도 했다.)
💡 정리본을 만들 때 “누가 읽나”를 먼저 정하면 공개 여부가 저절로 정해진다. 남이 읽을 글과 내가 꺼내 볼 서랍은 애초에 다른 물건이다.
가져다 쓰실 것 — 자동화 결과물 검증 체크리스트
자동화를 붙이고 나서 한 번은 이걸 돌려보세요. 저는 8주 만에 처음 했고, 31%가 틀려 있었습니다.
- 결과물을 하나 골라 직접 눌러본다. 링크면 열어보고, 숫자면 원본과 맞춰본다. 화면이 초록불인 것과 무관하게.
- 한 개가 틀렸으면 열 개를 더 본다. 틀린 게 랜덤인지 패턴인지부터 가른다. (저는 두 항목의 링크가 서로 맞바뀐 걸 보고 “뒤섞임”이라고 확정했습니다.)
- 가설이 맞다면 숫자가 어떻게 나와야 하는지 정하고 세어본다. 매체별·시간대별·종류별로 갈라서.
- AI에게 시키는 일 중 “옮겨 적기”가 있는지 본다. 있으면 프로그램이 하게 넘긴다. AI는 고르기만.
- 못 찾았을 때 뭘 하는지 정한다. 기본값이 “아무거나 붙임”이면 “안 붙임”으로 바꾼다.
- 과거 데이터도 전수 확인한다. 오늘 고쳐도 어제까지 쌓인 건 그대로 틀려 있다.
마무리
8주 동안 “돌아가게 만드는 것”만 배웠다. 이번 주에 배운 건 **“돌아가는 걸 의심하는 법”**이다.
만들 때는 안 되던 게 되면 기쁘다. 그런데 자동화는 만든 다음이 더 길다. 그 긴 시간 동안 조용히 틀린 걸 쌓고 있을 수 있고, 그건 화면이 알려주지 않는다. 지난주에 “봇이 제대로 모으고 있는지 모니터링하겠다”고 적어뒀는데, 그 다짐을 지킨 첫 주에 바로 큰 게 걸렸다. 다짐을 글로 남겨두길 잘했다.
📷 여기에 정정 전/후 위키 화면(틀린 링크 → 맞는 링크)을 나란히 넣으면 좋아요.