Files
aio-01d4-stu/Last3Mon/70/LAB-03-A-CHANGE-AND-VERSION.md

5.4 KiB

Lab 03 · 모듈을 바꿀 때: 하위 호환과 새 버전

강사용 정답본 · 학생 저장소에 올리지 않습니다. 학생용 문제는 LAB-03-Q-CHANGE-AND-VERSION.md. 요청문은 예시이며 CLI 에이전트로 보내 재지는 않았습니다. 결과 숫자는 정답 워크플로우를 2026-10-18에 1회씩 실행한 값입니다 (gpt-4.1-mini). 수업 전날(2026-10-21) 같은 정답으로 다시 돌린 명령 · -v 출력 전부와 codex 프롬프트: answers/LAB-TEST-RESULT.md (점수는 10/18과 같음).

예제 1 · 요청문 예

my-work/rule-check.json 모듈을 같은 id(modRuleCheck01)로 고쳐 줘. 하위 호환이어야 한다.
- 입력 allowed_domains(array)를 더한다. 비어 있거나 없으면 ["intra.example.com"].
- 초안의 http(s) 링크 중 호스트가 허용 목록에 없으면 external_link. 호스트는 글자로 잘라 낸다 (Code 안에 URL 클래스 없음).
- 기존 입력·결과 필드는 그대로. my-work/rule-check-test.json 도 allowed_domains 를 넘기게(없으면 []).
기대 결과 cases/lab03.json, 그리고 lab02-module, lab01, lab02-challenge 도 그대로 통과.

정답: reference/lab03-example1-rule-check.json + reference/lab03-example1-rule-check-test.json

수업 준비 때 결과
바꾸기 전 cases/lab03.json 3/4 (바깥 링크를 못 잡음)
처음 v1.1 (new URL(...)로 호스트를 읽음) 2/4 — 사내 링크까지 external_link. Code 노드 안에서 URL을 쓸 수 없어 모든 링크가 "읽기 실패 = 바깥"으로 처리됨
호스트를 글자로 자르게 고친 뒤 4/4
쓰는 곳 다시 lab02-module 5/5 · 키트 lab01 5/5 · SMS lab02-challenge 4/4

풀이 포인트: 같은 id로 push한 순간 키트와 SMS 모두 새 모듈을 쓴다. 그래서 쓰는 곳 테스트를 모두 돌렸다.

예제 2 · 요청문 예

새 모듈 my-work/rule-check-v2.json 을 만들어 줘. id modRuleCheck02 (v1 파일은 건드리지 않는다).
- 입력은 v1.1 과 같다. 검사도 같다.
- 결과 {passed, blocking, warnings, issues, version: 2}: too_long 은 warnings, 나머지는 blocking. passed = blocking 이 비었는가.
- 시험용 웹훅 my-work/rule-check-v2-test.json (경로 my-rule-check-v2).
- 키트(my-work/notice-kit.json)는 v2 를 부르고 결과에 blocking, warnings 를 더한다. 예전 codes 필드는 남긴다 (blocking + warnings).
- SMS 는 v1 그대로. 기대 결과 cases/lab03-v2.json, lab01, lab02-challenge.

정답: reference/lab03-example2-rule-check-v2.json, reference/lab03-example2-rule-check-v2-test.json, reference/lab03-example2-kit-v2.json

수업 준비 때 결과
cases/lab03-v2.json 5/5 (v2 시험 0.11.2초, 키트 1.42.1초, SMS 1.0초)
처음 키트 v2 (결과를 blocking·warnings로 바꾸고 codes를 뺌) cases/lab01.json 2/5 — 키트를 쓰는 쪽이 읽던 codes가 사라짐
codes를 남긴 뒤 lab01 5/5 · lab03-v2 5/5 · SMS lab02-challenge 4/4

풀이 포인트: 모듈의 깨지는 변경은 새 id로 막았지만, 키트가 그 변화를 자기 계약으로 흘려보내 한 번 더 깨졌다. 계약은 층마다 있다: 모듈 → 키트 → 키트를 부르는 쪽.

과제 · 영향 표 예

모듈 · 버전 쓰는 워크플로우 테스트
modRuleCheck01 (v1.1) my-rule-check 시험용 웹훅, SMS lab02-module, lab03, lab02-challenge
modRuleCheck02 (v2) 공지 키트, my-rule-check-v2 시험용 웹훅 lab01, lab01-challenge, lab03-v2

과제 · 어려운 케이스와 최종본

케이스: answers/70-lab03-challenge-cases.json

케이스 업무 규칙 예제 2 키트(v2)
kind: " Security " 앞뒤 공백·대문자도 같은 종류 ✘ (kind가 그대로 " Security ")
kind: "보안" 한국어 이름도 받음 ✘
사실이 공백만 400 ✘ (200)
kind: party 400 + 종류 목록 ✘ (200)
"바깥 링크 꼭 넣어 주세요" 게시하지 않음, blocking에 external_link ✔
사내 링크 게시, 공지에 링크 ✔
"한 줄로 아주 짧게" 그래도 꼭 넣을 문장 ✔
합계 3/7
  • 예제 2 키트의 kind 실패는 표 앞에서 이름을 다듬지 않았기 때문. "보안"·" Security "일 때 예제 키트는 표에서 값을 찾지 못한 채 공지를 썼다 → 없는 종류를 멈추지 않은 것(Lab 01 과제)과 같은 뿌리.
  • 고칠 곳은 키트만 (모듈을 고칠 일이 없어 영향 표의 다른 테스트를 돌릴 필요가 없었다).

최종본: answers/70-lab03-challenge-final.json — Kind settings에서 trim().toLowerCase()와 한국어 별칭(점검·보안·교육·설문), 없는 종류 400, 사실 공백 확인, 설문 한 줄.

수업 준비 때 결과
어려운 케이스 7/7
lab01 · lab01-challenge · lab03-v2 · lab02-challenge 5/5 · 4/4 · 5/5 · 4/4