본문으로 건너뛰기
고급약 35분

성능 리포팅과 튜닝 사이클

성능 개선은 "더 빨라질 때까지"가 아니라 합의된 종료 조건에서 멈춘다. 측정·개선·재측정 사이클의 종료 조건을 정하고, 같은 워크로드·데이터·환경·워밍업·반복 횟수로 전후 비교를 믿을 수 있게 만들고, p95·p99와 오류율·자원 여유를 함께 담은 한 장짜리 리포트를 쓰고, 성능 회귀를 CI에 거는 현실적인 임계값과 기준선 갱신 규칙을 익힌다.

  • #성능리포트
  • #튜닝사이클
  • #백분위
  • #성능회귀
  • #CI

개념

사이클은 언제 멈추는가

레슨 3의 마지막에서 확인한 사실이 하나 있다. 병목은 하나를 고치면 반드시 다음 것이 드러난다. DB 쿼리를 고치면 앱 CPU가 1위가 되고, 그걸 고치면 직렬화가 1위가 된다. 그래서 "느린 곳이 없어질 때까지"를 종료 조건으로 두면 사이클은 끝나지 않는다. 성능 개선에서 진짜 어려운 결정은 "무엇을 고칠까"가 아니라 "이제 멈춰도 되는가" 다.

멈추는 근거는 넷이고, 앞쪽일수록 강하다.

종료 조건판정 문장강도
요구사항 충족레슨 2의 PERF-01·02를 자원 여유 조건까지 포함해 통과가장 강함
수확 체감다음 후보의 예상 개선폭이 전체 p95의 5% 미만강함
비용 역전개선 공수·위험이 인프라 증설 비용보다 큼강함
병목이 통제 밖남은 1위가 외부 API·단말·법정 절차처럼 우리가 못 바꾸는 구간조건부

"요구사항 충족"에 자원 여유 조건이 함께 들어가야 한다. p95를 통과했지만 CPU가 95%라면 그것은 통과가 아니라 다음 스파이크에서 깨질 예약 이다. 레슨 2에서 요구사항에 "앱 CPU 평균 ≤ 70%"를 함께 적어 둔 이유가 이것이다.

네 번째는 종료가 아니라 이관 이다. 병목이 외부 결제 API라면 성능 개선 과제는 닫고, 대신 타임아웃·서킷브레이커·큐잉·사용자 안내 같은 설계 과제와 SLA 재협상 안건으로 넘긴다. "우리가 할 수 있는 일이 없다"와 "여기서 멈춘다"는 다르고, 리포트에는 후자로 적어야 한다.

한 사이클의 크기는 미리 정한다. 한 바퀴 = 가설 1개 · 변경 1개 · 재측정 1회 · 기록 1줄. 이 단위를 정해 두면 "성능 개선 2주"라는 일정이 "6바퀴"로 번역되고, 남은 바퀴 수로 진행률을 말할 수 있다.

전후 비교를 믿을 수 있게 만드는 조건

"p95가 1,420 ms에서 810 ms로 줄었습니다"가 참이 되려면, 두 측정이 같은 실험 이어야 한다. 실무에서 이 비교를 무효로 만드는 원인은 거의 정해져 있다.

고정해야 할 것어긋나면 생기는 일
워크로드 모델시나리오 비율·도착률이 바뀌면 숫자를 비교할 근거가 없다
데이터두 번째 실행 때 테이블이 커져 있거나, 캐시가 이미 더워져 있다
환경인스턴스 타입·이웃 부하·오토스케일 상태가 다르다
코드 외 변경그 사이에 들어간 다른 커밋·설정·인덱스가 섞인다
측정 지점·집계어제는 LB 로그, 오늘은 부하 도구 값을 봤다

여기에 세 가지 절차가 더 붙는다.

워밍업을 버린다. JIT 컴파일, 커넥션 풀 생성, 캐시 채우기, OS 페이지 캐시가 자리를 잡기까지 초반 응답은 정상보다 훨씬 느리다. 이 구간을 결과에 섞으면 p99가 통째로 오염된다. 워밍업 시간을 요구사항에 숫자로 적고(예: 5분), 집계에서 제외하고, 두 실행에서 같은 길이로 적용한다. 반대로 워밍업만 재고 싶은 경우(배포 직후 첫 요청, 스케일아웃된 새 인스턴스)는 별도 시나리오로 따로 잰다 — 섞지 않는 것이 요점이다.

