이 문서에서는 애플리케이션의 성능을 개선할 수 있는 몇 가지 기술에 대해 설명합니다. 경우에 따라 개념을 설명하기 위해 다른 API 또는 일반적인 API의 예가 사용되기도 하지만, 같은 개념이 Google Civic Information API에도 적용됩니다.
gzip을 사용한 압축
각 요청에 필요한 대역폭을 줄이는 쉽고 편리한 한 가지 방법은 gzip 압축을 사용하는 것입니다. 이 경우 결과를 압축 해제하려면 CPU 시간이 추가로 필요하기는 하지만 대신에 네트워크 비용을 절감할 수 있다는 장점이 있습니다.
gzip으로 인코딩된 응답을 받으려면 Accept-Encoding
헤더를 설정하고 사용자 에이전트에 gzip
문자열이 포함되도록 수정해야 합니다. 다음은 gzip 압축을 사용할 수 있도록 적절하게 구성된 HTTP 헤더의 예시입니다.
Accept-Encoding: gzip User-Agent: my program (gzip)
부분 리소스 작업
API 호출의 성능을 개선할 수 있는 또 다른 방법은 데이터에서 관심 있는 부분만 요청하는 것입니다. 이렇게 하면 애플리케이션에서 불필요한 필드를 전송하고 파싱하고 저장하지 않게 되므로 네트워크, CPU, 메모리를 포함한 리소스를 더 효율적으로 사용할 수 있습니다.
부분 응답
기본적으로 서버에서는 요청을 처리한 후에 전체 리소스 표현을 반환합니다. 더 나은 성능을 위해 서버에 필요한 필드만 전송하도록 요청하여 부분 응답을 받을 수 있습니다.
부분 응답을 요청하려면 fields
요청 매개변수를 사용하여 반환받을 필드를 지정합니다. 응답 데이터를 반환하는 모든 요청에서 이 매개변수를 사용할 수 있습니다.
예시
다음 예시에서는 일반적인(가상의) 'Demo' API에 fields
매개변수를 사용하는 방법을 보여 줍니다.
단순 요청: 이 HTTP GET
요청은 fields
매개변수를 생략하고 전체 리소스를 반환합니다.
https://www.googleapis.com/demo/v1
전체 리소스 응답: 전체 리소스 데이터에는 다음과 같은 필드가 포함됩니다. 여기에는 보기 쉽게 일부 필드만 포함되었으며 다른 많은 필드는 생략되어 있습니다.
{ "kind": "demo", ... "items": [ { "title": "First title", "comment": "First comment.", "characteristics": { "length": "short", "accuracy": "high", "followers": ["Jo", "Will"], }, "status": "active", ... }, { "title": "Second title", "comment": "Second comment.", "characteristics": { "length": "long", "accuracy": "medium" "followers": [ ], }, "status": "pending", ... }, ... ] }
부분 응답 요청: 같은 리소스에 대한 다음 요청에서는 반환되는 데이터의 양을 대폭 줄이기 위해 fields
매개변수를 사용합니다.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
부분 응답: 위 요청에 대해 서버에서 반환하는 응답에는 종류(kind) 정보와 짧게 줄인 항목(items) 배열만 포함되며, 이 항목 배열에는 각 항목의 HTML 제목 및 길이 특성 정보만 포함됩니다.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
이 응답은 선택한 필드와 해당 필드가 속한 상위 객체만 포함하는 JSON 객체입니다.
fields
매개변수의 형식을 지정하는 자세한 방법은 다음 부분에서 다루고 있으며, 그 다음 부분에는 응답에서 정확히 무엇이 반환되는지에 대해 자세히 설명되어 있습니다.
fields 매개변수 구문 요약
fields
요청 매개변수의 값 형식은 대략 XPath 구문을 기반으로 합니다. 지원되는 구문은 아래에 요약되어 있으며 이어지는 섹션에서 추가적인 예시를 확인할 수 있습니다.
- 여러 필드를 선택하려면 쉼표로 구분된 목록을 사용합니다.
a
필드 내에 중첩된b
필드를 선택하려면a/b
를 사용하고,b
내에 중첩된c
필드를 선택하려면a/b/c
를 사용합니다.
예외:
data: { ... }
와 같이 응답이data
객체 내에 중첩되도록 'data' 래퍼를 사용하는 API 응답의 경우fields
사양에 'data
'를 포함하지 마세요. 필드를 지정할 때data/a/b
와 같이 data 객체를 포함하면 오류가 발생합니다. 대신fields
를a/b
와 같이 지정하세요.- 배열 또는 객체의 특정 하위 필드 세트를 요청하려면 하위 선택자를 사용하여 표현식을 괄호 '
( )
'로 묶습니다.예:
fields=items(id,author/email)
는 items 배열에 포함된 각 요소의 항목 ID와 작성자 이메일만 반환합니다. 하위 필드를 하나만 지정할 수도 있으며, 이때fields=items(id)
는fields=items/id
와 같습니다. - 필요한 경우 필드 선택 구문에 와일드 카드를 사용합니다.
예:
fields=items/pagemap/*
는 페이지 지도 내의 모든 객체를 선택합니다.
fields 매개변수 사용 방법의 추가 예시
아래 예시에서는 fields
매개변수 값이 응답에 미치는 영향을 설명합니다.
참고: 모든 쿼리 매개변수 값과 마찬가지로 fields
매개변수 값도 URL로 인코딩되어야 합니다. 이 문서의 예시에는 보기 쉽도록 인코딩이 생략되어 있습니다.
- 반환받을 필드 지정(또는 필드 선택)
fields
요청 매개변수 값은 쉼표로 구분된 필드 목록이며 각 필드는 응답의 루트를 기준으로 지정됩니다. 따라서 list 작업을 수행하는 경우에는 응답으로 컬렉션이 반환되며, 일반적으로 이 응답에는 리소스 배열이 포함됩니다. 하나의 리소스를 반환하는 작업을 수행하는 경우에는 리소스를 기준으로 필드가 지정됩니다. 선택한 필드가 배열(또는 배열의 일부)인 경우 서버에서는 배열의 모든 요소 중에서 선택된 부분을 반환합니다.
다음은 컬렉션 수준의 몇 가지 예시입니다.
예시 결과 items
items 배열의 모든 요소를 반환하며 각 요소의 모든 필드가 포함되지만 다른 필드는 제외됩니다. etag,items
etag
필드 및 items 배열의 모든 요소를 반환합니다.items/title
items 배열에 포함된 모든 요소의 title
필드만 반환합니다.
중첩 필드가 반환되는 경우 응답에는 항상 해당 필드가 속한 상위 객체가 포함됩니다. 명시적으로 함께 선택하지 않은 다른 하위 필드는 상위 필드에 포함되지 않습니다.context/facets/label
context
객체 아래에 중첩된facets
배열의 모든 구성원에 대해label
필드만 반환합니다.items/pagemap/*/title
items 배열의 각 요소에 대해 pagemap
의 하위 항목인 모든 객체의title
필드(있는 경우)만 반환합니다.
다음은 리소스 수준의 몇 가지 예시입니다.
예시 결과 title
요청된 리소스의 title
필드를 반환합니다.author/uri
요청된 리소스에서 author
객체의uri
하위 필드를 반환합니다.links/*/href
links
의 하위 요소인 모든 객체의href
필드를 반환합니다.- 하위 선택을 사용하여 특정 필드의 일부만 요청
- 기본적으로 요청에서 특정 필드를 지정하면 서버에서는 해당하는 객체 또는 배열 요소 전체를 반환합니다. 하지만 특정 하위 필드만 포함하는 응답을 지정할 수도 있습니다. 아래 예시와 같이 '
( )
' 하위 선택 구문을 사용하면 됩니다.예시 결과 items(title,author/uri)
items 배열에 포함된 각 요소에 대해 title
및 author의uri
값만 반환합니다.
부분 응답 처리
서버는 fields
쿼리 매개변수가 포함된 유효한 요청을 처리한 후 요청된 데이터와 함께 HTTP 200 OK
상태 코드를 반환합니다. fields
쿼리 매개변수에 오류가 있거나 매개변수가 유효하지 않은 경우 서버에서는 HTTP 400 Bad Request
상태 코드와 함께 필드 선택에 어떤 문제가 있는지 알려 주는 오류 메시지(예: "Invalid field selection a/b"
)를 반환합니다.
다음은 위 소개 섹션에 나와 있는 부분 응답의 예입니다. 요청에서는 fields
매개변수를 사용하여 반환할 필드를 지정합니다.
https://www.googleapis.com/demo/v1?fields=kind,items(title,characteristics/length)
부분 응답은 다음과 같습니다.
200 OK
{ "kind": "demo", "items": [{ "title": "First title", "characteristics": { "length": "short" } }, { "title": "Second title", "characteristics": { "length": "long" } }, ... ] }
참고: 데이터 페이지 나누기를 위한 쿼리 매개변수(예: maxResults
및 nextPageToken
)를 지원하는 API의 경우 이러한 매개변수를 사용하여 각 쿼리의 결과를 관리 가능한 크기로 줄이세요. 그러지 않으면 부분 응답을 사용해도 성능이 개선되지 않을 수 있습니다.