V8 런타임 개요

Apps Script 및 JavaScript에서 런타임 또는 런타임 환경에는 스크립트 코드를 파싱하고 실행하는 자바스크립트 엔진이 포함됩니다. 런타임은 메모리 액세스 방법, 프로그램이 컴퓨터의 운영체제와 상호작용할 수 있는 방법, 적합한 프로그램 구문에 관한 규칙을 제공합니다. 각 웹브라우저에는 JavaScript용 런타임 환경이 있습니다.

예전부터 Apps Script는 Mozilla의 Rhino JavaScript 인터프리터를 기반으로 했습니다. Rhino는 Apps Script에서 개발자 스크립트를 실행하는 편리한 방법을 제공했으며, Apps Script를 특정 JavaScript 버전(ES5)에 연결하기도 했습니다. Apps Script 개발자는 Rhino 런타임을 사용하는 스크립트에서 최신 JavaScript 구문과 기능을 사용할 수 없습니다.

이 문제를 해결하기 위해 이제 Chrome 및 Node.js를 지원하는 V8 런타임에서 Apps Script가 지원됩니다. 최신 JavaScript 구문과 기능을 활용하기 위해 기존 스크립트를 V8로 마이그레이션할 수 있습니다.

이 페이지에서는 V8에 의해 사용 설정되는 새로운 기능과 스크립트에서 V8을 사용하도록 설정하는 방법을 설명합니다. 스크립트를 V8로 이전에서는 V8 런타임을 사용하기 위해 기존 스크립트를 이전하는 단계를 설명합니다.

V8 런타임의 기능

V8 런타임을 사용하는 스크립트는 다음 기능을 활용할 수 있습니다.

최신 ECMAScript 구문

V8 런타임으로 구동되는 스크립트에서 최신 ECMAScript 구문을 사용할 수 있습니다. 이 구문에는 let, const 및 기타 여러 인기 기능이 포함되어 있습니다.

V8 런타임을 사용하여 구현할 수 있는 일반적인 구문 개선사항을 간략히 알아보려면 V8 구문 예시를 참고하세요.

함수 감지 개선

V8을 사용하는 스크립트의 Apps Script 기능 감지가 개선되었습니다. 새 런타임은 다음과 같은 함수 정의 형식을 인식합니다.

      function normalFunction() {}
      async function asyncFunction() {}
      function* generatorFunction() {}

      var varFunction = function() {}
      let letFunction = function() {}
      const constFunction = function() {}

      var namedVarFunction = function alternateNameVarFunction() {}
      let namedLetFunction = function alternateNameLetFunction() {}
      const namedConstFunction = function alternateNameConstFunction() {}

      var varAsyncFunction = async function() {}
      let letAsyncFunction = async function() {}
      const constAsyncFunction = async function() {}

      var namedVarAsyncFunction = async function alternateNameVarAsyncFunction() {}
      let namedLetAsyncFunction = async function alternateNameLetAsyncFunction() {}
      const namedConstAsyncFunction = async function alternateNameConstAsyncFunction() {}

      var varGeneratorFunction = function*() {}
      let letGeneratorFunction = function*() {}
      const constGeneratorFunction = function*() {}

      var namedVarGeneratorFunction = function* alternateNameVarGeneratorFunction() {}
      let namedLetGeneratorFunction = function* alternateNameLetGeneratorFunction() {}
      const namedConstGeneratorFunction = function* alternateNameConstGeneratorFunction() {}

      var varLambda = () => {}
      let letLambda = () => {}
      const constLambda = () => {}

      var varAsyncLambda = async () => {}
      let letAsyncLambda = async () => {}
      const constAsyncLambda = async () => {}

트리거 및 콜백에서 객체 메서드 호출

V8을 사용하는 스크립트는 라이브러리 메서드를 이미 호출할 수 있었던 위치에서 객체 메서드와 클래스 정적 메서드를 호출할 수 있습니다. 이러한 장소에는 다음이 포함됩니다.

다음 V8 예에서는 Google 스프레드시트에서 메뉴 항목을 구성할 때 객체 메서드를 사용하는 방법을 보여줍니다.

