V8 런타임 개요

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

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

이 문제를 해결하기 위해 이제 Chrome 및 Node.js를 구동하는 V8 런타임에서 Apps Script가 지원됩니다. 최신 자바스크립트 구문과 기능을 활용하기 위해 기존 스크립트를 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 Sheets에서 메뉴 항목을 구성할 때 객체 메서드를 사용하는 방법을 보여줍니다.

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의 클래스는 기본적으로 자바스크립트 프로토타입 기반 상속에 대한 구문 방법입니다.

// 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. 상단에서 Save project 를 클릭합니다.

스크립트를 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. 상단에서 Save project 를 클릭합니다.

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

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

스크립트를 V8로 자동 이전

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

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

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

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