thinking of SNOWMERAK

HTTP API 에러 쓰는 법

왜?

왜? HTTP API에 에러 쓰는 건 개인 취향 혹은 조직에서 정한 룰 아닌가요? 저도 그렇게 생각하고 있습니다. 모름지기 학사 과정을 수료했든, 학원을 수료했든, 부트캠프를 수료했든, 백엔드 개발자라면 알아서 잘 남길 수 있을 것입니다. 그럼 왜 이 글이 있는 거죠? RFC에 HTTP API의 에러에 관한 내용이 있더라구요. 흥미로워서 가져왔습니다. RFC7807 RFC7807은 Problem Details for HTTP …

DevContainer로 개발환경 구성하기

Dev Container

Dev Container Dev Container는 도커 컨테이너를 이용하여 개발 환경을 구축하는 방법입니다. 이 방식을 이용하면 쉽게 어느 곳에서나 동일한 개발 환경을 구축할 수 있습니다. 이 글에서는 Go 언어를 사용하는 개발 환경을 구축하는 방법을 소개합니다. devcontainer 폴더 구성 프로젝트 폴더 내에 .devcontainer 폴더를 생성합니다. 그리고 다시 한번 그 안에 원하는 개발 환경 이름으로 폴더를 생성 …

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

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를 가지고 있습니다. …

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

프로토버퍼?

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

vcpkg를 cgo에 사용하기

vcpkg?

vcpkg? vcpkg는 Microsoft에서 발표한 C/C++ 패키지 매니저입니다. vcpkg의 레포에 등록된 패키지들을 install을 통해 손쉽게 설치하고 이용할 수 있습니다. vcpkg 설치 vcpkg는 전역으로 사용할 수 있지만 이번 글에서는 프로젝트 내에서 사용하도록 설정하겠습니다. mkdir prac git clone https://github.com/microsoft/vcpkg.git prac 폴더를 생성한 후, …

제티

제티 (Jetti)

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

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

구조체 임베딩

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

Context 패키지 (실전)

기능 복기

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