KoreaDevKNOWLEDGE SHARING

콘텐츠 유형학습하기

AI SOFTWARE DEVELOPMENT · 06 / 10

테스트와 AI 개발 품질

Type check부터 unit·integration·contract·browser E2E까지 발견 가능한 결함을 나누고 AI 수정 loop를 release evidence로 닫습니다.

난이도
실무
구성
강의 8개 · 실습 2개 · 평가

CORE UNIT 1 / 1

테스트와 AI 개발 품질

Type check부터 unit·integration·contract·browser E2E까지 발견 가능한 결함을 나누고 AI 수정 loop를 release evidence로 닫습니다.

난이도
실무
구성
강의 8개 · 실습 2개 · 평가

도해·표 자료: 각 강의의 공식 1차 출처를 바탕으로 저자 구성. 원문과 검토일은 해당 강의 끝에서 확인합니다.

NEW HIRE ONBOARDING

첫 업무를 받는 순서로 시작합니다

중학교를 졸업하고 처음 IT 업무를 맡은 신입사원도 따라올 수 있도록, 어려운 정의보다 상황·할 일·증거·보고할 경계를 먼저 확인합니다.

  1. 01

    상황을 한 문장으로 읽기

    결제 버튼 test가 `button`이 존재하는지만 확인합니다. 실제 defect는 두 번 클릭하면 주문이 두 번 생성되는 것입니다.

  2. 02

    오늘 맡은 일

    검사 층마다 발견하는 결함과 못 잡는 결함을 구분합니다.

  3. 03

    완료를 보여 주는 증거

    응답 순서를 뒤집고 이전 요청을 성공과 실패로 각각 끝내 최신 목록과 안내가 유지되는지 확인하십시오.

  4. 04

    멈추고 선임에게 확인할 경계

    중복 fixture, 느린 suite와 서로 다른 환경의 drift를 관리해야 합니다.

낯선 용어 먼저 풀기

Type·unit·integration·E2E의 경계
검사 층은 서열이 아니라 서로 다른 실패를 더 싼 위치에서 찾는 방어선입니다.
Unit test와 결정성
좋은 unit test는 구현 줄을 복제하지 않고 입력과 관찰 가능한 계약을 빠르게 고립합니다.
API·schema·integration test
통합 test의 목적은 구성요소가 존재하는지보다 서로 같은 계약을 이해하는지 확인하는 것입니다.

이 과정의 질문

왜 바뀌었고, 무엇을 검증해야 하는가?

기술의 장점만 외우지 않고 그 장점이 성립하는 조건과 새 실패 경계를 함께 확인합니다.

OBSERVABLE OUTCOMES

학습을 마치면 할 수 있는 일

  1. 검사 층마다 발견하는 결함과 못 잡는 결함을 구분합니다.
  2. 사용자 관찰 동작 중심의 Playwright assertion과 격리 data를 설계합니다.
  3. 실패 재현부터 동일 조건 재검증까지 AI coding 품질 loop를 수행합니다.

PREREQUISITE CHECK

본문을 읽기 전에 확인할 세 가지

정답을 외우는 시험이 아닙니다. 질문을 먼저 생각한 뒤 해설을 열어 이번 과목에서 사용할 바탕 개념을 확인하십시오.

1테스트는 code가 맞다는 증명인가요?

선택한 입력과 관찰에 대해 기대와 같았다는 증거입니다. 누락된 조건과 잘못 쓴 기대는 통과한 test 밖에 남습니다.

2Unit test와 E2E test 중 하나만 고르면 되나요?

빠른 작은 범위와 실제 통합 경로가 찾는 결함이 달라 위험에 맞게 조합해야 합니다.

3Flaky test는 다시 돌려 통과하면 괜찮나요?

원인을 숨기면 release 신뢰도가 떨어집니다. 시간, shared state, network와 selector를 격리해 결정적 신호로 복구해야 합니다.

TEXTBOOK GUIDE

개념의 배경부터 판단 기준까지 읽는 본문

IT를 처음 접하는 독자도 용어를 암기하지 않고 원인과 결과를 연결할 수 있도록 한 절씩 이어서 설명합니다.

CONCEPT FLOW

각 장은 이렇게 연결됩니다

각 장은 따로 외우는 단답이 아닙니다. 왼쪽에서 오른쪽으로 따라가며 앞 장의 개념이 다음 판단에 어떻게 쓰이는지 먼저 살펴보세요.

  1. 1장Type·unit·integration·E2E의 경계
  2. 2장Unit test와 결정성
  3. 3장API·schema·integration test
  4. 4장Playwright로 사용자 행동 검증
  5. 5장AI 수정 loop와 release gate
  6. 6장정답을 만드는 경로를 구현과 분리합니다
  7. 7장간헐적 실패를 재시도 횟수 대신 사건 기록으로 진단합니다
  8. 8장늦은 응답이 최신 사용자 선택을 덮지 않게 검증합니다
테스트와 AI 개발 품질의 전체 지도입니다. 아래 장문 해설과 각 장을 읽다가 길을 잃으면 이 순서로 돌아오세요.
그림 6-1. 테스트와 AI 개발 품질의 개념 전개앞 장의 선택과 한계가 다음 장의 문제로 어떻게 이어지는지 보여 줍니다.
  1. 1
    Type·unit·integration·E2E의 경계

    검사 층은 서열이 아니라 서로 다른 실패를 더 싼 위치에서 찾는 방어선입니다.

  2. 2
    Unit test와 결정성

    좋은 unit test는 구현 줄을 복제하지 않고 입력과 관찰 가능한 계약을 빠르게 고립합니다.

  3. 3
    API·schema·integration test

    통합 test의 목적은 구성요소가 존재하는지보다 서로 같은 계약을 이해하는지 확인하는 것입니다.

  4. 4
    Playwright로 사용자 행동 검증

    Browser test는 CSS selector가 아니라 사용자가 인식하는 role·label·결과를 중심으로 기다리고 assertion합니다.

  5. 5
    AI 수정 loop와 release gate

    AI가 test를 작성했다면 그 test도 독립 evidence와 의도적 실패로 검증해야 합니다.

  6. 6
    정답을 만드는 경로를 구현과 분리합니다

    같은 계산을 복사한 검사는 같은 오류를 승인하므로 요구 조건에서 독립된 기대값을 만듭니다.

  7. 7
    간헐적 실패를 재시도 횟수 대신 사건 기록으로 진단합니다

    첫 실패의 상태와 시간 순서를 보존해야 재실행이 원인을 지우지 않습니다.

  8. 8
    늦은 응답이 최신 사용자 선택을 덮지 않게 검증합니다

    비동기 화면의 정답은 마지막 도착 응답이 아니라 현재 선택에 대응하는 결과입니다.

