13장. REST API 와 FastAPI
오류 처리와 요청 기록
가게의 계산대는 영수증을 남깁니다. 나중에 "언제 무엇을 팔았나", "환불은 왜 했나"를 보려고입니다. API 서버도 요청마다 누가, 언제, 무엇을 불렀고, 결과가 어땠는지, 얼마나 걸렸는지 기록합니다.
1번에서 요청을 받고 2번에서 처리합니다. 3번에서 문제가 생기면 HTTPException 으로 알맞은 상태 코드와 짧은 까닭을 돌려줍니다. 4번에서 성공이든 실패든 사용자, 시각, 엔드포인트, 상태 코드, 걸린 시간을 기록합니다. 여기서 영수증이 요청 기록입니다.
기록에 남길 것과 남기지 않을 것
| 남긴다 | 남기지 않는다 |
|---|---|
| 시각, 사용자(이름이나 번호), 엔드포인트, 상태 코드 | API 키, 토큰, 비밀번호 |
| 걸린 시간, 모델의 판 | 주민번호, 전화번호 같은 개인정보 원문 |
| 오류의 종류 | 서버 내부 경로와 쿼리 |
기록 한 줄
import json, time
start = time.perf_counter()
status = 200 # 실제로는 처리 결과의 상태 코드
record = {"시각": "2026-10-28T10:00:00", "사용자": "상담원1", "주소": "/predict", "상태": status,
"걸린ms": round((time.perf_counter() - start) * 1000, 2)}
print(json.dumps(record, ensure_ascii=False)) # 한 줄에 한 요청. 나중에 표로 읽기 쉽다코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
time.perf_counter() | performance counter(성능 측정용 초시계)다. 아주 정밀한 초를 주며, 두 번 잰 값의 차이만 뜻이 있다 |
(time.perf_counter() - start) * 1000 | 초 단위의 차이에 1000 을 곱해 밀리초(ms, millisecond, 천분의 1초)로 바꾼다 |
round(..., 2) | 소수 둘째 자리까지 반올림한다 |
json.dumps(record, ensure_ascii=False) | 기록 하나를 한글이 그대로 남은 JSON 한 줄로 바꾼다 |
이 코드가 뜻하는 것
계산대 영수증 한 장에는 시각, 계산원, 산 것, 결제 결과가 적힙니다. 여기서 영수증 한 장이 요청 기록 한 줄이고, 계산원이 사용자, 산 것이 주소, 결제 결과가 상태 코드입니다. 다만 보통 영수증에는 계산에 걸린 시간이 없지만, 요청 기록에는 느려진 곳을 찾으려고 걸린 시간을 꼭 남깁니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
start = time.perf_counter() | 처리 시작 시각을 잰다 | 계산 시작에 초시계 누르기 |
status = 200 | 처리 결과의 상태 코드(여기서는 정해 둔 값) | 결제 성공 |
record = {...} | 시각, 사용자, 주소, 상태, 걸린 시간을 사전에 담는다 | 영수증 내용 |
print(json.dumps(...)) | 한 줄의 JSON 으로 보인다 | 영수증 한 장 출력 |
실행하면 {"시각": "2026-10-28T10:00:00", "사용자": "상담원1", "주소": "/predict", "상태": 200, "걸린ms": ...} 꼴의 한 줄이 나옵니다. 시각은 설명용으로 적어 둔 값입니다. 이 예는 시작과 끝 사이에 하는 일이 없어 걸린ms 가 0 에 가까운 작은 값이고, 실행할 때마다 조금씩 다릅니다.
주의할 점
- 기록도 데이터입니다. 보관 기간과 볼 수 있는 사람을 정합니다.
- LLM 의 질문과 답을 기록하면 품질을 고치는 데 큰 도움이 되지만, 질문에 개인정보가 들어 있을 수 있습니다. 11장처럼 가린 뒤 저장합니다.