function onOpen() {
  var ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
  ui.createMenu('Custom Menu')
      .addItem('First item', 'menu.item1')
      .addSeparator()
      .addSubMenu(ui.createMenu('Sub-menu')
          .addItem('Second item', 'menu.item2'))
      .addToUi();
}

var menu = {
  item1: function() {
    SpreadsheetApp.getUi().alert('You clicked: First item');
  },
  item2: function() {
    SpreadsheetApp.getUi().alert('You clicked: Second item');
  }
}

로그 보기

Apps Script는 두 가지 로깅 서비스, 즉 Logger 서비스console 클래스를 제공합니다. 두 서비스 모두 동일한 Stackdriver Logging 서비스에 로그를 작성합니다.

Loggerconsole 로그를 표시하려면 스크립트 편집기 상단에서 실행 로그를 클릭합니다.

실행 보기

스크립트의 실행 기록을 보려면 Apps Script 프로젝트를 열고 왼쪽에서 실행 을 클릭합니다.

V8 구문 예시

다음은 V8 런타임을 사용하는 스크립트에 사용할 수 있는 인기 있는 구문적 기능의 간단한 목록입니다.

letconst

letconst 키워드를 사용하면 각각 블록 범위 로컬 변수와 블록 범위 상수를 정의할 수 있습니다.

// V8 runtime
let s = "hello";
if (s === "hello") {
  let s = "world";
  console.log(s);  // Prints "world"
}
console.log(s);  // Prints "hello"

const N = 100;
N = 5; // Results in TypeError
      

화살표 함수

화살표 함수를 사용하면 표현식 내에서 함수를 간단하게 정의할 수 있습니다.

// Rhino runtime
function square(x) {
  return x * x;
}

console.log(square(5));  // Outputs 25
      
// V8 runtime
const square = x => x * x;
console.log(square(5));  // Outputs 25

// Outputs [1, 4, 9]
console.log([1, 2, 3].map(x => x * x));
      

클래스

클래스는 상속을 통해 코드를 개념적으로 구성하는 수단을 제공합니다. V8의 클래스는 주로 JavaScript 프로토타입 기반 상속에 대한 문법적 슈가입니다.

// V8 runtime
class Rectangle {
  constructor(width, height) { // class constructor
    this.width = width;
    this.height = height;
  }

  logToConsole() { // class method
    console.log(`Rectangle(width=${this.width}, height=${this.height})`);
  }
}

const r = new Rectangle(10, 20);
r.logToConsole();  // Outputs Rectangle(width=10, height=20)
      

디스트럭처링 할당

디스트럭처링 할당 표현식을 사용하면 배열 및 객체의 값을 고유한 변수로 빠르게 압축해제할 수 있습니다.

// Rhino runtime
var data = {a: 12, b: false, c: 'blue'};
var a = data.a;
var c = data.c;
console.log(a, c);  // Outputs 12 "blue"

var array = [1, 2, 3];
var x = a[0];
var y = a[1];
var z = a[2];
console.log(x, y, z);  // Outputs 1 2 3
      
// V8 runtime
var data = {a: 12, b: false, c: 'blue'};
var {a, c} = data;
console.log(a, c);  // Outputs 12 "blue"


var array = [1, 2, 3];
var [x, y, z] = array;
console.log(x, y, z);  // Outputs 1 2 3


      

템플릿 리터럴

템플릿 리터럴은 삽입된 표현식을 허용하는 문자열 리터럴입니다. 이를 통해 더 복잡한 문자열 연결 문을 피할 수 있습니다.

// Rhino runtime
var name =
  'Hi ' + first + ' ' + last + '.';
var url =
  'http://localhost:3000/api/messages/'
  + id;
      
// V8 runtime
var name = `Hi ${first} ${last}.`;
var url =
  `http://localhost:3000/api/messages/${id}`;


      

기본 매개변수

기본 매개변수를 사용하면 함수 선언에서 함수 매개변수의 기본값을 지정할 수 있습니다. 이렇게 하면 누락된 매개변수에 기본값을 명시적으로 할당할 필요가 없으므로 함수 본문의 코드를 간소화할 수 있습니다.

// Rhino runtime
function hello(greeting, name) {
    greeting = greeting || "hello";
    name = name || "world";
    console.log(
        greeting + " " + name + "!");
}

