2교시 실습 (40분) | Session 2: 에이전틱 루프와 컨텍스트 엔지니어링
같은 요청, 다른 컨텍스트 — 에이전트에게 동일한 작업을 3번 요청하되, 매번 제공하는 컨텍스트를 달리한다. 결과의 차이를 직접 측정하며 컨텍스트 엔지니어링의 효과를 체감한다.
01-context-engineering/
├── README.md # 이 파일
├── Justfile # 환경 준비, 테스트, 서버 실행
├── src/ # 참조용 원본 코드 (북마크 REST API)
│ ├── app.py # HTTP 서버 (라우팅)
│ ├── models.py # Bookmark dataclass
│ ├── database.py # JSON 저장소
│ ├── validators.py # 입력 유효성 검사
│ └── test_api.py # API 테스트
├── round1/ # Round 1: AGENTS.md 없음
│ └── src/ # (원본과 동일한 코드)
├── round2/ # Round 2: 기본 AGENTS.md 있음
│ ├── AGENTS.md # 코딩 컨벤션 + 테스트 규칙
│ └── src/
├── round3/ # Round 3: 풍부한 컨텍스트
│ ├── AGENTS.md # 상세 규칙 + 예시 참조
│ ├── architecture.md # 아키텍처 문서
│ ├── examples/ # 코드 예시 파일
│ │ ├── add_field.py # 필드 추가 패턴
│ │ ├── error_handling.py # 에러 핸들링 패턴
│ │ └── docstring_style.py # docstring 스타일
│ └── src/
└── artifacts/
└── comparison-template.md # 비교 기록 양식
# Python 3.8 이상 필요
python3 --version
# 환경 확인
just setup
# 또는
python3 -c "import http.server, json, uuid, dataclasses; print('OK')"아래는 동일한 요청을 Round 1과 Round 2에서 실행한 실제 세션 기록이다. 세션 ID와 공유 URL이 있으며, oc-trace로 직접 조회 가능하다.
북마크에 category 필드를 추가하고, 카테고리별 필터링 API를 만들어줘.
요구사항:
- Bookmark 모델에 category 필드 추가 (선택 필드, 기본값 None)
- POST /bookmarks 시 category 값 저장 가능
- GET /bookmarks?category=tech 처럼 쿼리 파라미터로 필터링 가능
- 테스트 추가
| 항목 | 값 |
|---|---|
| 세션 ID | ses_2ffb44952ffen83yt2yCA9ul6e |
| 공유 URL | https://opncd.ai/share/yCA9ul6e |
| 시작 | 2026-03-18 18:34:15 |
| 종료 | 2026-03-18 18:37:00 |
| 소요 시간 | 2분 45초 |
| 토큰 | 446,704 |
| 도구 호출 | 22회 |
| 사용 도구 | todowrite, glob, grep, read, apply_patch, bash |
| 파일 변경 | 4개 (+71줄, -9줄) |
[0:00] 사용자 → "북마크에 category 필드를 추가하고..."
│
[0:00] todowrite → 작업 계획 3개 항목 생성
│ "Inspect bookmark model, API routes, and test structure" [in_progress]
│ "Add optional category field to bookmark model..." [pending]
│ "Update POST and GET /bookmarks to accept and filter..." [pending]
│
[0:00] glob **/* → 5개 파일 발견
│ test_api.py, app.py, validators.py, database.py, models.py
│
[0:00] grep "Bookmark|bookmarks" in round1 → 34개 매칭
│ (파일 구조 파악 전에 키워드 검색으로 맥락 수집)
│
[0:00] read models.py → category 필드 없음 확인
[0:00] read app.py → HTTP 라우팅 패턴 파악
[0:00] read database.py → 저장소 함수 목록 확인
[0:00] read test_api.py → 기존 테스트 구조 파악
[0:00] read validators.py → 유효성 검사 패턴 파악
│
[0:00] todowrite → "Inspect..." [completed]
│
[0:09] apply_patch → models.py + database.py + app.py + test_api.py 동시 수정
│ (15.5초 소요 — 4개 파일을 한 패치에 묶어 처리)
│
[0:25] bash "python -m unittest src/test_api.py" → 실패
│ ImportError: 경로 오류 (src/ 서브디렉토리 방식 불가)
│
[0:26] bash "python -m unittest test_api.py" → OK (경고 있음)
│ ResourceWarning: HTTPError 리소스 미정리
│ Ran 5 tests in 0.550s — OK
│
[0:27] apply_patch → test_api.py 수정 (tearDownClass에 server_close 추가)
[0:27] bash "python -m unittest test_api.py" → OK (경고 여전히 있음)
[0:28] apply_patch → test_api.py 수정 (HTTPError e.close() 추가)
[0:29] bash "python -m unittest test_api.py" → OK, 경고 없음
│ Ran 5 tests in 0.555s — OK (ResourceWarning 해결)
│
[0:29] todowrite → 나머지 항목 [completed]
│
[0:29] read models.py, app.py, database.py, test_api.py → 최종 상태 재확인
│ (수정 완료 후 파일 전체를 다시 한 번 읽음)
│
[2:45] 완료 답변 출력
| 판단 항목 | 선택 | 비고 |
|---|---|---|
| 탐색 방식 | glob + grep + read 5개 | 구조를 모르므로 키워드 검색 먼저 |
| 필터링 위치 | database 레이어 (get_all_by_category) |
요구사항에 없는 설계 결정 |
| validators.py | 수정 안 함 | category 유효성 검사 없음 |
| docstring | 미추가 | 기존 코드에도 없으므로 생략 |
| logging | 기존 print() 유지 |
전환 필요성 인식 못함 |
| 테스트 함수명 | test_create_bookmark_with_category |
자체 판단 (규칙 없음) |
| 경고 수정 | apply_patch 2회 추가 소비 | 요청 외 부가 작업 |
| 항목 | 값 |
|---|---|
| 세션 ID | ses_2ffaf11e2ffeYS37wBg4Y9ES4v |
| 공유 URL | https://opncd.ai/share/g4Y9ES4v |
| 시작 | 2026-03-18 18:39:57 |
| 종료 | 2026-03-18 18:42:06 |
| 소요 시간 | 2분 9초 |
| 토큰 | 299,831 |
| 도구 호출 | 18회 |
| 사용 도구 | todowrite, glob, read, apply_patch, bash |
| 파일 변경 | 5개 (+131줄, -23줄) |
[0:00] 사용자 → "북마크에 category 필드를 추가하고..."
│
[0:00] todowrite → 작업 계획 4개 항목 생성
│ "Inspect current bookmark API structure and tests" [in_progress]
│ "Add optional category field to model and persistence..." [pending]
│ "Support category in validation and HTTP handlers..." [pending]
│ "Add and run tests" [pending]
│ (AGENTS.md 체크리스트 순서 반영: models → validators → database → app → test)
│
[0:00] glob **/*.py → 5개 .py 파일 발견
│ (Round 1의 glob **/* 와 달리 .py만 명시적으로 검색)
│
[0:00] read models.py → [실패] 경로 오류
[0:00] read database.py → [실패] 경로 오류
[0:00] read validators.py → [실패] 경로 오류
[0:00] read app.py → [실패] 경로 오류
[0:00] read test_api.py → [실패] 경로 오류
│ (처음 경로로 /round2/ 접근 → 실패 → /round2/src/로 수정)
│
[0:00] read models.py → [성공] category 필드 없음 확인
[0:00] read database.py → [성공] 저장소 함수 확인, logging 이미 있음
[0:00] read validators.py → [성공] validate_url, validate_bookmark_input 확인
[0:00] read app.py → [성공] logging.basicConfig 이미 설정됨
[0:00] read test_api.py → [성공] 기존 테스트 7개 구조 파악
│
[0:00] todowrite → "Inspect..." [completed]
│
[0:11] apply_patch → models.py + validators.py + database.py + app.py + test_api.py
│ 5개 파일 단일 패치로 동시 수정 (0.3초)
│ AGENTS.md 체크리스트 순서대로: models → validators → database → app → test
│
[0:11] todowrite → 나머지 항목 [completed]
│
[0:12] bash "python -m unittest -v src/test_api.py" → 실패
│ ImportError: 경로 오류 (Round 1과 동일한 패턴)
│
[0:13] bash "python -m unittest -v test_api.py" → OK
│ 15개 테스트 전부 통과
│ (Round 1: 5개 → Round 2: 15개, +10개 순증)
│
[0:13] todowrite → 최종 [completed]
│
[2:09] 완료 답변 출력
| 관찰 항목 | Round 1 (AGENTS.md 없음) | Round 2 (AGENTS.md 있음) |
|---|---|---|
| 탐색 도구 | glob + grep + read | glob + read (grep 없음) |
| 탐색 방식 | 키워드 검색으로 맥락 수집 먼저 | 파일 목록 → 직접 읽기 |
| 수정 파일 수 | 4개 (validators.py 누락) | 5개 (validators.py 포함) |
| validators.py | 수정 안 함 | validate_category() 추가 |
| apply_patch 횟수 | 3회 (경고 수정 2회 추가) | 1회 (5개 파일 한 번에) |
| 테스트 수 | 5개 통과 | 15개 통과 |
| 테스트 함수명 | test_create_bookmark_with_category |
test_create_bookmark_with_category_success (패턴 준수) |
| docstring | 미추가 | Google 스타일 전체 적용 |
| logging | print() 유지 |
logging 모듈 사용 (AGENTS.md 규칙) |
| 토큰 사용 | 446,704 | 299,831 (-33%) |
| 소요 시간 | 2분 45초 | 2분 9초 (-22%) |
| 도구 호출 | 22회 | 18회 (-18%) |
Round 1에서 에이전트는 파일을 읽기 전에 grep "Bookmark|bookmarks"로 키워드 검색을 먼저 했다.
AGENTS.md가 없으니 어떤 파일에 무엇이 있는지 알 수 없어, 검색으로 맥락을 모아야 했다.
Round 2에서는 grep이 완전히 사라졌다. AGENTS.md의 코드 구조 규칙이 파일별 역할을 명시했기 때문이다:
## 코드 구조
- `models.py`: 데이터 모델만
- `database.py`: 저장소 접근만
- `validators.py`: 유효성 검사만
- `app.py`: HTTP 라우팅 + 응답 처리
핵심: 컨텍스트가 탐색을 대체했다. 에이전트가 "무엇을 찾아야 할지" 알고 있으면 탐색 단계가 줄어든다.
Round 1에서 에이전트는 validators.py를 읽었지만 수정하지 않았다. category 유효성 검사를 추가해야 한다는 판단 근거가 없었기 때문이다.
Round 2에서는 AGENTS.md 체크리스트가 명시적으로 validators.py 수정을 요구했다:
## 신규 기능 추가 시 체크리스트
- [ ] `models.py`에 데이터 모델 변경 반영
- [ ] `validators.py`에 유효성 검사 추가 ← 이 항목
- [ ] `database.py`에 저장소 함수 추가
- [ ] `app.py`에 라우트 핸들러 추가
- [ ] `test_api.py`에 테스트 추가결과: Round 2에서 validate_category() 함수가 자동으로 추가되었고, 100자 초과, 빈 문자열 등의 예외 케이스도 처리되었다.
Round 1에서 에이전트는 테스트 실행 중 ResourceWarning을 발견하고, 요청에 없던 수정을 2회 더 했다.
컨텍스트가 없으면 에이전트는 "발견한 문제를 즉시 고쳐야 한다"고 판단한다.
Round 2에서는 동일한 경고가 발생했지만 에이전트가 추가 패치를 하지 않았다. AGENTS.md가 명시한 범위에만 집중했기 때문이다.
비고: Round 2에서도
ResourceWarning은 발생했다. 하지만 에이전트가 범위를 벗어나는 수정을 하지 않아 도구 호출이 더 적었다.
Round 1: 요청한 기능의 성공 케이스 2개만 추가 (총 5개) Round 2: 성공 케이스 + 실패 케이스(400, 404) 모두 추가 (총 15개)
AGENTS.md 규칙: "성공 케이스와 실패 케이스를 모두 테스트한다"
학생들이 Round 2를 직접 진행하고 결과를 기록합니다.
1단계: 코드 살펴보기 (3분)
# round2/src/ 코드 구조 확인
ls round2/src/
# AGENTS.md 읽기 (중요!)
cat round2/AGENTS.md2단계: 기존 테스트 통과 확인 (2분)
just test-r2모든 테스트가 통과하면 준비 완료.
3단계: 에이전트에게 과제 요청 (8분)
에이전트를 round2/ 디렉토리에서 실행하고 다음 요청을 보내세요:
북마크에 category 필드를 추가하고, 카테고리별 필터링 API를 만들어줘.
요구사항:
- Bookmark 모델에 category 필드 추가 (선택 필드, 기본값 None)
- POST /bookmarks 시 category 값 저장 가능
- GET /bookmarks?category=tech 처럼 쿼리 파라미터로 필터링 가능
- 테스트 추가
4단계: 결과 확인 (2분)
# 테스트 실행
just test-r2
# 서버 실행 후 curl로 확인
just serve-r2 &
curl -s -X POST http://localhost:8002/bookmarks \
-H "Content-Type: application/json" \
-d '{"title":"파이썬","url":"https://python.org","category":"docs"}'
curl -s "http://localhost:8002/bookmarks?category=docs"
kill %15단계: 세션과 실제 로그 비교 (진행 중에 작성)
에이전트가 작업하는 동안 아래를 기록하세요:
| 항목 | I DO (실제 기록) | 내 세션 |
|---|---|---|
| 첫 번째 도구 호출 | todowrite | |
| grep을 사용했는가? | 사용 안 함 | |
| validators.py 수정 여부 | 수정함 | |
| apply_patch 횟수 | 1회 | |
| 테스트 통과 수 | 15개 | |
| 총 도구 호출 횟수 | 18회 |
artifacts/comparison-template.md의 Round 2 섹션도 채워주세요.
실행 후 자신의 세션을 추적하고 싶다면:
# 세션 목록 확인
opencode session list
# 세션 추적 (oc-trace)
python3 ~/.claude/skills/oc-trace/oc_trace.py list
python3 ~/.claude/skills/oc-trace/oc_trace.py trace <session_id> -vRound 3(풍부한 컨텍스트)를 직접 구성하고, 자신만의 AGENTS.md 규칙을 실험합니다.
- Round 3 환경 탐색
# Round 3에는 무엇이 있나?
ls round3/
cat round3/AGENTS.md
cat round3/architecture.md
ls round3/examples/- 에이전트를
round3/디렉토리에서 실행
동일한 요청을 전달하고 아래를 관찰하세요:
examples/add_field.py를 참조하는가?architecture.md의 확장 포인트를 따르는가?- Round 2보다 코드 품질이 개선되었는가?
- 테스트 확인
just test-r3- 3라운드 비교 기록표 완성
artifacts/comparison-template.md의 Round 3 섹션과 "라운드 비교 요약" 섹션을 채우세요.
| 지표 | Round 1 (기록) | Round 2 (기록) | Round 3 (직접 측정) |
|---|---|---|---|
| 토큰 사용량 | 446,704 | 299,831 | |
| 도구 호출 횟수 | 22회 | 18회 | |
| apply_patch 횟수 | 3회 | 1회 | |
| 테스트 통과 수 | 5개 | 15개 | |
| validators.py 수정 | 없음 | 있음 |
Round 2 또는 Round 3의 AGENTS.md에 자신만의 규칙을 추가하고 에이전트 동작이 달라지는지 확인하세요.
아이디어 예시:
## 추가 규칙 아이디어
- category 허용 값을 enum으로 정의하라: tech, news, blog, video, docs, other
- 북마크 URL은 중복 저장 금지
- 삭제 시 실제 삭제 대신 deleted_at 필드를 설정하는 소프트 삭제 방식 사용
- 응답에 항상 X-Total-Count 헤더 포함추가한 규칙과 결과를 artifacts/comparison-template.md의 "나의 인사이트" 섹션에 기록하세요.
# 헬스 체크
curl http://localhost:8000/health
# 북마크 생성 (category 없음)
curl -X POST http://localhost:8000/bookmarks \
-H "Content-Type: application/json" \
-d '{"title":"Python","url":"https://python.org"}'
# 북마크 생성 (category 있음 - 에이전트가 기능 추가 후)
curl -X POST http://localhost:8000/bookmarks \
-H "Content-Type: application/json" \
-d '{"title":"GitHub","url":"https://github.com","category":"tech"}'
# 전체 목록 조회
curl http://localhost:8000/bookmarks
# 카테고리 필터링 (에이전트가 기능 추가 후)
curl "http://localhost:8000/bookmarks?category=tech"
# 단건 조회
curl http://localhost:8000/bookmarks/{id}
# 수정
curl -X PUT http://localhost:8000/bookmarks/{id} \
-H "Content-Type: application/json" \
-d '{"title":"새 제목","url":"https://new.com"}'
# 삭제
curl -X DELETE http://localhost:8000/bookmarks/{id}| 컨텍스트 수준 | 에이전트에게 주어진 것 | 관찰된 효과 |
|---|---|---|
| Round 1 | 코드만 | grep으로 탐색, validators 누락, apply_patch 3회, 토큰 446K |
| Round 2 | 코드 + AGENTS.md | grep 없음, validators 자동 포함, apply_patch 1회, 토큰 300K |
| Round 3 | 코드 + AGENTS.md + 아키텍처 + 예시 | 직접 측정해보세요 |
핵심 교훈: 에이전트는 판단 비용이 높을수록 불일관하거나 틀린 선택을 한다. 컨텍스트 엔지니어링은 "에이전트가 판단해야 할 것"을 줄이는 기술이다.
세션 로그 원본은
logs/round1-log.md,logs/round2-log.md에 있다. 세션 추적 방법의 자세한 내용은 부록: 세션 추적 가이드를 참고하라.