Go 언어, 어디에 써야 할까? 4월 COMMIT 현장 스케치

Go 언어 강의이호민카카오엔터프라이즈이호민

구름 COMMIT은 한 달에 한 번 수요일마다 기술, 개발, 성장, 조직 문화 등을 주제로 열리고 있습니다. 7번째 COMMIT에서는 ‘Go 언어’ 이야기를 나누었어요. Go 언어의 매력에 빠져 백엔드로 직무까지 바꾼 카카오엔터프라이즈 개발자 이호민 님과 함께요. 4월 COMMIT 현장의 이야기를 전해드립니다. Go 언어, 어디에 써야 할까요?

🎤 이 아티클은 이호민 님의 4월 COMMIT 세미나 내용을 바탕으로 재구성되었습니다.

개발 경력 20년

저는 카카오엔터프라이즈에서 전업 Go 개발자로 일하고 있습니다. Go 언어 외에는 거의 사용하지 않고 있어요. 피처 폰 개발부터 시작해 임베디드 개발자를 거쳐 지금은 백엔드 개발자로 총 20년 가까이 개발하고 있습니다.

안드로이드 프레임워크, 리눅스 등 다수의 오픈 소스 프로젝트에도 참여했어요. 개인 오픈 소스 프로젝트는 100개 정도 진행했습니다. 작은 회사에서 경력을 시작해 저를 알리고 싶었거든요. 제 토이 프로젝트가 궁금하시다면 깃헙 저장소(Github)를 참고해 주세요.

오늘 COMMIT에서는 제가 Go 언어 테크 트리(Tech Tree)를 타게 된 이유와 과정을 소개해 드릴게요. Go 언어를 기술적으로 깊게 다루지는 않습니다.

내가 써 본 프로그래밍 언어

Go언어

저는 초등학교 때 베이직(BASIC)으로 프로그래밍을 시작했어요. 대학에서는 C/C++를 전공했는데 코딩하는 과정이 정말 고통스러웠습니다. 당시에는 윈도우에서 짠 프로그램이 리눅스(Linux)에서 돌아가지 않는 경우가 많아 불편했거든요. 그러다 파이썬(Python)이 좋다는 이야기를 듣고 조금씩 사용하기 시작했습니다. 지금은 Go 언어에 정착했지만요.

제가 Go 언어를 얼마나 다룰 줄 아는지 궁금하실 텐데요. 일단 Go 언어의 모든 문법을 알고 있습니다. Go 언어에서는 이 단계가 굉장히 쉬워요. 일주일 정도면 모든 문법을 파악하실 수 있습니다.

Go 언어의 모든 패키지를 다 훑어봤고요. 패키지도 마음만 먹으면 다 보실 수 있습니다. 무엇보다 Go 언어를 Go 언어답게 사용하고 있어요. 여전히 훈련하고 있지만요.

이외에는 배쉬(Bash), 자바스크립트(JavaScript), 다트와 플러터(Dart with Flutter), 러스트(Rust)를 사용했습니다. 리눅스가 세상을 정복한 만큼 종종 배쉬를 사용했고, 자바스크립트나 다트, 플러터는 테스트용 웹 페이지나 앱을 만들 때 사용하고 있습니다. 러스트도 사용해 봤는데 저는 여전히 Go가 더 마음에 들더라고요. 그래도 러스트는 배워볼 만한 가치가 있는 언어라고 생각합니다.

파이썬 경력 20년 이상

파이썬도 매력이 많은 언어입니다. 제가 파이썬에 빠진 이유는 당시에 파이썬은 C와는 다르게 배터리가 포함(Battery Included: 일반적인 개발 작업에 사용할 수 있는 표준 라이브러리가 포함되어 있다는 의미)되어 있다고 광고했거든요. 기본 라이브러리에 많은 기능이 들어가 있고, 보안이나 유니코드 지원 등 내장 패키지도 강력했어요. 서드 파티(3rd Party) 패키지도 다양했고요. 파이썬은 C와는 달리 멀티 플랫폼 언어라 한 번 짠 프로그램을 다른 플랫폼에서 그대로 돌릴 수 있는 점도 좋았습니다.