hello();  // Outputs "hello world!"
      
// V8 runtime
var hello =
  function(greeting="hello", name="world") {
      console.log(
        greeting + " " + name + "!");
  }

hello();  // Outputs "hello world!"

      

여러 줄 문자열

템플릿 리터럴과 동일한 구문을 사용하여 여러 줄 문자열을 정의할 수 있습니다. 템플릿 리터럴과 마찬가지로 이 구문을 사용하면 문자열 연결을 피하고 문자열 정의를 단순화할 수 있습니다.

// Rhino runtime
var multiline = "This string is sort of\n"
+ "like a multi-line string,\n"
+ "but it's not really one.";
      
// V8 runtime
var multiline = `This on the other hand,
actually is a multi-line string,
thanks to JavaScript ES6`;
      

V8 런타임 사용 설정

스크립트에서 Rhino 런타임을 사용 중인 경우 다음 단계에 따라 V8로 전환할 수 있습니다.

  1. Apps Script 프로젝트를 엽니다.
  2. 왼쪽에서 프로젝트 설정 을 클릭합니다.
  3. Chrome V8 런타임 사용 체크박스를 선택합니다.

또는 스크립트 매니페스트 파일을 수정하여 스크립트 런타임을 직접 지정할 수도 있습니다.

  1. Apps Script 프로젝트를 엽니다.
  2. 왼쪽에서 프로젝트 설정 을 클릭합니다.
  3. 편집기에 'appsscript.json' 매니페스트 파일 표시 체크박스를 선택합니다.
  4. 왼쪽에서 편집기 > appsscript.json를 클릭합니다.
  5. appsscript.json 매니페스트 파일에서 runtimeVersion 필드를 V8 값으로 설정합니다.
  6. 상단에서 프로젝트 저장 을 클릭합니다.

스크립트를 V8로 이전에서는 V8을 사용해도 스크립트가 제대로 작동하는지 확인하기 위해 수행해야 하는 다른 단계를 설명합니다.

Rhino 런타임 사용 설정

스크립트에서 V8을 사용 중이고 원래 Rhino 런타임을 사용하도록 전환해야 하는 경우 다음 단계를 따르세요.

  1. Apps Script 프로젝트를 엽니다.
  2. 왼쪽에서 프로젝트 설정 을 클릭합니다.
  3. Chrome V8 런타임 사용 체크박스를 선택 취소합니다.

또는 스크립트 매니페스트를 수정합니다.

  1. Apps Script 프로젝트를 엽니다.
  2. 왼쪽에서 프로젝트 설정 을 클릭합니다.
  3. 편집기에 'appsscript.json' 매니페스트 파일 표시 체크박스를 선택합니다.
  4. 왼쪽에서 편집기 > appsscript.json를 클릭합니다.
  5. appsscript.json 매니페스트 파일에서 runtimeVersion 필드를 DEPRECATED_ES5 값으로 설정합니다.
  6. 상단에서 프로젝트 저장 을 클릭합니다.

기존 스크립트를 이전하려면 어떻게 해야 하나요?

스크립트를 V8로 이전 가이드에서는 V8을 사용하기 위해 기존 스크립트를 이전하는 데 필요한 단계를 설명합니다. 여기에는 V8 런타임을 사용 설정하고 스크립트에 알려진 비호환성이 있는지 확인하는 작업이 포함됩니다.

V8로 스크립트 자동 이전

2020년 2월 18일부터 Google에서는 자동화된 호환성 테스트를 통과한 기존 스크립트를 V8로 점진적으로 이전하기 시작합니다. 영향을 받는 스크립트는 이전 후에도 계속 정상적으로 작동합니다.

스크립트의 자동 이전을 선택 해제하려면 매니페스트의 runtimeVersion 필드를 DEPRECATED_ES5로 설정합니다. 이후 언제든지 스크립트를 V8로 이전할 수 있습니다.

버그를 신고하려면 어떻게 해야 하나요?

지원 가이드에서는 Stack Overflow에서 프로그래밍 지원을 받고, 기존 문제 보고서를 검색하고, 새 버그를 제출하고, 새로운 기능을 요청하는 방법을 설명합니다.