TABLE OF CONTENTS
1. Why Golang?
k8s가 Go로 만들어졌으므로 Cloud환경에서는 Go가 굉장히 많이 쓰이게 된다. 또한 Go를 알면 실제로 k8s 아키텍쳐가 어떻게 돌아가고 동작하는지를 Code Level로도 파악할 수 있다.
Golang(구글에서 개발)의 장점을 알아보자.
Golang은 일단 Compile Language로서 C언어처럼 Machine Language로 Compile 과정을 통해 컴파일이 되어 Executable file로 생성이 되게 되어 Interpreter 언어에 비해 실행 속도가 빠르다.
또한 Golang은 Java와는 다르게 Runtime이 필요없이 Binary file로 곧바로 배포가 되기 때문에 배포 속도도 빠르게 된다. 뿐만 아니라 Golang은 GoRoutine이라는 경량 Thread 구조를 사용하므로 비동기 작업을 처리하기도 좋다.
또한 Golang은 심지어 GC도 지원이 되어 Dynamic Memory(Heap Segment) life cycle 관리를 GC가 진행하게 되며 또한 Code의 Reusability를 위해서 Module화와 Package화를 진행하게 된다.
Golang의 단점을 알아보자.
일단 Library 관리가 까다롭다. 왜냐하면 go.mod이라는 text file에서 library에 대한 versioning을 관리를 하고 있기 때문에 version이 업데이트 될때마다 이 version을 수동으로 계속 해당 file을 수정해줘서 따라가야 한다.
또한 아직까진 Golang 진영에 Framework가 존재하지 않기 때문에 개발 속도가 Python 진영의 Django나 Java 진영의 Spring에 비해서 느리다.
그럼 이제 Golang을 기반으로 하는 Open Source Project가 어떤게 있는지 살펴보자.
만약 내가 어떤 오픈 소스를 사용하고 싶은데 공식문서에는 제대로 언급되어 있지도 않고 문서도 많이 없을 경우에는 어떻게 해야 할까? 이 경우에는 내가 직접 소스 코드를 분석해서(따라가보면서) 이해를 해가야만 한다. DevOps 조직에서 일을 하게 되면 클라우드에 사용되는 여러 프레임워크/툴을 분석할 줄 알아야하는데 이 중 대부분이 Golang 기반의 프레임워크/툴이므로 Golang을 알아야만 하는 것이다.
그러면 이제 Golang의 성능 비교 지표를 봐보자.
아래 표는 FaaS에선 반드시 발생하게 되는 Cold Start가 걸리게 되는데 그때 걸리는 Cold Start Delay에 대한 지표다.
압도적으로 컴파일 언어인 Golang과 Rust가 가장 Delay가 적게 걸리게 된다.
그리고 Warm State일때 평균적인 Duration을 나타낸 것으로 이 역시 Golang과 Rust가 짧은 것을 알 수 잇다.
그러면 이제 Golang을 설치해보도록 하자. Golang 홈페이지에서 내 OS에 맞는 binary file을 다운로드 받도록 하자. 또한 Golang은 IDE를 지원하지 않기 때문에 아직까진 VSCode를 IDE로 많이 사용한다.
일단 Golang의 소스코드와 느낌부터 보자.
fmt는 formatter로 이 Class에 Println이라는 함수가 내장됨.
위의 오른쪽에서 tree구조를 보게 되면 go.mod라는 module을 관리하는 text file과 main.go를 볼 수 있게 된다.
2. How to write Go code?
자 이제 본격적으로 Golang 문법에 대해 살펴보기 위해 Golang 공식 문서에서 제공하는 Golang Cheat Sheet을 봐보도록 하자. 지금부터 나올 문법 관련 그림들을 눈에 익혀서 이해하기만 하자.
변수 할당은 두가지 방법으로 모두 다 가능하다
상수 선언도 가능하다
Golang은 OOP 언어일까 절챠지향 언어일까?
Golang은 따로 클래스를 생성하지 않고, C처럼 struct로 객체를 퉁치는 OOP 언어이다.
defer 키워드는 특정 문장 혹은 함수를 나중에 실행하게 하는 Java의 finally 블럭처럼 마지막에 Clean-up 작업을 위해 사용. 가령, 어떤 에러가 발생하더라도 항상 파일을 Close하거나 Thread를 반환하도록 할때 사용.
panic()함수는 현재 함수를 즉시 멈추고 현재 함수에 적용된 defer 함수들을 모두 실행한 후 즉시 리턴한다. 이러한 panic 모드 실행 방식은 다시 상위함수에도 똑같이 적용되고, 계속 Function Call Stack을 타고 올라가며 쭉쭉 상위 method로 타고 올라가다가 결국 그리고 마지막에는 프로그램이 에러를 내고 종료하게 된다.
Go 내장함수인 recover()함수는 정반대로 panic 함수에 의한 패닉상태를 다시 정상상태로 되돌리는 함수이다.
[Reference]
Go cheatsheet
The one-page guide to Go: usage, examples, links, snippets, and more.
devhints.io
2. https://github.com/serverless/serverless-golang
GitHub - serverless/serverless-golang: Serverless Template for Golang
Serverless Template for Golang. Contribute to serverless/serverless-golang development by creating an account on GitHub.
github.com
'DEVOPS > Serverless With Golang' 카테고리의 다른 글
[Serverless With Golang] 3. AWS Services for Serverless Service (0) | 2024.07.03 |
---|---|
[Serverless With Golang] 2. Serverless Framework (0) | 2024.07.03 |
[Serverless With Golang] 1. Serverless Architecture (0) | 2024.07.02 |