무작정 공부해본 Go 언어의 첫인상
며칠전 프로젝트를 하다 지쳐서 하고 싶은 공부를 하려고 했고 Rust 언어를 만나 즐거운 시간을 보냈다. 그런데 Rust 언어를 공부한 이후 이번에는 Go 언어가 눈에 들어왔다.
사실은 Rust 문서를 보고나서 오랜만에 쓰고 싶던 글도 쓰고 보고 싶던 영화도 보다보니 며칠 사이에 새로운 언어가 땡겼다.
그래서 오늘은 심플함의 끝판왕이라고 생각되는 Go 언어를 배우면서 느꼈던 점을 간략하게 소개하고자 한다.
사실 Go 언어는 이전부터 관심갖고 지켜본 언어이다.
여러 커뮤니티의 의견을 종합해보면 다른 언어와 마찬가지로 비판이 존재하는 언어이다. 열성 Rust 지지자들이 Go 언어에 대해 비판하는 걸 자주 볼 수 있다. 그럼에도 불구하고 도구로써 Go 언어는 굉장히 유용하다는 의견이 많았다.
의견을 종합하면 몇 가지로 추릴 수 있다.
주로 고루틴과 함께 Go 언어의 간결함을 매력 포인트로 꼽았다.
Go 언어의 제네릭 부재를 언급하면서 부족함을 간결함이라고 말할 순 없다는 비판을 하는 분들이 계셨다. 이 점은 조만간 해결될거라고 생각한다. Go 언어에 앞으로 제네릭을 쓸 수 있게 되었기 때문이다. 시간이 지나면 정식으로 사용할 수 있게 될 것이다.
어제 저녁과 오늘 오전까지 많은 부분을 살펴보았다.
일반적인 변수와 타입 그리고 struct, func, 고루틴과 채널까지 살펴보았다.
Go 언어에도 struct가 있는 걸 보고 신기했다. 이 점을 두고 궁금했던 점은 Rust 언어와 Go 언어에서 왜 Class 문법이 없고 struct를 사용하는데도 불구하고 미래의 언어라고 여겨지는 지였다.
나름 결론을 내렸는데 개인적인 생각으로는 Rust 언어는 처음부터 차세대 시스템 프로그래밍 언어이면서 C++ 킬러 언어라고 언급했으며 안정성을 홍보하면서 나왔기에 새롭고 다양한 개념을 녹여넣으면서도 C나 C++과 비슷한 feature를 차용할 가능성이 있기 때문이라고 생각했다.
그런데 Go는 왜 그랬을까?
개인적인 추측이지만 Go 언어의 핵심 개발자 중 한 분이 켄 톰슨이기 때문이라고 생각한다.
Go 언어를 탄생시키면서 간결한 문법과 낮은 러닝커브를 위해 C 언어와 비슷하게 작은 feature로 많은 것을 가능하게 하고자 하는 철학을 택했고 그래서 Go 언어의 형태에 C 언어의 특징이 작게나마 반영되었다고 생각했다.
언어에 대해서는 고루틴과 채널을 제외하고는 별다른 할말이 없다.
러스트를 배울 때는 신기할 정도로 생소하고 흥미로운 개념이 많았는데 Go 언어를 공부하면서는 큰 어려움이 없었다.
어떤 언어든 깊게 공부하면 어렵겠지만 확실히 처음 공부하는 입장에서는 Rust 언어와 느낌이 달랐다.
간결하게 작성할 수 있고 어렵거나 생소한 개념이 없어서 빠르게 배울 수 있었다. 이런 점이 매력이라고 생각했는데 그 심플함이 고루틴까지 줄곧 이어진다는 점에서 더 큰 매력을 느꼈다.
간결하게 만들기 위해 안전성을 훼손했는지에 대한 의문이 들 수 있다.
전혀 아니다.
고루틴을 만들어주면서 고루틴끼리 서로 커뮤니케이션할 때는 반드시 채널을 거친다면 데드락이 발생하지 않는다고 한다. 이 점이 상당히 매력적이다. 직접 고루틴을 쓰는 법을 보면 알겠지만 그저 해당 구문에 go라고 써주면 된다. 그러면 그게 고루틴이 된다.
어째 고루틴의 작동 트리거가 go라는 이름인 것을 보면 개발자들도 Go 언어의 매력을 고루틴이라고 자부하지 않을까 싶다. 또한 채널을 보면서 마치 Stream과 비슷한 기능을 한다고 생각했다.
위에서 언급하진 않았지만 고루틴과 채널에 더불어 굉장히 매력적인 점이 있다.
Go의 표준 모듈이다.
정말 수많은 모듈이 있다.
기본으로 제공되는 것이 아주 다양한데 일부 블로그에서는 이 표준 모듈만으로 웹서버를 만들 수 있기 때문에 이 점이 파이썬이 Flask나 Django 같은 프레임워크가 있어야 백엔드 개발을 진행할 수 있다는 점과 비교했을때 Python3 대신 Go 언어를 사용해야할 이유 중 하나로 들 수 있다고 말한다.
개인적으로 느낀 점은 이런 풍부한 모듈 지원이 Go 언어를 단독으로 사용하면서 수많은 일을 할 수 있음을 뜻한다고 생각했다. 그러면서 고루틴이라는 매력 포인트가 존재하고 빠른 속도와 간결한 문법을 제공한다는 것이 개발자에게 재미난 장난감을 제공해준다는 느낌을 받았다. 누구든 한번쯤 써보고 싶은 장난감인 것이다. 그만큼 매력적이다.
Rust 언어를 살펴볼때는 실수하면 큰일날 것 같고 실수시켜주지 않겠다는 철학이 느껴지면서 컴파일러에게 맞아가면서 눈치보며 작성하는 느낌이라면 Go 언어의 경우는 그저 신나게 작성한다는 느낌이 들었다.
다만 한가지 의아했던 점은 예외처리가 없어서 if 문으로 도배를 해야한다는 점이다.
goquery를 예로 들자면 goquery에서 제공하는 수많은 func들 중 대부분 결과값과 함께 다중 리턴으로 err를 반환하는데 이 err를 잡으려면 try catch가 아니라 실제 if 구문에서 err가 nil인지 아닌지 확인하고 nil이 아니라면 그때 errors.New("에러!")를 던지는 방식으로 처리하는 경우가 많았다. 이 점이 단점으로 꼽을 수 있는 부분이다.
참고로 Go 언어에서는 null 대신 Swift언어처럼 nil을 사용한다. nil은 개념적으로 null과 똑같다고 보면 된다. 다만 Objective-C 에서는 null과 nil간에 미세한 차이가 있다고 하는데 본문의 내용과는 관련이 없어 찾아보지 않았다.
예전에 한 커뮤니티에 달린 댓글 중 Go가 verbose 하다는 의견이 있었는데 그 의견을 읽으면 Go 언어는 간결하게 작성할 수 있는데 왜 verbose하다고 말하는지 궁금했다. 그런데 이제와서 보니 예외처리 상황에서 코드가 불필요하게 많이 소모될 수 있겠다는 생각이 들었다. 그래서 verbose하다고 말한 것이라고 생각했다.
Quora 커뮤니티에서 Go 언어가 Java를 대체할 거라는 의견을 보았다. 하지만 개인적인 생각은 웹 전용 C언어라고 불러주고 싶은 이 언어는 백엔드에서 오히려 Java가 아닌 Python3의 지분을 일부 차지할 것 같다.
인터프리터에 가까운 빠른 컴파일 속도를 제공하며 Python3 보다 빠르며 동시에 고루틴을 지원하기에 GIL로 가불기에 걸린 Python3를 제치고 이후 서버사이드 영역에서 Java를 보조할 것 같다. 물론 Python3가 강점을 지닌 영역은 계속 Python3이 사용될 것이지만 Flask와 Django로 개발을 할 바에 Go 생태계를 활용하는게 낫다는 분위기가 널리 형성될 거라고 예상한다.
이외에도 Go 언어를 사용하다보면 매우 많은 부분에서 간결함을 느낄 수 있다.
구조체 선언시 굳이 필드 사이에 콤마를 찍지 않아도 되고 세미콜론은 당연히 없으며 변수 선언도 := 로 타입 추론 가능하게 열어두었다.
요소 나열시에는 파이썬처럼 ... 까지 지원한다.
개인적으로 구조체 선언시 필드 사이에 콤마가 없어도 되는게 가장 좋다고 느꼈다.
센스가 느껴지는 부분이라고 생각했기 때문이다.
하루밖에 되지 않았지만 재밌게 살펴볼 수 있는 언어였다.
Rust 언어를 알아볼 때는 집중해서 3~4일을 살펴본 것 같은데 Go 언어는 하루만에 부담없이 살펴보았다.
배우면서 정리한 내용이 있는데 정리가 끝나는 대로 기술 블로그에 업로드할 생각이다.
매번 느끼는 점이지만 이 분야에는 재밌는 것들이 넘쳐난다. 특히 오늘처럼 여유가 생기면 평소에 보고 싶었던 내용을 살펴보는 것도 좋다.
간만에 Rust 언어와 Go 언어를 살펴보면서 예전부터 꼭 한번 살펴보고 싶었던 언어들을 살펴볼 수 있어서 만족스러웠다.
프로젝트로 고통받던 와중에 쉬어갈 수 있어 다행이었다.
지금은 간단하게 작성한 서버에서 echo.New()로 생성한 에코 서버가 어째선지 POST에 인수로 잡아놓은 func에 있는 동작을 하지 않아서 살펴보는 중이다.
오랜만에 재밌게 살펴봤다.
Rust 언어는 아직 뒷부분에서 살펴볼 내용이 많이 남았고 Go는 간략한 내용을 일부 살펴봤다.
공부하면서 작성한 작은 프로젝트를 깃허브에 올렸는데 처음부터 끝까지 직접 만든 프로젝트가 아니기 때문에 진행 중인 프로젝트가 끝나고 시간이 나면 Go 언어를 활용해서 토이 프로젝트를 하나 만들어볼 생각이다.
간략하게 공부한 내용이기에 부족한 점이 있다면 댓글로 남겨주시기 바랍니다.
읽어주셔서 감사합니다.