LabHub
배우기 러닝패스 코스

Debugging in Practice

Fixing an API You Inherited

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

테스트도 문서도 믿을 수 없는 상태로 넘겨받은 API 에서, 증상만 보고 네 개의 결함을 찾아 고칠 수 있게 됩니다.

왜 중요한가

이 실습의 결함들은 전부 200 을 반환하면서 틀린 값을 주는 종류입니다. 예외를 던지는 버그는 모니터링이 잡아 주지만, 그럴듯한 숫자를 돌려주는 버그는 몇 달 뒤 회계가 안 맞을 때 발견됩니다. 그래서 사양을 입출력 표로 먼저 옮기고 경계값을 넣어 보는 절차가 필요합니다.

마지막 단계의 상태 코드 구분도 장식이 아닙니다. 400 은 "네가 잘못 보냈다", 500 은 "내가 처리하다 망가졌다" 이고, 클라이언트 라이브러리는 대부분 5xx 만 재시도 대상으로 봅니다. 잘못된 파라미터에 500 을 돌려주면 영원히 실패할 요청이 무한히 재시도되면서 서버 부하만 올립니다. 상태 코드는 사람이 아니라 기계가 읽는 약속입니다.

/opt/app/server.py 의 docstring 에 원래 사양이 적혀 있습니다. 코드가 그 사양과 어긋나는 지점이 곧 버그 목록입니다.

단계

  1. /opt/app/server.py/root/app/server.py 로 복사하세요. 이후 이 사본만 고칩니다.
  2. 사본을 실행해 127.0.0.1:8000/health 가 응답하게 만드세요.
  3. /sum?a=2&b=35 를 반환하게 고치세요.
  4. /sum?a=10&b=3242, /sum?a=-4&b=95 를 반환하는지 확인하세요.
  5. /avg?nums=2,4,95, /avg?nums=1010 을 반환하게 고치세요. 내림 평균입니다.
  6. /upper?s=fdeFDE 를 반환하게 고치세요.
  7. /orders/total 이 200 과 함께 130400 을 반환하게 고치세요. 유효한 행의 조건은 docstring 에 있습니다.
  8. /sum?a=2/sum?a=x&b=1 이 각각 400 을 반환하게 만드세요. /nope404 는 원본 코드가 이미 돌려주고 있으니 확인만 하면 됩니다 — 고칠 것은 /sum 의 인자 처리뿐입니다. 무엇이 이미 되어 있는지부터 재어 보는 것이 이 단계의 요령입니다.

참고

작업 사본 만들기

/opt/app/server.py/root/app/server.py 로 복사하세요. 이후 이 사본만 고칩니다.

원본을 직접 고치지 않는 것이 현장의 기본입니다. /opt/app/server.py 를 /root/app/ 아래로 복사하세요.

서버 띄우기

사본을 실행해 127.0.0.1:8000/health 가 응답하게 만드세요.

python3 로 실행하면 127.0.0.1:8000 에서 대기합니다. 고칠 때마다 재시작해야 반영됩니다.

덧셈 결과 바로잡기

/sum?a=2&b=35 를 반환하게 고치세요.

2 와 3 을 넣었을 때 나오는 값을 보면 어떤 연산자가 쓰였는지 바로 보입니다. 파일 안에서 그 한 글자를 찾으세요.

음수 입력도 확인하기

/sum?a=10&b=3242, /sum?a=-4&b=95 를 반환하는지 확인하세요.

경계값 확인 단계입니다. 부호가 섞였을 때도 맞는지 보면 진짜 덧셈인지 알 수 있습니다.

평균 계산 바로잡기

/avg?nums=2,4,95, /avg?nums=1010 을 반환하게 고치세요. 내림 평균입니다.

원소 세 개일 때와 한 개일 때를 각각 넣어 보세요. 나누는 수가 원소 개수와 몇 차이 나는지 드러납니다.

대소문자 변환 바로잡기

/upper?s=fdeFDE 를 반환하게 고치세요.

엔드포인트 이름과 실제로 호출하는 문자열 메서드가 일치하는지 보세요.

주문 합계가 죽지 않게 만들기

/orders/total 이 200 과 함께 130400 을 반환하게 고치세요. 유효한 행의 조건은 docstring 에 있습니다.

docstring 에 유효한 행의 조건이 세 가지로 적혀 있는데 코드에는 그 분기가 없습니다. 문서대로 걸러내면 됩니다.

잘못된 요청에 올바른 코드 돌려주기

/sum?a=2/sum?a=x&b=1 이 각각 400 을 반환하게 만드세요. /nope404 는 원본 코드가 이미 돌려주고 있으니 확인만 하면 됩니다 — 고칠 것은 /sum 의 인자 처리뿐입니다. 무엇이 이미 되어 있는지부터 재어 보는 것이 이 단계의 요령입니다.

파라미터가 없거나 숫자가 아닐 때 지금은 서버가 죽습니다. 클라이언트 잘못은 4xx 입니다.