[AWS] API Gateway Mapping Templates란? 쉽게 정리 (Mock Response, Request Transformation, Response Transformation)
◇ 공부 기록용으로 작성하였으니 틀린점, 피드백 주시면 감사하겠습니다 ◇
Mapping templates for REST APIs
API Gateway의 Mapping Template
Mapping Template은 API Gateway에서 요청(Request) 또는 응답(Response) 데이터를 변환하는 템플릿이다.
API Gateway에 요청 온 데이터를 변환해서 백엔드에 보내거나, 백엔드에서 API Gateway로 온 데이터를 변환하여 클라이언트에 반환하거든 할 수 있다. 즉, 여러가지 상황을 시뮬레이션 할 수 있다.
Mapping template은 VTL(Velocity Template Language)을 사용하여 작성된다.
예시
쿼리 문자열 매개변수를 JSON 형식으로 변환해 백엔드(예: Lambda 함수)로 전달하기
< query string >
?item=apple&quantity=3
< JSON 형식 >
{
"item": "$input.params('item')",
"quantity": "$input.params('quantity')"
}
Velocity Template Language
VTL란?
VTL은 템플릿을 작성하고 데이터를 동적으로 처리하는 데 사용되는 템플릿 언어이다.
Apache Velocity라는 템플릿 엔진을 기반으로 하고 있다.
Mapping Templates 주요 기능
- Request Transformation (요청 변환)
- Response Transformation (응답 변환)
- Mock Response (모의 응답)
백엔드 서버에 보내는 데이터를 변환
Request Transformation (요청 변환)
클라이언트가 보낸 요청 데이터를 API Gateway에서 다른 형식(예: JSON에서 XML)으로 변환하거나, 파라미터를 새로 추가하여 백엔드(예: Lambda 함수 등)으로 보낸다.
[예시]
클라이언트가 API Gateway를 통해 아래와 같은 JSON 요청 데이터를 보낸다.
{
"firstName": "Elon",
"lastName": "Musk",
"age": 5
}
백엔드 서버에서는 "fullName"
으로 받고 싶을 경우, Mapping Templates의 VTL 코드를 통해 아래와 같이 변환 시킬수 있다.
{
"fullName": "Elon Musk",
"age": 5
}
벡엔드 서버에서 받은 데이터를 변환
Response Transformation (응답 변환)
백엔드 서버(예: Lambda 함수 등)에서 받은 응답을 클라이언트에 보내기 위해 원하는 형식으로 변환한다.
[예시]
Lambda 함수에서 아래와 같은 JSON 응답을 받았을 경우
{
"statusCode": 200,
"body": {
"userId": "12345",
"accountStatus": "active",
"lastLogin": "2024-11-10T10:00:00Z"
}
}
클라이언트에 보내기 위해서 Mapping Template을 통해 "accountStatus"
와 "lastLogin"
만 보낼려고 한다.
{
"accountStatus": "active",
"lastLogin": "2024-11-10T10:00:00Z"
}
벡엔드 서버 호출 없이 API Gateway에서 특정 응답 만들기
Mock Response (모의 응답)
[Mapping templates - Mock Response]
백엔드 호출 없이 API Gateway에서 다양한 응답을 시뮬레이션하는 방법
API Gateway에서 백엔드 서비스 호출 없이 모의 응답(mock response)을 설정하여 API를 테스트도 할 수 있다.
이를 통해 백엔드 서버가 아직 준비되지 않았을 때도 API 테스트를 할 수 있다.
[예시]
사용자가 특정 API 호출 시 고정된 응답을 받도록 하고 싶다. (백엔드 서버는 준비되지 않았다)
Mapping Template을 통해 클라이언트에는 아래와 같은 JSON 형식의 모의 응답이 반환된다.
{
"message": "This is a mock response",
"statusCode": 200
}
AWS 공식 문서: https://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings.html
🤔 문제 1
개발자가 모바일 앱을 만들고 있으며, Amazon API Gateway REST API를 사용하여 백엔드 서비스를 호출합니다. 개발 단계에서 통합 테스트를 위해 백엔드 서비스를 호출하지 않고 다양한 백엔드 응답을 시뮬레이션하려고 합니다.
어떤 솔루션이 가장 적은 운영 오버헤드로 이 요구 사항을 충족할 수 있을까요?
- AWS Lambda 함수를 생성하고, API Gateway proxy integration을 사용하여 일정한 HTTP 응답을 반환합니다.
- Amazon EC2 인스턴스를 생성하여 AWS CloudFormation 템플릿을 사용해 백엔드 REST API를 제공합니다.
- API Gateway 스테이지를 사용자 정의하여 요청에 따라 응답 유형을 선택합니다.
- 요청 매핑 템플릿(mapping template)을 사용하여 모의 통합 응답을 선택합니다.
정답
정답. 4번
Use a request mapping template to select the mock integration response.
문제 2
개발자가 쇼핑 목록에 항목을 추가하는 REST 서비스를 작성하고 있습니다. 이 서비스는 Amazon API Gateway와 AWS Lambda 통합으로 구축되었습니다. 쇼핑 목록 항목은 메서드 요청에서 쿼리 문자열 매개변수로 전송됩니다.
개발자가 쿼리 문자열 매개변수를 Lambda 함수의 인수로 변환하려면 어떻게 해야 하나요?
- request validation(요청 유효성)를 활성화합니다.
- Lambda 함수의 Amazon 리소스 이름(ARN)을 포함합니다.
- integration type(통합 유형)을 변경합니다.
- mapping template을 생성합니다.
정답
정답. 4번
mapping template을 생성합니다.