제가 취업하고 처음 맡은 업무가 휴대폰 소스 코드에 있는 중국어와 영어 쌍을 복사, 붙여넣기 해서 엑셀로 정리하는 거였어요. 2달 정도 걸리는 업무라고 하시더라고요. 2주 동안 복사, 붙여넣기 하다가 안 되겠다 싶어 파이썬을 익혔습니다. 파이썬으로 자동화하고 나니 2분 만에 되더라고요. 2달짜리 업무를 2분으로 만든 경험이 무척 달달했습니다. 이때 파이썬에 큰 매력을 느꼈고, 모든 업무에 파이썬을 사용하고 싶어졌어요.

아쉽지만 주 업무가 파이썬이 아니었고, 당시 하드웨어는 파이썬 인터프리터를 품지 못했습니다. 주변 동료를 설득하기도 어려웠고요. 결국에는 주 업무의 보조용으로만 간간이 파이썬을 사용했습니다. 그렇게 10년 정도가 흐르고 나니 머신러닝 세상이 왔고, 파이썬 엔지니어의 몸값이 크게 뛰었죠. 저는 아쉽지만, 기회를 놓쳤고요. 파이썬을 10년 정도 썼지만, 파이썬으로 내세울 만한 게 없었습니다. 그러던 차에 우연히 Go를 만났어요.

Go에 빠지게 된 이유를 소개해 드리기 전에 Go가 어떤 언어인지 간단하게 짚어보겠습니다.

Go 언어 소개

  • 2007년 : 구글에서 로버트 그리즈머(Robert Griesemer), 롭 파이크(Rob Pike), 켄 톰슨(Ken Thompson)이 언어 설계 시작
  • 2009년 : Go 공식 발표
  • 2012년 : BSD(Berkeley Software Distribution) 스타일 라이선스 하에 오픈 소스 프로젝트로 출시
  • 2015년 : 가비지 컬렉터(Garbage Collector)에 중요한 개선이 이루어진 Go 1.5 출시
  • 2018년 : 의존성 관리를 위한 Go 모듈이 도입된 Go 1.11 출시
  • 2021년 : 컴파일러 최적화 개선과 애플 실리콘(M1) 프로세서에 대한 네이티브 지원이 포함된 Go 1.17 출시
  • 2022년 : 제네릭(Generic)이 포함된 Go 1.18 출시

Go 언어는 2007년에 구글에서 로버트 그리즈머, 롭 파이크, 켄 톰슨이 설계해 2009년에 공식 발표한 언어입니다. 저는 Google I/O 발표 영상으로 처음 접했어요. 본격적으로 Go 언어를 사용하기 시작한 건 2013년쯤이니 10년 정도 됐네요.

Go 언어는 오픈 소스 라이선스가 GPL(General Public License: 외부 배포 시 해당 소프트웨어의 전체 소스 코드를 공개해야 하는 오픈 소스 라이선스)이 아니라 BSD(Berkeley Software Distribution: 소프트웨어의 무료 사용, 수정 및 배포를 허용하는 오픈 소스 라이선스)이기 때문에 기업 입장에서는 상대적으로 유리합니다. GPL은 오픈 소스를 사용하면 결과 소스도 반드시 오픈해야 하는데, 기업 입장에서는 이게 큰 리스크거든요. Go 언어는 BSD 스타일 라이선스 하에 오픈 소스 프로젝트로 출시되었기 때문에 결과물을 공개할 필요가 없습니다.

Go언어마스코트

‘고퍼(Gopher)’라는 Go 언어 공식 마스코트인데, 호불호가 많이 갈리는 편이에요. 저는 선호하는 편입니다. 고퍼는 롭 파이크의 부인인 일러스트레이터 르네 프렌치(Renee French)가 롭 파이크 동료를 한 명씩 그렸는데 그중 한 작품에서 탄생했다고 해요.

Go 언어 아버지들의 업적

로버트 그리즈머, 롭 파이크, 켄 톰슨은 전설적인 분들이죠. 세 분 다 유닉스(Unix) 계열 OS에 잔뼈가 굵은 분들입니다.

