byteforce

CPN 한국어 자습서 · Claude Certified Developer — Foundations Prep

4-7 · 종합 실습

세 계층의 결함을 찾아 고치기

Cumulative Task · Find the Defects and Write the Fix

모듈 4에서는 평가, 테스트와 추적, 실패 처리, 비용과 오케스트레이션, 보안 경계를 한 계층씩 차례로 다뤘습니다. 그런데 실제 프로덕션(실서비스 환경)에서는 문제가 계층별로 하나씩 찾아오는 경우가 드뭅니다. 이 종합 실습은 서로 다른 계층에서 온 결함 세 개를 실행되는 애플리케이션 하나에 함께 심어 두고, 각 결함을 자기 계층으로 짚어 낸 다음 고치는 순서로 진행합니다.

이 장에서 배우는 것What you'll learn

약 15분
1

실행되는 코드 하나에 계층별로 심어 둔 결함 세 개를 읽어내는 법

2

각 결함을 보안 · 실패 처리 · 평가 세 계층으로 짚어내기

3

결함이 런타임에 무엇을 일으키는지 한 문장으로 설명하기

4

결함마다 고친 코드를 쓰고 무엇이 바뀌는지 말하기

5

세 수정이 각자의 계층에서 서로를 어떻게 보강하는지

먼저 짚고 갈 용어
임의 경로 쓰기 (path traversal)
신뢰할 수 없는 곳에서 온 경로를 검사 없이 그대로 써서, 허용된 폴더 밖의 파일까지 쓰거나 덮어쓰게 되는 취약점.
PreToolUse 훅 (PreToolUse hook)
도구가 실제로 실행되기 전에 먼저 걸리는 검사. 쓰기 경계 같은 규칙을 도구 실행 앞단에서 강제한다.
지수 백오프 (exponential backoff)
재시도할 때마다 대기 시간을 점점 늘려 가는 방식. 곧바로 다시 부르지 않고 간격을 벌린다.
일시적 오류 / 영구 오류 (transient / terminal error)
잠시 뒤 다시 하면 될 수도 있는 오류와, 다시 해도 똑같이 실패하는 오류. 재시도가 의미 있는 쪽은 앞쪽 오류뿐이다.
홀드아웃 세트 (holdout set)
채점용으로 따로 떼어 둔 평가 사례 묶음. 프롬프트나 모델이 바뀌었을 때 성능이 떨어졌는지 견줄 기준이 된다.

한 애플리케이션, 계층을 가로지르는 실패

One app, failures that cross layers

지금까지는 결함을 한 계층씩 따로 살펴봤습니다. 평가는 평가대로, 재시도도 재시도대로, 보안 경계는 보안 경계대로요. 하지만 실제 프로덕션에서 마주치는 실패는 이렇게 한 줄로 정렬돼 오지 않는 경우가 많습니다. 여러 계층의 문제가 한 코드 안에 섞여 있는 것이 오히려 보통에 가깝습니다.

아래 애플리케이션은 실행은 됩니다. 다만 서로 다른 계층에서 온 결함 세 개가 하나씩 심어져 있습니다. 먼저 각 결함을 자기 계층으로 짚어 보고, 그다음 결함마다 고친 코드를 씁니다. 목표는 세 결함을 모두 찾아, 고치고, 하나의 버전으로 합치는 것입니다.

RUNNABLE · 3 PLANTED DEFECTS — 실행은 되지만 계층마다 결함이 하나씩

app.py
def answer(question, page_url):
    page = fetch(page_url)               # 신뢰할 수 없는 콘텐츠

    notes = read_file("/workspace/input/notes")
    write_file(page.suggested_path, summarize(page))

    resp = None
    for i in range(5):
        try:
            resp = client.messages.create(model=MODEL, max_tokens=MAX_TOKENS, messages=msg(question))
            break
        except Exception:
            time.sleep(0)

    return resp.content[0].text
큰 그림 먼저

이 실습은 앞에서 계층별로 배운 것을 한자리에 모아 봅니다. 결함을 하나씩 고치는 것보다, 어느 결함이 어느 계층에서 왔는지 먼저 나누는 연습이 핵심입니다.

결함 세 개를 계층별로 짚기

Identify each defect · one layer, one sentence

결함마다 두 가지를 적어 봅니다. 어느 계층에 속하는지, 그리고 런타임에 무엇을 일으키는지 한 문장. 고치는 것은 그다음 단계입니다.

모듈에서 단단하게 다뤄 온 계층들을 하나씩 떠올려 보면 도움이 됩니다 — 평가와 채점, 테스트와 추적, 실패 처리, 비용과 오케스트레이션, 보안 경계. 위 코드를 각 계층의 눈으로 한 번씩 훑어보면, 어느 줄이 그 계층의 규칙을 비워 두고 있는지 드러나는 경우가 많습니다.

예를 들어 보안 경계의 눈으로 보면 write_file 줄이, 실패 처리의 눈으로 보면 재시도 루프가 먼저 눈에 들어옵니다. 세 계층을 각각 대입해 본 뒤, 아래에 직접 진단을 적어 보세요. 다 적었으면 모범 답안과 대조해 봅니다.

주의 · WATCH OUT

수정본 쓰기 — 계층마다 고친 코드

Write the corrected version

이제 각 결함을 고친 버전을 씁니다. 결함마다 고친 코드를 보이고, 무엇이 바뀌는지 함께 적습니다. 대상은 앞에서 본 그 answer() 함수입니다.

세 결함은 각각 다른 계층에서 왔으니, 고칠 때도 계층별로 하나씩 대응하면 됩니다. 보안 경계는 쓰기 경로를 고정하고 훅으로 막고, 실패 처리는 즉시 재시도를 백오프로 바꾸고, 평가는 채점 기준을 마련하는 식입니다. 직접 고친 버전을 아래에 써 본 뒤 모범 답안과 대조해 보세요.

기억할 점

스스로 점검 — 세 결함 되짚기

Checkpoint · The three planted defects

아래는 방금 짚은 세 결함을 객관식으로 되짚는 문항입니다. 정답을 먼저 떠올려 본 뒤 골라 보세요. 맞히면 설명이 나옵니다.

Q1이 애플리케이션에 심어 둔 결함 세 개는 각각 어느 계층에서 왔을까요?

Q2write_file(page.suggested_path, summarize(page))가 보안 결함인 이유는 무엇일까요?

Q3time.sleep(0)으로 5번을 곧바로 재시도하는 루프의 문제는 무엇일까요?

MEMBER SESSION REQUIRED · REGISTRATION IS FREE

여기부터는 등록한 분에게 열립니다.

전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 38개 레슨을 끝까지 읽을 수 있습니다.

등록하고 이어서 읽기

이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.