CONTROLLED EXPLANATION

늦은 검색 오류를 폐기하는 판정 흐름

현재 상태: 이전 요청: 바다

늦은 검색 오류를 폐기하는 판정 흐름

자료: Playwright 공식 검증 원칙을 바탕으로 저자 구성. 가상 검색의 요청 순서와 응답 순서를 분리해 읽습니다.

입력 변경B 성공 먼저 도착A 오류 나중 도착오래된 응답 폐기1이전 요청: 바다2현재 요청: 산3산 결과 표시4A의 늦은 오류5현재 결과 유지
  1. 이전 요청: 바다

    요청 A의 응답을 보류합니다.

  2. 현재 요청: 산

    요청 B를 현재 선택으로 기록합니다.

  3. 산 결과 표시

    B 성공과 로딩 종료를 확인합니다.

  4. A의 늦은 오류

    현재 선택 B와 식별자가 다릅니다.

  5. 현재 결과 유지

    산 목록과 안내가 그대로 남습니다.

1 → 2
입력 변경
2 → 3
B 성공 먼저 도착
3 → 4
A 오류 나중 도착
4 → 5
오래된 응답 폐기

화살표는 시험에서 제어한 도착 순서입니다. 마지막 노드는 오래된 오류 뒤에도 유지할 사용자 상태입니다.

CONCRETE CASES

과정 전체 선택 기준표

TABLE 6-1

과정 전체 선택 기준표

각 장의 기술을 이름이 아니라 작동 원리, 새 비용과 확인할 증거로 비교합니다.

6-1. 테스트와 AI 개발 품질의 설계 판단 기준
중심 메커니즘주의할 비용확인할 증거
1. Type·unit·integration·E2E의 경계작은 범위의 빠른 feedback과 넓은 범위의 실제 통합 증거를 계층화합니다.중복 fixture, 느린 suite와 서로 다른 환경의 drift를 관리해야 합니다.최근 결함마다 어느 gate가 처음 잡아야 했는지 분류하고 빈 경계를 찾습니다.
2. Unit test와 결정성Dependency를 제어하고 input-output contract를 좁혀 빠르고 재현 가능한 failure를 만듭니다.과도한 mock과 구현 결합이 거짓 안정성과 유지 비용을 만듭니다.Mutation이나 의도적 결함을 넣어 test가 실제로 실패하는지 확인합니다.
3. API·schema·integration test실제 boundary serialization과 state transition을 격리 환경에서 실행합니다.환경 시작 시간, fixture drift와 외부 service 불안정이 비용이 됩니다.Old consumer-new provider와 new consumer-old provider 조합에서 중요한 contract를 실행합니다.
4. Playwright로 사용자 행동 검증Browser가 실제 DOM·event·network를 실행하고 사용자 관찰 결과가 될 때까지 assertion합니다.느린 실행, data 격리와 환경 의존성이 생깁니다.Keyboard, mobile viewport, 느린 response와 오류 response에서 같은 journey를 검증합니다.
5. AI 수정 loop와 release gateReproducible command와 immutable revision이 code change를 관찰 가능한 결과에 연결합니다.Suite 비용과 false positive를 줄이려면 ownership과 지속적인 정리가 필요합니다.Test 자체에 mutation을 넣고 requirement와 독립된 oracle이 실패를 잡는지 확인합니다.
6. 정답을 만드는 경로를 구현과 분리합니다요구 문서에서 만든 입력·기대값 표가 구현과 테스트 사이의 공통 오해를 끊습니다.정책 소유자의 검토 시간이 필요하며 정책이 모호하면 코드보다 먼저 기준을 보완해야 합니다.배송비 정책의 경계 표를 작성하고 잘못된 비교 연산을 넣었을 때 실패하는 행을 표시하십시오.
7. 간헐적 실패를 재시도 횟수 대신 사건 기록으로 진단합니다첫 불일치와 공유 자원 식별자를 연결하면 시간 초과 뒤에 숨은 경쟁을 찾을 수 있습니다.진단 자료에는 계정 정보가 남을 수 있으므로 가명 데이터와 접근 제한이 필요합니다.공유 계정과 격리 계정의 병렬 실행 기록을 비교하고 처음 달라지는 요청을 지목하십시오.
8. 늦은 응답이 최신 사용자 선택을 덮지 않게 검증합니다현재 요청 식별과 응답 식별을 비교하는 적용 경계가 오래된 결과의 덮어쓰기를 차단합니다.취소와 폐기 로직이 복잡해질 수 있어 요청 수명과 오류 상태를 함께 설계해야 합니다.응답 순서를 뒤집고 이전 요청을 성공과 실패로 각각 끝내 최신 목록과 안내가 유지되는지 확인하십시오.

CHAPTER 1 / 8

Type·unit·integration·E2E의 경계

검사 층은 서열이 아니라 서로 다른 실패를 더 싼 위치에서 찾는 방어선입니다.

이 개념이 필요해진 배경

Type check는 값 형태, unit test는 작은 계산, integration은 module·database·API 계약, E2E는 실제 browser에서 사용자가 보는 흐름을 확인합니다. 아래 층이 통과해도 위 경계의 serialization과 배포 설정은 틀릴 수 있습니다.

모든 경우를 E2E로만 만들면 느리고 원인 격리가 어렵고, mock unit만 있으면 실제 연결 오류를 놓칩니다. 결함이 처음 생기는 가장 낮은 층에 빠른 test를 두고 핵심 journey는 실제 경계로 보완합니다.

그림 6-2. Type·unit·integration·E2E의 경계의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

