Go 언어 첫 입문
프로그래밍이란걸 계속 공부하다가 항상 심심하면 나오는 언어가 Go 언어 였다. Go 언어는 쿠버네티스, 이더리움, etcd, 도커와 같은 분산 시스템을 만들었다. 그래서 현재 공부하고 있는 분야인 쿠버네티스, 도커 등 여러가지 기업에서 Go 언어를 활용하여 분산 시스템을 구축한다는 이야기를 듣고 Go 언어가 도대체 무엇을 하는 언어인지, 어떤 역할을 하는지, 어떤게 많이 편하고 장단점이 있는지 알고자 공부했다. 한번 쯤은 Go 언어를 공부해 보고 싶었으며, gRPC와 protobuf가 어떻게 Go 언어와 잘 버물려졌는지 알고자 했다.
어떻게 공부 했는가?
최근에 쿠버네티스나, 네트워크 공부를 하면서 가장 효율적이고 나에게 맞는 공부법을 찾게 된것 같다. 기존에는 항상 인터넷에 검색하여 모르는 내용이 있으면 검색 해서 알아냈지만, 결국엔 주먹구구식의 공부법이란걸 알게 되면서 자료가 있다면 책을 구매해 어떤 기능을 갖는지, 어떻게 활용 할 수 있는지 읽어보는게 가장 빠르다는 것을 알게 되었다.
그래서 총 2권의 책을 구매하여 문법인 기본서, MSA구조를 어떻게 활용 하여 구축 하는지에 대한 책을 총 2권을 구매하여 책을 읽으면서 공부 하였다. 역시 짧은 기간에 공부하는건 책으로 하는 것이 제일 빠르고 효율적이라고 생각이 든다.
기본서, 문법책을 읽을 때는 Go 언어는 다른 언어인 Swift나 Objective-C 처럼 구조가 많이 신기한 언어 이였기 때문에 변수를 만들거나, 함수 명, 타입 생략 기능과 같은걸 익히기 위해서 Go 언어를 직접 설치하여 타이핑 하면서 공부 했다.
Go 활용서의 경우는 gRPC, jsonRPC, Gin을 활용한 RestAPI 서버 구축등 다양한 서버 방법과 context를 통한 비동기 컨트롤, 통신에 대한 정의, middleware가 어떠한 역할을 하는지에 대한 내용이 앞 부분에 있었다. 해당 내용의 대부분은 “쿠버네티스 완벽 가이드”라는 책을 통해 외부 네트워크 통신이 어떻게 이뤄지는지, RPC가 무엇인지 대한 기초가 있었기 때문에 읽는것 자체는 무난 하였다. 그 외에 활용서 내용에는 Go 언어 보다는 MSA에 대한 내용이 중점으로 쓰여져 있었기 때문에 외부 프로그램, 라이브러리가 어떤 것이 있는지 알려주었다. 대표적으로 Logging을 위한 프로메테우스, 시각화를 위한 그라파나, 보안을 위한 툴, CI/CD 툴 등 다양한 도구에 대해서 서술이 되어 있었다.
Go 언어 문법 적응 어떻게 했는가?
책은 문법적인 내용이 중점적으로 다뤄져 있었기 때문에 실제 개발을 진행 할 때 소스코드 파일 분리, 패키지 상호 관계, 빌드 하는 방법에 대해서는 나와 있지 않았다. 그래서 테스트 프로젝트를 만들어 공부 하면서 많은 어려움이 있었다. 아래에 어떤 어려움이 있었는지 어떻게 해결 했는지 기록해 보았다.
1. 소스코드 파일 분리는 어떻게 하는가?
개발을 진행 할 때 하나의 소스 파일에 모든 내용은 기록 하는 것은 정말 많은 어려움이 있다. 파일 하나에 수천라인의 코드가 있다면 추후 리팩토링, 디버깅을 할 때 몇번 라인에 있었는지 알기가 많이 어렵기 때문에 코드 분리는 필수이다. 처음에 Go 언어가 package란 개념있고, 워크스페이스에서 루트는 main으로 작성을 하기에 다른 파일에는 어떻게 package명을 작성 해야하는지, 그리고 어떻게 import 해야하는지 의문이 들었다. 그래서 github에 들어가서 다른 프로젝트 코드를 확인하여 어떻게 파일 분리가 되었는지 확인하였다. 확인한 결과 그냥 같은 폴더에 있기만 하면 되는것 이였다.
2. 하위 폴더 어떻게 만들지와 1st party 라이브러리 만드는 방법
1번과 마찬가지의 고민이다. 1번은 파일만 똑같이 추가하면 되지만 폴더를 만들고 하위 폴더를 만들거나 1st 파티 라이브러리 만드는 방법은 많은 고민이 되는 주제 였다. 깃허브에서 찾아본 결과 소스코드가 있는 폴더의 이름을 패키지명으로 지으면 되는것 이였다.
3. 깃허브에 라이브러리 만들기.
2번 내용에서 확장된 고민이다. 라이브러리를 만들더라도, 만약 레포지토리가 다르거나, 프로젝트가 다른 경우, 참조해야하는 경우에는 라이브러리를 만들고 등록하는 방법을 알아야한다. 놀랍게도 Go 언어는 “github.com/{name}/{repo}” 이렇게 mod init을 하기만 하면 되는것 이였다. 쓸 때는 go get “github.com/{name}/{repo}” 하면 끝이였다. 만약 프로그램이라면 go install ~~ 하면 프로그램이 설치가 된다는 것이 많이 놀라웠다. 마치 npm 느낌이였다.
4. 3rd party 라이브러리는 어떤것이 좋을까?
주 언어가 아니라 다른 언어를 할 때 가장 큰 문제 중 하나이다. 원래 사용하고 쓰던 언어라면 유용하고 자주 쓰이는 라이브러리는 바로 알고 있기 때문에 쓰는것이 거리낌이 없지만 처음 접하는 언어에서는 어떤것이 자주 쓰이는 라이브러리 인지, 어떤 라이브러리가 있는지 알지 못한다. 그래서 3rd party 라이브러리가 어떤것이 있는지 빠르게 알고, 사용하는 방법을 우선적으로 터득해야 하므로 깃허브에 “Awesome-Go” 라고 검색하여 어떤 라이브러리가 인기가 있는지, 종류가 있는지 검색하여 Go언어의 라이브러리 종류를 빠르게 공부 했다.
Go 언어에서 느낀 장 단점
장단점이 너무 확실하게 갈리는 언어이다. 개인적으로 느낀 부분은 Javascript에서 Type이란 개념이 추가가 된 느낌이 많이 강했다. 최대한 언어에서 많은 자유를 주었지만 이 자유로 인해 개발에 어려움이 생기는것 같다. 대표적으로 interface 구조 이다. Swift나 C#, C++ 경우에는 interface를 정의 하고 상속을 하는 개념이다. 하지만 Go 언어에서 상속이라는 개념이 존재하지 않기 때문에 interface는 해당 함수 있는지에 대한 유무만 체크 한다. 그래서 해당 객체가 해당 interface가 되는지 대한 라이브러리 대한 개념이 많이 있어야지 될것 같은 내용이다.
즉 너무… interface가 자유 분방 하다는 뜻이다.
현재 Go 언어로 어떤것을 하고 있는가?
Go 언어라는 것은 처음 사용하기 때문에 비교적 난이도가 쉽지만, Go언어의 멀티 쓰레딩의 장점에 대해서 확인해 보고 싶었다. 그래서 현재 타 기업과 연계해서 개발 하고 있는 신생 프로젝트를 Go언어로 만들어서 테스트 하고 있다. 그 외에 aswcloud 프로젝트 통해 gRPC를 활용하여 아이폰 어플리케이션에서 서버 컴퓨터에 다양한 서버 구축 하는 프로그램 개발을 진행 하고 있다.