DevContainer로 개발환경 구성하기

Dev Container Dev Container는 도커 컨테이너를 이용하여 개발 환경을 구축하는 방법입니다. 이 방식을 이용하면 쉽게 어느 곳에서나 동일한 개발 환경을 구축할 수 있습니다. 이 글에서는 Go 언어를 사용하는 개발 환경을 구축하는 방법을 소개합니다. devcontainer 폴더 구성 프로젝트 폴더 내에 .devcontainer 폴더를 생성합니다. 그리고 다시 한번 그 안에 원하는 개발 환경 이름으로 폴더를 생성합니다. $ mkdir -p .devcontainer/practice-go devcontainer 설정 파일 작성 .devcontainer/practice-go 폴더 내에 devcontainer.json 파일을 생성합니다. 저희는 전반적인 구성을 docker-compose로 하기 때문에 docker-compose....

April 5, 2024 · snowmerak

git, buf, 그리고 패키지 매니저로 프로토버퍼 관리하기

프로토버퍼? 프로토버퍼는 구글에서 개발한 직렬화 라이브러리입니다. 프로토버퍼는 다양한 언어를 지원하며, 단일 IDL(Interface Description Language)을 사용하여 여러 언어에 대한 DTO 및 시리얼라이저를 생성할 수 있습니다. 그렇기에 서버와 클라이언트 사이에 서로 다른 언어를 사용하더라도, 같은 IDL만 공유할 경우 서로가 주고 받는 메시지의 종류만 안다면, 별도의 DTO를 문서를 보고 만들 필요 없이 바로 사용할 수 있습니다. 프로토버퍼의 문제점 프로토버퍼는 .proto 확장자를 가진 IDL 파일을 각 언어에 맞게 컴파일해서 사용해야한다는 단점이 있습니다. 그래서 프로토버퍼 파일 버전이 상이할 경우에, 같은 메시지(DTO)를 주고 받는 다더라도, 예외가 발생할 수 있어 주의가 필요합니다....

December 13, 2023 · snowmerak

제티

제티 (Jetti) 제티는 제가 프로젝트를 구조적으로 관리하고, 생산성을 조금이라도 높이기 위해 만든 코드 생성기입니다. 제티의 지향점 제티는 다음과 같은 지향점을 가지고 있습니다. 고 언어 프로젝트 구조에 대해 어느 정도 강제성을 부여합니다. 코드를 작성할 때, 귀찮은 부분을 최대한 코드 생성을 통해 줄여줍니다. 까먹고 하지 못 했다는 이유로 해야할 것을 하지 못하는 일을 최대한 줄여줍니다. cgo 의존성이나 외부 툴 설치에 대한 간단한 지원을 제공합니다. 설치 제티는 go install을 통해 설치할 수 있습니다....

August 20, 2023 · snowmerak

구조체 임베딩과 프로모션, 그리고 상속

구조체 임베딩 구조체 임베딩은 구조체를 다른 구조체의 필드로 사용하는 것을 말합니다. 예를 들어 다음과 같은 구조체가 있다고 가정해봅시다. type Person struct { Name string Age int } 그리고 이 구조체를 다른 구조체의 필드로 사용한다면 다음과 같이 사용할 수 있습니다. type Student struct { Person Grade int } 그러면 마치 Student 구조체에 Person 구조체의 필드가 포함된 것처럼 사용할 수 있습니다. student := Student{ Person: Person{ Name: "snowmerak", Age: 20, }, Grade: 3, } fmt....

August 14, 2023 · snowmerak

Context 패키지 (실전)

기능 복기 TODO 컨텍스트의 경우에 특이 케이스이므로 여기에 포함시키지 않겠습니다. 컨텍스트 생성 package main import "context" func main() { ctx := context.Background() } context.Background() 를 통해 새로운 컨텍스트를 생성할 수 있습니다. 반드시 이 컨텍스트를 생성할 때는, 모든 작업의 최상단에서 생성해야 합니다. 취소 가능한 컨텍스트 생성 context.WithCancel() package main import "context" func main() { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) defer cancel() } context.WithCancel() 을 통해 취소 가능한 컨텍스트를 생성할 수 있습니다....

May 26, 2023 · snowmerak

Context 패키지 (이론)

