Opinionated Zanzibar
Zanzibar 개요 Zanzibar(이하 잔지바)는 구글에서 실제 사용하고 있으며, 수년 전에 논문을 통해 공개된 권한 관리 시스템입니다. 잔지바는 주로 관계 튜플이란 것에 의해 권한 관계가 정의됩니다. 각각의 사용자, 권한 관계, 객체에 대해서 튜플 이용하여 아래와 같이 정의합니다. …
제목, 본문 요약, 카테고리와 태그에서 찾습니다.
검색어를 입력하면 글을 바로 필터링합니다.
Zanzibar 개요 Zanzibar(이하 잔지바)는 구글에서 실제 사용하고 있으며, 수년 전에 논문을 통해 공개된 권한 관리 시스템입니다. 잔지바는 주로 관계 튜플이란 것에 의해 권한 관계가 정의됩니다. 각각의 사용자, 권한 관계, 객체에 대해서 튜플 이용하여 아래와 같이 정의합니다. …
오랜만에 글 쓰려고 하니까 어렵네요. 개요 바이브코딩 여러분들은 AI로 개발할 때 가장 중요하다고 보는 게 무엇인가요? 모델의 성능? 정교한 프롬프트? 컨텍스트 엔지니어링? 최신 기술이 포함된 하네스? 더 효과적인 LLM 평가 방법? 워크스페이스 및 세션 분리? AI 혹은 인간 개발자에 대한 자율성? 모두 중요한 것들이지 …
개요 실시간 로그 수집과 분석은 현대 소프트웨어 시스템에서 필수적인 요소가 되었습니다. 많은 팀이 ElasticSearch나 OpenSearch를 로그 데이터 웨어하우스로 사용해 왔고, 이는 합당한 선택이었습니다. 전역 인덱싱(full-text search)과 유연한 스키마는 로그 탐색에 매우 유용했습니다. 하지만 로그 …
들어가며 미쳐버린 생산성 미쳐버린 AI의 발전으로 인해 수 많은 사람들이 AI에의해 월급을 받지 못 하고 있습니다. 하지만, 프리는 오히려 늘었죠. 저 또한 회사에서 개발하는 시간은 오히려 줄고, 사이드로 뭔가 하는 건 상당히 늘었습니다. 사이드로 안 가더라도 회사에서 하나를 개발하는 시간이 줄고, 다른 걸 더 개발하는 …
이에 대해 제 기나긴 헛소리가 이어질 예정입니다. 불편하시면 그런거 아닌데!라고 해주세요. TL;DR 리셋 버튼이 된 트럭: 과거의 교통사고가 성장을 위한 시련이었다면, 현대의 트럭은 지친 현실을 가장 효율적으로 끝내고 새로운 삶을 시작하게 돕는 리셋 버튼입니다. 노력 가성비와 치트 능력: 노력이 보상받지 못하는 저성장 …
배경 왜? 이 또한 제가 조직에서 기본적으로 사용하고 있던 로그 자체에 대한 불합리에 의거하여 설계한 내용입니다. 기존 로그는 단순히 필요에 따라 에러를 남기거나, 스냅샷을 남기는 정도에 불과 했습니다. 그 때문에 매번 예상치 못한 경우에 대한 추적이 불가능에 가까웠죠. 또한 명확한 관측성을 확보하지 못 하다보니 어떤 부 …
소듐이요? 사족 저랑 비슷한 시기에 정규 교육을 나오신 분들은 나트륨이 더 익숙할 Na는 이제 소듐이 되었습니다. 저랑 같이 소듐으로 부르며 영포티가 되시죠. 전 아직 영써티지만요. 소금? 하여간에 그래서 왜 소듐인가, libsodium이란 라이브러리의 탄생 배경에는 다니엘 번스타인이라는 분이 만든 …
뭐냐면 별 건 아니고, zymkey 4i 드라이버 설치 스크립트가 debian 13에 적용이 안되어 있어서 제가 써먹으려고 멋대로 수정한 스크립트 입니다. install_zk_sw.sh로 저장해서 실행하세요. 스크립트 #!/bin/bash …
아니 근데 왜 다들 요즘 서비스 아키텍처 구상하면서 큰 의문이 들었습니다. 규모가 조금이라도 큰 조직이면 자바나 스프링 강박증이라도 없었다면 높은 확률로 각자가 쓰고 있는 기술 스택이 다를 것입니다. 제가 느낀 위화감이 그것이었습니다. NodeJS, PHP, Java, Go, C++(?) 등으로 이루어진 API 및 웹소켓 …
그러게나 말이에요. 왜 사람 힘들게 만들까 미리 말씀드리지만, 저는 네트워크 엔지니어가 아니라 백엔드 엔지니어로서 짧은 시간 안에 이슈를 체크 및 리포트 중이라 조금이라도 깊게 들어갔을 때 틀렸을 수 있으니 크로스체크 부탁드립니다. 개요 무슨 일이 있었나 어쩌다 보니 현재 있는 조직에서 특정 서비스가 Tx 성능이 피크 타 …
퀀텀이란 무엇인가? 퀀텀은 라틴어 ‘quantus’에서 유래했으며, ‘얼마나 많은’, ‘양의’를 의미합니다. 이외에도 사전 상에서 다음과 같은 의미를 찾을 수 있습니다. (물리학) 양자: 더 이상 나눌 수 없는 에너지나 물질의 최소 단위. (일반적으로) 최소량, 일정량. 갑작스럽고 중요한 도약을 의미할 때도 사용 아키텍처 …
개요 flutter를 설치하는 걸 어려워 하시는 분들이 적잖이 계신 것같아 작성합니다. OS 별로 설치 방법 Windows Script를 이용해서 Written by Gemini. PowerShell 스크립트입니다. 아무 곳이나 get_flutter.ps1같은 파일을 만들어 아래 스크립트를 붙여넣기 하여 저장하고 실행합니 …
valkey? 여전히 valkey보다 redis가 더 익숙한 분들이 계실 겁니다. valkey는 Redis Inc.의 redis에 대한 라이센스 변경 및 독점적 지위 확보 시도에 대한 반발로 redis 7.2.4를 베이스로 추가 개발되고 있는 레디스 대체제입니다. 현재는 레디스보다도 먼저 8.0 버전을 출시하는 등 굉장히 …
잠재적인 데이터 불일치 문제 MSA는 개발 및 배포의 유연성, 기술 스택의 다양성, 확장성, 장애 격리 등 다양한 장점을 제공하지만, 그로 인해 트레이드 오프되는 단점들도 분명히 존재합니다. 그 대표적인 부분이 비즈니스 로직 오류, 사용자 경험 저하, 심각한 경우 금전적 손실까지 야기할 수 있는 중요한 문제인 잠재적인 데 …
배경 로그도 남기고, 이벤트도 남겨? 서비스를 쭉 구성하다보니 이런 생각을 했습니다. 어차피 로그는 남긴다. 필요한 유저 행동에 대해 이벤트르 발행한다. 그러면 각 서비스가 로그에서 필요한 걸 가져가서 상태 변화를 기록하면 되는 것 아닐까? 뭣하러 굳이 이벤트를 별도로 발행하지? 어차피 모두 kafka같은 메시지 브로커를 …
개요 왜 사람들은 PGO(Profile Guided Optimization)을 적극적으로 사용하지 않을까? 저는 이 의문을 예전부터 품고 있었습니다. 생각해보니 프로파일을 저장하고, 가져오는 어떠한 표준화된 프로토콜이 없다는 게 이유로 보였습니다. 사실 쓸 사람들은 어떻게든 쓰고 있겠지만, 저도 처음 PGO를 적용할 때에 …
? 대는 소를 포함한다는 말은 법률상으로 상위 개념과 하위 개념이 존재할 경우, 상위 개념에 대한 법을 하위 개념에도 적용하는 것입니다. 쉽게 이야기하면, 법률적으로는 자전거가 자동차의 하위 개념이니 자동차에 적용하는 다양한 법을 자전거에도 같이 적용하는 것입니다. 하지만 제가 법률 전문가도 아니고, 법과 관련된 이야기를 …
배경 NATS는 정말 아름다워 NATS는 Go 언어로 작성된 메시지큐입니다. 그리고 제가 개인적으로 좋아하는 오픈소스 프로젝트이기도 합니다. 한때 NATS에서 서브스크립션이 메시지를 받는 방식이 단순 채널이 아닌 독특한 자료구조가 따로 있는 걸 봤었던 적이 있습니다. 이 자료구조는 연결리스트를 통해 특정 서브스크립션에 전 …
메락아, 그게 무슨 소리니? 아니 일단 들어봐 서비스가 되었든, 소프트웨어가 되었든, 어떤 프로젝트에 대해 보통 기업은 신기술에 밝거나, 손이 빠르거나, 임원의 말을 잘 듣는 사람에게 첫 스타트를 시키는 경우가 많습니다. 하지만 단순히 그렇게 되어서는 서비스나 소프트웨어의 수명이 줄어들어서, 유지보수 비용의 증가 뿐만 아 …
이것 또한 최근 포스트와 마찬가지로, 최근에 진행했던 프로젝트의 회고입니다. 개요 해당 프로젝트에는 개인적으로 몇가지 이해가 어려운 부분들이 좀 있었습니다. 그 중 R&R에 대해 제가 품은 의문과 그에 대한 제 나름의 해결 방법을 서술하고자 합니다. 본문 어떤 부분이? API GW와 서비스만 책임 분리 API GW와 인증 …
개요 이전 포스팅과 동일한 프로젝트에 대한 회고를 내용으로 합니다. 이 포스트에선 비교적 안일하게 생각했던 라이프타임에 대해 생각했던 걸 적어보려합니다. 여기서 말하는 라이프타임은 객체의 라이프사이클, 캐시 수명, 요청의 타임아웃 등을 포함하는 어떤 것의 발생과 소멸까지의 시간을 의미합니다. 뭐가 문제였지? 대부분의 라이 …
개요 최근 그래도 규모가 조금 있는 프로젝트를 처음부터 설계하고, 구현 및 운영한 경험이 생겼습니다. 상당히 많은 부분에서 하고 싶은 걸 했고, 부족한 점을 느끼기고 했고, 발전했다고 생각합니다. 하지만 안타깝게도, 기반 시스템(혹은 라이브러리)에 대해서 조직 내에서도 명확히 어떻게 해왔다는 게 없었어서 상당히 아쉬운 결 …
Liskov Substitution Principle with inheritance 리스코프 치환 법칙은 객체지향 프로그래밍에서 중요한 법칙 중 하나입니다. 서브 타입은 언제나 슈퍼 타입으로 대체될 수 있어야 한다. 개인적으로는 살짝 헷갈린 적이 있는 표현이지만, 코드 내의 인스턴스 타입을 교체하는 케이스로 이해하면 쉽습 …
개요 코드를 구조화하는 건 생각보다 어렵지 않다고 생각합니다. 하지만 생각보다 어렵기도 하죠. 그래서 사실 이걸 어떻게 표현해야할 지는 모르겠는데, 그냥 편하게 아키텍처를 만드는 것에서 프로젝트 구조를 짜는 것, 코드를 작성하는 것까지의 제 나름대로의 룰을 정리해보려고 합니다. 룰 모듈 혹은 서비스를 분리하세요. 모듈을 …
왜? HTTP API에 에러 쓰는 건 개인 취향 혹은 조직에서 정한 룰 아닌가요? 저도 그렇게 생각하고 있습니다. 모름지기 학사 과정을 수료했든, 학원을 수료했든, 부트캠프를 수료했든, 백엔드 개발자라면 알아서 잘 남길 수 있을 것입니다. 그럼 왜 이 글이 있는 거죠? RFC에 HTTP API의 에러에 관한 내용이 있더라 …
Dev Container Dev Container는 도커 컨테이너를 이용하여 개발 환경을 구축하는 방법입니다. 이 방식을 이용하면 쉽게 어느 곳에서나 동일한 개발 환경을 구축할 수 있습니다. 이 글에서는 Go 언어를 사용하는 개발 환경을 구축하는 방법을 소개합니다. devcontainer 폴더 구성 프로젝트 폴더 내에 …
Provider Provider는 제가 만들고 있는 고 언어에서 의존성 주입을 위한 컨테이너입니다. 정의 type Provider struct { constructors map[reflect.Type]map[reflect.Value]struct{} container map[reflect.Type]any lock …
프로토버퍼? 프로토버퍼는 구글에서 개발한 직렬화 라이브러리입니다. 프로토버퍼는 다양한 언어를 지원하며, 단일 IDL(Interface Description Language)을 사용하여 여러 언어에 대한 DTO 및 시리얼라이저를 생성할 수 있습니다. 그렇기에 서버와 클라이언트 사이에 서로 다른 언어를 사용하더라도, 같은 …
vcpkg? vcpkg는 Microsoft에서 발표한 C/C++ 패키지 매니저입니다. vcpkg의 레포에 등록된 패키지들을 install을 통해 손쉽게 설치하고 이용할 수 있습니다. vcpkg 설치 vcpkg는 전역으로 사용할 수 있지만 이번 글에서는 프로젝트 내에서 사용하도록 설정하겠습니다. mkdir prac git …
제티 (Jetti) 제티는 제가 프로젝트를 구조적으로 관리하고, 생산성을 조금이라도 높이기 위해 만든 코드 생성기입니다. 제티의 지향점 제티는 다음과 같은 지향점을 가지고 있습니다. 고 언어 프로젝트 구조에 대해 어느 정도 강제성을 부여합니다. 코드를 작성할 때, 귀찮은 부분을 최대한 코드 생성을 통해 줄여줍니다. 까먹고 …
구조체 임베딩 구조체 임베딩은 구조체를 다른 구조체의 필드로 사용하는 것을 말합니다. 예를 들어 다음과 같은 구조체가 있다고 가정해봅시다. type Person struct { Name string Age int } 그리고 이 구조체를 다른 구조체의 필드로 사용한다면 다음과 같이 사용할 수 있습니다. type …
기능 복기 TODO 컨텍스트의 경우에 특이 케이스이므로 여기에 포함시키지 않겠습니다. 컨텍스트 생성 package main import "context" func main() { ctx := context.Background() } context.Background() 를 통해 새로운 컨텍스트를 생성할 수 있습니다. 반드 …
패키지 구성 Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes. 컨텍스트 패키 …
테스트 주도 개발 테스트 주도 개발을 하자는 이야기는 아닙니다. 테스트 주도 개발은 좋은 개발 방법론이라고 생각은 합니다. 하지만 제가 이번 글에서 말하고자 하는 것은 테스트 주도 개발이 아니라 테스트 가능한 코드를 작성하는 것입니다. 글이 끝나갈 때 쯤엔 마치 테스트 주도 개발이 옳다는 듯이 얘기하고 있을 가능성도 충분 …
액터 모델? 액터 모델은 동시성 문제를 해결하기 위해 등장한 개념입니다. 각 액터는 독립된 스레드에서 실행되며, 메시지를 통해 상호작용합니다. 액터 모델은 다음과 같은 특징을 가집니다. 액터는 메모리를 공유하지 않습니다. 액터는 고유의 상태를 가질 수 있습니다. 액터 간의 통신은 메시지를 통해 이루어집니다. 액터 간의 통 …
Arena? 고랭은 가비지 컬렉터를 쓰는 언어이고, 덕분에 사용자는 메모리를 관리하는 데에 크게 신경을 쓸 필요가 없습니다. 하지만 프로젝트 크기가 커지고, 사용해야할 힙 메모리가 커질수록 더욱 빈번하게, 그리고 한번에 많은 양의 메모리를 수집하여 처리하게 됩니다. 하나의 기능을 수행하고 난 후에는 물론이고, 수행하는 도 …
왜 러스트? 개인적으로 러스트로 알고리즘 문제를 푸는 건 좋은 선택이라 생각합니다. 아래의 다양한 자료구조를 빌트인으로 제공합니다. Vector VecDeque LinkedList HashMap HashSet BtreeMap BtreeSet BinaryHeap 유용한 이터러블과 빌트인 고차함수들이 있습니다. 일단 이터러블 …
이 페이지의 고 코드는 제네릭이 포함되어 있습니다. enum? 고에서 열거형은 아래의 단순한 형태, 혹은 조금의 변형으로밖에 작성되지 않습니다. package week const ( Monday = iota Tuesday Wednesday Thursday Friday Saturday Sunday ) 단순하게 week 패키 …
개요 고 언어를 사용하여 프로젝트를 구성할 때, 제가 주로 작성하는 스타일을 정리하는 글입니다. 대체로 import cycle을 해결하거나 어느정도의 OOP를 구현하는 데에도 용이하다고 생각합니다. 역할 각 패키지는 고유의 역할을 가지게 됩니다. 역할은 2가지 경우로 나뉩니다. 역할에 대해 단일 구현체만 존재할 경우 역할 …
레이트 리미터 Limiter interface package limiter type Limiter interface { TryTake([]byte) (bool, int) } 레이트 리미터 객체가 구현해야할 인터페이스로 Limiter 인터페이스가 있습니다. 바이트 슬라이스를 받아서 해당 슬라이스를 기반으로 레이트 리밋을 계 …
행위 패턴의 하나로, 어떤 문제를 해결함에 어떤 방법을 사용하는 지 적절히 선택, 혹은 작성할 수 있게 해주는 패턴 코틀린으로 평균을 구하는 계산기 만들기 이 계산기의 평균을 구하는 방법은 총 3가지가 있습니다. 산술 평균 : (a + b) / 2 기하 평균 : root2(a * b) 조화 평균 : 2ab / (a + …
이 글은 제 레포를 기반으로 작성되었습니다. 왜? 오픈톡방에서 고루틴에 대한 이야기가 나왔었습니다. 고루틴을 안전하게 관리하기 위한 보일러플레이트에 대한 것과 join과 반환값의 처리에 대한 것이었습니다. 그래서 한번 해당 건에 대해 나름의 해답을 라이브러리로 만들어봤습니다. gopool GoPool type GoPool …
이 글은 제 로그 라이브러리를 작성하며 생각한 것을 작성한 것입니다. 개요 logstream 라이브러리는 로그를 생성하고 소비하는 패턴을 구현하기 위해 만든 일종의 고 프로그램 전역에서 돌아가는 메시지 큐입니다. 다른 메시지 큐와 마찬가지로 여러 생산자가 토픽에 값을 추가하고 소비자가 토픽에서 값을 꺼내서 사용합니다. 생 …
개요 인터페이스 비교로 에러를 처리하는 방식에 기반하여 인터페이스로 매개변수를 덕타이핑하는 건 어떨까 해서 한번 시도해봤습니다. 아이디어 아이디어는 쉽습니다. 베이스가 되는 인터페이스와 구조체를 작성합니다. 이후 필요에 따라 매개변수를 얻을 수 있는 새로운 인터페이스를 제공하고 해당 인터페이스에 대한 구조체를 작성합니다. …
option option 패키지는 직전 포스트에 작성한 result 패키지에서 에러 메시지가 빠진 형태입니다. 구조체 type Option[T any] struct { value any } func Some[T any](value T) *Option[T] { return &Option[T]{value: value} } …
이 글은 제가 작성한 레포인 generics-for-go를 기반으로 쓰여졌습니다. 개요 예전 고 1.18 dev 버전이 나왔을 때 한 레포를 만들어서 제네릭 관련 함수를 찍어낸 적이 있습니다. 그 이후 한동안 잊고 지내다가 1.18 beta가 나오게 되고 이제 큰 피처의 변화는 없을 거라 판단해서 제네릭으로 몇가지 장난을 …
쉬운 에러 처리 package main import ( "errors" ) func NewError() error { return errors.New("this is new error!") } func ThrowError() error { _, err := os.Open("not-exist") return err } …
본 문서는 https://blog.cloudflare.com/kemtls-post-quantum-tls-without-signatures/ 의 번역이 일부 포함되어 있습니다. 더 나은 제안: KEMTLS 서명이 외에 인증에 사용되는 다른 메커니즘에는 긴 역사가 있습니다. Signal 프로토콜, Noise 프레임워크 또는 …
안녕하세요. 누구나 안전하고 편리한 네트워크를 꿈꾸는 백엔드 개발자, snowmerak입니다. project skill languages frameworks tools Database contact email: [email protected] telegram & kakaotalk: snowmerak external …