go

go

    2020년 회고록―, 시작

    많은 일이 일어난 2020년도 거의 끝나간다. 올해 회고록의 제목은 이다. 많은 것들을 시작되었기 때문이다. 또 다른 키워드로는 , 그리고 가 있다. 이 회고록은 개발에 관련된 것만을 적는 것이 아니라, 개발을 포함하여 올해 내게 일어났던 사건들이나 활동들을 어느정도 정리해보는 것을 목적으로 한다. 강의 제작 (2020.01 - 2020.08) 2020년 들어 처음 시작한게 아마 강의 제작이 아닐까 싶다. 사실 첫 강의는 2019년에 나왔지만 품질향상을 위해 새로 리부트하기로 하여 다시 촬영을 하고 제작을 시작했다. 개발 공부는 했지만 지식을 가지고 있음을 증명할 만한 수단이나, 백수라서 딱히 돈벌이도 없었기 때문에 겸사겸사 시작한 것이었다. 2020년에 만든 강의는 총 세개, PHP 7+ 프로그래밍: ..

    Go: 웹 서버 구축하기 (net/http, html/template)

    WAS(Web Application Server) Node.js 서버처럼 Go 언어로 만든 서버도 동적 컨텐츠를 처리하는 WAS(Web Application Server)로써 동작하게 만들 수 있다. 보통 앞에 NginX, Apache 와 같은 범용적인 http 서버를 앞에다가 두고 뒤에 별도로 WAS 를 실행시켜두는 것이 일반적인 구성일 것이다. 물론 Go 로 만든 서버를 직접 80 포트에 바인딩하는 것도 가능하지만 요청이 많아질 경우 과부하가 걸릴 가능성도 있어서 많은 트래픽이 발생하는 경우에는 권장하는 방법은 아니다. 이 포스트에서 말하는 웹 서버는 Go 언어로 만든 서버를 의미할 것이며 이러한 서버를 만드는 행위는 Node.js http 모듈을 사용하여 만드는 것만큼 상당히 단순하다고 볼 수 있다..

    Go: Switch 를 사용하여 타입 체크하기 (Reflection) [Effective Go]

    Switch 일반적으로 다른 언어에서는 어떤 값의 타입에 따라 다른 행동을 하고 싶을 때 Reflection 를 사용하여 해결한다. Go 에서는 특이하게도 언어차원에서 Switch 를 사용하여 해결할 수 있는데, 다음과 같이 해볼 수 있다. var t interface{} = map[string]string{ "sayHello": "Hello, Go!", } switch t := t.(type) { case string: fmt.Println(t) case map[string]string: for k, v := range t { fmt.Println(k, v) } } Switch 와 함께 타입 단언(Type Assertion)을 사용하여 해결할 수 있다. 그런데 자세히 살펴보면 map 타입에 대해서는 상..

    Go: new vs make [Effective Go]

    Go 에는 메모리에 대한 것에 대해 유달리 헷갈리는 것들이 있는데, new, make, 그리고 포인터(Pointer)이다. C언어에서 동적 메모리를 할당할 때 쓰는 malloc, 초기화에 사용하는 memset 과는 달리 사용법이 다소 헷갈린다. 특히 Go 는 로컬 함수 스코프에서도 포인터를 반환하는 것을 허용하고 있기도 하므로 더욱 의문스럽다. new new() 는 메모리를 할당하되 초기화는 하지 않는다. 메모리를 할당하고 해당 객체에 제로(Zero Value)값을 설정하고 해당 객체에 대한 포인터를 반환하게 된다. Go 에서는 Zeroed Storage 라고 표현하는 듯하며 new() 를 사용하여 반환된 값은 포인터이고, 해당 포인터가 가리키는 값은 각 타입에 대한 제로값이다. m := new(MyTy..

    Go: 싱글 바이너리로 웹 서비스 제공하기 (go-bindata)

    Go 를 사용하여 얻을 수 있는 이점 중 하나는, 빌드의 결과로 싱글 바이너리가 나와 간단하게 배포하고 사용자에게 제공할 수 있다는 점이다. 그런데, 이러한 Go 로 작성한 웹 서비스를 제공하려고 하다보면 각종 리소스 파일이 많아지는 것으로 인해 문제가 될 수 있다. 기껏 싱글 바이너리로 어플리케이션을 배포할 수 있는데 리소스 파일로 인해 배포할 파일이 늘어난다면 그건 이점을 살리지 못한 것이 될 지도 모른다. 리소스를 바이너리에 포함시키기 리소스를 별도의 파일로 분리시키지 않고 소스코드에 포함시켜 최종적으로는 바이너리에 포함될 수 있도록 만들 수 있는데, 바로 go-bindata 를 사용하면 그런 행위가 가능하다. go-bindata 를 사용하면 실제 파일시스템 경로와 유사한 사용방법으로 API 를 사..