[Go] Golang 이란

2022. 8. 15. 15:44[ DevOps ]/[ Golang ]

Go의 철학

1. 큰 프로젝트에서도 사용될 수 있는 안정성

2. 빠른 속도

3. 요즘 인기 있는 Python, Javascript과 같은 가독성

4. 네트워크, 멀티프로세싱에 최적화

 

cf. 2012년 3월에 Go 1.0 공개했으며 현재(2022년 8월) 최신 버전은 1.19이다.

 

Golang은 C계열 언어로 분류되며 객체지향 언어는 아니지만 객체지향스럽게 프로그래밍 가능하다고 한다.(상속을 지원하지 않지만 객체지향처럼 코딩 가능) Go는 UNIX, C언어, B언어, UTF8, JVM과 같은 프로젝트에 참여한, 꽤 영향력이 큰 개발자들이 만든 언어이다.

 


Golang의 장단점

1. 장점

1. 빠른 속도

Go는 컴파일 기반 언어여서 실행 자체 시점만 비교했을 때, 인터프리터 기반인 언어보다 빠르다. 컴파일 언어는 전체 코드를 한 번에 번역 후 실행하는 방식으로 컴파일 속도에 의존적이고 큰 메모리를 사용한다는 점, 플랫폼에 의존적이다는 점이 단점이 될 수 있다. 하지만 한번 컴파일이 되기만 하면 실행시키는 시간 자체는 빠르다. 인터프리터 언어는 라인 단위로 해석하여 실행하기 때문에 실행 자체 속도만 봤을 때, 컴파일 언어보다 느리다.

 

[여담]

C/C++는 개발자의 손이 많이 가기 때문에 개발 속도가 느리지만 실행 속도는 매우 빠르다. Python은 개발 속도가 빠르지만 실행 속도는 매우 느리다. Go는 개발 속도와 실행 속도가 모두 빠른 편에 속하는 언어이다. 또한 Go는 Javascript처럼 배우기 쉽지만 Javascript보다 빠르다. 플랫폼에 따라 다르겠지만 Go는 Java보다 빠르거나 비슷하다고 한다.

 

2. 배우기 쉬움, 가독성 향상

실행이 빠르다는 C언어의 특징과 간편한 문법을 제공하는 Python, Javascript의 장점을 모두 가지고 있다. 하지만 배울 것도 다른 언어에 비해 많지 않다. 예를 들어, Javascript에서는 loop를 위한 기능 중 for, map, filter, forEach, for in, for of 등이 있지만 Go에서는 for 하나만 제공된다. 마찬가지로 C언어에서의 for, while, doWhile은 결국 컴파일되면 같은 코드이기 때문에 Go에서는 for 하나로 통일했다. 즉, 다른 방법을 찾으려고 노력하지 않아도 된다는 의미이다. 

 

Go에도 포인터가 있지만 포인터 연산은 지원하지 않는다. 포인터를 연산하다 보면 의도하지 않은 주소에 접근할 수 있다는 우려가 있기 때문이다. 따라서 C언어에서의 복잡했던 많은 부분을 단순화했고 가독성을 향상했다. 

 

3. 멀티 코어 환경에 최적화(분산 시스템에서 강점)

Go언어는 멀티 코어 환경을 감안해서 만들어졌기 때문에 멀티코어 프러세싱(parallel)을 사용하는 애플리케이션을 개발할 때 다른 언어에 비해 쉽게 구현 가능하다. 고루틴(Goroutine)을 사용하여 한 줄로 쓰레드 생성 가능하며, go 키워드를 사용해서 concurrent하게 실행할 수 있다. Java나 C에서 쓰레드를 구현하려면 제약이 많았다. 예를 들어, Java에서 쓰레드를 구현하는 방법 중 Runnable을 extend하고 run() 메소드 구현하는 등의 복잡한 과정이 요구된다. C에서도 pthread로 쓰레드를 구현하는데 꽤 제한도 많고 복잡하다. Go는 NodeJS의 장점인 쉬운 비동기 처리 장점을 가지고 있다.

 

Go에서는 경량 쓰레드인 고루틴(Goroutine)을 제공하고 쓰레드 간 메시징을 위한 채널(Channel)을 지원한다. 

 

cf. 아래는 삼성SDS 문서를 참고했다. (바로가기)

고루틴은 자체 Go 런타임 스케줄러에 의해 관리되며 OS 스레드에 비해서도 경량입니다. OS 스레드를 생성하는데 필요한 메모리가 1MB인 반면, 고루틴은 2KB입니다. 또한 일반 스레드와 달리 메모리의 스택 영역을 사용하며 자체 스케줄러에 의해 관리하므로 컨텍스트 스위칭 비용을 줄입니다. 여기에 Go 런타임에서 사용하는 CPU 코어 수를 지정하는 환경변수 GOMAXPROC를 지정함으로써 병렬적으로 고루틴을 실행할 수 있습니다. 하나의 프로세스에서 보통 1만 개의 고루틴을 실행시킬 수 있으며 몇십만 단위의 고루틴도 실행 가능하도록 스케줄러가 구현되어 있습니다. (스택 메모리가 부족하면 힙 영역까지 확장)

 