검사 층은 서열이 아니라 서로 다른 실패를 더 싼 위치에서 찾는 방어선입니다.

작동 원리

작은 범위의 빠른 feedback과 넓은 범위의 실제 통합 증거를 계층화합니다.

검증 증거

최근 결함마다 어느 gate가 처음 잡아야 했는지 분류하고 빈 경계를 찾습니다.

구체적인 시스템에서 따라가기

세금 계산 함수의 경계값은 unit test가 빠르게 확인할 수 있지만, JSON에서 금액 단위가 잘못 직렬화되거나 migration이 column을 누락한 문제는 integration 경계에서만 드러납니다. Browser E2E는 사용자가 버튼을 눌러 최종 결과를 보는 전체 경로를 확인하지만 실패 원인을 좁히는 비용이 큽니다. 같은 결함을 모든 층에 복제하기보다 가장 싸게 발견할 층과 반드시 지켜야 할 핵심 journey를 나눕니다.

검사 층을 설계할 때는 “몇 퍼센트가 unit인가”보다 최근 사고가 어디에서 빠져나갔는지 봅니다. Type은 맞았지만 authorization이 빠졌다면 contract와 abuse test가 필요하고, API는 맞았지만 keyboard로 제출하지 못했다면 browser test가 필요합니다. 결함 분류를 정기적으로 갱신해야 suite가 실제 risk를 따라갑니다.

선택 기준과 실패 경계

중복 fixture, 느린 suite와 서로 다른 환경의 drift를 관리해야 합니다.

피해야 할 오해: Test pyramid가 고정 비율이나 E2E 금지를 뜻한다는 생각은 틀립니다.

직접 검증하기

최근 결함마다 어느 gate가 처음 잡아야 했는지 분류하고 빈 경계를 찾습니다.

판정할 핵심작은 범위의 빠른 feedback과 넓은 범위의 실제 통합 증거를 계층화합니다.

이 장을 정리하면

검사 층은 서열이 아니라 서로 다른 실패를 더 싼 위치에서 찾는 방어선입니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Microsoft, 「Playwright Best Practices검토일 2026-08-28 · 적용 범위 공식 문서 최신판

CHAPTER 2 / 8

Unit test와 결정성

좋은 unit test는 구현 줄을 복제하지 않고 입력과 관찰 가능한 계약을 빠르게 고립합니다.

이 개념이 필요해진 배경

시간, random, global state와 network를 명시적 dependency로 만들면 같은 입력이 같은 결과를 내게 할 수 있습니다. 경계값, invalid input과 invariant를 표로 만들고 test name에 기대 행동을 씁니다.

Mock이 내부 호출 순서를 너무 자세히 고정하면 안전한 refactor도 실패하고 실제 결과가 틀려도 통과할 수 있습니다. Pure calculation은 값으로, boundary adapter는 contract와 작은 integration으로 검증합니다.

그림 6-3. Unit test와 결정성의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

좋은 unit test는 구현 줄을 복제하지 않고 입력과 관찰 가능한 계약을 빠르게 고립합니다.

작동 원리

Dependency를 제어하고 input-output contract를 좁혀 빠르고 재현 가능한 failure를 만듭니다.

검증 증거

Mutation이나 의도적 결함을 넣어 test가 실제로 실패하는지 확인합니다.

구체적인 시스템에서 따라가기

현재 시간을 직접 읽는 만료 함수는 test 실행 시점마다 결과가 달라집니다. Clock을 입력 dependency로 전달하면 만료 직전, 정확한 경계와 만료 후를 같은 값으로 반복할 수 있습니다. Random ID, environment variable과 global cache도 같은 방식으로 제어해야 실패가 code 때문인지 환경 때문인지 분리됩니다.

Mock은 외부 결제 호출을 막는 데 유용하지만 내부 helper가 몇 번 불렸는지만 검사하면 구현을 그대로 복제합니다. 입력과 반환된 업무 결과, 저장된 state처럼 사용자가 관찰할 계약을 우선 확인하고 adapter 자체는 실제 protocol에 가까운 contract test로 보완합니다. Mutation을 넣었는데 test가 계속 통과한다면 coverage 숫자와 관계없이 중요한 assertion이 빠진 것입니다.

선택 기준과 실패 경계

과도한 mock과 구현 결합이 거짓 안정성과 유지 비용을 만듭니다.

피해야 할 오해: Line coverage 100%가 모든 의미 경로를 검증한다는 생각은 틀립니다.

직접 검증하기

Mutation이나 의도적 결함을 넣어 test가 실제로 실패하는지 확인합니다.

판정할 핵심Dependency를 제어하고 input-output contract를 좁혀 빠르고 재현 가능한 failure를 만듭니다.

이 장을 정리하면

좋은 unit test는 구현 줄을 복제하지 않고 입력과 관찰 가능한 계약을 빠르게 고립합니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Microsoft, 「Playwright Assertions검토일 2026-08-28 · 적용 범위 공식 문서 최신판
  2. Microsoft, 「TypeScript Handbook검토일 2026-08-28 · 적용 범위 공식 문서 최신판

CHAPTER 3 / 8

API·schema·integration test

통합 test의 목적은 구성요소가 존재하는지보다 서로 같은 계약을 이해하는지 확인하는 것입니다.

이 개념이 필요해진 배경

Provider와 consumer가 status, schema, error, auth와 version을 같은 의미로 사용하는지 확인합니다. Database migration은 이전·새 code version이 coexist하는 rollout 조건과 rollback 가능성을 test해야 합니다.

Test container나 임시 database는 실제 engine 동작을 확인하면서 data를 격리합니다. Production dump를 그대로 쓰지 말고 최소 fixture와 익명화된 representative case로 constraint와 query plan을 검증합니다.

그림 6-4. API·schema·integration test의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

통합 test의 목적은 구성요소가 존재하는지보다 서로 같은 계약을 이해하는지 확인하는 것입니다.

작동 원리

실제 boundary serialization과 state transition을 격리 환경에서 실행합니다.

검증 증거

Old consumer-new provider와 new consumer-old provider 조합에서 중요한 contract를 실행합니다.

구체적인 시스템에서 따라가기

