똑같은 문자열인데 비교 구문이 안 먹는 경우? (feat. Apps Script)

EenSung Kim·2022년 8월 11일
1

앱스 스크립트

목록 보기
1/1
"김코더" === "김코더"  // false????

Intro

여러 명의 사람들에게 발급해야 하는 증서가 구글 드라이브에 저장되어 있습니다.
증서의 파일 명은 각 개인의 이름으로 이루어져 있네요.
각자 자기 자신의 증서를 받아볼 수 있도록 자동화하면 어떨까요?

살짝 각색이 들어가긴 했지만, 제가 해결하려고 했던 자동화의 예시입니다. 생각보다 간단해 보이죠? 실제로 Apps Script를 다룰 줄 안다면 쉽게 자동화를 진행해 볼 수 있습니다. Apps Script 는 고도로 추상화 된 다양한 메서드를 제공하고 있기 때문에, 크게 복잡하지 않은 로직으로도 충분히 구현 가능한 수준이죠.

생각보다 짧은 시간만에 뚝딱 결과물을 만들었습니다. 테스트해보니 동작도 잘 하더라구요. 여러 가지 상황을 다 고려한 로직은 아니지만, 그래도 이 정도면 간단하고 명확한 작업들에는 활용이 가능할 것 같았습니다.


Problem

실전에 써먹으려고 했더니 갑자기 이메일이 발송되지 않습니다. 코드가 동작하지 않은 것은 아니었어요. 코드는 잘 돌아갔는데 이메일은 하나도 발송되지 않았습니다.

log 를 찍어가며 확인해보니, 발송받을 개인의 이름과 파일명에 적혀있는 이름을 비교하는 구문이 제대로 동작하지 않고 있었습니다.

if (name === fileName) {...}

name 변수와 fileName 변수에 대체 어떤 값이 들어가길래 if 조건문이 동작하지 않았는지 확인하고자 console.log 를 찍었습니다. 근데 웬걸? 둘 다 "김코더" 로 똑같은 값이 들어가 있는 거예요.

혹시라도 type 이 다르게 들어오나 싶어 typeof name, typeof fileName 을 각각 찍어보았습니다. 하지만 둘 다 string 으로 잘 나타나더라구요. type 문제는 아닌 것으로 보였습니다.


구글링해보니 스택 오버플로우에 힌트가 될 만한 글이 있네요. Apps Script 에서 똑같은 두 문자열이 똑같지 않다고 할 때 어떻게 디버그할 수 있는지에 관한 질문이었습니다.

  1. 두 변수의 type 이 같은지 확인해라.
    이건 했었죠.

  2. 두 변수의 length가 같은지 확인해라.
    길이야 당연히 같게 나오게.....응??

두 변수의 length 를 찍었더니 하나는 3, 다른 하나는 7이 뜨더라구요. 코드는 거짓말을 하지 않았습니다. 겉으로 드러나는 모습에 제가 속았던 것 뿐이었죠. 시트에서 가져온 개인의 이름과 getName() 메서드로 가져온 (확장자를 잘라낸) 파일 제목의 길이가 서로 다른 것이 문제였습니다.
(아마도 언어 형식이 다른 것이 아닐까 싶네요)

문제를 찾았으니 절반은 넘었습니다. 서로 다른 길이로 인식되는 두 문자열을 어떻게 비교할 수 있는지만 찾아내면 될 것 같았어요.


Solved

또 다시 구글링을 진행하다가 마침내 해결책을 찾아냈습니다. 영어가 아닌 문자열을 서로 비교할 때 사용 가능한 Intl 객체입니다. 어느 현자께서 정확히 제가 필요한 내용을 이미 2019년에 적어두셨더라구요. "Comparing Non-English Strings with JavaScript Collators" 라는 제목의 글이었습니다.

핵심적인 내용을 간추리면 이렇습니다.

Javascript가 영어를 기본 베이스로 하고 있다보니, 영어가 아닌 언어의 경우 일반적인 string 비교로는 비교가 되지 않는다. 이를 비교하기 위해 우리는 Intl.Collator 를 사용할 수 있다.

const collator = new Intl.Collator('ko');
const result = collator.compare(name, fileName);
console.log(result)

new Intl.Colaltor('ko') 를 통해 한국어 문자열을 비교할 수 있습니다. 그리고 collator.compare() 에 비교하고자 하는 두 변수를 인자로 전달합니다. 자바스크립트의 비교 구문인 === 를 활용했을 때는 길이가 달라 비교가 불가능 했지만, collator 를 활용하면 길이가 다르더라도 우리 눈에 보이는 대로 비교가 가능합니다. 만약 두 변수가 동일한 문자열 값이라면 0을 리턴하죠.
(두 문자열이 다른 경우 순서에 따라 1 또는 -1을 돌려줍니다.)

const collator = new Intl.Collator('ko');
const result = collator.compare(name, fileName);
if (result === 0) {...}

이제 이렇게 해서 서로 다른 길이로 나타나는 두 한글 문자열을 비교하고, 그 결과에 따라 조건을 분기할 수 있게 되었습니다. Apps Script 코드로 한글 문자열을 비교해야 하는 경우 알아두면 좋은 꿀팁인 것 같습니다.


Outro

Apps Script 를 다루는 건, 사실 개발을 한다고 하기에는 조금 민망한 작업인 것 같을 때가 많습니다. 하지만 다룰 줄 알게 되면 많은 일들을 빠르게 처리할 수 있게 되는 것 같아요. 휴먼 에러를 덜 수 있다는 건 당연히 덤일 테구요.

물론 휴먼 에러가 생기는 영역이 달라질 뿐이기도 합니다. 잘 동작되는 줄로만 알았던 코드가 오늘처럼 동작하지 않는 경우들이 발생하니까요. 그래도 이런 경험을 통해서 조금씩 더 알아가는 게 있다면, 충분하지 않을까 싶습니다. 욕심을 버리고 꾸준히! 가 정말 중요한 것 같아요.

오늘은 여기까지입니다. 도움이 되셨다면 좋겠습니다.

profile
iOS 개발자로 전직하기 위해 공부 중입니다.

0개의 댓글