이 문서에서는 애플리케이션의 성능을 개선할 수 있는 몇 가지 기술에 대해 설명합니다. 경우에 따라 개념을 설명하기 위해 다른 API 또는 일반적인 API의 예가 사용되기도 하지만, 하지만 Google Drive API에도 동일한 개념이 적용됩니다.
gzip을 사용한 압축
각 요청에 필요한 대역폭을 줄이는 쉽고 편리한 한 가지 방법은 gzip 압축을 사용하는 것입니다. 이 경우 결과를 압축 해제하려면 CPU 시간이 추가로 필요하기는 하지만 대신에 네트워크 비용을 절감할 수 있다는 장점이 있습니다.
gzip으로 인코딩된 응답을 받으려면 Accept-Encoding
헤더를 설정하고 사용자 에이전트에 gzip
문자열이 포함되도록 수정해야 합니다. 다음은 gzip 압축을 사용할 수 있도록 적절하게 구성된 HTTP 헤더의 예시입니다.
Accept-Encoding: gzip User-Agent: my program (gzip)
부분 리소스 작업
API 호출의 성능을 개선하는 또 다른 방법은 관심 있는 데이터 부분만 보내고 받는 것입니다. 이렇게 하면 애플리케이션에서 불필요한 필드를 전송하고 파싱하고 저장하지 않게 되므로 네트워크, CPU, 메모리를 포함한 리소스를 더 효율적으로 사용할 수 있습니다.
다음과 같은 두 가지 유형의 부분 요청이 있습니다.
부분 요청을 작성하는 자세한 방법은 다음 섹션에 설명되어 있습니다.
부분 응답
기본적으로 서버에서는 요청을 처리한 후에 전체 리소스 표현을 반환합니다. 더 나은 성능을 위해 서버에 필요한 필드만 전송하도록 요청하여 부분 응답을 받을 수 있습니다.
부분 응답을 요청하려면 fields
요청 매개변수를 사용하여 반환받을 필드를 지정합니다. 응답 데이터를 반환하는 모든 요청에서 이 매개변수를 사용할 수 있습니다.
fields
매개변수는 응답 데이터에만 영향을 주며 전송해야 하는 데이터에는 영향을 주지 않습니다. 리소스를 수정할 때 전송하는 데이터의 양을 줄이려면 패치 요청을 사용하세요.
예
패치(부분 업데이트)
리소스를 수정할 때 불필요한 데이터가 전송되지 않도록 할 수도 있습니다. 변경하려는 특정 필드의 업데이트된 데이터만 전송하려면 HTTP PATCH
동사를 사용합니다. 이 문서에 설명된 패치 시맨틱스는 이전에 부분 업데이트를 위해 구현되었던 GData 구문과는 다르며 더 간단해졌습니다.
아래의 짧은 예에서는 일부 데이터만 업데이트할 경우 패치를 사용하면 전송해야 하는 데이터가 얼마나 최소화되는지를 보여 줍니다.
예
패치에 대한 응답 처리
API는 올바른 패치 요청을 처리한 후 200 OK
HTTP 응답 코드와 함께 수정된 리소스의 전체 표현을 반환합니다. API에 ETag가 사용되는 경우에는 PUT
을 사용할 때와 마찬가지로 패치 요청이 성공적으로 처리되면 서버에서 ETag 값을 업데이트합니다.
fields
매개변수를 사용하여 반환되는 데이터의 양을 줄이지 않으면 패치 요청에서 전체 리소스 표현을 반환합니다.
패치 요청으로 인해 새로운 리소스 상태의 구문 또는 의미 체계가 올바르지 않게 되면 서버에서 400 Bad Request
또는 422 Unprocessable Entity
HTTP 상태 코드를 반환하며 리소스 상태는 변경되지 않은 채 유지됩니다. 예를 들어 필수 필드의 값을 삭제하려고 하면 서버에서 오류가 반환됩니다.
PATCH HTTP 동사가 지원되지 않는 경우 대체 표기법
방화벽에서 HTTP PATCH
요청을 허용하지 않으면 아래와 같이 HTTP POST
요청을 실행하고 재정의 헤더를 PATCH
로 설정합니다.
POST https://www.googleapis.com/... X-HTTP-Method-Override: PATCH ...
패치와 업데이트의 차이점
실제로 HTTP PUT
동사를 사용하는 업데이트 요청용으로 데이터를 전송할 때는 필수항목이거나 선택항목인 필드만 전송해야 합니다. 서버에서 설정된 필드의 값을 전송하면 이 값은 무시됩니다. 이는 부분 업데이트를 수행하는 또 다른 방법처럼 보일 수도 있지만 이 접근 방식에는 몇 가지 제한사항이 있습니다. HTTP PUT
동사를 사용하는 업데이트의 경우 필수 매개변수를 제공하지 않으면 요청이 실패하고 선택적 매개변수를 제공하지 않으면 이전에 설정한 데이터가 삭제됩니다.
이러한 이유로 패치를 사용하는 것이 훨씬 안전합니다. 변경하려는 필드의 데이터만 제공하면 되며, 생략한 필드는 삭제되지 않습니다. 반복 요소 또는 배열의 경우에만 이 규칙에 예외가 적용됩니다. 즉, 모두 생략하면 이전 상태가 그대로 유지되고, 이 중 하나라도 제공하면 전체 세트가 제공한 세트로 대체됩니다.
일괄 요청
이 문서에서는 API 호출을 일괄 처리하여 클라이언트가 수행해야 하는 HTTP 연결 수를 줄이는 방법을 보여줍니다.
이 문서에서는 특히 HTTP 요청을 보내 일괄 요청을 하는 방법을 다룹니다. Google 클라이언트 라이브러리를 사용하여 일괄 요청을 하는 경우 클라이언트 라이브러리의 문서를 참조하세요.
개요
클라이언트가 수행하는 각 HTTP 연결에는 어느 정도의 오버헤드가 수반됩니다. Google Drive API는 일괄 처리를 지원하므로 클라이언트에서 단일 HTTP 요청에 여러 개의 API 호출을 넣을 수 있습니다.
다음과 같은 경우에 일괄 처리를 사용할 수 있습니다.
- 대량의 파일 메타데이터를 검색합니다.
- 메타데이터 또는 속성을 일괄적으로 업데이트합니다.
- 새 사용자 또는 그룹 추가와 같이 다수의 파일의 권한을 변경합니다.
- 로컬 클라이언트 데이터를 처음 동기화하거나 오프라인 상태에서 장시간 후 동기화하는 경우
각각의 경우 각 호출을 개별적으로 보내는 대신 단일 HTTP 요청으로 그룹화할 수 있습니다. 내부 요청은 모두 동일한 Google API로 이동해야 합니다.
단일 일괄 요청의 호출 수는 100개로 제한됩니다. 이보다 더 많이 호출해야 하는 경우 여러 개의 일괄 요청을 사용합니다.
참고: Google Drive API용 일괄 처리 시스템은 OData 일괄 처리 시스템과 동일한 구문을 사용하지만 시맨틱스는 다릅니다.
추가 제약조건은 다음과 같습니다.
- 호출이 100개를 초과하는 일괄 요청은 오류를 일으킬 수 있습니다.
- 각 내부 요청의 URL 길이는 8,000자로 제한됩니다.
- Google Drive는 미디어의 업로드 또는 다운로드, 파일 내보내기와 같은 일괄 작업을 지원하지 않습니다.
일괄 처리 세부정보
일괄 요청은 하나의 HTTP 요청으로 결합된 여러 API 호출로 구성되며, 이 요청을 API 탐색 문서에 지정된 batchPath
로 보낼 수 있습니다. 기본 경로는 /batch/api_name/api_version
입니다. 이 섹션에서는 일괄 처리 구문을 세부적으로 설명하며 뒷부분에서 예시를 제시합니다.
참고: 일괄 처리된 n개 요청의 사용량 한도를 계산할 때는 요청 하나가 아니라 n개로 계산됩니다. 일괄 요청은 일련의 요청 집합으로 분리된 후 처리됩니다.
일괄 요청의 형식
일괄 요청은 여러 개의 Google Drive API 호출이 포함된 단일 표준 HTTP 요청이며, multipart/mixed
콘텐츠 유형을 사용합니다. 이 기본 HTTP 요청 내의 각 부분에 중첩된 HTTP 요청이 포함됩니다.
각 부분은 자체 Content-Type: application/http
HTTP 헤더로 시작됩니다. 선택사항인 Content-ID
헤더가 있는 경우도 있습니다. 그러나 부분 헤더는 부분의 시작을 표시하기 위해 있을 뿐이며 중첩된 요청과는 별개입니다. 서버에서 일괄 요청을 개별 요청으로 해체하면 부분 헤더는 무시됩니다.
각 부분의 본문은 자체 동사와 URL, 헤더, 본문을 포함하는 완전한 HTTP 요청입니다. HTTP 요청은 URL의 경로 부분만 포함해야 합니다. 전체 URL은 일괄 요청에서 허용되지 않기 때문입니다.
외부 일괄 요청의 HTTP 헤더(Content-Type
과 같은 Content-
헤더 제외)는 일괄 처리되는 각 요청에 모두 적용됩니다. 특정 HTTP 헤더를 외부 요청과 개별 호출에 모두 지정하는 경우 개별 호출 헤더의 값이 외부 일괄 요청 헤더의 값을 재정의합니다. 개별 호출의 헤더는 해당 호출에만 적용됩니다.
예를 들어 특정 호출에 승인 헤더를 제공하는 경우 이 헤더는 해당 호출에만 적용됩니다. 외부 요청에 승인 헤더를 제공하는 경우 이 헤더는 개별 호출에서 자체 승인 헤더로 재정의하지 않는 이상 모든 개별 호출에 적용됩니다.
서버는 일괄 요청을 수신하면 외부 요청의 쿼리 매개변수와 헤더를 각 부분에 적절히 적용한 다음 각 부분을 개별 HTTP 요청처럼 취급합니다.
일괄 요청 응답
서버 응답은 multipart/mixed
콘텐츠 유형의 단일 표준 HTTP 응답입니다. 각 부분은 일괄 요청에 포함된 요청 중 하나에 대한 응답이며 요청 순서와 동일한 순서로 표시됩니다.
요청의 부분과 마찬가지로 각 응답 부분에는 상태 코드, 헤더, 본문을 포함한 완전한 HTTP 응답이 포함됩니다. 또한 요청의 부분과 마찬가지로 각 응답 부분 앞에는 Content-Type
헤더가 붙어 부분의 시작을 표시합니다.
요청의 특정 부분에 Content-ID
헤더가 있는 경우 해당하는 응답 부분에도 일치하는 Content-ID
헤더가 표시되며 원래 값 앞에는 문자열 response-
가 붙습니다(다음 예시 참조).
참고: 서버는 호출을 임의의 순서로 수행할 수 있습니다. 지정한 순서에 따라 실행된다고 생각하면 안 됩니다. 2개의 호출이 지정된 순서에 따라 실행되도록 하려면 1개의 요청으로 두 호출을 보내면 안 됩니다. 첫 번째 호출을 단독으로 보낸 다음 첫 번째 호출의 응답을 기다렸다가 두 번째 호출을 보내야 합니다.
예
다음 예는 Google Drive API에서 일괄 처리를 사용하는 방법을 보여줍니다.
일괄 요청 예시
POST https://www.googleapis.com/batch/drive/v3 Accept-Encoding: gzip User-Agent: Google-HTTP-Java-Client/1.20.0 (gzip) Content-Type: multipart/mixed; boundary=END_OF_PART Content-Length: 963--END_OF_PART Content-Length: 337 Content-Type: application/http content-id: 1 content-transfer-encoding: binary
POST https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id Authorization: Bearer authorization_token Content-Length: 70 Content-Type: application/json; charset=UTF-8
{ "emailAddress":"example@appsrocks.com", "role":"writer", "type":"user" } --END_OF_PART Content-Length: 353 Content-Type: application/http content-id: 2 content-transfer-encoding: binary
POST https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id&sendNotificationEmail=false Authorization: Bearer authorization_token Content-Length: 58 Content-Type: application/json; charset=UTF-8
{ "domain":"appsrocks.com", "role":"reader", "type":"domain" } --END_OF_PART--
일괄 응답 예시
이전 섹션의 요청 예에 대한 응답입니다.
HTTP/1.1 200 OK Alt-Svc: quic=":443"; p="1"; ma=604800 Server: GSE Alternate-Protocol: 443:quic,p=1 X-Frame-Options: SAMEORIGIN Content-Encoding: gzip X-XSS-Protection: 1; mode=block Content-Type: multipart/mixed; boundary=batch_6VIxXCQbJoQ_AATxy_GgFUk Transfer-Encoding: chunked X-Content-Type-Options: nosniff Date: Fri, 13 Nov 2015 19:28:59 GMT Cache-Control: private, max-age=0 Vary: X-Origin Vary: Origin Expires: Fri, 13 Nov 2015 19:28:59 GMT--batch_6VIxXCQbJoQ_AATxy_GgFUk Content-Type: application/http Content-ID: response-1
HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Date: Fri, 13 Nov 2015 19:28:59 GMT Expires: Fri, 13 Nov 2015 19:28:59 GMT Cache-Control: private, max-age=0 Content-Length: 35
{ "id": "12218244892818058021i" }
--batch_6VIxXCQbJoQ_AATxy_GgFUk Content-Type: application/http Content-ID: response-2
HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 Date: Fri, 13 Nov 2015 19:28:59 GMT Expires: Fri, 13 Nov 2015 19:28:59 GMT Cache-Control: private, max-age=0 Content-Length: 35
{ "id": "04109509152946699072k" }
--batch_6VIxXCQbJoQ_AATxy_GgFUk--
요청에서 특정 필드 반환
fields
매개변수를 지정하지 않으면 서버는 메서드에 관한 기본 필드 집합을 반환합니다. 예를 들어 files.list
메서드는 kind
, id
, name
, mimeType
필드만 반환합니다.
반환된 기본 필드가 필요하지 않을 수 있습니다. 응답에서 반환할 필드를 지정하려면 fields
시스템 매개변수를 사용하세요.
자세한 내용은 특정 필드 반환을 참고하세요.
about
, comments
(delete
제외), replies
(delete
제외) 리소스의 모든 메서드에 fields
매개변수를 설정해야 합니다. 이러한 메서드는 기본 필드 집합을 반환하지 않습니다.