Consumer가 `status: "paid"`를 기대하는데 provider가 enum을 `completed`로 바꾸면 JSON schema가 각각 유효해도 함께 실행할 때 실패합니다. Contract test는 실제 consumer 기대와 provider 응답을 version별로 비교해야 합니다. Error status, retry header, pagination과 authorization도 정상 response만큼 계약의 일부입니다.

Database 변경은 특히 시간축을 포함합니다. 먼저 nullable column을 추가한 뒤 old code와 new code가 함께 읽고 쓸 수 있는지 확인하고, backfill이 끝난 뒤에만 not-null을 강제하는 방식이 필요할 수 있습니다. Migration test는 빈 database뿐 아니라 대표 크기의 기존 data, 중단 후 재실행과 rollback 조건을 검증해야 운영 배포를 설명할 수 있습니다.

선택 기준과 실패 경계

환경 시작 시간, fixture drift와 외부 service 불안정이 비용이 됩니다.

피해야 할 오해: Schema 파일이 같으면 consumer와 provider가 호환된다는 생각은 틀립니다.

직접 검증하기

Old consumer-new provider와 new consumer-old provider 조합에서 중요한 contract를 실행합니다.

판정할 핵심실제 boundary serialization과 state transition을 격리 환경에서 실행합니다.

이 장을 정리하면

통합 test의 목적은 구성요소가 존재하는지보다 서로 같은 계약을 이해하는지 확인하는 것입니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Microsoft, 「TypeScript Handbook검토일 2026-08-28 · 적용 범위 공식 문서 최신판
  2. Microsoft, 「Playwright Best Practices검토일 2026-08-28 · 적용 범위 공식 문서 최신판

CHAPTER 4 / 8

Playwright로 사용자 행동 검증

Browser test는 CSS selector가 아니라 사용자가 인식하는 role·label·결과를 중심으로 기다리고 assertion합니다.

이 개념이 필요해진 배경

Web-first assertion은 element가 기대 상태가 될 때까지 재시도해 임의 sleep보다 실제 UI 신호를 사용합니다. Role과 accessible name selector는 화면 의미를 test하면서 접근성 문제도 드러냅니다.

각 test는 독립된 browser context와 data를 사용하고 third-party는 통제 가능한 경계에서 stub합니다. 핵심 로그인·구매는 실제 application path를 확인하되 외부 결제 side effect를 production에 보내지 않습니다.

그림 6-5. Playwright로 사용자 행동 검증의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

Browser test는 CSS selector가 아니라 사용자가 인식하는 role·label·결과를 중심으로 기다리고 assertion합니다.

작동 원리

Browser가 실제 DOM·event·network를 실행하고 사용자 관찰 결과가 될 때까지 assertion합니다.

검증 증거

Keyboard, mobile viewport, 느린 response와 오류 response에서 같은 journey를 검증합니다.

구체적인 시스템에서 따라가기

Playwright에서 `button`의 CSS class를 찾는 test는 디자인 refactor에 쉽게 깨지면서도 사용자가 인식할 label이 사라진 문제는 놓칠 수 있습니다. `getByRole("button", { name: "주문 제출" })`처럼 접근 가능한 role과 이름으로 찾고, 클릭 뒤 주문 번호와 상태가 보이는지 확인하면 test가 사용자 계약에 가까워집니다.

Browser test의 기다림도 업무 신호를 따라야 합니다. 3초 sleep은 빠른 환경을 낭비하고 느린 환경에서는 여전히 실패하지만, 성공 message나 network response와 연결된 assertion은 조건이 충족되는 순간 끝납니다. 각 test에 독립 account와 order를 만들고 완료 후 정리하면 병렬 실행과 재시도에서도 이전 state가 결과를 오염시키지 않습니다.

선택 기준과 실패 경계

느린 실행, data 격리와 환경 의존성이 생깁니다.

피해야 할 오해: Element가 DOM에 존재하면 사용자가 작업을 완료할 수 있다는 생각은 틀립니다.

직접 검증하기

Keyboard, mobile viewport, 느린 response와 오류 response에서 같은 journey를 검증합니다.

판정할 핵심Browser가 실제 DOM·event·network를 실행하고 사용자 관찰 결과가 될 때까지 assertion합니다.

이 장을 정리하면

Browser test는 CSS selector가 아니라 사용자가 인식하는 role·label·결과를 중심으로 기다리고 assertion합니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Microsoft, 「Playwright Assertions검토일 2026-08-28 · 적용 범위 공식 문서 최신판
  2. Microsoft, 「Playwright Best Practices검토일 2026-08-28 · 적용 범위 공식 문서 최신판

CHAPTER 5 / 8

AI 수정 loop와 release gate

AI가 test를 작성했다면 그 test도 독립 evidence와 의도적 실패로 검증해야 합니다.

이 개념이 필요해진 배경

먼저 결함을 재현하는 red test를 보고 최소 변경으로 green을 만든 뒤 영향 범위 전체를 실행합니다. Agent가 test 기대값을 잘못된 결과에 맞춰 바꾸지 않았는지 diff와 requirement를 대조합니다.

Release evidence에는 source revision, test command·result, build artifact, security·accessibility check와 남은 risk가 포함됩니다. 실패한 gate를 단순 재시도로 숨기지 않고 원인과 recovery를 기록합니다.

그림 6-6. AI 수정 loop와 release gate의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

AI가 test를 작성했다면 그 test도 독립 evidence와 의도적 실패로 검증해야 합니다.

작동 원리

Reproducible command와 immutable revision이 code change를 관찰 가능한 결과에 연결합니다.

검증 증거

Test 자체에 mutation을 넣고 requirement와 독립된 oracle이 실패를 잡는지 확인합니다.

구체적인 시스템에서 따라가기

AI가 production 오류를 고칠 때는 먼저 사용자가 관찰한 실패를 자동 test로 옮기고 그 test가 기존 revision에서 실패하는지 확인해야 합니다. Agent가 code와 test 기대값을 동시에 바꾸면 잘못된 결과를 새로운 정답으로 만들 수 있으므로 issue의 acceptance criterion이나 독립 oracle과 diff를 대조합니다.

