locale (8) — 코드에 나라를 안 넣으려는 노력
한 나라를 위한 분기는 모두의 빚이 된다
검색이든 스토어든 전 세계로 나가는 서비스를 만들다 보면, '나라마다 다르게 해 준다'는 말이 결국 코드 한 줄을 어떻게 짜느냐의 문제로 내려오는 순간을 종종 만나는데, 그 한 줄에서 나라의 경계를 어디에 긋고 또 어떻게 다룰 것인가가 반대로 그 서비스가 세상을 보는 방식이기도 했다.
가장 손쉬운 유혹은 'if 한국이면 이렇게'라고 코드에 한국을 곧이곧대로 적어 넣는 것이었다. 하지만 전 세계 사람들이 똑같이 지나가는 코드 한복판에 한국만을 위한 분기를 하나 끼워 넣는 순간, 그 단순한 비교 한 줄의 값은 아무 상관도 없는 99% 이상의 사용자들이 매번 나눠 치르게 된다. 소수를 위한 처리의 비용이 다수에게 전가되는, 말하자면 또 하나의 파레토인 셈인데, 이 문제는 뒷날 나라마다 점수를 달리 매기는 locale-aware 구현으로 갈수록 훨씬 심해진다. 유지 보수 쪽의 부담도 확실했는데, 구글의 엔지니어들은 코드 그 자체를 일종의 빚으로 여기는 문화 속에서 일했기에, 그런 분기 하나하나가 두고두고 갚아야 할 부채로 쌓이는 걸 모두가 알고 있었다. 그에 맞는 엄격하고 다양한 리뷰 프로세스가 잘 설명해 주고 있기도 하다.
사실 그런 분기가 아예 없었던 것도 아니어서, 코드 안에는 if China가 꽤 많이 있었다. 중국이라는 시장에는 그럴 만한 사정이 하나둘이 아니었고, 그 사정을 하나씩 이해해 주다 보니 분기는 자꾸만 늘어났다. 그러다 구글이 중국에서 물러나던 무렵 중간 결산처럼 드러난 것은, 그렇게 쌓인 if China가 기술적으로도 SDLC의 측면에서도 여간 곤란한 짐이 아니라는 사실이었고, 그 전후로 개발팀들은 잠재적인 코드 부채들과 오래 싸워야 했다. 그것을 꽤 가까이에서 지켜본 처지라, 사정의 무게가 중국만 못한 상황에서 if Korea를 넣자는 이야기는 명분에서부터 힘이 모자랄 수밖에 없었다.
그래서 선호된 방법은 'if 한국'이 아니라 'if 이 기능이 켜진 나라라면'처럼, 한국을 특별히 떼어 다루는 대신 모든 나라를 같은 틀에 올려놓고 차이는 설정에 두는 쪽이었다. 한국의 실명 인증 같은 것도 코드에 나라 이름을 적어 넣는 대신 '이 기능이 이 locale에서 켜져 있는가'라는 feature flag로 놓고, 어느 기능을 어느 나라에 넣고 뺄지는 잘 정리된 config로 따로 빼 두면, 코드는 코드대로 마음껏 다듬어 가면서도 기능이 어긋나는 일은 없었다. 물론 '이 실명 인증이 다른 어느 나라에서 쓰인다면' 혹은 법이 바뀌어서 다르게 켜고 꺼야 하는 경우까지 내다본 기대이기도 했다.
이런 깐깐함은 단지 취향이 아니라, 무언가를 만들어 공용 코드에 합쳐 넣는 일을 마치 공공재를 보태는 것처럼 여겨 엄격한 리뷰와 승인을 거치게 하던 문화에서 나왔다. 특정 나라만을 위한 처리조차 슬그머니 끼워 넣는 예외가 아니라 하나의 어엿한 기능 출시로 다루어, 설령 법이 그렇게 요구한다 하더라도 그 영향이 어디까지 미치는지를 실험과 분석으로 먼저 따져 본 다음에야 결정에 보태곤 했다. 이 문화에 대한 자세한 내용은 Software Engineering at Google ( https://abseil.io/resources/swe-book )에서 참고하시길.
그런데 무언가를 나라에 맞춰 다르게 주려면 그 전에 이 사람이 대체 어느 나라 사람인지부터 알아야 하는데, 로그인조차 하지 않은 사용자라면 그가 누구인지 알려 주는 단서가 많지 않아서, 브라우저가 보내오는 언어 설정으로 그가 쓰는 말을 짐작하고 접속한 IP의 위치, 그러니까 geo IP로 그 자리를 가늠하고, 또 한때는 google.co.kr 같은 도메인으로 그가 들어온 문을 이용해 판단하는 식이었다. 여러 조건들을 if condition으로 놓기도, 확률 모델을 사용하기도 했던 기억이다.
재미있는 건 이 '로그인하지 않은 사용자'라는 말의 무게가 시간과 함께 통째로 뒤집혔다는 점인데, 크롬도 스마트폰도 흔치 않던 시절 한국이라면 PC방에서 쏟아져 들어오던 거의 모든 트래픽이 로그인 없는 익명의 사용자였던 반면, 누구나 제 계정으로 로그인한 채 살아가는 지금은 오히려 일부러 incognito를 켠 극소수만이 그 자리에 남게 되었다. 구글 Chrome 팀과 구글 identity 팀의 노력은 경의를 표할 만큼 집요한 면이 있어 몇몇 협업의 기회가 있었을 때 배울 게 많았던 기억이다.
로그인을 하고 나면 사정이 한결 나아진다. 한 번 로그인하면 어디서든 그 계정으로 살아가는 single sign-on은 크롬 이전에는 확실히 없던 문화였고, 이것을 브라우저 레벨에서 해내겠다는 것은 구글로서도 매우 야심 차고 거대한 프로젝트였는데, 그것이 펼쳐지면서 구글은 계정마다 확률을 두기 시작했다. 이메일이며 문서며 그 계정으로 오간 것들을 두루 살펴 언어의 비율을 잡는 식인데, 내 개인 계정은 한글과 영어가 칠 대 삼쯤, 회사 계정은 거꾸로 이 대 팔쯤으로 잡혀 있었다. 여러 제품을 아우르는 서비스가 사용자를 이해하는 방법 중 하나였을 거고, 언어는 이렇게 확률로 구할 수 있었다.
그런데 나라는 그럴 수가 없었다. 결제가 얽히는 순간 나라는 하나를 골라야 했고, 나는 개인 계정을 통신사와 은행이 이어진 한국에, 회사 계정을 미국에 두었다. 퇴사한 뒤 개인 계정의 국적을 미국으로 옮기는 일은 생각보다 꽤 복잡했는데, 이런 절차가 테러 자금 같은 것을 추적하는 국제 공조에 닿아 있다는 걸 알고 나서는 조금 불편해도 취지를 따르기로 했다. 따지고 보면 세금과 결제야말로 한 사람을 어느 나라 사람으로 매기는 가장 무거운 잣대였던 셈이다. 언어는 칠 대 삼으로 걸쳐 살 수 있어도, 돈, 특히 세금 앞에서 나라는 하나여야 했다.
도메인과 IP, 계정과 세금. 여러 단서를 끌어모아 보아도 나라라는 선은 코드에 적어 넣기에는 늘 조금씩 흐릿했고, 사용자는 그 사이를 아무렇지 않게 넘나들며 살았다. 코드에 나라를 안 넣으려던 그 노력들은, 돌이켜 보면 그 흐릿함을 인정하는 일이었는지도 모른다. 글로벌 서비스를 운영하려는 분들께 작은 존경과 위로의 마음을 건네어 본다.
—-
원문은 브런치에 있습니다 → https://brunch.co.kr/@chaesang/192