패키지 구성 Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes. 컨텍스트 패키지는 Context 타입을 구현하고 있는 패키지입니다. 이 컨텍스트 타입은 인터페이스로 실제로는 하부에 크게 5가지 타입의 컨텍스트 구현체가 존재합니다. 컨텍스트 종류 아무 상태도 가지지 않은, backgroundCtx와 todoCtx 취소 시그널을 보내거나 무시할 수 있는, cancelCtx와 withoutCancelCtx 특정 시간만 동작하거나 특정 시각까지만 동작하는, timerCtx 키와 값을 저장하는, valueCtx 사후 처리를 담당하는, afterFuncCtx backgroud, todo 아마 세상에서 가장 많이 쓰이는 컨텍스트입니다....

May 26, 2023 · snowmerak

고루틴과 채널을 활용한 유사 액터 모델

액터 모델? 액터 모델은 동시성 문제를 해결하기 위해 등장한 개념입니다. 각 액터는 독립된 스레드에서 실행되며, 메시지를 통해 상호작용합니다. 액터 모델은 다음과 같은 특징을 가집니다. 액터는 메모리를 공유하지 않습니다. 액터는 고유의 상태를 가질 수 있습니다. 액터 간의 통신은 메시지를 통해 이루어집니다. 액터 간의 통신은 비동기적입니다. 액터는 해당 메시지에 대응하는 동작을 수행합니다. CSP와 너무 잘 맞지 않아? 고 언어는 기반 패러다임에 CSP가 있는 만큼, 고루틴과 채널이라는 강력한 도구가 있습니다. 이를 이용해 타 언어에 비해 손 쉽게 액터 모델을 구현할 수 있습니다....

March 19, 2023 · snowmerak

고랭과 아레나

Arena? 고랭은 가비지 컬렉터를 쓰는 언어이고, 덕분에 사용자는 메모리를 관리하는 데에 크게 신경을 쓸 필요가 없습니다. 하지만 프로젝트 크기가 커지고, 사용해야할 힙 메모리가 커질수록 더욱 빈번하게, 그리고 한번에 많은 양의 메모리를 수집하여 처리하게 됩니다. 하나의 기능을 수행하고 난 후에는 물론이고, 수행하는 도중에도 GC가 동작하여 응답이 늦어지는 상황이 생겨날 확률이 늘어납니다. 그런 상황에서 유용하게 쓸 수 있는 아레나(arena)라는 개념이 등장했습니다. 아레나는 미리 사용할 힙 메모리를 할당 받아서 사용합니다. 이 때 할당받는 큰 힙 메모리 덩어리 하나를 페이지라고 합니다....

May 19, 2022 · snowmerak

[A] role playing go

개요 고 언어를 사용하여 프로젝트를 구성할 때, 제가 주로 작성하는 스타일을 정리하는 글입니다. 대체로 import cycle을 해결하거나 어느정도의 OOP를 구현하는 데에도 용이하다고 생각합니다. 역할 각 패키지는 고유의 역할을 가지게 됩니다. 역할은 2가지 경우로 나뉩니다. 역할에 대해 단일 구현체만 존재할 경우 역할에 대해 여러 구현체가 존재할 경우 단일 구현체가 존재할 경우 여러 서비스 간 주고 받는 로그 객체를 만든다고 가정합시다. 저는 log라는 패키지를 만들 것입니다. package log type Log struct { UnixTime int64 `parquet:"name=unix_time, type=INT64" json:"unix_time"` AppID int32 `parquet:"name=app_id, type=INT32" json:"app_id"` Level int32 `parquet:"name=level, type=INT32" json:"level"` Message string `parquet:"name=message, type=BYTE_ARRAY, convertedtype=UTF8, encoding=PLAIN_DICTIONARY" json:"message"` } log라는 패키지 아래에 Log 구조체를 직접 생성하여 log 패키지를 클래스처럼 작성합니다....

March 11, 2022 · snowmerak

간단한 로드밸런서와 HTTP 프록시 서버 구현

레이트 리미터 Limiter interface package limiter type Limiter interface { TryTake([]byte) (bool, int) } 레이트 리미터 객체가 구현해야할 인터페이스로 Limiter 인터페이스가 있습니다. 바이트 슬라이스를 받아서 해당 슬라이스를 기반으로 레이트 리밋을 계산하여 이번 요청이 사용 가능하면 true와 적절한 status code를 반환합니다. slide count struct type SlideCount struct { lock *lock.Lock unit int64 maxConnPer float64 prevTime int64 prevCount int64 curCount int64 nextTime int64 } func New(maxConnPer float64, unit time.Duration) limiter.Limiter { now := int64(time....

March 11, 2022 · snowmerak