Release gate에는 성공한 명령 이름만이 아니라 실행한 source revision, dependency lock, build artifact digest와 결과 파일이 연결되어야 합니다. 간헐 실패를 재시도로 감추거나 영향 test를 임의로 제외하면 green 표시의 의미가 사라집니다. 배포 뒤에는 같은 대표 journey와 운영 metric으로 regression이 없는지 확인하고 임계값을 넘으면 자동 중단하거나 rollback합니다.

선택 기준과 실패 경계

Suite 비용과 false positive를 줄이려면 ownership과 지속적인 정리가 필요합니다.

피해야 할 오해: AI가 만든 test는 AI가 만든 code를 객관적으로 검증한다는 생각은 틀립니다.

직접 검증하기

Test 자체에 mutation을 넣고 requirement와 독립된 oracle이 실패를 잡는지 확인합니다.

판정할 핵심Reproducible command와 immutable revision이 code change를 관찰 가능한 결과에 연결합니다.

이 장을 정리하면

AI가 test를 작성했다면 그 test도 독립 evidence와 의도적 실패로 검증해야 합니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Anthropic, 「Demystifying Evals for AI Agents검토일 2026-08-28 · 적용 범위 공식 문서 최신판
  2. Microsoft, 「Playwright Best Practices검토일 2026-08-28 · 적용 범위 공식 문서 최신판

CHAPTER 6 / 8

정답을 만드는 경로를 구현과 분리합니다

같은 계산을 복사한 검사는 같은 오류를 승인하므로 요구 조건에서 독립된 기대값을 만듭니다.

이 개념이 필요해진 배경

AI가 할인 계산과 테스트를 함께 작성하면 두 파일이 같은 잘못된 반올림 규칙을 공유할 수 있습니다. 테스트가 통과하는 이유를 알려면 어떤 문서와 사람이 기대값을 정했는지 먼저 확인합니다. 비교 대상 두 개가 있다는 사실만으로 독립된 검증이 생기지는 않습니다.

Oracle은 결과의 옳고 그름을 판정하는 기준입니다. 계산 프로그램의 출력을 그대로 기대값으로 저장하면 현재 동작을 보존하는 검사는 되지만 요구 충족 검사는 되지 못합니다. 변경 전에 정책의 적용 순서와 경계값을 작은 표로 확정합니다.

표에는 정상 입력만 넣지 않습니다. 할인 적용 전후의 최소 금액, 빈 품목, 음수 수량처럼 의미가 달라지는 지점을 선택합니다. 허용하지 않는 입력은 임의의 금액으로 바꾸지 않고 거절 상태와 사용자 안내까지 기대 결과로 적습니다.

하나의 정확한 답을 적기 어려운 기능에는 변환 전후 관계를 사용할 수 있습니다. 교육용 정렬 함수라면 입력 순서를 뒤집어도 정렬된 값의 집합은 같아야 합니다. 다만 중복 제거가 허용되는지처럼 관계가 성립하는 전제도 함께 써야 합니다.

그림 6-7. 정답을 만드는 경로를 구현과 분리합니다의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

같은 계산을 복사한 검사는 같은 오류를 승인하므로 요구 조건에서 독립된 기대값을 만듭니다.

작동 원리

요구 문서에서 만든 입력·기대값 표가 구현과 테스트 사이의 공통 오해를 끊습니다.

검증 증거

배송비 정책의 경계 표를 작성하고 잘못된 비교 연산을 넣었을 때 실패하는 행을 표시하십시오.

구체적인 시스템에서 따라가기

교육용 배송비 정책은 할인 후 상품 합계가 30,000원 이상이면 무료라고 가정합니다. 원가 32,000원에 할인 3,000원이 적용되면 비교 대상은 29,000원입니다. 원가로 무료 배송을 판정하는 구현과 그 구현을 복사한 테스트는 함께 통과할 수 있습니다. 배송비 금액 자체는 별도 정책값으로 두어 무료 조건과 요금표 변경을 혼동하지 않게 합니다.

검토자는 정책 문장의 할인 후라는 조건을 계산표에 표시하고 배송비가 부과되는 기대값을 직접 정합니다. 개발자는 그 표의 식별자를 테스트 이름에 연결합니다. 코드 수정자가 정책도 바꿨다면 동작 수정과 요구 변경을 같은 것으로 취급하지 않고 별도 검토합니다. 표의 승인 날짜도 남겨 나중에 정책 개정으로 기대값이 바뀐 경우를 회귀 결함과 구분합니다.

반대로 출력 전체를 고정한 화면 스냅샷은 날짜 문구가 바뀔 때도 실패할 수 있습니다. 배송비 규칙을 검증하려는 목적이라면 금액과 적용 이유를 직접 확인하는 편이 원인을 좁힙니다. 문구와 배치가 요구인 경우에만 해당 스냅샷을 별도 근거로 유지합니다. 관련 없는 화면 변화가 검사 실패를 반복하면 담당자가 진짜 금액 오류까지 무시할 수 있습니다.

검증을 마치려면 비교 연산을 의도적으로 바꾼 후보가 경계 테스트에서 실패하는지 확인합니다. 30,000원과 29,999원을 함께 넣으면 이상과 초과를 혼동한 결함을 구분할 수 있습니다. 이 실패 기록을 남겨야 테스트가 단순 실행 확인을 넘어 정책을 감시한다는 근거가 생깁니다. 경계 안팎의 결과를 함께 보아야 테스트가 항상 같은 값만 반환하는 가짜 구현도 거부합니다.

선택 기준과 실패 경계

정책 소유자의 검토 시간이 필요하며 정책이 모호하면 코드보다 먼저 기준을 보완해야 합니다.

피해야 할 오해: 다른 파일에 쓴 계산이면 독립 검사라는 생각은 틀립니다. 같은 식을 복사하면 오류도 공유합니다.

직접 검증하기

배송비 정책의 경계 표를 작성하고 잘못된 비교 연산을 넣었을 때 실패하는 행을 표시하십시오.

판정할 핵심요구 문서에서 만든 입력·기대값 표가 구현과 테스트 사이의 공통 오해를 끊습니다.

이 장을 정리하면

