고 언어가 가장 빛을 발하는 분야는?
컨텐츠 정보
- 조회 370
본문
고는 마니아들이 호기심에 사용하던 언어에서 출발해 15년 만에 이제는 세계에서 가장 중요한 여러 클라우드 네이티브 소프트웨어 프로젝트를 움직이는, 실제 환경에서 검증된 프로그래밍 언어로 발전했다.
도커, 쿠버네티스와 같은 프로젝트의 언어로 고가 선택된 이유가 궁금한 적이 있다면 이 기사를 통해 그 궁금증을 해소할 수 있을 것이다. 고의 대표적인 특징, 다른 프로그래밍 언어와의 차이점을 정리하고, AI 기반 툴 영역에서 현재 고의 입지를 비롯해 고가 적합한 프로젝트 종류는 무엇인지 살펴본다. 마지막으로 고의 기능과 한계, 그리고 앞으로의 발전 방향을 조망한다.
고는 작고 단순한 언어
고 또는 고랭(Golang)은 구글 직원들, 그 중에서도 오랜 유닉스 구루이자 구글 특별 엔지니어인 롭 파이크가 중심이 돼 개발한 언어지만 엄밀히 말해 “구글 프로젝트”는 아니다. 고는 바람직한 사용 방식과 방향성에 대해 확고한 의견을 가진 리더십의 주도 하에 커뮤니티에서 개발된 오픈소스 프로젝트다.
고의 설계 방향이 쉽게 배우고 직관적으로 사용할 수 있는 언어인 만큼 사용하는 구문도 읽고 이해하기 쉽다. 기능은 특히 C++ 같은 언어와 비교하면 많지 않은 편이다. 고의 구문은 C와 비슷한 면이 있어 오랜 C 개발자들에게 비교적 쉽게 느껴지지만 고의 여러 기능, 특히 동시성과 함수형 프로그래밍 관련 기능은 얼랭(Erlang)과 같은 언어를 연상시키기도 한다.
고는 크로스 플랫폼 엔터프라이즈 애플리케이션을 구축하고 유지하기 위한 C 유사 언어인 만큼 자바와 많은 공통점이 있다. 또한 어디서든 실행 가능한 코드를 빠르게 개발할 수 있는 수단이라는 측면에서 파이썬과 비슷하다고 할 수도 있지만 파이썬과 고의 경우 공통점보다는 차이점이 더 크다.
고 문서에서는 고를 “빠른 정적 타입 컴파일 언어이면서 동적 타입 인터프리터 언어처럼 느껴지는 언어”라고 설명한다. 대규모 고 프로그램도 몇 초 만에 컴파일된다. 또한 고는 C 스타일의 include 파일과 라이브러리에 따르는 오버헤드를 대부분 피해간다.
고 언어의 장점
고는 다재다능하고 편리하고 빠르고 이식성과 상호운용성을 제공하며 폭넓게 지원되는 현대 언어다. 이러한 특성 덕분에 대규모 개발 프로젝트에서 가장 선호되는 언어로 확고하게 자리잡았다. 고의 긍정적인 여러 특성을 하나씩 자세히 살펴보자.
다재다능함과 편리함
많은 일반적인 프로그래밍 요구를 충족할 수 있다는 면에서 고는 파이썬 같은 인터프리터 언어와 비견될 정도다. 동시성과 스레드 유사 동작을 위한 고루틴 등 언어 자체에 내장된 기능도 있고, http 패키지와 같은 고 표준 라이브러리 패키지를 통해 부가적인 기능도 사용할 수 있다. 파이썬과 마찬가지로 가비지 수집을 포함한 자동 메모리 관리 기능도 제공한다.
그러나 인터프리터 언어와 달리 고 코드는 실행 속도가 빠른 네이티브 바이너리로 컴파일된다. 또한 C나 C++과 달리 고는 컴파일 속도가 매우 빨라 컴파일 언어가 아닌 인터프리터 언어를 다루는 듯한 느낌이 들 정도다. 게다가 고의 빌드 시스템은 다른 여러 컴파일 언어에 비해 복잡하지 않아서 고 프로젝트를 빌드하고 실행하는 데 필요한 단계나 신경 써야 할 부분이 매우 적다.
많은 언어를 앞서는 빠른 속도
고 바이너리의 실행 속도는 C 바이너리보다는 느리지만 그 차이는 대다수 애플리케이션에서는 인지할 수 없을 만큼 미미하다. 대다수 작업에서 고의 성능은 C와 대등하고 자바스크립트, 파이썬, 루비 등 개발 속도로 유명한 언어에 비하면 훨씬 더 빠르다.
이식성과 상호운용성
고 툴체인으로 생성된 실행 파일은 기본 외부 종속성 없이 독립적으로 실행된다. 고 툴체인은 다양한 운영체제와 하드웨어 플랫폼에 걸쳐 제공되며, 이러한 툴체인을 사용해 여러 플랫폼을 오가며 바이너리를 컴파일할 수도 있다. 무엇보다, 이와 같은 모든 기능을 기반 시스템에 대한 접근성을 희생하지 않으면서 제공한다. 고 프로그램은 외부 C 라이브러리와 통신하거나 네이티브 시스템 호출을 수행할 수 있다. 예를 들어 도커에서 고는 저수준 리눅스 기능, cgroups, 네임스페이스와 상호작용해 컨테이너를 구현한다.
폭넓은 지원
고 툴체인은 리눅스, 맥OS, 윈도우 바이너리, 또는 도커 컨테이너로 무료로 제공된다. 레드햇 엔터프라이즈 리눅스, 페도라와 같은 인기 있는 리눅스 배포판에 기본적으로 포함되므로 각 플랫폼에 대체로 쉽게 고 소스를 배포할 수 있다. 또한 마이크로소프트 비주얼 스튜디오 코드부터 액티브스테이트(ActiveState)의 코모도 IDE에 이르기까지 많은 서드파티 개발 환경에서도 고에 대한 지원은 탄탄하다.
고 언어를 위한 최적의 사용례
모든 작업에 맞는 언어는 없지만 다른 언어에 비해 더 많은 작업에 적합한 언어는 있다. 고는 클라우드 네이티브 개발 프로젝트, 분산 네트워크 서비스, 그리고 유틸리티와 독립 실행 툴 개발에서 가장 빛을 발한다. 이러한 각 프로젝트 유형에 특히 잘 맞는 고의 특성을 살펴보자.
클라우드 네이티브 개발
고의 동시성과 네트워킹 기능, 높은 이식성은 클라우드 네이티브 앱 구축에 적합한 특성이다. 실제로 도커, 쿠버네티스, 이스티오를 비롯한 클라우드 네이티브 컴퓨팅의 초석이라고 할 수 있는 여러 프로젝트를 구축하는 데 고가 사용됐다.
분산 네트워크 서비스
네트워크 애플리케이션의 생명은 동시성인데, 고의 네이티브 동시성 기능(주로 고루틴과 채널)은 이러한 작업에 잘 맞는다. 당연히 고 프로젝트의 상당수는 네트워킹, 분산 함수, 클라우드 서비스를 위한 프로젝트다. 여기에는 API, 웹 서버, 마이크로서비스를 위한 쿠버네티스 지원 프레임워크 등이 포함된다.
유틸리티와 독립형 툴
고 프로그램은 외부 종속성이 최소화된 바이너리로 컴파일된다. 빠르게 실행되고 재배포를 위한 패키징이 용이한 만큼 유틸리티와 기타 툴을 만드는 데 이상적이다. 한 예로 텔레포트(Teleport)라는 액세스 서버는 소스에서 컴파일하거나 사전 빌드된 바이너리를 다운로드하는 방법으로 빠르게 서버에 배포할 수 있다.
고 언어의 한계
이제 고의 한계에 대해서도 살펴보자. 우선 개발자들이 원할 만한 많은 언어 기능이 생략됐다. 또한 모든 것을 바이너리에 집어넣기 때문에 고 프로그램은 크기가 클 수 있다. 고의 가비지 수집 메커니즘은 자동 메모리 관리를 제공하지만 절대적 성능 측면에서 그 대가를 치른다. 또한 GUI를 빌드하기 위한 표준 툴킷이 없고, 시스템 프로그래밍에는 적합하지 않다는 한계도 있다.
각각의 문제를 더 자세히 살펴보자.
많은 언어 기능의 생략
방향성이 강한 고의 기능 집합은 찬사와 비판을 동시에 받는다. 고는 작고 이해하기 쉬운 언어에 초점을 두면서 특정 기능은 의도적으로 생략했다. 그 결과 다른 언어에서는 흔히 볼 수 있는 몇 가지 기능이 고에는 없다. 의도적 설계라 해도 프로젝트 유형에 따라 분명 단점이 된다.
다른 언어에는 있지만 고에는 없는 기능 중 하나가 매크로다. 매크로의 일반적인 정의는 컴파일 타임에 프로그램 코드를 생성하는 기능이다. C, C++, 그리고 최근 부상 중인 러스트 모두 매크로 시스템이 있는데, 고에는 매크로가 없다. 적어도 이들 언어와 같은 형태의 매크로는 존재하지 않는다. 대신 고에는 고 소스 내의 매직 코멘트를 찾아 실행하는 go generate라는 툴 명령이 있다. 이 명령을 사용해서 고 소스 코드를 생성하거나 심지어 다른 명령을 실행할 수도 있지만, 주 용도는 일반적으로 빌드 프로세스에 앞서 프로그램에 따라 코드를 생성하는 것이다. (기술 블로거 엘리 벤데르스키가 go generate 명령에 대해 자세히 설명하는 글을 썼다.)
최근까지 오랫동안 이어진 또 다른 불만은 하나의 함수가 여러 타입의 변수를 받을 수 있게 해주는 제네릭 함수의 부재였다. 고 개발 팀은 고의 나머지 부분과 상호 보완적인 구문과 동작을 원한다는 이유로 오랫동안 제네릭 도입을 거부했지만 2022년 초에 출시된 고 1.18부터는 제네릭을 위한 구문을 언어에 넣었다. 과거에는 go generate와 이 명령의 코드 생성 기능이 제네릭 부재를 부분적으로 해결하기 위한 수단으로 사용됐지만 지금은 잘 사용되지 않는다.
사실 고는 중대한 언어 기능을 추가하는 경우가 거의 없고, 추가하더라도 상당한 검토가 선행된다. 이 같은 관행은 여러 버전에 걸친 폭넓은 하위 호환성을 유지하는 데는 유리하지만 혁신 속도를 떨어트린다는 대가가 따른다.
비대한 바이너리
고의 또 다른 잠재적 단점은 생성되는 바이너리의 크기다. 고 바이너리는 기본적으로 정적 컴파일된다. 즉, 런타임에 필요한 모든 요소가 바이너리 이미지에 포함된다. 이 방식을 사용하면 빌드와 배포 프로세스는 간소화되지만 대신 간단한 “Hello, world!” 프로그램조차 64비트 윈도우에서 크기가 약 1.5MB에 달한다. 고 팀은 릴리스마다 바이너리 크기를 줄이기 위해 노력을 기울여왔다. 압축을 사용하거나 디버그 정보를 제거해 고 바이너리 크기를 줄이는 방법도 있는데, 후자의 방법은 서비스 장애 시 현장에서 디버그 정보가 필요한 클라우드나 네트워크 서비스에는 부적절하고, 독립 실행형 분산 애플리케이션에 사용하는 것이 좋다.
가비지 수집의 리소스 소비
고가 자랑하는 또 하나의 기능인 자동 메모리 관리는 가비지 수집을 위해 일정한 처리 오버헤드가 필요하다는 측면에서 단점으로도 볼 수 있다. 설계 자체가 수동 메모리 관리를 제공하지 않는 고의 가비지 수집은 엔터프라이즈 애플리케이션의 메모리 부하를 잘 처리하지 못한다는 비판을 받아왔다.
그나마 새로운 버전이 나올 때마다 메모리 관리 기능이 개선되고 있긴 하다. 예를 들어 고 1.8에서 가비지 수집을 위한 지연 시간이 대폭 단축됐고, 1.25에서는 새로운 실험적인 가비지 수집기가 도입됐다. 고 개발자는 C 확장의 수동 메모리 할당을 사용하거나 서드파티 수동 메모리 관리 라이브러리를 사용할 수 있지만 대다수 개발자는 네이티브 솔루션을 선호한다.
표준 GUI 툴킷의 부재
대다수 고 애플리케이션은 명령줄 툴 또는 네트워크 서비스지만 고 애플리케이션을 위한 풍부한 GUI를 제공하기 위한 다양한 프로젝트가 현재 진행되고 있다. GTK와 GTK3 프레임워크를 위한 바인딩이 있고, 여러 플랫폼에 걸쳐 플랫폼 네이티브 UI를 제공하려는 프로젝트도 있다(고 1.24 이상 버전에 중심을 둠). 그러나 이 부분에서 확고한, 또는 장기적으로 안전한 선택지는 아직 등장하지 않았다. 또한 고는 설계상 플랫폼 독립적이기 때문에 이 영역의 프로젝트가 표준 패키지 집합에 포함될 가능성도 희박하다.
시스템 프로그래밍에는 적합하지 않은 언어
마지막으로, 고는 네이티브 시스템 기능과 통신은 할 수 있지만 커널, 디바이스 드라이버, 임베디드 시스템과 같은 저수준 시스템 구성요소를 개발하도록 설계된 언어는 아니다. 결국 고 런타임과 가비지 수집기는 기반 운영체제에 의존한다. (이러한 종류의 작업을 위한 최신 언어를 찾는 개발자라면 러스트에 관심을 가질 만하다.)
고 언어의 미래
고의 개발 방향은 갈수록 개발자들의 요구와 필요에 맞춰지고 있으며, 개발진은 자신들의 원칙을 고집하기보다는 개발자들의 의견을 반영해 언어의 변화를 추구하고 있다. 대표적인 사례가 제네릭이다. 제네릭은 최선의 방식에 대한 오랜 토론 끝에 언어에 추가됐다.
2024년 고 개발자 설문조사에 따르면 고에 대한 개발자들은 만족도는 대체로 높지만 오류 처리의 장황함, 없거나 미성숙한 프레임워크, 고의 타입 시스템 사용 등과 관련해 풀어야 할 숙제도 드러났다. 이러한 영역에서는 향후 많은 발전이 필요하다.
대다수 언어가 그렇듯이 고도 시간이 지날수록 핵심 사용례에 집중하면서 결국 네트워크 서비스에서 틈새를 찾았다. 향후 고는 이 영역에서 입지를 계속 확대해 나갈 가능성이 높다. 개발자 설문에서 언급된 다른 사용례로는 API나 RPC 서비스 생성(응답자의 74%), CLI 애플리케이션(63%), 웹 서비스(45%), 라이브러리/프레임워크(44%), 자동화(39%), 데이터 처리(37%) 등이 있다. AI 기술 개발에 고를 사용한다고 응답한 비율은 4%에 그쳤지만 이들은 고가 프로덕션 환경에서 AI 기반 워크로드를 실행하기 위한 강력한 플랫폼이라고 평가했다. ML/AI 개발에 고를 사용하지 않는 개발자들이 선택한 주요 이유는 툴 부족(23%), 그리고 이러한 작업의 기본 선택지가 파이썬이라는 점(16%)이었다.
고의 장점인 빠른 속도와 개발의 간소함이 다른 사용례, 특히 이미 다른 언어와 기존 사용례가 지배하고 있는 영역으로 얼마나 확장될지는 아직 알 수 없다. 러스트는 안전하고 빠른 시스템 프로그래밍(고의 진입 가능성이 낮은 영역)을 위한 지배적인 언어이며, 파이썬은 여전히 ML/AI, 프로토타이핑, 자동화, 글루 코드를 위해 사람들이 가장 많이 찾는 언어다. 엔터프라이즈 애플리케이션 분야에는 강력한 자바가 버티고 있다.
그러나 주요 프로그래밍 언어로서 고의 미래는 이미 확고하며, 특히 장기적으로 유지 가능한 확장성 있는 인프라 개발에 고의 속도와 단순성이 도움이 되는 클라우드 분야에서의 미래가 밝다.
dl-itworldkorea@foundryco.com
관련자료
-
링크
-
이전
-
다음





