LLM 엔지니어링13장 · REST API 와 FastAPI12 / 22← 이전목차다음 →MetaContents

13장. REST API 와 FastAPI

오류 처리와 요청 기록

가게의 계산대는 영수증을 남깁니다. 나중에 "언제 무엇을 팔았나", "환불은 왜 했나"를 보려고입니다. API 서버도 요청마다 누가, 언제, 무엇을 불렀고, 결과가 어땠는지, 얼마나 걸렸는지 기록합니다.

요청을 받고, 처리하고, 오류면 알맞은 상태 코드로 바꾸고, 누가 언제 무엇을 얼마나 걸려 했는지 기록하는 네 단계 흐름도

1번에서 요청을 받고 2번에서 처리합니다. 3번에서 문제가 생기면 HTTPException 으로 알맞은 상태 코드와 짧은 까닭을 돌려줍니다. 4번에서 성공이든 실패든 사용자, 시각, 엔드포인트, 상태 코드, 걸린 시간을 기록합니다. 여기서 영수증이 요청 기록입니다.

기록에 남길 것과 남기지 않을 것

남긴다남기지 않는다
시각, 사용자(이름이나 번호), 엔드포인트, 상태 코드API 키, 토큰, 비밀번호
걸린 시간, 모델의 판주민번호, 전화번호 같은 개인정보 원문
오류의 종류서버 내부 경로와 쿼리

기록 한 줄

Python
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장처럼 가린 뒤 저장합니다.
← 이전 절13장 · 권한: 무엇을 해도 되나다음 절 →13장 · 실습 지도