같은 계산을 복사한 검사는 같은 오류를 승인하므로 요구 조건에서 독립된 기대값을 만듭니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Microsoft, 「Playwright Best Practices검토일 2026-08-28 · 적용 범위 공식 문서 최신판
  2. Anthropic, 「Demystifying Evals for AI Agents검토일 2026-08-28 · 적용 범위 공식 문서 최신판

CHAPTER 7 / 8

간헐적 실패를 재시도 횟수 대신 사건 기록으로 진단합니다

첫 실패의 상태와 시간 순서를 보존해야 재실행이 원인을 지우지 않습니다.

이 개념이 필요해진 배경

간헐적으로 실패하는 테스트는 동일한 이름 아래 서로 다른 실행 조건을 숨길 수 있습니다. 공유 계정, 이전 실행의 데이터, 응답 순서와 시간대가 대표적인 차이입니다. 실패를 불운으로 부르기 전에 어느 조건이 달랐는지 비교 가능한 기록을 만듭니다.

실패 사건에는 코드 revision, 브라우저 버전, 테스트 데이터 식별자와 처음 어긋난 관찰값이 필요합니다. 최종 오류 메시지만 남기면 그 이전의 잘못된 화면 전환을 찾기 어렵습니다. Trace와 네트워크 기록은 가설을 만드는 자료이며 원인 자체를 자동 판정하지는 않습니다.

원인 후보를 줄일 때는 한 번에 한 조건만 바꿉니다. 병렬 실행을 끄자 통과했다면 경쟁 상태나 공유 데이터라는 가설이 강해지지만 아직 증명은 아닙니다. 각 테스트에 별도 계정을 배정한 상태에서 병렬 실행을 다시 켜야 격리 가설을 확인할 수 있습니다.

일시 격리는 해당 실패가 감시하던 사용자 위험을 제거하지 않습니다. 격리 항목에는 담당자, 재현 조건, 대체 확인과 재통합 조건을 적습니다. 성공률 집계에서 조용히 빼면 제품이 좋아진 것이 아니라 보이지 않는 영역이 늘어난 것입니다.

그림 6-8. 간헐적 실패를 재시도 횟수 대신 사건 기록으로 진단합니다의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

첫 실패의 상태와 시간 순서를 보존해야 재실행이 원인을 지우지 않습니다.

작동 원리

첫 불일치와 공유 자원 식별자를 연결하면 시간 초과 뒤에 숨은 경쟁을 찾을 수 있습니다.

검증 증거

공유 계정과 격리 계정의 병렬 실행 기록을 비교하고 처음 달라지는 요청을 지목하십시오.

구체적인 시스템에서 따라가기

교육용 계정 설정 테스트 두 개가 같은 사용자의 표시 이름을 바꾼다고 가정합니다. 각각은 저장 완료를 기다리지만 병렬 실행에서는 상대 테스트가 마지막 값을 덮어씁니다. 버튼 대기 시간을 늘려도 공유된 데이터 소유권은 달라지지 않습니다. 공유 계정을 단독 실행할 때는 충돌이 없으므로 로컬 성공이 병렬 실행 안전성을 입증하지 못합니다.

실패한 실행의 요청 본문과 응답 뒤 조회값을 비교하면 두 개의 다른 이름이 같은 사용자 식별자로 기록됩니다. 별도 계정으로 바꾼 뒤 같은 병렬도와 응답 지연을 유지합니다. 저장 성공 안내와 새로고침 후 이름이 모두 맞으면 경쟁 조건을 제거했다는 근거가 됩니다. 각 요청의 소유 계정까지 기록하면 다른 테스트의 저장 결과를 성공으로 읽는 경우도 구분합니다.

반례로 외부 서비스가 테스트 시간에 실제로 중단됐다면 계정 격리만으로는 복구되지 않습니다. 내부 화면 동작 검사는 통제된 오류 응답으로 고정하고 외부 연결 검사는 별도 계약으로 나눕니다. 그래야 외부 장애와 앱의 잘못된 오류 안내가 같은 실패 이름에 섞이지 않습니다. 외부 대역의 오류 코드와 본문은 앱이 처리해야 하는 실제 계약에 맞춰야 진단 가치가 있습니다.

마지막에는 실패했던 병렬 조건을 다시 실행하고 최초 실패 기록과 수정 후 기록을 나란히 둡니다. 재시도 없이 성공한 결과와 데이터 충돌이 사라진 관찰을 함께 남깁니다. 실행 횟수만 늘린 결과는 원인 제거의 대체 증거가 아닙니다. 격리한 데이터가 실행 뒤 정리되는지도 확인해 다음 실행에 남는 상태가 다시 원인이 되지 않게 합니다.

선택 기준과 실패 경계

진단 자료에는 계정 정보가 남을 수 있으므로 가명 데이터와 접근 제한이 필요합니다.

피해야 할 오해: 재시도 후 통과했으므로 결함이 없다는 결론은 틀립니다. 조건이 우연히 달라졌을 수 있습니다.

직접 검증하기

공유 계정과 격리 계정의 병렬 실행 기록을 비교하고 처음 달라지는 요청을 지목하십시오.

판정할 핵심첫 불일치와 공유 자원 식별자를 연결하면 시간 초과 뒤에 숨은 경쟁을 찾을 수 있습니다.

이 장을 정리하면

첫 실패의 상태와 시간 순서를 보존해야 재실행이 원인을 지우지 않습니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Microsoft, 「Playwright Best Practices검토일 2026-08-28 · 적용 범위 공식 문서 최신판

CHAPTER 8 / 8

늦은 응답이 최신 사용자 선택을 덮지 않게 검증합니다

비동기 화면의 정답은 마지막 도착 응답이 아니라 현재 선택에 대응하는 결과입니다.

이 개념이 필요해진 배경

검색어를 빠르게 바꾸는 화면에서는 요청 순서와 응답 순서가 다를 수 있습니다. 첫 요청이 느리면 두 번째 결과가 보인 뒤 이전 결과가 다시 나타납니다. 개별 요청이 모두 성공해도 사용자는 현재 입력과 다른 정보를 보게 됩니다.