로버트 그리즈머는 V8 자바스크립트 엔진을 만든 분이에요. 대부분의 크롬 웹사이트에 들어가는 엔진이죠. 롭 파이크는 유닉스, 플랜 9(Plan 9), 인페르노(Inferno) OS를 설계했습니다. UTF-8을 개발했고요. 켄 톰슨도 유닉스를 같이 만든 분이에요. C 프로그래밍 언어의 전신인 B 프로그래밍 언어를 만든 분이기도 합니다. 몇십 년 동안 B와 C 언어를 사용하면서 아쉽다고 생각한 점을 개선한 언어가 Go입니다.

Go 언어의 목표

Go 언어는 다른 프로그래밍 언어의 단점은 해결하고 강점은 살렸습니다. 복잡성을 크게 줄여 코드 가독성을 높이는 데 초점을 맞췄어요. 컴파일 속도를 개선하고 정적 타입 시스템을 적용했고요.

Go 언어는 단순합니다. 이렇게 쓰자고 약속해 둔 코드가 많아 효율적이에요. 기본적으로 고루틴(Goroutine)을 통해 동시성을 지원하고 있고요. 파이썬에 버금가는 강력한 표준 라이브러리도 제공하고 있습니다. 표준 라이브러리만 따지면 Go 언어가 파이썬보다 뛰어나다고 생각해요.

Go 언어로 프로그래밍할 때 고루틴을 무한한 자원처럼 사용하라는 조언이 많습니다. 그만큼 경량이기 때문이에요. 고루틴 간의 커뮤니케이션도 ‘채널’이라는 기능으로 지원하고요.

무엇보다 Go 언어는 컴파일 언어이다 보니 시작이 빠릅니다. 간단한 API 서버를 파이썬과 Go 언어로 만들었을 때 라즈베리 파이(Raspberry Pi)에서 돌려보면 파이썬은 시작하는 데 5초 가량 걸리는데, Go는 바로 시작합니다. MSA(Micro Service Architecture)로 시스템을 만들 때 Go를 선택하는 이유죠.

자바(Java)도 컴파일 언어지만 JVM(Java Virtual Machine)이 있기 때문에 메모리 소비가 큰 편입니다. 반면에 Go는 네이티브 바이너리(Native Binary)로 빌드해 메모리를 훨씬 적게 소비합니다.

정적 링크도 Go 언어의 장점이죠. 정적 링크는 실행 파일이 하나라는 뜻이에요. 파일 하나만 복사하면 바로 배포할 수 있습니다. 도커(Docker) 같은 컨테이너 기술을 사용할 때 큰 장점이 되죠.

내가 Go를 선택한 이유

파이썬을 처음 접했을 때와 느낌이 비슷했습니다. 언어가 단순해서 금방 배울 수 있고, 생산성이 좋았어요. 무엇보다 프로그램이 작고 빠르니까 어디에나 쓸 수 있을 것 같았습니다.

당시에는 Go 언어를 업으로 다루는 사람이 드물었기 때문에 스페셜리스트(Specialist)가 될 좋은 기회였습니다. 제가 파이썬을 시작할 당시에는 이미 잘하는 분들이 너무 많았거든요.

무엇보다 Go로 개발하는 게 재밌었어요. 저는 개발이 재미있어서 직업으로 선택했는데, C/C++로 개발하는 건 힘들더라고요. Go는 개발하는 과정이 재미있어서 당장 업으로 삼지는 않더라도 계속 붙잡고 있겠다고 다짐했죠.

Go 광야에서 10년

저는 Go 공식 홈페이지 ‘A Tour of Go’로 처음 배웠어요. 이 튜토리얼만 따라 하셔도 기본 문법은 바로 익힐 수 있습니다. 당시에는 Go 한글 책은 커녕 원서도 없었거든요.

이렇게 Go를 배운다고 바로 Go 언어 개발자로 구글에 취업할 수 있을까요? Go 컴파일러 개발자가 아닌 이상 Go 개발자는 채용이 많지 않았습니다. 혼자라도 잘 쓰기로 결심하고 파이썬으로 만든 도구를 포팅하기 시작했어요.

이호민한글시계

