개발자에게 모던(Modern)하다는 것은 무엇일까? 최신 기술의 적극적인 수용? 유연함과 변화에 대한 열려있는 자세? 개인적으로는 실용적인 것이 모던하다고 생각한다. 그런 관점에서 봤을 때, Go 언어는 실로 모던하다.
책 서론에서 생각보다 놀라운 점은, Go 언어는 구글에서 만들어졌고 유닉스와 C의 원조급 개발자인 켄 톰슨(Ken Thompson) 그리고 C를 만들어낸 벨 연구소에서부터 유명했던 롭 파이크(Rob Pike) 등의 인물들이 만든 언어기 때문에, 굉장히 고지식할거라고 생각했다. 조금의 타입 불일치도 허락하지 않는다거나 메모리 관리가 정말 빡빡하다거나, 하지만 생각보다 Golang은 트랜디했다.
예를 들어서 Go의 타입 시스템은 계층 구조가 없다. 인터페이스를 만들고 상속하거나 확장해서 쓰는 자바와 다르게, Go는 상속보다 조합이 낫다는 철학으로 조합(Composition)을 사용한다. 인터페이스를 사용하는 것에서 나오는 피로도를 없애버리고, 조합을 사용하는 것이 실용적이라 판단한 것이다.
Go에서는 덕 타이핑(Duck Typing)을 지원한다. 덕 타이핑은 '꽥꽥거리는 것은 모두 오리'라는 뜻으로, 굳이 인터페이스를 상속하지 않아도 같은 메서드명을 사용하는 것은 같은 타입으로 본다.
그리고 Go 언어의 가장 큰 특징은 아무래도 고루틴(goroutine)이다. 이 책에서는 Go가 동시성을 제어하는 방법인 고루틴에 대해서 자세하게 알려준다.
책 소개
Go 언어에 대한 기본기를 제공하는 책이다. Java나 Javascript과 같이 멀티스레드를 다룰 일이 없는 언어를 쓰게 된다면, Go 언어는 굉장히 낯설 것이다. 나 또한 책을 보다가 대체 왜 이렇게 코드를 짜는건가 이해를 못한 경우가 많았다.
Go 언어는 이러한 멀티스레드를 다룰 수 있도록 동시성(Concurrency) 프로그래밍을 강력하게 지원한다. 멀티스레드, 동시성 그리고 뮤텍스나 스핀락... 모두 운영체제에서 나오는 경쟁 상태를 해결하기 위해 나온 개념이다.
Golang이 동시성을 지원하는 이유
본 책의 첫 챕터에서 Go가 이렇게 동시성 프로그래밍을 위해 고루틴이라는 강력한 툴을 지원하는 이유를 상술한다. 첫째는 현대 프로그래밍 세계에서 동시성은 사실상 필수가 되어버렸다. 이전에 포스팅했던 스프링부트의 멀티스레드에 관한 것도 생각해보면, 사실 스프링부트 자체는 싱글스레드지만, 앞단의 톰캣 소켓이 여러개 동작하여 멀티스레드처럼 동작한다.
이 외에도 최근에는 Aurora RDS를 사용하게 되면 기본으로 리더와 라이터 인스턴스를 분리해주고, etcd나 kafka와 같은 서버를 멀티 노드로 띄우면 알아서 리더 선출(Leader Election)을 통해서 읽기/쓰기 작업을 분리한다. 이렇게 읽기와 쓰기를 분리하면서, 싱글스레드 기반의 언어에서 읽기 작업은 완전히 멀티스레드의 영역으로 분리되어가고 있다.
하지만 십수년전 부터 정립된 운영체제의 이론 중 한 키워드, 아직까지도 해결되지 못한 문제 그것은 바로 경쟁 상태이다. 한 개의 자원을 두 개의 스레드가 쓰는 작업을 하면 어떻게 되는가?
Go는 이러한 현대 프로그래밍의 현황을 잘 파악한 것 같다. Java와 Livescript가 나오던 시절, CPU 1코어 정도가 아니라 현재는 쿼드코어, 슈퍼컴퓨터의 경우는 CPU가 56코어 혹은 64코어까지 발달했다. 아직까지도 CPU 1코어 시절의 방식으로 프로그래밍을 하는 것을 뜯어고치기 위해서 Go는 고루틴(gorutine)을 통해서 최고의 퍼포먼스를 보여줄 수 있는 도구를 제공한다.
이 책을 읽으면 좋은 대상
첫 번째로는 운영체제에 대해서 관심이 있는 사람이다. 필자는 개인적으로 대학교 시절 역대급 강의는 운영체제였다고 생각하고, 정말 버릴게 하나도 없는 과목이었다. 이 책의 중반부에서는 고루틴의 원리를 설명하면서 운영체제의 멀티스레드와 동시성 문제들을 아주 자세하게 설명해준다.
심지어 고루틴을 통해서 이러한 동시성을 제어하는 방법을 코드로 보여주며, 그림으로도 보여준다. 개인적으로 '동시성 문제가 있어 멀티스레드를 도입하는게 쉽지는 않겠구나' 정도로 생각만 해두었는데, -> 그래서 이걸 어떻게 해결할건데? 수준의 사고에 도달하는 방법을 알 수 있었다.
두 번째는 기존의 Java나 Typescript에서 답답함을 느낀 사람이다. 개인적으로는 Java를 별로 안 좋아하는 이유가 인프라 관점에서는 JVM 자체도 메모리를 엄청 잡아먹어서 관리도 힘들며, print 하나를 하려고 해도 system.out.println()을 해야한다. 메인 함수는 또 얼마나 긴지, 하물며 인터페이스는 너무 귀찮다. 인터페이스를 쓰는 것까지는 괜찮은데, public private 뿐만 아니라 protected나 default 등등...
사실 내가 그냥 개발을 못해서 그런거겠지만, Go는 정말 통쾌하다. 상속보다 조합이 낫다며 과감하게 상속 개념을 없애며, 컴파일하면 바이너리 파일로 나와 실행하기도 편리하다. 속도는 또 얼마나 빠른가. 물론 어려워서 나는 제대로 다루지도 못하지만 개인적으로는 자바에 비해서 엄청 모던하다고 생각한다.
책의 장점과 아쉬운 점
개인적으로 느낀 장점으로는 책 전반적으로 고루틴이나 채널 등 동시성 제어에 사용하는 도구들이 나올 때, 운영체제에 대해서 자세하게 설명해주고 있어서 자세히 모르는 사람이라도 쉽게 이해할 수 있게, 이미 잘 알고 있는 사람이라면 더욱 빨리 이해할 수 있도록 만들어주는 친절한 설명이 좋았다.
뭐 동시성 문제야 너무나도 유명하니까 설명 안해줘도 충분히 이해할 수 있다는 마인드지만, Go 코드 자체가 워낙 초보자에게는 읽기 어려워서 그림과 함께 코드를 보여주니 다행이라는 느낌이 들었다.
아쉬운 점으로는 Go 언어를 소개시켜주는 맥락이 불친절하다는 점이었다. 초반에 Go에 대해 간단하게 printf부터 설명을 하다가 갑자기 내장 라이브러리 설명을 껴서 하는데, 이 부분은 바로 뒤에 나오는 고루틴과 연관이 없을 뿐더러 Golang에 대한 이해가 많이 부족한 초반부에 갑자기 장황하게 나와있어서 읽느라 애를 먹었다.
심지어, 고루틴 설명이 끝나고 난 뒷부분에서 이러한 라이브러리들 설명을 하는데 왜 후반부에 안하고 앞 부분에서 하는 지.. 원망스러웠다. 아마도 이 책을 리뷰하거나 쓴 사람들에게 있어서 Golang이란 친숙해서 쉽거나, C언어 베이스가 출중해서 포인터나 main()에서부터 시작하는 절차지향적인 프로그래밍이 익숙해서 쉽게쉽게 리뷰했던 것 같다. 나야 C언어 베이스는 이미 한물 간 지 오래되어 포인터를 설명하는 부분에서는 수 차례 읽어보아야 했기 때문에, 이 부분은 단점이라기보다는 C언어 베이스가 부족한 사람들은 힘들 수 있다는 설명 정도이다.
총평 및 추천 여부
자바스크립트가 아니라 타입스크립트를 쓰면 모던한가? 혹은 자바가 아닌 코틀린? 개인적으로는 Go 언어를 공부해보면 모던하다는 것을 느낄 수 있을 것 같다. 물론 모든 기술에 장점만 있을 수 없기에 Go 언어를 보자마자 '이건 반드시 써야해!' 이런 느낌보다, 쓰면 좋겠지만 굳이? 라는 생각이 든 부분이 많다. 아마도 퍼포먼스가 중요한 프로덕트를 만들고 있지 않기 때문일 것이다. ( 내가 )
자바, 자바스크립트, 파이썬 이 정도의 언어 폭에서 프로그래밍을 접해본 사람에게는 이 책을 권한다. Go 언어를 배우기 위해서가 아니라, 현대의 개발 프로세스를 개선하기 위해 최근에 나온 언어들이 무엇을 중점적으로 가져가는 지 아는 것 만으로도 꽤 도움이 된다고 생각한다.
'후기 > 책' 카테고리의 다른 글
책 리뷰 : 소프트웨어 장인 정신 이야기 (1) | 2025.06.03 |
---|---|
책 리뷰 : 이펙티브 엔지니어 (1) | 2025.06.03 |
책 리뷰 : 쿠버네티스 패턴 (1) | 2025.05.18 |
책 리뷰 : 마이크로서비스 도입은 이렇게 한다 (0) | 2025.05.17 |
책 리뷰 : 소프트웨어 스펙의 모든 것 (0) | 2025.05.07 |