화면 상태에는 검색어뿐 아니라 그 결과를 만든 요청의 식별도 필요합니다. 응답을 반영하는 시점에 현재 선택과 여전히 일치하는지 확인합니다. 요청 취소는 낭비를 줄일 수 있지만 취소가 늦었거나 서버 작업이 계속되는 경우도 결과 검증이 필요합니다.

테스트는 네트워크 전체가 조용해질 때까지 기다리는 대신 해당 선택의 완료 신호를 관찰합니다. 입력값, 결과 제목과 오류 안내가 같은 요청 세대에 속하는지 확인합니다. 오래된 실패 응답이 새 성공 화면을 오류로 바꾸는 경우도 같은 계약에 포함합니다.

이 계약은 검색 외에도 미리보기, 배송 지역 선택과 문서 전환에 적용됩니다. 화면을 떠난 뒤 완료된 요청이 새 화면의 상태를 바꾸지 않아야 합니다. 어떤 응답을 폐기했는지 진단할 수 있되 사용자에게 내부 요청 번호를 노출할 필요는 없습니다.

그림 6-9. 늦은 응답이 최신 사용자 선택을 덮지 않게 검증합니다의 판단 흐름문제 조건에서 작동 원리와 검증 증거까지 이어지는 관계입니다.
문제와 선택 조건

비동기 화면의 정답은 마지막 도착 응답이 아니라 현재 선택에 대응하는 결과입니다.

작동 원리

현재 요청 식별과 응답 식별을 비교하는 적용 경계가 오래된 결과의 덮어쓰기를 차단합니다.

검증 증거

응답 순서를 뒤집고 이전 요청을 성공과 실패로 각각 끝내 최신 목록과 안내가 유지되는지 확인하십시오.

구체적인 시스템에서 따라가기

교육용 도서 검색에서 먼저 입력한 바다의 응답을 보류하고 나중에 입력한 산의 응답을 먼저 반환합니다. 산 목록이 나타난 뒤 바다 응답을 풀어 줍니다. 최종 입력과 결과가 모두 산이면 오래된 성공 응답을 무시한 것입니다. 두 결과의 제목과 항목을 다르게 만들어 입력만 바뀌고 목록은 그대로인 거짓 통과도 구분합니다.

반례는 성공 응답만 제어하는 테스트입니다. 이전 바다 요청을 오류로 끝내면 현재 산 결과가 사라질 수도 있습니다. 이전 성공과 이전 실패 두 경로를 별도 실행해야 응답 상태에 관계없이 최신 선택을 지킨다는 근거가 생깁니다. 오류 안내가 최신 요청 식별자에 묶이지 않았다면 성공 목록을 지켜도 잘못된 경고가 남을 수 있습니다.

접근성 관찰도 같은 흐름에 포함합니다. 결과 수 안내가 오래된 목록의 수를 읽거나 로딩 표시가 영원히 남으면 시각적 목록만 맞아도 완료가 아닙니다. 현재 요청의 목록, 로딩 종료와 보조기술 안내를 함께 확인합니다. 화면에 나타난 상태와 보조기술이 읽는 상태가 같은 요청을 설명하는지 확인하는 것이 목적입니다.

검증 자료에는 요청을 잡은 순서, 풀어 준 순서와 각 시점의 기대 상태를 적습니다. 임의의 긴 대기 시간 대신 제어한 응답과 화면 조건을 연결합니다. 실패를 수정한 뒤에도 응답 순서를 그대로 유지해야 회귀 방지 여부를 비교할 수 있습니다. 새 화면으로 이동한 뒤 보류 응답을 풀어 주는 추가 경로는 화면 수명 경계까지 확인하게 합니다.

선택 기준과 실패 경계

취소와 폐기 로직이 복잡해질 수 있어 요청 수명과 오류 상태를 함께 설계해야 합니다.

피해야 할 오해: HTTP 성공이면 화면에 반영해도 된다는 생각은 틀립니다. 현재 선택에 대한 응답인지도 확인해야 합니다.

직접 검증하기

응답 순서를 뒤집고 이전 요청을 성공과 실패로 각각 끝내 최신 목록과 안내가 유지되는지 확인하십시오.

판정할 핵심현재 요청 식별과 응답 식별을 비교하는 적용 경계가 오래된 결과의 덮어쓰기를 차단합니다.

이 장을 정리하면

비동기 화면의 정답은 마지막 도착 응답이 아니라 현재 선택에 대응하는 결과입니다.

이 장의 공식 출처

본문의 기술 사실은 다음 1차 자료를 기준으로 검토했습니다. 도해와 비교는 이 자료를 바탕으로 저자가 재구성했습니다.

  1. Microsoft, 「Playwright Assertions검토일 2026-08-28 · 적용 범위 공식 문서 최신판
  2. Microsoft, 「Playwright Best Practices검토일 2026-08-28 · 적용 범위 공식 문서 최신판

INTERACTIVE LAB 1 / 2

실습 1 · 통과하지만 의미 없는 test 고치기

결제 버튼 test가 `button`이 존재하는지만 확인합니다. 실제 defect는 두 번 클릭하면 주문이 두 번 생성되는 것입니다.

회귀를 직접 잡는 검증을 고르세요.

답 선택

정답 A

A. 두 번 클릭·느린 응답을 재현하고 하나의 idempotency key와 주문 1건, 중복 방지 UI를 확인합니다.조건과 작동 원리, 실패 경계까지 함께 반영한 판단입니다.

B. Button의 CSS color만 snapshot합니다.일부 장점만 보고 전제 조건이나 새로 생기는 실패 경계를 빠뜨렸습니다.

C. Test timeout을 늘리고 존재 assertion만 유지합니다.서로 다른 계층의 책임을 하나로 간주해 실제 검증 지점을 놓칩니다.

D. Coverage 숫자만 100%로 올립니다.기술 이름이나 유행을 근거로 삼았지만 현재 요구의 관찰 가능한 증거가 없습니다.

INTERACTIVE LAB 2 / 2

실습 2 · 응답 역전 기록에서 회귀 검사를 설계합니다

가상 도서 검색에서 바다 요청 뒤 산 요청을 보냈습니다. 산 목록이 먼저 나온 뒤 늦은 바다 오류가 전체 화면을 오류로 바꿉니다. 현재 테스트는 산 목록이 잠깐 보였다는 사실만 확인합니다.