제가 취미로 만든 프로젝트 중 한글 시계가 있는데요, 아두이노로 만들었더니 시간이 조금씩 틀어졌습니다. 뒤에 라즈베리 파이 같은 단일 보드 컴퓨터(Single-Board Computer, SBC)를 두고 Go로 포팅해서 올렸더니 NTP(Network Time Protocol)로 정확한 시간을 보여주더라고요. C로 하는 것보다 훨씬 편했습니다. 이때부터 Go를 업으로 삼고 싶다고 생각하고 코딩 테스트를 Go로 풀기 시작했죠.

Go 한글 패키지도 만들었습니다. Go 패키지가 지금도 많은 편은 아니지만, 예전에는 더 없었어요. 파이썬 간판스타셨던 장혜식 님을 벤치마킹해서 만들었습니다.

저는 임베디드 개발자였지만 백엔드 개발에 특화되어 백엔드 포지션으로 전직을 시도했습니다. 가끔 Go 개발자 채용 공고도 열렸는데 매번 떨어졌어요. Go 개발자 채용이지만 Go는 필수 사항이 아니라 우대 사항이었고, 오히려 스프링(Spring)이 필수였거든요. 한국 백엔드는 스프링이 강세니까요.

2년 동안 경력 공백이 있었습니다. 스프링을 다룰 줄 알았다면 쉬웠을 텐데 Go만 아는 제가 백엔드를 다 배우기는 쉽지 않았거든요.

먹고사니즘을 해결하려고 임베디드 안드로이드 시스템 개발자로 카카오에 입사했어요. 코딩 테스트는 Go와 파이썬으로 봤고요. 카카오에 입사하기 전에는 코스랩(KossLab)에서 Go + IoT로 연구 지원을 받았습니다.

입사하자마자 Go를 주로 썼던 건 아니에요. 처음에는 보조 도구로 사용했습니다. 그러다 Go 언어가 어울리는 업무가 생긴 거죠. 암호화, 저수준 네트워크, 동시성 지원이 필요했거든요. 도전적인 일정이라 선뜻 나서는 분이 없어 자원했습니다. Go를 사용한 첫 정식 업무가 됐어요. 하나둘 성공 사례가 쌓이니 더 큰 규모의 일을 할 수 있게 됐습니다.

이런 데서도 Go 언어를 잘 쓰고 있습니다

모던 OS가 있는 환경이면 어디든 쓸만합니다. 웹 API 서버나 클라이언트도 Go로 만들 수 있어요. 크로스 컴파일러(Cross Compiler)가 내장되어 있어 리눅스에서만 쓸 수 있는 게 아니라 윈도우, 맥 OS 등에서 사용할 수 있습니다. C에서는 크로스 컴파일러를 설치하는 게 큰 고통이었거든요.

컨테이너 이미지는 스태틱 싱글 바이너리(Static Single Binary)로 빌드됩니다. 덕분에 스크래치(Scratch) 베이스로 이미지 용량을 5~10MB 사이로 빌드할 수 있습니다. 바이너리 하나 정도 크기로 빌드되죠. 저는 SBC(Single Board Computer)에서 하드웨어를 제어하는 용도로 사용합니다. ‘periph’ 패키지를 사용하면 SBC에서도 Go를 쓸 수 있어요.

Go 개발자 설문 조사 2022

제가 모든 Go 개발자를 대변할 수 없어 설문 조사를 가져왔습니다. 150개 이상의 국가에서 9,000명 이상의 Go 개발자가 응답했어요. 결과를 좀 살펴보겠습니다.

상위 3개 국가는 미국(21%), 독일(10%), 중국(9%)이에요. 중국에 Go 사용자가 매우 많다고 알고 있어요. 구글에 접근하지 못함에도 불구하고 많이 사용하고 계시는 게 의외죠.

응답자의 54%는 Go 사용 경험이 1~5년 정도 됩니다. 75%는 Go를 전문적인 작업에 사용하고 있어요. 주로 소프트웨어, 금융, 통신 분야에서 쓰고 있습니다.

응답자들이 Go를 선택한 이유는 제가 꼽은 이유와 비슷해요. 성능, 단순함, 동시성입니다. 저는 Go의 성능이 자바만큼 좋다고 생각해요. Go는 예약어가 가장 적은 프로그래밍 언어 중 하나로 꼽히고 있습니다. 그만큼 단순하고 배우기 쉽죠. 동시성이 기본 내장된 것도 큰 장점이고요.

