Covenant

Go 언어의 장점과 단점





주의


본 글은 특정 언어를 지지하거나 GO를 폄하할 의도로 작성한 글이 아닙니다. 웹 상의 의견과 제가 Go를 사용하면서 느낀점을 첨언하였습니다. GO언어를 선택할까 고민하는, 궁금한 분들에게 도움이 되기를 바랍니다.



GO란?


  • 09년 구글의 로버트 그리즈머, 홉 파이크, 켄 톰슨이 개발하였습니다.
  • 고루틴이 있습니다.
    • 멀티쓰레드 메커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 쓰레드이며, OS 에서 관리하는 경량 쓰레드보다 더 경량입니다.
    • 일급객체로 정수와 실수와 같은 데이터 타입과 동급으로 취급
    • channel을 통해 동시성을 지원합니다.
  • 멀티 패러다임 언어
    • 함수형 언어라고 하기에는 함수의 순수성(Purity), 불변성(Immutability)을 보장하지 않습니다.


GO 언어 장점


  • 매우 간단한 문법으로 배우기 쉬습니다.
    • loop 문법으로 while이 없고 오직 for만 있습니다.
    • class 문법이 없습니다.
  • 정적타입 / 강타입 언어입니다.
  • 컴파일속도가 빠른 컴파일 언어입니다.
    • 컴파일 속도가 빨라서 인터프리터 언어처럼 쓸 수 있습니다.
  • 속도가 빠릅니다.
    • 여러분이 Go로 알고리즘 문제를 해결한다면 다른 언어와 비교할 수 없는 빠른 속도로 해결할 수 있습니다.
  • 고루틴이 있습니다.
    • 고루틴은 쓰레드보다 매우 가볍고 쉽게 이용이 가능합니다.
  • 풍부한 기본 모듈을 제공합니다.
    • 자체 제공하는 패키지들이 강력해서 별도의 웹 프레임워크를 사용하지 않아도 웹을 개발할 수 있습니다. 파이썬으로 순수 웹 개발이 힘들기에 장고, 플라스크 프레임워크를 사용하는 것에 대조됩니다.
  • 신뢰할 수 있는 제작사, 대기업들의 사용합니다.
    • 구글이 만들었고 YouTube 개발에 사용하는 언어입니다. 해외에는 우버, 넷플릭스, BBC 가 사용하고 있으며 도커 또한 Go로 개발하였습니다. 국내는 카카오엔터프라이즈, 당근마켓, 왓차, 버즈빌 등 대기업, 스타트업이 사용하는 언어입니다.
  • 컨벤션이 통일되어 있습니다.
    • 컨벤션에 맞추어 코드를 수정해주는 go fmt 기능이 있다.
    • VS Code에서 저장을 누르는 순간 formatter가 포멧을 바로 맞추어줍니다.
  • 채널 기반 언어입니다.
    • Go는 대표적인 채널 기반 언어입니다. 스레드라는 것을 명시적으로 주지 않고 고루틴을 생성하면 알아서 스레드를 생성해주고 적절한 스레드에 고루틴을 할당합니다. goroutine 사이의 커뮤니케이션을 전부 채널을 통해서 한다면 동기화 문제를 신경 쓰지 않아도 된됩니.
  • 네이티브 바이너리가 나온다.
    • 결과를 배포하는 입장에서 네이티브 바이너리가 나온다는 것은 매우 큰 장점입니다. 요즘은 대부분 서버에 파이썬이나 JVM이 설치되어 있지만, 역시 배포는 네이티브 바이너리로 하는 것이 가장 편합니다.
    • 그러나 바이트 코드를 생성하는 언어가 아니므로 바이너리만 배포하는 경우 (C와 C++처럼) 타겟 머신에 맞추어 각각 컴파일을 해야해야합니다.
  • 인터페이스 기반의 폴리모피즘
    • Go에서 폴리모픽한 코드를 작성하는 유일한 방법은 인터페이스를 인자로 넘기는 것입니다. 이 덕분에 인터페이스 단위의 추상화가 자연스럽게 이루어집니다.


GO언어 단점


  • 없는게 산더미입니다.
    • 제네릭 문법 없음. 클래스 문법 없음(OOP 안녕~), 예외 처리 문법 없음, Public, Private 키워드 없음, this 문법 없음
    • 메서드를 만들 수 있으며 인터페이스를 이용해서 다형성을 구현할 수 있습니다. Composition으로 상속을 대신할 수 있습니다.
    • 덱과 같은 자료형이 제공되지 않습니다. (알고리즘 풀때 눈물....)
  • 코드가 깔끔해 지지 못합니다.
    • 예외 처리 문법이 없기에 if 문이 상당히 많이 사용됩니다. 읽기 힘든 지저분한 코드가 생깁니다.
  • 좋은 IDE가 없습니다.
    • C는 DEV C++, Visual Studio 등등, Java의 이클립스가 있지만 Go는 VS Code, Goland 말고 별다른 선택지가 없습니다.
  • verbose 한 코드
    • Go는 템플릿도 매크로도 없습니다. 이는 Go의 코드를 단순하게 만들어주는 장점도 있지만, 하지만 템플릿도 매크로도 없어서 단순한 코드가 반복해서 등장합니다.
  • 중앙 저장소의 부재
    • Go에서는 깃헙 등의 원격 저장소에 올라온 패키지를 go get 명령어로 다운로드 및 설치해서 사용합니다.
  • 강력한 라이브러리 부재
    • GORM 등 있지만 뭔가 아쉽습니다. 자바 진형의 강력한 JPA가 그립습니다.
    • 파이썬의 Django, Flask와 같이 지배적인 라이브러리가 있는 것이 아니라 고만고만한 Echo, Gin, Beego 프레임워크가 있습니다.
  • 버전관리
    • 코드를 작성하면 formatter가 코드를 수정하는데 단순히 공백이 추가된 것을 git에서 수정된 라인으로 잡을 때가 있습니다. 커밋의 호읍이 길다면 실제 수정된 로직을 파악하기는 힘들어집니다.
  • 우리나라 한정.. Go를 도입한 회사가 많이 없습니다.
    • 자바 진형이 대세인 우리나라에서는 타 언어에 비해서 인럭풀이 많지 않습니다.
    • 하지만 Go의 빠른성능, 빅쿼리 등등의 이유로 도입하는 회사가 있습니다.


참고자료