Go 57

Go 개발할 때 필요한 Makefile 작성해보기

안녕하세요? Go를 사용하여 제품을 만들 때, Makefile을 사용하여 빌드를 지정하는 경우가 많습니다. 이유는 다음과 같습니다.버전 정보 등을 삽입하기에 편리합니다.여러 바이너리를 출력할 때 편리합니다.Go의 빌드 옵션을 지정하는 데 여러 가지가 있어 정리해두고 싶습니다.코드 생성기로 미리 작성해야 하는 부분이 있고, 그것을 고려하면 Makefile 등으로 정리하고 싶습니다.그래서 이번에는 프로젝트가 커져가는 중에 어떤 Makefile 작성 방법을 사용하고 있는지 소개하고자 합니다. ** 목 차 **Step 1. 버전 정보를 삽입하기버전 정보를 어느 파일에 작성할지에 대한 논의첫 번째 MakefileStep 2. -race나 -installsuffix 등 옵션을 환경 변수로 지정하기Step 3. 외부..

Go 2024.03.25

Go 언어 개발 환경 설정 - go mod init과 그 필요성

안녕하세요? Go 언어에 푹 빠져서 요즘 계속 배우고 있는데요. Go 언어(일명 Golang)는 Google에서 개발한 정적 타입 언어로 빠르고 안전한 프로그램을 작성하는 데 많이 사용됩니다. 그러나 처음 Go 언어를 접할 때 go mod init이라는 명령어를 만나면 이게 뭔지 혼란스러울 수 있는데요. 이 글에서는 go mod init가 무엇이며 왜 필요한지 자세히 살펴 보겠습니다. ** 목차 **Go 모듈이란?go mod init이란?go mod init이 왜 필요한가요?Go 언어에서의 모듈 관리도구 체인이란?외부 패키지 github.com/gin-gonic/gin에 대하여Python의 의존성 관리와 모듈 관리Java의 의존성 관리와 모듈 관리결론Go 모듈이란?Go 언어에서는 코드 패키지를 구성하고 ..

Go 2024.03.03

Go 언어의 net/http 패키지의 http.HandleFunc이 실행되는 방식 이해하기

안녕하세요? 오늘은 Go 기본 문법을 알고 계시는 분 혹은 Request 요청이 들어왔을 때 함수가 어떻게 실행되는지 궁금하신 분, 또는 Go의 웹 응용 프레임워크를 능숙하게 활용하고 싶은 분들을 위해 조금은 지루한 글을 쓸까 합니다. 웹 응용 프로그램을 개발할 때, 요청이 들어오면 해당 경로에 따라 함수를 실행해야 합니다. 그런데 웹 응용 프레임워크를 사용하면 내부에서 어떤 처리가 이루어지는지 몰라도 동작시킬 수 있습니다. 하지만 웹 응용 프레임워크를 올바르게 활용하려면 내부 구현에 대한 이해가 필요합니다. 그래서 이번 기회에 Go의 net/http 패키지 문서를 참조하여 요청이 들어왔을 때 함수가 어떻게 실행되는지 조사해보았습니다. 특히 http.Handle과 http.HandleFunc과 같은 유사..

Go 2024.03.03

Go 언어로 웹 애플리케이션 만든 경험담

시작하기Go 언어를 사용하여 웹 애플리케이션을 만들어 보았는데요. 스크래치에서부터 작성했기 때문에 작성 도중 계속된 시행착오를 겪으며 최종적으로는 웹 애플리케이션 모양새가 구현될 수 있었습니다. 그래서 MVC 애플리케이션을 구성할 때 특히 컨트롤러 계층을 중심으로 몇가지 생각을 정리해 볼까 합니다. ** 목 차 **시작하기ViewController리퀘스트 핸들러(Request Handler)라우팅(Routing)필터(Filter)리퀘스트 컨텍스트(Request Context)ModelView작성한 웹 애플리케이션은 API 서버였기 때문에 실제로 여기에 대한 지식은 많지 않습니다. 뷰가 있는 앱을 만든다면 개인적으로는 React 등을 사용하여 프론트엔드 애플리케이션으로 구현하고 Go 부분은 API 서버 역..

Go 2024.03.01

goroutine과 channel로 알아보는 비동기 처리

서문안녕하세요? 오늘은 go언어에서 channel과 goroutine에 대해 이야기해보려고 합니다.goroutine에 대하여goroutine은 가상 스레드로 처리를 시작하는 기능입니다. 작업자를 늘려서 일을 분담한다는 의미와 비슷합니다. 아래 코드와 같이 go 키워드를 사용하여 함수를 호출하면 goroutine으로 시작됩니다.func main() { go task()}func task() { // 어떤 작업} 여기서 goroutine으로 시작하고 싶은 함수 즉 task 함수에 반환값을 설정하고 싶은 경우가 있는데요. 그냥 쉽게 생각하면 다음과 같은 코드를 작성할 수 있습니다.func main() { // 문법 오류가 발생합니다 // 원래는 반환값을 지정할 수 없지만, 만약 가능하다고..

Go 2024.02.20

Go 언어의 포인터와 atomic.Value의 이해

** 목 차 **atomic.Value 소개Go 언어의 포인터와 interface{}atomic.Value의 구현Value 구조체 선언ifaceWords 구조체 선언값 읽기 (Load 함수)값 추가 (Store 함수)atomic 패키지의 사용과 안전한 구현Go 언어의 포인터에 대한 이야기를 atomic.Value의 구현을 통해 살펴보겠습니다. atomic.Value는 무엇일까요? 이것은 Go 1.4부터 추가된 기능입니다. Go의 공식 문서에서는 "메모리를 공유하여 통신하지 마라."라는 말이 자주 등장합니다. 그러나 여러 Goroutine에서 하나의 변수를 참조하거나 업데이트하는 것은 표준 패키지를 살펴보면 꽤 자주 나타나는 패턴입니다. 이때 sync 패키지 등을 사용하여 값의 race condition을..

Go 2024.02.14

Go 서버 모니터링 간단하게 만들기

Go 서버 모니터링Go로 서버 프로그램 작성하기Go에서는 서버 프로그램을 작성하기 위한 유틸리티가 풍부하게 준비되어 있으며, 고루틴이나 채널을 활용하면 고성능이 요구되는 환경에서도 충분한 성능을 발휘할 수 있습니다. 언제였는지 기억나지 않지만 '그것은 HTTP 서버를 작성하기 위한 언어입니다'라는 이야기를 어떤 엔지니어로부터 들었던 적이 있습니다. 예를 들어 'Hello, World!'만 반환하는 HTTP 서버라면 표준 라이브러리인 net/http를 사용하여 아래와 같이 작성할 수 있습니다. hello_server.gopackage mainimport ( "fmt" "net/http")func handler(w http.ResponseWriter, r *http.Request) ..

Go 2024.02.14