5.9 KiB
Lab 02 · 규칙 검사를 모듈로, 두 곳에서 쓰기
- 관련 강의: 2단계 · 모듈화: Sub-workflow와 계약
- 소요 시간: 약 70분 (예제 1 20분 · 예제 2 15분 · 과제 35분)
- 준비: Lab 01의
my-work/notice-kit.json(없으면cp reference/lab01-example2-kit.json my-work/notice-kit.json후 push) - 목표: 규칙 검사를 모듈(Sub-workflow)로 떼어 내 따로 시험하고, 공지 키트가 그 모듈을 부르게 바꾼다 (결과는 그대로). 다른 워크플로우(SMS)도 같은 모듈을 쓴다.
flowchart LR
E1["예제 1<br/>모듈 + 시험용 웹훅"] --> E2["예제 2<br/>키트가 모듈 사용<br/>(테스트는 그대로)"] --> T["과제<br/>SMS도 같은 모듈"]
복사해 붙일 요청문은 없습니다. 막히면
▶를 하나씩 펼칩니다.
예제 1 · 규칙 검사 모듈과 시험용 웹훅 (20분)
만들 것: 두 파일.
| 파일 | 하는 일 |
|---|---|
my-work/rule-check.json |
모듈. Execute Workflow Trigger로 시작, 입력 4개를 받아 {passed, codes, issues}. 파일 안에 "id": "modRuleCheck01" |
my-work/rule-check-test.json |
시험용 웹훅 my-rule-check: 본문을 그대로 모듈에 넘기고 결과를 돌려줌 |
계약은 AGENTS.md 3절, 노드 모양은 5절. 기대 결과 cases/lab02-module.json (LLM 없이 규칙만, 케이스당 0.1초 정도).
▶ 1단계 · 모듈의 입력을 정하기
키트 안의 Rule checks 코드가 지금 무엇을 읽고 있나요? 웹훅 본문, 설정 표, 앞 노드의 초안. 모듈은 이것들을 직접 읽을 수 없습니다 (부르는 쪽이 다르기 때문). 그래서 필요한 값을 모두 입력으로 받아야 합니다. 입력마다 이름과 종류(글자, 숫자, 목록)를 정합니다.
▶ 2단계 · 왜 시험용 웹훅이 따로 있나
모듈은 웹훅이 없어서 call이나 test로 바로 부를 수 없습니다. 웹훅 → 모듈 호출 → 응답, 세 노드짜리 워크플로우를 하나 더 두면 모듈만 따로 시험할 수 있습니다. 두 파일을 함께 push합니다.
▶ 3단계 · 모듈 id
부르는 쪽은 모듈을 id로 찾습니다. id를 파일에 직접 적으라고 요청문에 넣었나요? (AGENTS.md 3절)
uv run tools/flow.py push my-work/rule-check.json my-work/rule-check-test.json
uv run tools/flow.py test cases/lab02-module.json -v
예제 2 · 키트가 모듈을 부르게 (15분)
할 일: my-work/notice-kit.json 안의 규칙 검사 코드를 지우고, 그 자리에 모듈 호출(Execute Workflow)을 둔다. 결과는 바뀌면 안 된다.
▶ 1단계 · "결과는 그대로"를 어떻게 확인하나
바꾸기 전에 test cases/lab01.json을 돌려 보고서를 남겨 두고, 바꾼 뒤 같은 테스트를 돌립니다. 테스트를 하나도 고치지 않고 통과하면 결과가 그대로인 것입니다 (리팩터링).
▶ 2단계 · 무엇을 넘기나
예제 1에서 정한 입력 4개를 키트의 어디에서 가져오나요? 사실은 웹훅에서, 초안은 앞 노드에서, 길이와 꼭 넣을 문장은 설정 표에서.
uv run tools/flow.py test cases/lab01.json -v # 바꾸기 전
uv run tools/flow.py push my-work/notice-kit.json
uv run tools/flow.py test cases/lab01.json -v # 바꾼 뒤 (테스트는 그대로)
uv run tools/flow.py test cases/lab01-challenge.json -v # 과제를 했다면
관찰: n8n Executions에서 키트 실행 하나에 모듈 실행이 따로 생기나요? 웹훅으로 다른 역할을 부르던 69일차와 무엇이 다른가요?
과제 · SMS도 같은 모듈 (35분)
팀장이 요청했습니다.
"급한 공지는 문자로도 보내요. 80자 이내 한두 문장, 날짜·시간은 그대로, 연락처나 링크는 넣지 마세요. 검사 규칙은 공지와 같은 걸 써 주세요. 따로 만들면 나중에 또 달라집니다."
| 조건 | 값 |
|---|---|
| 저장할 파일 | my-work/sms.json |
| 웹훅 · 계약 | AGENTS.md 3절 SMS (my-sms) |
| 검사 | 예제 1의 모듈 (최대 길이 80, 꼭 넣을 문장 없음) |
| 기대 결과 | cases/lab02-challenge.json, 그리고 키트의 cases/lab01.json도 계속 통과 |
▶ 1단계 · 모듈을 고치지 않고
SMS는 길이 80, 꼭 넣을 문장 없음. 모듈 안을 고치지 않고 입력만 다르게 주면 됩니다. 모듈 안에 "SMS면 80"을 넣으면 무엇이 문제일까요?
▶ 2단계 · 한 줄로 영향 보기
DESIGN.md 3절 표의 "쓰는 곳"에 키트, SMS, 시험용 웹훅을 적습니다. 모듈을 고치면 이 세 곳의 테스트를 모두 돌려야 합니다 (Lab 03).
uv run tools/flow.py push my-work/sms.json
uv run tools/flow.py test cases/lab02-challenge.json -v --repeat 3
uv run tools/flow.py test cases/lab01.json -v
막혔을 때
| 증상 | 할 일 |
|---|---|
| 모듈을 부르는 노드가 빨강 (모듈을 찾지 못함) | 모듈 파일의 id와 부르는 쪽의 workflowId.value가 같은지, 모듈을 push했는지 |
모듈 결과의 codes가 이상함 |
모듈 입력의 종류(max_length가 숫자, required_phrases가 목록)를 Executions에서 확인 |
| 계속 안 됨 | reference/lab02-example1-rule-check.json, lab02-example1-rule-check-test.json, lab02-example2-kit-module.json을 my-work/로 복사 후 push |
확인
- 예제 1:
cases/lab02-module.json통과 (모듈만 따로). - 예제 2: 키트가 모듈을 부르고,
cases/lab01.json이 테스트 수정 없이 통과. - 과제:
cases/lab02-challenge.json3번 반복 통과, 모듈 안은 고치지 않았다.