Go를 사용하고 계신 분들은 대부분 현재 사용량을 유지하거나(26%), 더 쓰고 싶다(62%)고 답변했습니다.

매년 Go 개발자 설문조사를 할 때마다 Go에 필요한 기능이 무엇인지 묻는데요, 대부분 제네릭이라고 답합니다. Go 1.18 릴리즈에 드디어 제네릭이 포함되었죠. Go 생태계의 특징 중 하나가 충분히 고민한 다음 기능을 릴리즈한다는 거예요. 그 선택이 올바른 경우가 많고요. Go 제네릭은 다른 언어 제네릭보다 제네릭 패키지를 만드는 데 공을 많이 들여 제네릭을 쓰고 있어도 눈치 못 채게 구조가 짜여져 있습니다. 약 1/4 응답자가 Go 코드에서 제네릭을 사용하고 있네요.

서드 파티 종속성 관련 보안 우려도 제기되고 있습니다. 요새는 패키지의 보안 관련 문제를 파악하는 툴이 있는 것으로 알고 있긴 합니다만 전반적으로 다른 언어에 비해 성숙하지 못하다는 우려가 있죠.

에러 처리도 도전 과제입니다. 트라이 캐치(Try Catch)가 없다고 하죠. Go는 에러 처리를 한 땀 한 땀 다 해야 합니다. 이렇게 에러를 처리하면 추적이 쉽다는 장점이 있긴 합니다. 그래도 전반적인 만족도는 매우 높은 편이에요.

2023년 Go 언어의 위상

2023년 3월 기준 TIOBE 10위더라고요. 매달 달라지기는 하는데 대부분 15위 안에는 들었습니다. 파이썬, 자바스크립트, 러스트 등 쟁쟁한 언어들과 어깨를 나란히 하고 있죠.

Golang Korea(한국Go사용자모임)는 멤버가 7,000명이 넘습니다. 올해 6~7월 중에는 GopherCon Korea 행사가 예정되어 있고요. 국내 저서, 번역서는 벌써 50권 이상 되더라고요. 제가 Go를 처음 배울 때는 거의 없었거든요.

Go도 만능칼은 아닙니다

Go도 해결해야 할 과제는 있습니다. 패키지 종속성 관리, 디버깅, 패키지 생태계는 개선이 필요해요. 패키지 종속성은 어느 프로그래밍 언어나 가지고 있는 문제라 저는 크게 불편하지는 않았습니다. NPM 모듈 시스템이 도입된 이후로 많이 개선되기도 했고요.

보통 처음부터 Go를 쓰기보다는 C/C++ 등 다른 언어를 쓰다가 넘어오는 분들이 많아 디버거를 잘 안 쓰실 거예요. 언어가 배우기 쉽다 보니 대부분 로깅 정도로 디버깅하고요.

패키지 생태계 개선이 필요하다는 건 장점이자 단점이라고 생각합니다. 중앙 집중 패키지 시스템이 없기 때문인데요. Go는 러스트의 카고(Cargo)나 노드(Node.js)의 NPM 같은 중앙 집중 패키지 시스템이 없는 대신 저장소의 깃헙 주소를 패키지 주소로 사용합니다. 특이한 시스템이죠. 그래도 생태계 개선은 필요합니다.

어떤 프로그래밍 언어든 하나로만 다 만들려고 하면 안 됩니다. Go도 마찬가지고요. 예를 들면 처음에 ‘Go는 구글에서 만든 언어이니 안드로이드 앱도 만들겠지’라고 기대한 분들이 많았어요. 이제 자바 안 쓰고 Go로 안드로이드 앱을 만드는 세상이 오겠다고 생각했죠. 가능하기는 합니다. Go 팀이 ‘모바일(mobile)’이라는 패키지를 내놨거든요. 아쉽지만 일반인이 쓸 수 있는 수준은 아닙니다.

