Google Apps Script로 간단한 Web API 만들기

2024년 05월 20일

Google Apps Script를 활용하면 간단한 웹 애플리케이션을 손쉽게 만들 수 있습니다. 코드 몇 줄만으로도 GET, POST와 같은 HTTP 요청을 처리하는 서버를 구현할 수 있습니다.

이를 통해 구글 시트의 데이터를 제공하는 API, 구글 메일 발송 API, 구글 Docs 문서를 템플릿으로 활용해 PDF를 생성하는 API 등 다양한 기능을 구현할 수 있습니다.

1 GET, POST API 만들기

1.1 GET API 구현

1)GET 요청에 응답하는 API를 만드는 코드는 다음과 같습니다.

function doGet(e) {
  const params = JSON.stringify(e);
  return ContentService.createTextOutput(params).setMimeType(ContentService.MimeType.JSON);
	//GET 요청에서 담기는 params를 그대로 응답합니다.
}

2)코드를 저장하고, 웹앱으로 배포해야 합니다.

  • 배포>새 배포웹앱을 선택합니다.

  • 다음 사용자 인증 정보로 실행은 로 한다. 액세스 권한이 있는 사용자는 모든 사용자로 설정합니다.

배포가 완료되면 웹 앱 URL이 생성됩니다.

이 URL로 접속하면 다음과 같은 응답을 받을 수 있습니다.

{
	"contextPath": "",
	"contentLength": 0,
	"parameter": {},
	"queryString": "",
	"parameters": {}
}

URL Query에 정보를 추가해 테스트해보겠습니다.

기존의URL?my_params=test로 접속하면 다음과 같은 응답이 옵니다:

{
	"parameter": {
		"my_params": "test"
	},
	"queryString": "my_params=test",
	"contextPath": "",
	"contentLength": 0,
	"parameters": {
		"my_params": [
			"test"
		]
	}
}

1.2 POST API 구현

  1. POST 요청에 응답하는 API는 다음과 같이 구현합니다
function doPost(e) {
	const body = JSON.parse(e.postData.contents);
  return ContentService.createTextOutput(JSON.stringify(body)).setMimeType(ContentService.MimeType.JSON);
}

POST 요청으로 전송된 body를 JSON.parse(e.postData.contents)로 활용할 수 있습니다.

  1. GET요청과 마찬가지로 코드를 저장한 후에 배포 > 배포 관리 > 새버전 > 배포 를 선택합니다.

⚠️ 중요: 웹앱으로 동작하는 Apps Script는 코드를 저장하는 것만으로는 변경사항이 반영되지 않습니다. 반드시 배포 > 배포 관리 > 새버전 > 배포를 실행해야 코드가 적용됩니다.

  1. API 테스트 도구 혹은 curl을 이용해서 테스트를 합니다.
curl --request POST \
  --url {내가만든웹엡URL} \
  --header 'Content-Type: application/json' \
  --data '{
	"myData" : "hi"
}'

응답:

{
	"myData": "hi"
}

2 실전 API 예제

제품 ID를 쿼리로 전달받아 해당 제품의 상세 정보를 응답하는 GET API를 만들어보겠습니다.

준비물

  • products 정보가 담긴 구글 시트
  • 구글시트와 연결된 Apps Script 파일

아래 형태처럼 제품의 정보가 담긴 products 시트를 생성합니다.

Apps Script 파일에 아래와 같이 코드를 작성합니다.

function doGet(e) {
	//요청된 URL에 parameter가 담기지 않았을 경우 'fail'로 응답
  if (!e.parameter.id) {
    const response = JSON.stringify({
      status: "fail",
      message: "Missing 'id' parameter"
    });
    return ContentService.createTextOutput(response).setMimeType(ContentService.MimeType.JSON);
  }

	//SpreadSheet에서 데이터 읽기
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadSheet.getSheetByName("products");
  const values = sheet.getDataRange().getValues();

  const requestedId = e.parameter.id;

	//요청된 id와 시트의 id 비교 후 응답
  for (let i = 1; i < values.length; i++) {
    const id = values[i][0].toString();
    if (id === requestedId) {
      const data = {
        id: id,
        name: values[i][1],
        type: values[i][2],
        size: values[i][3]
      }

      const response = JSON.stringify({
        status: "success",
        data
      });
      return ContentService.createTextOutput(response).setMimeType(ContentService.MimeType.JSON);
    }
  }
  
	//일치하는 id를 찾지 못한 경우 'fail' 응답
  const response = JSON.stringify({
    status: "fail",
    message: "'id' not found"
  });

  return ContentService.createTextOutput(response).setMimeType(ContentService.MimeType.JSON);
}

Disclaimer

스프레드시트를 데이터베이스 대용으로 사용하는 것에는 주의가 필요합니다. 편리해 보일 수 있지만, 실제로는 여러 가지 성능상의 제약이 따르기 때문입니다. 특히 데이터 규모가 커질수록 원하는 값을 찾는 시간이 크게 증가하는 문제가 있습니다. Apps Script에서 스프레드시트의 데이터를 읽어오는 과정 자체에 상당한 시간이 소요되며, 읽어온 데이터를 가공하고 원하는 값을 찾는 과정에서도 추가적인 지연이 발생합니다. 또한 스프레드시트는 대규모 데이터 처리에 필수적인 인덱싱이나 쿼리 최적화 기능을 제공하지 않으며, 동시 접속자 처리에도 제한이 있습니다. 따라서 소규모 내부 도구를 개발하는 용도로는 활용할 수 있지만, 실제 서비스나 대규모 데이터를 다루는 프로덕션 환경에서는 적절한 데이터베이스 시스템을 사용하는 것이 바람직합니다.

Apps Script Web App의 한계점

Google Apps Script로 무료로 간단한 API를 구현할 수 있지만, 몇 가지 중요한 한계가 있습니다. 일반 사용자를 대상으로 하는 서비스용 API로는 적합하지 않지만, 자동화 도구로서는 충분히 활용할 수 있습니다.

주요 한계점:

  • 응답 속도가 느립니다

  • 표준 API 형식을 완벽히 구현할 수 없습니다

    • 응답의 status code를 설정할 수 없어 error message로 대체해야 합니다
    • doPut, doDelete 함수가 없어 doGet, doPost를 변형해서 사용해야 합니다
  • script runtime timeout 제한이 있어, 일정 시간을 초과하면 응답하지 않습니다

  • 웹앱 URL 요청 시 다른 URL로 리다이렉트되므로, 리다이렉트를 처리할 수 없는 환경에서는 사용이 어려울 수 있습니다.

    자세한 설명 : ‘보안상의 이유로 Content service에서 반환되는 콘텐츠는 script.google.com에서 제공되지 않고 스크립트.googleusercontent.com의 일회성 URL로 리디렉션됩니다. 즉, 콘텐츠 서비스를 사용하여 다른 애플리케이션에 데이터를 반환하는 경우 HTTP 클라이언트가 리디렉션을 따르도록 구성되어 있는지 확인해야 합니다. 예를 들어, cURL 명령줄 유틸리티에서 -L 플래그를 추가합니다. 이 동작을 활성화하는 방법에 대한 자세한 내용은 HTTP 클라이언트 설명서를 참조하세요.’


Ref


TAGS
GOOGLE APPS SCRIPTBACKENDJAVASCRIPT