기존 테스트가 놓친 조건을 직접 검증하는 수정안을 고르고, 최신 요청의 최종 상태가 왜 판정 기준인지 설명하십시오.

답 선택

정답 B

A. 모든 응답이 끝나도록 대기 시간을 늘리고 기존 존재 검사만 유지합니다.시간이 늘어도 오래된 오류가 최신 결과를 덮는지 검사하지 않으므로 같은 결함을 승인할 수 있습니다.

B. 늦은 바다 오류를 주입한 뒤 산 입력·산 목록·로딩 종료·오류 없음이 유지되는지 확인합니다.현재 선택에 대응하는 최종 상태와 오래된 실패의 폐기를 함께 관찰하므로 실제 사용자 결함을 직접 잡습니다.

C. 바다 요청을 테스트에서 제거하고 산 검색만 실행합니다.경쟁하는 이전 요청이 사라져 재현 조건을 잃으므로 단독 검색 성공은 응답 역전 안전성을 증명하지 않습니다.

D. 화면 오류 문구를 테스트 기대값으로 바꿉니다.요구는 최신 검색 결과 유지인데 현재 결함에 기대값을 맞추면 구현과 검사가 같은 오류를 공유합니다.

KEY TERMS

이번 단원 핵심 용어

Type·unit·integration·E2E의 경계
작은 범위의 빠른 feedback과 넓은 범위의 실제 통합 증거를 계층화합니다.
Unit test와 결정성
Dependency를 제어하고 input-output contract를 좁혀 빠르고 재현 가능한 failure를 만듭니다.
API·schema·integration test
실제 boundary serialization과 state transition을 격리 환경에서 실행합니다.
Playwright로 사용자 행동 검증
Browser가 실제 DOM·event·network를 실행하고 사용자 관찰 결과가 될 때까지 assertion합니다.
AI 수정 loop와 release gate
Reproducible command와 immutable revision이 code change를 관찰 가능한 결과에 연결합니다.
정답을 만드는 경로를 구현과 분리합니다
요구 문서에서 만든 입력·기대값 표가 구현과 테스트 사이의 공통 오해를 끊습니다.
간헐적 실패를 재시도 횟수 대신 사건 기록으로 진단합니다
첫 불일치와 공유 자원 식별자를 연결하면 시간 초과 뒤에 숨은 경쟁을 찾을 수 있습니다.
늦은 응답이 최신 사용자 선택을 덮지 않게 검증합니다
현재 요청 식별과 응답 식별을 비교하는 적용 경계가 오래된 결과의 덮어쓰기를 차단합니다.

UNIT WORKBOOK

개념을 새로운 상황에 적용하는 문제와 기록지

기본 원리 확인에서 시작해 실제 업무 판단으로 확장합니다. 답을 제출하면 정답만이 아니라 모든 선택지가 맞거나 틀린 이유를 확인할 수 있습니다.

THREE-LEVEL ASSESSMENT

기본 원리에서 운영 판단까지

답을 제출하면 정답만이 아니라 모든 선택지가 맞거나 틀린 이유를 확인할 수 있습니다.

기본 문제 1

Web-first assertion의 이점은 무엇인가요?

답 선택

정답 B

A. Test data를 공유합니다.기술 이름이나 유행을 근거로 삼았지만 현재 요구의 관찰 가능한 증거가 없습니다.

B. 고정 sleep 대신 사용자에게 보일 기대 상태가 될 때까지 조건을 재확인합니다.조건과 작동 원리, 실패 경계까지 함께 반영한 판단입니다.

C. 모든 network를 production으로 보냅니다.일부 장점만 보고 전제 조건이나 새로 생기는 실패 경계를 빠뜨렸습니다.

D. 접근성 이름을 무시합니다.서로 다른 계층의 책임을 하나로 간주해 실제 검증 지점을 놓칩니다.

적용 문제 2

Mock이 구현 내부 호출 순서만 검사할 때 생기는 문제는 무엇인가요?

답 선택

정답 C

A. Runtime schema가 자동 생성됩니다.서로 다른 계층의 책임을 하나로 간주해 실제 검증 지점을 놓칩니다.

B. Browser 호환성이 증명됩니다.기술 이름이나 유행을 근거로 삼았지만 현재 요구의 관찰 가능한 증거가 없습니다.

C. 실제 결과 오류를 놓치고 안전한 refactor에도 test가 깨질 수 있습니다.조건과 작동 원리, 실패 경계까지 함께 반영한 판단입니다.

D. Test가 항상 더 빠르고 정확해집니다.일부 장점만 보고 전제 조건이나 새로 생기는 실패 경계를 빠뜨렸습니다.

종합 문제 3

AI 생성 code의 release evidence로 충분한 것은 무엇인가요?

답 선택

정답 D

A. Agent의 완료 문장입니다.일부 장점만 보고 전제 조건이나 새로 생기는 실패 경계를 빠뜨렸습니다.

B. 한 번의 type check만입니다.서로 다른 계층의 책임을 하나로 간주해 실제 검증 지점을 놓칩니다.

C. 변경 줄 수가 많다는 사실입니다.기술 이름이나 유행을 근거로 삼았지만 현재 요구의 관찰 가능한 증거가 없습니다.

D. Requirement에 연결된 재현 test, 전체 gate, immutable build와 남은 risk 기록입니다.조건과 작동 원리, 실패 경계까지 함께 반영한 판단입니다.

PRIMARY SOURCES

과정 참고문헌

장별 출처를 다시 모은 목록입니다. 본문의 설명과 저자 도해는 아래 원문을 직접 검토해 작성했습니다.

PERSONAL WORKSHEET

내 환경에 옮겨 적는 학습 기록지

입력 내용은 현재 브라우저 화면에만 머물며 저장하거나 외부로 전송하지 않습니다. 민감한 실제 정보 대신 범주와 가명을 사용하십시오.

OFFICIAL SOURCES

공식 자료에서 다시 확인하기

기술·호환성·모델 정보 검토 연월: 2026년 8월

LEARNING RECORD

본문·판단 활동·모든 해설을 확인했나요?

완료 기록은 이 브라우저에만 저장됩니다.