멀티플랫폼 언어라니까 GUI 앱 정도는 된다고 생각하셨다면 이 또한 어렵습니다. Go는 파이썬처럼 GUI 라이브러리를 기본 제공(tk)하지 않아요. 물론 서드 파티 패키지로 존재하기는 합니다. 만약 GUI가 필요하다면 fyne, wails 같은 실험적이고 예쁜 GUI 프레임워크를 쓰는 걸 추천해요.

저는 취미로 아두이노를 다루어서 Go 프로그램이 워낙 작다고 하니 마이카에 쓰고 싶었어요. 가능하긴 하더라고요. ‘타이니고(TinyGo)’라는 비공식 컴파일러가 있습니다. 타이니고를 사용하면 Go 이미지를 아주 작게 만들어서 비좁은 곳에 심을 수 있어요. 타이니고를 빌드한 걸 웹어셈블리(WebAssembly)에 쓰기도 합니다.

비좁은 곳에 욱여넣는 일이 쉽지는 않죠. 타이니고는 비공식 컴파일러다 보니 설치부터 쉽지 않습니다. 보통 Go 툴이 인스톨러(Installer)로 설치만 하면 되는 데 비하면 상대적으로 공수가 많이 들어요.이런 경우는 러스트가 더 적합합니다. 러스트는 아주 작은 프로그램을 만들 수 있지만 개발 과정이 힘들죠.

다양한 기술을 배우면서 느낀 점

범용적인 기술을 지향해야 합니다. 이쪽 업계는 3개월만 가만히 있어도 뒤처지기 쉽잖아요. 일반적으로 널리 사용할 수 있는 걸 배워야 한다고 생각합니다.

저는 파이썬을 시작하기 전에 리눅스를 배운 게 신의 한 수였다고 생각해요. 당시에는 리눅스가 세계를 정복한다는 이야기가 웃겨서 배우기 시작했는데 실제로 정복해 버렸죠. 리눅스는 교양 필수입니다. 도커와 쿠버네티스도 필수라고 생각하고요.

오픈 소스 순혈주의(GPL)는 조심하시고 도움이 되는 도구는 편견 없이 사용하세요. 코파일럿(Copilot)을 아직 안 쓰신다면 꼭 써보시고요.

Go는 이렇게 익숙해지세요

Go 공식 홈페이지의 인터렉티브 튜토리얼을 따라 하는 게 큰 도움이 됩니다. 한 번 따라 하고 나면 대부분의 책이 필요 없어질 거예요.

유데미 같은 곳에서 강의를 듣는 것도 추천드립니다. 종종 90% 세일을 하거나 평생 소장할 수 있는 강의들도 많고요. 번역서도 좋습니다.

커뮤니티도 많이 활용해 보세요. 혼자서 끙끙 앓지 마시고 커뮤니티에 물어보면 많은 분이 친절하게 알려주실 거예요.

모든 기술은 써보기 전까지는 진가를 알 수 없습니다. 뭐라도 꼭 만들어 보시길 바라요.

마치며

Go는 특별한 기능이 있는 언어는 아닙니다. 대신 설계상 올바른 선택을 한 게 강점인 언어예요. 첫 릴리즈 후 11년 동안 안정적인 사용층을 확보해 성숙한 언어의 길로 접어들었고요.

혹시 Go를 사용해 보니 좋아서 회사 동료들을 설득하고 싶다면 억지로 밀고 나가는 건 추천하지 않습니다. 본인이 편한 데 Go를 사용하면서 Go가 성향에 맞는 분들을 자연스럽게 유입시키는 게 좋습니다.

다른 언어로 구축한 시스템을 Go로 다 뜯어고치는 건 큰 비용이 들겠죠. 인력과 시간 모두요. 지금은 컨테이너 기술이 보편화되어 있어 컨테이너만 사용하면 필요한 부분만 Go로 새로 만들 수 있습니다. 이렇게 만들어서 다른 컴포넌트와 융합하면 돼요. 이런 식으로 조금씩 적용 분야를 넓혀가시면 좋겠어요. 특히 비용이 문제가 되는 컴포넌트를 Go로 구축하며 세력을 늘려나가면 좋겠습니다.

Edit Sunny Design Lil


Posted by
goorm

ANYONE CAN DEVELOP