
API Gateway → Lambda → Pydantic 모델 연결 흐름에 대한 전체 구조를, 개념 → 원리 → 예시 코드 → 실전 활용 포인트까지 정리
Lambda 기반의 API는 보통 다음과 같은 구조로 동작한다:
API Gateway는 Lambda 함수에 요청 정보를 event 딕셔너리 형태로 전달한다.
이 event 안에는 요청 관련 다양한 정보가 들어 있다.
예시 요청: GET /users?age=25
전달되는 event 구조:
{
"resource": "/users",
"path": "/users",
"httpMethod": "GET",
"queryStringParameters": {
"age": "25"
},
"body": null,
"headers": {
"Content-Type": "application/json"
}
}
필요한 정보는 다음 경로에서 찾을 수 있다:
| 데이터 종류 | 위치 | 예시 |
|---|---|---|
쿼리 파라미터 (?age=25) | event["queryStringParameters"] | {"age": "25"} |
| 요청 바디 (POST 등) | event["body"] | 문자열로 인코딩된 JSON |
경로 파라미터 (/users/{id}) | event["pathParameters"] | {"id": "123"} |
요청의 종류에 따라 추출 위치가 다르다:
GET /users?age=25 → event["queryStringParameters"]POST /users + JSON body → json.loads(event["body"])GET /users/123 → event["pathParameters"]["id"]추출 후에는 문자열로 넘어오기 때문에, 숫자 등으로 형 변환이 필요하다.
이 부분에서 Pydantic이 자동 타입 변환과 검증을 해줄 수 있다.
BaseModel을 상속받아 입력 스키마를 정의한 뒤, 모델(**입력 딕셔너리) 형식으로 검증할 수 있다.
예시:
from pydantic import BaseModel
class QueryParams(BaseModel):
age: int
그 후 Lambda 내부에서:
params = QueryParams(**event["queryStringParameters"])
이렇게 하면 다음을 자동으로 해준다:
age가 int로 변환 가능한지 확인ValidationError 발생검증이 실패했을 때는 Pydantic이 ValidationError를 발생시킨다.
이를 try/except로 감싸고, 적절한 HTTP 상태 코드로 응답하면 된다.
400 Bad Request: 파라미터 누락 또는 잘못된 요청 구조422 Unprocessable Entity: 파라미터 구조는 맞지만 값이 부적절예시:
from pydantic import ValidationError
try:
params = QueryParams(**event["queryStringParameters"])
except ValidationError as ve:
return {
"statusCode": 422,
"body": json.dumps({"message": "Invalid input", "detail": str(ve)})
}
import json
from pydantic import BaseModel, ValidationError
from http import HTTPStatus
class QueryParams(BaseModel):
age: int
def handler(event, context):
try:
params = QueryParams(**event.get("queryStringParameters", {}))
return {
"statusCode": HTTPStatus.OK,
"body": json.dumps({"message": f"You are {params.age} years old"})
}
except ValidationError as ve:
return {
"statusCode": HTTPStatus.UNPROCESSABLE_ENTITY,
"body": json.dumps({"message": "Invalid input", "detail": str(ve)})
}
except Exception as e:
return {
"statusCode": HTTPStatus.INTERNAL_SERVER_ERROR,
"body": json.dumps({"message": "Internal server error"})
}
| 항목 | 내용 |
|---|---|
| 이벤트 구조 출력해보기 | print(json.dumps(event, indent=2)) 로 구조 확인 |
| Pydantic 사용 위치 | 쿼리스트링, 경로 파라미터, 바디 파싱 후에 검증용으로 사용 |
| try/except 구조 | ValidationError, KeyError, Exception 순서대로 잡기 |
| 응답 통일성 | 항상 { "statusCode", "body (stringified json)" } 형식 유지 |
| 바디 파싱 시 | json.loads(event["body"]) 필요함 (POST/PUT 요청의 경우) |
Lambda는 프레임워크 없이도 API 서버처럼 작동할 수 있으며, 구조를 명확히 이해하면 확장성과 유지보수성이 향상된다.
Pydantic은 유효성 검사와 데이터 구조화를 동시에 제공하는 강력한 도구로, Lambda에서도 유용하게 활용 가능하다.
API Gateway → Lambda → Pydantic 흐름은 "입력 → 검증 → 처리 → 응답"이라는 백엔드 개발의 기본 원리를 가장 단순하고 명확하게 보여준다.