반복해서 잰다. 같은 조건으로 같은 부하를 세 번 돌리면 p95가 780 / 810 / 795처럼 흔들린다. 이 흔들림의 폭을 모르면 "810에서 770으로 줄었다"가 개선인지 잡음인지 판정할 수 없다. 그래서 순서가 이렇다.

1. 개선 전 조건으로 3~5회 반복 측정 → p95 의 분포(최소·중앙·최대)를 기록
   예) 개선 전 p95 : 1,380 / 1,420 / 1,455 / 1,410  → 중앙 1,415, 폭 ±38
2. 이 폭이 그 환경의 잡음 수준(noise floor)이다
3. 변경 후 같은 횟수로 반복 측정
   예) 개선 후 p95 :   795 /   810 /   788 /   822  → 중앙 802, 폭 ±17
4. 두 분포가 겹치지 않으면 개선으로 판정, 겹치면 "판정 불가"로 기록
   (1,380 과 822 는 겹치지 않는다 → 개선)

교차로 번갈아 돌린다. A→A→A→B→B→B 순서로 재면 중간에 생긴 환경 변화가 전부 B에 반영된다. A→B→A→B로 번갈아 돌리면 그 편향이 양쪽에 섞여 사라진다. 클라우드 환경처럼 이웃 부하를 통제할 수 없을 때 특히 효과가 크다.

평균의 함정과 백분위를 오해하는 방식

성능 결과의 통계적 성질은 모듈 31 레슨 4에서 다뤘다. 여기서는 개선 판정과 보고에서 반복되는 오해 네 가지 만 짚는다.

평균만 보고하면 개선의 방향조차 틀릴 수 있다. 캐시를 넣어 90%의 요청이 5 ms로 빨라지고 나머지 10%는 캐시 미스 경로가 추가되어 1,200 ms가 됐다면, 평균은 크게 좋아지고 p99는 나빠진다. 평균만 적힌 리포트는 "개선"으로 승인되고, 장애는 그 10%에서 난다.

백분위는 더하거나 평균 낼 수 없다. 서버 3대의 p95가 1.2 / 1.4 / 1.3초라고 해서 전체 p95가 1.3초인 것이 아니다. 두 시간대의 p95를 평균해 "그날의 p95"라고 적는 것도 틀렸다. 합치려면 원본 분포(히스토그램)를 합친 뒤 다시 백분위를 계산해야 한다. 그래서 측정 도구가 백분위 값이 아니라 히스토그램을 내보내는지 확인하는 것이 중요하다.

구간별 p95를 합쳐 전체 응답 시간의 p95를 만들 수 없다. DB p95 180 ms + 앱 p95 150 ms = 전체 p95 330 ms가 아니다. 어떤 요청에서 DB가 느렸고 다른 요청에서 앱이 느렸을 수 있다. 계층별 p95는 어느 계층을 볼지 고르는 데 쓰고, 합산으로 쓰지 않는다. 레슨 2의 응답 시간 예산도 같은 이유로 "합이 800"이 아니라 "각 칸의 상한"으로 읽는다.

표본 수가 적으면 높은 백분위는 의미가 없다. 요청이 200건인데 p99를 적으면 사실상 가장 느린 2건을 보고하는 것이다. 개선 전후를 p99로 비교하려면 양쪽 모두 충분한 표본이 필요하고, 표본 수를 리포트에 함께 적어야 한다.

한 장짜리 성능 리포트

성능 리포트가 30장이면 아무도 안 읽고, 결론만 한 줄이면 아무도 못 믿는다. 한 장에 들어가야 하는 것은 정해져 있다.

