ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [구글 앱스 스크립트 기본 5] 로그를 사용해 스크립트의 진행상황 파악하기
    공부/구글 앱스 스크립트 2023. 8. 4. 17:04

     

     

    [구글 앱스 스크립트 기본 5] 로그를 사용해 스크립트의 진행상황 파악하기

     

     

    글의 순서 

    더보기
    • 로그와 디버그
    • 구글 앱스 스크립트에서의 Base Service와 클래스 Logger
    • 클래스 Logger의 메서드 log의 예제

     

     

    로그와 디버그

    로그는 컴퓨터가 어떤 행동을 수행했다는 기록을 남기는 것을 뜻합니다. 우리 눈에는 보이지 않지만 컴퓨터는 우리가 컴퓨터를 켜고 끄고, 어떤 프로그램을 실행하고, 어떤 드라이버가 실행되고 어떤 오류들이 발생했다는 사실들을 모두 기록해 둡니다. 흔히 로그를 분석한다라는 말을 쓰는데 이는 컴퓨터의 실행 기록들을 분석한다라는 이야기도 됩니다.

     

    디버그는 컴퓨터가 어떤 행동을 실행하는 과정 중에 발생하는 오류나 비정상적인 행동들, 흔히 버그라고 불리는 것들을 찾고 수정하는 것을 의미하며 디버깅이라고도 부릅니다. 우리가 처음 스크립트를 쓰게 되면, 예상외로 그 스크립트가 우리가 예상한 대로 100% 정확히 동작하는 것을 보기는 어렵습니다. 때문에 처음 스크립트를 작성한 후 디버그 과정을 통해 그 스크립트가 개발자의 계획대로 작동할 수 있도록 하게 됩니다. 

     

    지난 글에서 getValue(s) 메서드를 사용하면서 getValue(s) 메서드를 실행하게되면 구글 앱스 스크립트는 그 코드를 정확히 실행했음에도 따로 가져온 값을 출력하라는 기능을 만들지 않으면 getValue(s) 메서드를 통해 가져온 값들을 확인할 수 없다는 말을 했습니다. 때문에 setValue(s)를 통해 가져온 값들을 원하는 곳에 입력시키는 과정을 통해 스크립트가 정상적으로 작동하는 것을 확인했었습니다. 하지만 우리가 디버그 과정을 진행할 때 한 구글 앱스 스크립트의 특정 함수들이 가지고 있는 수많은 세부 기능들을 모두 일일이 구글 시트 파일에 출력시켜 그 기능의 작동 여부와 오류 여부를 확인할 수는 없는 노릇입니다. 때문에 모든 프로그래밍 언어들은 개발 과정에서 '로그' 즉, 기록을 남길 수 있도록 하는 기능들을 보유하고 있습니다. 구글 앱스 스크립트의 바탕이 되는 자바스크립트에서는 console.log를 통해 로그를 남길 수 있도록 하고 있지만, 구글 앱스 스크립트는 console.log가 아닌 Logger.log를 통해 로그를 남길 수 있습니다. 쉽게 말하면 굳이 setValue(s)를 통해 값들을 입력하지 않아도 Logger.log를 통해 로그를 남겨서 getValue(s)를 통해 가져온 정보들을 실행 로그 창에서 확인할 수 있습니다. 

     

     

    구글 앱스 스크립트에서의 Base Service와 클래스 Logger

    구글 앱스 스크립트에서는 Base Service (베이스 서비스)를 통해 로그를 남기는 기능을 제공하고 있습니다. 구글 앱스 스크립트의 Base Service는 이 외에도 구글 앱스 스크립트를 이용하고 있는 이용자의 정보를 가져오거나, 새로운 알림 창을 띄우거나 하는 기능들도 제공하고 있고, 다른 기능들에 대해서는 다른 글에서 차차 소개할 예정입니다. 구글 앱스 스크립트의 Base Service 중에서도 Logger 클래스에서 제공하는 log 메서드를 통해 구글 앱스 스크립트 에디터의 UI에서 살펴본 실행 기록 창에 로그를 문자열로 출력시킬 수 있게 해줍니다. (참고로 구글 앱스 스크립트 Base Service에서는 자바 스크립트에서와 마찬가지로 클래스 Console의 메서드 log도 있지만, 이 메서드의 경우 아주 제한적인 상황에서만 사용이 가능하기에, 구글 앱스 스크립트를 구글 시트를 비롯한 일반적인 구글 워크스페이스 앱들과 연동해 사용하시는 경우에는 쓸 일이 없습니다. 따라서 이 글에서 언급하는 메서드 log는 전부 클래스 Logger의 메서드 log를 뜻합니다.)

     

     

    클래스 Logger의 메서드 log의 예제

    구글 앱스 스크립트 레퍼런스에 따르면 메서드 log는 매개변수로 문자열로 출력하고자 하는 데이터를 받습니다. 즉, 문자열을 출력하고자 하면 문자열을, 변수를 출력하고자 하는 경우에는 변수를 입력하면 해당 문자열과 변수를 출력하게 됩니다. 메서드 log를 불러오는 경우도 우리가 기존에 알아보았던 getValue(s)나 setValue(s)와 다르지 않습니다. 가장 먼저 Base Service의 클래스들 중 로그를 출력할 수 있게 해주는 클래스인 Logger에 접근 후 데이터를 받아 실행 로그칸에 문자열로 출력시켜 주는 메서드인 log를 호출하면 됩니다. 가장 먼저 아주 간단한 예인 "Hello, World!"를 실행 로그에 출력시키는 예제를 살펴보겠습니다. 

    function example1() {
      Logger.log("Hello, World!");
    }

     

    example1 함수 실행결과

     

    위의 example1 함수를 실행시켜보면 지금까지는 스크립트가 실행되고 종료되었다는 알림만 나오던 실행 로그 창에 "Hello, World!"라는 문자열이 출력된 것을 알 수 있습니다. 이처럼 문자열을 로그 기록으로 남기고 싶다면, log 메서드의 파라미터로 문자열을 뜻하는 따옴표와 함께 원하는 문자열을 넣으면 됩니다. 저와 같이 새로운 구글 시트 파일과 이 파일에 결합된 구글 앱스 스크립트 파일을 만드셔서 위의 스크립트를 작성하셨다면, 지금까지와는 다르게 권한이 없으니 권한을 달라는 팝업이 뜨지 않는다는 것을 볼 수 있습니다. 이는 지금까지 Spreadsheet Service를 통해 구글 앱 스크립트에서 구글 시트 파일로 접근하는 것과는 달리, Base Service는 구글 앱 스크립트 내에서 자체적으로 실행되는 코드이기 때문에 따로 권한이 필요하지 않기 때문입니다. 만약 변수를 넣고 싶으면 어떻게 해야 할까요. 다음 예제는 변수를 로그로 출력시키는 예제입니다. 

    function example2() {
      var string = "Hello, World!";
      Logger.log(string);
    }

     

    example2 함수 실행결과

     

    위의 example2 함수의 실행 결과 또한 example1 함수의 실행결과와 다르지 않음을 알 수 있습니다. example2에서 메서드 log는 매개변수로 string이라는 변수를 받았고, string이라는 변수의 값은 바로 "Hello, World!"이기 때문입니다. 만약 우리가 지금까지 살펴보았던, getValue(s)를 통해 값을 가져온 경우, 값을 제대로 가져왔는지 여부를 살펴보려면 어떻게 해야 할까요? 다음 예제는 getValue(s) 메서드를 통해 가져온 값들을 로그로 출력시키는 예제입니다. 이 예제에서 사용된 구글 시트 파일은 아래와 같습니다. 

     

    example3에 사용된 구글 시트 파일

     

    이 파일에서 "A1:B3"에 있는 값들을  getValues 메서드를 이용해 만든 스크립트로 구글 앱스 스크립트로 가져온 후 메서드 log를 활용해 가져온 값들을 출력시켜보겠습니다. 이 스크립트의 경우 Spreadsheet Service를 활용해 특정 구글 시트에 접근해야 하므로, 그 구글 시트 파일에 대한 접근 권한이 필요합니다. 따라서 저와 같이 새로 파일을 만드신 경우에는 접근 권한을 요청하는 팝업이 뜹니다.

    function example3() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
      var range1 = sheet.getRange("A1:B3");
      var val = range1.getValues();
      
      Logger.log(val);
    }

     

    example3 함수 실행결과

     

    위와 같은 example3 함수를 실행시켜보면 실행 로그 창을 통해 우리가 원한 "A1:B3"에 있는 값들을 정확히 가져왔다는 사실을 알 수 있습니다. 만약 스크립트의 목적이 "A1:B3"에 있는 값들을 가져와서 특정 범위에 출력시키는 것이 아닌, 그 값들을 통해 다른 작업을 수행하기 위해서라면, 우리는 이제 구글 시트에 그 값들을 직접 넣지 않고도 제대로 값을 가져왔는지 확인할 수 있습니다. 만약 우리가 작성하는 코드가 엄청 길다고 하더라도, 우리는 이제 원하는 부분에 로그를 집어넣어 스크립트가 우리가 원하는 방식대로 잘 작동하는지, 중간 과정을 실행 로그 창에서 확인할 수 있습니다. 만약 example3의 예제에서 변수 val이 아닌 다른 변수들을 로그의 매개변수로 받아보면 어떤 결과가 나올까요? 실행 결과는 아래와 같습니다. 

     

     

    val을 메서드 log의 매개변수로 받았을 때는 getValues를 통해 가져온 정확한 정보들이 표시가 된 것과는 다르게, 다른 변수들은 각각 "Spreadsheet", "Sheet", "Range"라는 값을 보여주고 있습니다. 어디에 문제가 있어서 그런 걸까요? 아닙니다. 가장 먼저 Spreadsheet라는 문자열을 반환한 변수 ss를 살펴보겠습니다. 변수 ss는 구글 시트 파일에 접근하여 파일을 읽고, 만들고, 삭제할 수 있게 해주는 구글 앱스 스크립트의 Spreadsheet Service의 클래스인 SpreadsheetApp을 먼저 부른 후, 결합 구글 앱스 스크립트 파일과 연결된 활성화된 구글 시트 파일에 접근할 수 있게 해주는 메서드인 getActiveSpreadsheet를 호출합니다. 이때 메서드 getActiveSpreadsheet는 메서드를 통해 선택한 스프레드시트 파일을 결과 값으로 반환하게 됩니다. 따라서 Logger.log(ss)는 정확한 값을 반환하고 있습니다. Sheet와 Range도 마찬가지입니다. 각각 특정 시트(탭)과 특정범위를 반환하는 메서드를 사용하고 있기에 "Sheet"와 "Range"를 반환하고 있습니다. 이는 구글 앱스 스크립트의 레퍼런스에서도 나타납니다. 

     

    구글 앱스 스크립트 레퍼런스 getRange(a1Notation)

     

    getRange의 반환값은 "Range", 즉 "범위"입니다. 우리 유저의 입장에서는 선택한 범위인 "A1:B3"이나 혹은 이와 비슷한 문자열을 반환시켜야 할 것 같지만, 프로그램의 입장에서는 스크립트가 지정하고 있는 "A1:B3"의 범위를 잘 가져온 후, 그 범위를 잘 가져왔다는 뜻의 "Range(범위)"를 반환하고 있는 것입니다.

     

    이와 같이 우리가 Logger.log를 사용할 때 가끔은 우리의 예상과는 다른 문자열을 실행 로그에서 확인하게 되는 경우도 있습니다. 이런 상황과 마주할 때는, 구글 앱스 스크립트 레퍼런스에서 사용한 클래스와 메서드를 정확히 확인하고, 그 메서드의 반환값이 무엇인지 확인하게 되면 코드가 잘 작동하고 있는지 확인할 수 있습니다. 

     

     

    댓글

ⓒ 2018. Haedie's all rights reserved.