V8 런타임 개요

Apps Script 및 JavaScript에서 런타임 또는 런타임 환경에는 스크립트 코드를 파싱하고 실행하는 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 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의 클래스는 주로 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에서 프로그래밍 지원을 받고, 기존 문제 신고를 검색하고, 새 버그를 신고하고, 새 기능을 요청하는 방법을 설명합니다.