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

고 언어의 의존성 주입을 위한 Provider

Provider Provider는 제가 만들고 있는 고 언어에서 의존성 주입을 위한 컨테이너입니다. 정의 type Provider struct { constructors map[reflect.Type]map[reflect.Value]struct{} container map[reflect.Type]any lock sync.RWMutex } Provider는 constructors와 container를 가지고 있습니다. constructors는 생성자를 저장하는 맵입니다. container는 실제로 생성된 인스턴스를 저장하는 맵입니다. 생성자 등록 func (p *Provider) Register(constructFunction ...any) error { p.lock.Lock() defer p.lock.Unlock() for _, con := range constructFunction { if err := p.register(con); err != nil { return err } } return nil } func (p *Provider) register(constructFunction any) error { args, _, err := analyzeConstructor(constructFunction) if err !...

February 9, 2024 · snowmerak

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

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

December 13, 2023 · snowmerak

vcpkg를 cgo에 사용하기

vcpkg? vcpkg는 Microsoft에서 발표한 C/C++ 패키지 매니저입니다. vcpkg의 레포에 등록된 패키지들을 install을 통해 손쉽게 설치하고 이용할 수 있습니다. vcpkg 설치 vcpkg는 전역으로 사용할 수 있지만 이번 글에서는 프로젝트 내에서 사용하도록 설정하겠습니다. mkdir prac git clone https://github.com/microsoft/vcpkg.git prac 폴더를 생성한 후, vcpkg를 클론합니다. 클론하면 vcpkg 폴더가 생성되고, 최초 1회 bootstrap-vcpkg.sh(or 윈도우의 경우, bootstrp-vcpkg.bat)을 실행해야 합니다. cd vcpkg ./bootstrap-vcpkg.sh 그럼 vcpkg 폴더에 vcpkg 파일이 생성됩니다. 이 파일을 실행함으로 패키지를 설치할 수 있습니다....

October 12, 2023 · snowmerak

뭔가 이상한 플러터 프로젝트 구조

프로바이더는 이번 생에 처음이라.. 처음으로 제대로 된 플러터 프로젝트를 시작하는 중이었습니다. 이전에는 편하다는 이유로, getx를 애용했었는데, 이번에는 flutter developers korea분들의 의견을 듣고 Riverpod으로 선택했습니다. 여기서부터 문제가 생깁니다. 원래 GetX를 썼기에 제 스타일 상, 프로바이더의 구성은 전역 변수와 거의 같아질 수밖에 없었습니다. 물론 사실 이 부분은 제 능력부족에 대한 핑계이고, auto dispose만 제대로 해줬어도 그런 느낌은 주지 않았을 겁니다. 이 문제로 인해 폴더 분리도, 큰 규모는 처음이라 제대로 분리되어 있지도 않았죠....

September 16, 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

테스트 가능한 코드

테스트 주도 개발 테스트 주도 개발을 하자는 이야기는 아닙니다. 테스트 주도 개발은 좋은 개발 방법론이라고 생각은 합니다. 하지만 제가 이번 글에서 말하고자 하는 것은 테스트 주도 개발이 아니라 테스트 가능한 코드를 작성하는 것입니다. 글이 끝나갈 때 쯤엔 마치 테스트 주도 개발이 옳다는 듯이 얘기하고 있을 가능성도 충분히 높습니다. 테스트 가능한 코드 테스트 가능한 코드는 충분히 우리가 컨트롤 할 수 있는 정도의 크기로 기능과 코드를 나누어 지고, 추상화되어 있어야 합니다. 그리고 이 작은 검증된 테스트들은 코드가 모여서 만들어진 더욱 상위의 테스트에 대한 검증을 수월하게 합니다....

April 1, 2023 · snowmerak