성능 시험 결과 — 주문 조회 API 개선 (2026-09-25)
─────────────────────────────────────────────────────────
판정 : PERF-01 충족 (개선 전 미달 → 개선 후 충족)
변경 : 주문 목록의 users 조회를 건별(N+1) → 일괄 조회 1건 (PR #482)
 
조건 : 워크로드 모델 v1.2 '정상 부하'(19 rps, 믹스 7:2:1, 캐시 히트율 72%)
       staging-perf, c5.xlarge × 4, DB 동일 스냅샷(주문 4,180만 행)
       30분 측정 + 워밍업 5분 제외 · 각 4회 반복 · 중앙값 보고
       측정 지점 : API 게이트웨이 upstream_response_time
 
              기준(PERF-01)   개선 전        개선 후
  p50              —            420 ms        180 ms
  p95           ≤ 800 ms      1,415 ms        802 ms   ✔
  p99         ≤ 2,000 ms      3,780 ms      1,240 ms   ✔
  오류율        ≤ 0.5 %          0.9 %         0.02 %  ✔
  처리량           19 rps        18.4 rps      19.0 rps
  표본 수            —          33,120건      34,200건
  앱 CPU 평균     ≤ 70 %          88 %          41 %   ✔
  DB CPU 평균        —            76 %          22 %
  힙 사용률       ≤ 80 %          71 %          63 %   ✔
  GC 정지 p99    ≤ 200 ms        340 ms        110 ms  ✔
  요청당 쿼리 수    ≤ 5             41             3    ✔
 
반복 측정 분포(p95) : 개선 전 1,380~1,455 / 개선 후 788~822 — 겹치지 않음
남은 1위 병목 : 앱 직렬화(전체의 14%) — 예상 개선폭 3%로 수확 체감, 사이클 종료
잔여 위험 : 스파이크(121 rps) 미측정 — PERF-02는 다음 주 별도 시험

이 한 장의 구성 원칙은 셋이다. 첫째, 기준·전·후를 같은 표에 놓는다. "개선됐다"가 아니라 "기준을 넘겼다"가 판정이기 때문이다. 둘째, p95·p99와 오류율·자원 여유를 같은 표에 놓는다. 응답 시간만 있으면 "빠르지만 5%가 실패"나 "빠르지만 CPU 95%"를 걸러낼 수 없다. 셋째, 조건과 남은 위험을 적는다. 조건이 없으면 재현이 불가능하고, 잔여 위험이 없으면 이 리포트가 "성능 문제 없음"으로 잘못 인용된다.

빼야 할 것도 분명하다. 도구 화면 캡처, 실시간 그래프 원본, 개별 트레이스 목록, 튜닝 과정의 시행착오 는 첨부로 내린다. 그리고 평균 응답 시간 한 줄만 적는 칸은 만들지 않는다 — 넣더라도 p95·p99와 나란히 둔다.

성능 회귀를 CI 에 거는 법

한 번 개선한 성능은 다시 느려진다. 그래서 개선 결과를 회귀 시험으로 고정 하는 것이 사이클의 마지막 단계다. 여기서 다루는 것은 "이 변경이 성능을 나쁘게 만들었는가"의 판정 이고, 운영 중 경보 설계와 오류 예산 소진율은 모듈 37 레슨 9가 담당한다.

CI에서 부하 시험을 돌릴 때 부딪히는 현실은 하나다. 공용 러너의 측정값은 잡음이 크다. 이웃 작업, CPU 크레딧·스로틀, 컨테이너 한도, 네트워크가 실행마다 달라져 같은 코드로도 p95가 20~30% 흔들린다. 그래서 절대 임계값(p95 < 800ms)을 CI에 그대로 걸면 무작위로 빨간불이 켜지고, 팀은 곧 그 게이트를 무시한다.

현실적인 설정은 이렇다.

항목권장이유
판정 기준절대값이 아니라 기준선 대비 상대 변화환경 차이가 상쇄된다
임계값잡음 폭의 2배 이상 여유(예: 잡음 ±10%면 회귀 판정 +25%)오탐을 줄인다
반복같은 실행 안에서 3회, 중앙값 비교단발 이상치를 흡수한다
지표p95 + 오류율 + 요청당 쿼리 수·할당량 같은 구조 지표시간보다 안정적이다
실패 처리1차는 경고, 연속 2회 또는 재확인 실패 시 차단잡음으로 배포를 막지 않는다
기준선병합된 main 의 최근 N회 중앙값, 의도적 변경 시 갱신고정 상수는 금방 낡는다

구조 지표를 함께 거는 것이 실무에서 가장 효과가 좋다. "요청당 쿼리 수 ≤ 5", "요청당 할당 ≤ 2 MB", "외부 호출 수 ≤ 3" 같은 개수·양 기준은 러너 성능과 무관하게 재현되므로 잡음이 거의 없고, N+1 재발 같은 전형적 회귀를 시간 지표보다 먼저 잡는다.

기준선 갱신 규칙을 문서에 적어 둔다. 갱신 없이 두면 기준선이 낡아 정상 변경이 계속 회귀로 잡히고, 아무나 갱신하게 하면 회귀가 조용히 기준선에 흡수된다(이것이 성능이 서서히 나빠지는 가장 흔한 경로다). 규칙은 두 줄로 충분하다 — "기준선은 main 병합 시 자동 갱신하되, 이전 기준선보다 나빠지는 갱신은 PR 설명에 근거를 적고 리뷰어 승인을 받는다."

그리고 CI 부하 시험의 규모는 작아도 된다. 전체 용량 검증은 릴리스 전 전용 환경에서 하고, CI에서는 "구조가 나빠졌는가"를 빠르게 본다(예: 2분, 낮은 고정 rps). 무엇을 CI에 걸고 무엇을 릴리스 게이트로 미룰지 나누는 것이 실패하지 않는 설계다.

누구에게 무엇을 말하는가

같은 결과를 세 조직에 같은 말로 전하면 셋 다 못 쓴다.

대상알고 싶은 것전할 것전하지 말 것
경영진나가도 되나, 얼마 드나판정(충족/미달), 사용자 영향, 잔여 위험, 비용 효과(인스턴스 4대 → 2대)지표 이름, 도구, 트레이스
개발팀어디를 고치나병목 계층·근거 트레이스·구조 지표(쿼리 수 41 → 3), 재현 절차경영진용 요약 판정만
운영팀무엇을 감시하나새 자원 여유선, 임계값 후보, 스파이크 시 관찰 지점, 롤백 조건튜닝 과정의 시행착오

세 버전의 관계가 중요하다. 숫자는 하나여야 한다. 경영진 슬라이드의 "2배 개선"이 개발팀 표의 p95 1,415 → 802와 다른 근거에서 나오면 신뢰가 한 번에 무너진다. 한 장짜리 리포트를 정본으로 두고, 세 버전은 그 표에서 선택해서 만든다. 요약할 때도 판정 문장은 그대로 옮긴다.

그리고 경영진에게는 불확실성을 한 줄 붙인다. "정상 부하는 충족, 스파이크는 다음 주 시험 예정"이라고 적는 것이 "성능 문제 해결"보다 안전하고, 실제로 신뢰를 얻는 방식이다.

실무에서 왜 필요한가

성능 개선이 조직에서 실패하는 방식은 대개 둘이다. 하나는 끝나지 않는 것 이다. 종료 조건이 없으면 개선은 릴리스 일정과 충돌할 때까지 계속되고, 결국 "일정이 급해서 여기서 멈춤"으로 끝난다. 그 결정은 기록되지 않으므로 다음 분기에 같은 논쟁이 반복된다. 종료 조건 네 가지를 미리 표로 합의해 두면 멈춤이 판단 이 되고, 리포트에 근거가 남는다.

다른 하나는 믿을 수 없는 비교 다. 전후 조건이 어긋난 측정으로 "3배 빨라졌다"고 보고하면, 다음 릴리스에서 숫자가 돌아왔을 때 아무도 원인을 설명할 수 없고 성능 데이터 전체의 신뢰가 깎인다. 같은 워크로드·데이터·환경·워밍업·반복 횟수라는 다섯 가지는 비용이 거의 안 드는 보험이다.

리포팅 능력은 성능 QA가 조직에 영향을 주는 거의 유일한 통로다. 병목을 정확히 찾아도 한 장으로 옮기지 못하면 "QA가 느리다고 한다"로 요약돼 사라진다. 반대로 기준·전·후·자원 여유·잔여 위험이 한 장에 정리돼 있으면, 그 표가 릴리스 회의의 의사결정 문서가 된다.

채용시장에서의 위치

경력기술서에서 가장 강한 성능 항목은 "부하 테스트 수행"이 아니라 "성능 개선 전후 비교 리포트 작성 및 릴리스 판정" 이다. 면접에서도 "성능을 개선했다"는 답 다음에 거의 항상 "그게 개선인지 어떻게 확인했나요" 가 온다. 여기서 반복 측정 분포와 잡음 수준, 워밍업 제외, 백분위 합산 불가를 말하면 측정을 아는 사람으로 분류된다. CI 성능 회귀 게이트 설계 경험은 SRE·플랫폼 직군 전환에서도 그대로 쓰인다.

실습 과제

과제 1 — 잡음 수준 측정과 개선 판정 (30분)

같은 대상에 같은 부하를 변경 없이 4회 반복해 잡음 수준을 먼저 잰다.

  1. 4회의 p50·p95·p99와 오류율을 표로 적고, p95의 최소~최대 폭을 계산한다
  2. 이 폭을 기준으로 "이 환경에서 개선으로 인정할 최소 변화폭"을 한 문장으로 정한다
  3. 작은 변경(예: 캐시 TTL 조정, 커넥션 풀 크기)을 하나만 적용하고 다시 4회 측정한다
  4. 두 분포가 겹치는지 확인해 개선 / 악화 / 판정 불가 중 하나로 판정한다
  5. 워밍업 5분을 포함해 집계한 경우와 제외한 경우의 p99 차이를 비교한다

과제 2 — 한 장짜리 리포트 작성 (30분)

과제 1의 결과로 본문 템플릿을 채운다.

  1. 기준·개선 전·개선 후 세 열과 p50·p95·p99·오류율·처리량·표본 수·자원 지표 행을 채운다
  2. 조건 블록(워크로드·환경·데이터·반복 횟수·측정 지점·워밍업)을 빠짐없이 적는다
  3. 남은 1위 병목과 사이클 종료 근거(네 가지 중 어느 것인지)를 적는다
  4. 같은 내용을 경영진 3줄 / 운영팀 3줄로 각각 줄여 쓰고, 숫자가 정본과 일치하는지 확인한다

과제 3 — CI 회귀 게이트 설계 (25분)

과제 1에서 얻은 잡음 폭을 근거로 CI 게이트를 설계한다.

  1. 절대 임계값이 아니라 기준선 대비 상대 임계값으로 회귀 판정 기준을 쓴다
  2. 시간 지표 외에 구조 지표 두 개(요청당 쿼리 수·할당량·외부 호출 수 등)를 고르고 임계값을 정한다
  3. 1차 경고·2차 차단 규칙과 기준선 갱신 규칙(누가·언제·무슨 근거로)을 두 줄로 쓴다
  4. CI에 거는 것과 릴리스 전 전용 환경으로 미루는 것을 나눠 적고 각각의 이유를 쓴다

자가 체크리스트

  • 튜닝 사이클 종료 조건 네 가지를 말하고, 요구사항 충족에 자원 여유가 포함돼야 하는 이유를 설명할 수 있다
  • 병목이 통제 밖일 때 "종료"가 아니라 설계 과제·SLA 협상으로 이관해야 함을 안다
  • 전후 비교에서 고정해야 할 다섯 가지(워크로드·데이터·환경·코드 외 변경·측정 지점)를 점검할 수 있다
  • 워밍업 구간을 요구사항에 숫자로 정하고 집계에서 제외할 수 있다
  • 반복 측정으로 잡음 수준을 구하고, 두 분포가 겹치면 "판정 불가"로 기록할 수 있다
  • 평균만 보고할 때 놓치는 것과, 백분위를 더하거나 평균 낼 수 없는 이유를 설명할 수 있다
  • 계층별 p95를 합산해 전체 p95를 만들 수 없는 이유를 말할 수 있다
  • 기준·전·후와 p95·p99·오류율·자원 여유·잔여 위험이 담긴 한 장짜리 리포트를 쓸 수 있다
  • CI 성능 회귀 게이트를 상대 임계값·반복 측정·구조 지표·기준선 갱신 규칙으로 설계할 수 있다
  • 경영진·개발팀·운영팀에 각각 무엇을 전하고 무엇을 빼는지 구분할 수 있다

흔한 실수

  • 종료 조건 없이 개선을 시작한다. 병목은 무한히 나오므로 사이클이 일정에 부딪혀 끝난다. 네 가지 종료 조건을 먼저 합의한다.
  • 자원 여유를 안 보고 통과시킨다. p95는 충족했지만 CPU 95%면 다음 스파이크에서 깨진다. 요구사항에 자원 상한을 함께 넣는다.
  • 워밍업을 결과에 섞는다. 초반 JIT·캐시·풀 생성 구간이 p99를 통째로 오염시킨다. 제외 구간을 숫자로 정해 양쪽에 같이 적용한다.
  • 한 번 재고 개선이라고 말한다. 잡음 폭을 모르면 40 ms 차이가 개선인지 알 수 없다. 3~5회 반복해 분포로 비교한다.
  • 백분위를 평균 내거나 구간별로 더한다. 서버 3대의 p95 평균도, DB p95 + 앱 p95도 전체 p95가 아니다. 히스토그램을 합쳐 다시 계산한다.
  • 평균만 리포트에 적는다. 캐시로 평균이 좋아지고 p99가 나빠진 개선이 그대로 승인된다. p95·p99·오류율을 나란히 둔다.
  • CI에 절대 임계값을 걸고 곧 무시한다. 공용 러너의 잡음으로 무작위 실패가 나면 게이트가 죽는다. 상대 임계값·반복·2단계 실패 처리로 바꾼다.
  • 기준선을 아무나 갱신한다. 회귀가 조용히 기준선에 흡수되어 성능이 서서히 나빠진다. 나빠지는 갱신은 근거와 승인을 요구한다.

참고 자료

  • Grafana k6 — Thresholds — 백분위·오류율 임계값을 시험 실패로 연결하는 설정
  • Grafana k6 — Results output and metrics — 집계 지표와 원본 분포 내보내기
  • Google SRE Workbook — Alerting on SLOs — 목표 대비 판정과 잡음 사이의 트레이드오프(운영 경보 관점)
  • HdrHistogram — 백분위를 합산 가능하게 만드는 히스토그램 구현과 배경. 원문 확인
  • ISTQB CT-PT 실러버스 — 성능 시험 결과의 보고와 생명주기 내 성능 활동. 인증 페이지에서 원문 확인
  • 레슨 s2-m31-l04 — 성능 결과의 통계적 표현, 백분위 합산 불가, coordinated omission
  • 레슨 s5-m51-l02(성능 요구사항·용량 산정) · s5-m51-l03(병목 분석) · s2-m37-l09(운영 경보·오류 예산 소진율) · s4-m14-l07(SLI·SLO)

낯선 말 풀이

이 레슨에 나온 약어입니다. 본문에서도 처음 나올 때 점선으로 표시해 두었습니다 (제목과 링크 글자는 그대로 둡니다).

DB — 데이터베이스
데이터를 넣어 두고 꺼내 쓰는 저장소. 보통 표 여러 개가 서로 연결된 형태다.
CPU — 중앙처리장치
계산을 담당하는 부품. 사람으로 치면 머리다.
p95 — 95 백분위
느린 쪽 5%를 뺀 나머지가 이 안에 들어온다는 뜻. 100번 중 95번이 그 시간 안에 끝났다는 말이다.
API — 응용 프로그램 인터페이스
프로그램끼리 주고받는 창구. 사람이 화면 버튼을 누르는 대신, 프로그램이 정해진 주소로 요청을 보내 답을 받는다.
SLA — 서비스 수준 협약
"이 정도 품질은 보장한다"를 고객과 글로 약속한 것. 못 지키면 보상 조항이 따른다.
OS — 운영체제
기기를 돌리는 바탕 프로그램 — 윈도우, 맥, 안드로이드 같은 것.
p99 — 99 백분위
100번 중 99번이 이 시간 안에 끝났다는 뜻. 가장 느린 1%만 뺀 값이다.
CI — 지속적 통합
코드를 올릴 때마다 자동으로 합쳐서 빌드하고 시험까지 돌리는 방식.
컨테이너 — 컨테이너
이 커리큘럼에서 두 가지로 쓰인다. ① 프로그램과 그것을 돌리는 데 필요한 것들을 한 상자에 담아, 어느 컴퓨터에서나 똑같이 돌아가게 만든 것 ② 화면에서 여러 요소를 하나로 묶는 바깥 틀. 서버·배포 이야기면 ①, 화면·접근성 이야기면 ②다.
MB — 메가바이트
데이터 양의 단위. 사진 한 장이 대략 2~5 메가바이트쯤 된다.
PR — 풀 리퀘스트
"내가 고친 코드를 본체에 합쳐 달라"고 올리는 요청. 합치기 전에 사람들이 보고 의견을 단다.
QA — 품질보증
만든 것이 쓸 만한지 확인하고, 애초에 덜 망가지게 만드는 방법을 정하는 일. "테스트"는 그 일의 일부다.

이 레슨에 나온 나머지 5개를 포함해 용어집 전체 보기