V8 런타임 개요

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

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

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

이 문제를 해결하기 위해 이제 Apps Script는 Chrome 및 Node.js를 구동하는 V8 런타임에서 지원됩니다. 최신 자바스크립트 구문과 기능을 활용하려면 기존 스크립트를 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. 편집기에 앱 매니페스트 파일 표시 체크박스를 선택합니다.
  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. 편집기에 앱 매니페스트 파일 표시 체크박스를 선택합니다.
  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에서 프로그래밍 도움말을 확인하고, 기존 문제 보고서를 검색하고, 새 버그를 신고하고, 새 기능을 요청하는 방법을 설명합니다.