4. 다양한 프레임워크에서 사용

언어가 어떤 프레임워크에서 사용되느냐에 따라 언어의 사용성에 큰 영향을 준다. Go를 사용하는 다양한 프레임워크(Beego, Revel, Gin 등)들이 존재한다. 실제로 프레임워크를 활용해서 Go언어로 웹 제작도 쉽게 할 수 있다고 한다.

 

 

5. GC(Garbage Collection) 지원

Go언어에서는 가비지 컬렉터를 지원한다. C언어와의 주요한 차이점 중 하나일 것이라고 생각한다.

 

 

2. 단점

1. 제네릭(Generic) 미지원 (2021부터 지원)

함수 호출 시 변수의 타입을 자유롭게 하는 제네릭을 지원하지 않는다. Go를 만드는 과정에서 제네릭을 지원하려 했으나 Go의 철학인 단순함에 반하기 때문에 지원하지 않는다고 한다. 하지만 개발자들의 강력한 건의로 2021년부터(1.18 버전) 제네릭을 지원하고 있다.

 

 

2. 큰 바이너리 파일의 크기

컴파일 언어이기 때문에 실행 시 바로 컴파일된 파일인 '바이너리 파일'을 만든다. 하지만 컴파일 언어가 그렇듯이 바이너리 파일에는 필요한 모든 정보가 담겨있다. Go는 다른 컴파일 언어보다 바이너리 파일의 크기가 큰 편에 속한다. 예를 들어 단순한 "Hello World" 문자열을 출력하는 Go 바이너리 파일의 경우 2MB 정로도 크다. (윈도우 기준)

 

 

cf. 그 외 단점

- 접근 제어자(private 등) 없음

- Dequeue(덱)과 같은 자료구조 미지원

- Django, Flask, Spring과 같은 지배적인 프레임워크 부재

- try~catch 같은 예외처리 문법 부재

- 프로젝트 종속성 관리: Java의 경우 maven에서 관련 의존성이나 패키지가 관리되지만 Go는 라이브러리를 불러올 때 github url을 넣어야 함.

- Java는 JDK와 Spring의 maven 파일에서 라이브러리를 참조하는 반면, Go는 실행하는 컴퓨터의 라이브러리(/usr/lib) 폴더를 사용. (이 또한 사용하는 컴퓨터 시스템에 따라 다름)

 


 

Go가 가장 잘 사용될 수 있는 분야: '분산 시스템'

Go는 분산 환경 연구 중 탄생하게 된 언어이며 아래와 같은 분산 시스템 환경에서 가장 잘 활용될 수 있다.

 

- 분산 네트워크 환경

- 클라우드 서비스

- 분산 DB(CockroachDB)

- 웹 서버

- 유틸 프로그램

 

여러 대의 컴퓨터가 네트워크 상에 분산되어 있을 때 서로 메시지를 주고받기 위해서 중요한 개념은 Concurrency이다. 동시에 여러 작업을 처리해야 하기 때문이다. 따라서 클라우드 관련 분야에서 자주 사용되는 언어이다. 특히, 도커와 쿠버네티스를 사용 중이라면 여러 대의 컨테이너 기반으로 워크로드가 분산되기 때문에 Go의 장점을 잘 사용할 수 있다.

 

 

 

 

개인적인 생각으로 Go를 학습할 때 concurrency와 parallelism개념이 Go에서는 어떻게 적용되는지를 중점으로 학습해야 할 것 같다. 언어에는 철학, 구조, 개념, 패턴 등이 각각 다르기 때문에 새로운 언어를 배울 때에는 가장 먼저 공식 문서를 살펴보고 (https://go.dev/doc/) 간단한 문법을 습득한 뒤에 바로 코딩을 해 보면서 기존에 메인으로 사용하던 언어와의 차이점을 대비해보면서(함수 선언, 조건, 변수, 반복) 공부해야 기억에 가장 잘 남는 것 같다. 그리고 시간이 된다면 기존에 다른 언어로 빌드한 프로젝트를 새로 배운 언어로 변경시켜보는 프로젝트를 진행해 보는 것이 새로운 언어를 익히는데 큰 도움이 된다.

 

 

 

 

Reference

- Go인터뷰, https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html

- Go docs, https://go.dev/doc/

- https://www.samsungsds.com/kr/insights/golang.html

- Golang 철학, https://marsettler.com/the-zen-of-go/