[번역] 모던 React를 사용한 폼 탐구하기 : Kent C. Dodds의 A deep dive on forms with modern React를 번역한 글로 React 19의 Actions를 사용해서 form을 다루는 방법을 설명한다. 기존 onSubmit prop로 처리하는 대신 action prop으로 처리하고 useFormStatus를 사용해서 form의 보류 상태에 접근할 수 있는데 대안으로 useActionState를 사용해도 비슷하게 구현할 수 있다. 서버의 응답을 기다리지 않고 화면에 바로 표시하고 싶다면 useOptimistic을 사용할 수 있다.(한국어)
JS Dates Are About to Be Fixed : JavaScript Date 객체의 대안으로 제안된 Temporal 객체(현재 스테이지 3)를 설명하는 글이다. 기존 타임스탬프나 ISO 스트링으로, UTC로만 표시하는 것은 각 시간대에서 시간 맥락을 잃어버리기 때문에 충분하지 않다. Temporal의 ZonedDateTime에서는 시간 문자열 뒤에 타임존과 캘린더 확장을 표시해서 실제 시간 표시 및 서머타임으로 인한 영향을 명확하게 표시할 수 있다. 또한 Temporal에는 모던 API가 많이 있어서 날짜 비교를 한다거나 시간/날짜를 추가하고 남은 날짜 등을 계산할 수 있는 내장 API도 포함되어 있다.(영어)
그 밖의 개발 관련
배포 시점에 급상승하는 API Latency 해결하기 — Django + Gunicorn 사례 : 레몬베이스에서 Django + Gunicorn로 운영 중인 백엔드에서 배포 직후 API 레이턴시가 5초 정도로 증가하는 문제를 해결해 나간 과정인데 트러블슈팅의 정석에 가깝다는 생각이 들었다. 현재 구성한 설정에 맞게 Gunicorn이 어떻게 동작하는지를 자세히 파악한 뒤 문제가 되지 않는 부분을 제외하고 Preloading을 사용하고 있었음에도 콜드스타트가 발생하고 있었기 때문에 Preloading의 동작 방식을 자세히 살펴본다. 그래도 원인이 나오지 않자 Django의 동작 방식을 살펴보고 urls.py와 view 부분이 사전 로딩되지 않아 지연이 발생한다는 것을 알게 되어 이 부분을 사전 로딩하도록 코드를 수정해서 문제를 해결했다. 모든 문제가 원인을 알면 명확한데 원인을 알기 전에는 오리무중인 편인데 문제해결을 한 뒤 다시 상황을 맞추어보는 점과 배운 부분을 정리한 점까지 좋았다.(한국어)
uv: Unified Python packaging : Rust로 작성된 Python 패키지 관리자인 uv가 pip를 대체하는 수준을 넘어서 Python 프로젝트, CLI 도구, 싱글파일 스크립트, Python 자체까지도 관리할 수 있는 기능이 추가되었다. Armin Ronacher도 Rye가 빨리 uv로 이전되길 바라고 Python 생태계에 지배적인 도구 하나가 있어야 한다면 uv를 지지하는 글을 올렸다.(영어)
Stripe's monorepo developer environment : 2012년부터 19년까지 7년 동안 Stripe에서 일하면서 Stripe의 대형 Ruby 모노레포 환경에서 개발자 생산성을 높이기 위해 도구를 만든 경험을 정리한 글이다. 이 devpod 팀에서는 개발자별 인스턴스인 devbox를 지원하기로 하고 새로 들어온 개발자가 devbox에서 바로 개발 환경을 설정하게 지원했다. Stripe의 엔지니어가 전 세계에 있고 IDE 선택의 자유도도 있기 때문에 Git 체크아웃은 로컬에서 하게 하고 코드에 변경이 일어나면 rsync로 devboxes에 복사하도록 구현했다. 이후 HTTP 서비스를 지원하기 위해서 devbox에 요청을 처리할 수 있도록 지원하고 사용하기 편한 CLI 명령어도 추가하게 되었다. 이는 도구를 빌드하고 유지 보수할 엔지니어가 충분했기에 가능했고 이 투자가 성과를 거두려면 고객 엔지니어가 충분해야 했다는 부분에 공감하고 빠르게 성장하는 조직은 새 엔지니어가 바로 동작하는 개발자 환경을 가지는 것이 중요하고 동적인 조직에서는 엔지니어가 도구의 특성과 해결 방법을 배울 수 있다고 얘기한다.(영어)
TIL: 8 versions of UUID and when to use them : UUID는 v1부터 v8까지 있지만 일반적으로 버전이 높으면 새롭고 좋은 것으로 간주하지만 UUID는 모든 버전이 표준으로 정의되어 있다. 각 버전의 특징과 목적을 정리하고 임의의 ID가 필요하면 v4가 기본이고 정렬이 필요하다면 v7, UUID에 자체 데이터가 필요하다면 v5나 v8을 쓰면 된다.(영어)
Database in Kubernetes: Is that a good idea? : Kubernetes(k8s)에서 데이터베이스를 운영하려는 많은 시도가 있는데 이는 좋은 선택이 아니라고 얘기하는 글이다. k8s는 뛰어난 컨테이너 오케스트레이션 도구이지만 스테이트풀 관련 기능은 데이터베이스의 안정성을 충족하기엔 여전히 부족하며 k8s에서 데이터베이스를 운영하면 k8s의 장점인 무상태 유연성과 스케쥴링 기능도 사용하지 못하면서 데이터베이스는 신뢰성, 보안, 효율성, 단순성 등을 희생하게 되므로 양쪽 모두 손해인 전략이다. 클라우드에서 k8s는 PaaS에 속하지만, RDS는 IaaS에 속할 정도로 안정성이 중요한데 k8s에서는 이를 달성하기가 쉽지 않고 보안 측면에서도 딱히 좋지 않으며 베어 메탈과 같은 성능을 얻으려면 상당한 기술력이 필요하다. 이 상황은 클라우드 네이티브 열풍으로 k8s를 위한 k8s 도입이라는 왜곡된 현상이라고 얘기한다.(영어)
나도 eBPF 프로그램을 만들어 볼 수 있을까? : eBPF를 공부하기 위해서 웹서버에서 오가는 TCP를 분석하는 eBPF 프로그램을 만들어본 과정이다. eBPF 프로그램을 쉽게 작성할 수 있게 하는 BCC와 Linux VM을 실행하기 위한 Lima를 이용해서 eBPF로 수집된 TCP 통신 데이터를 Python 애플리케이션으로 수집해서 보여주는 간단한 tcp_monitor를 만들었다.(한국어)
How to calculate CPU for containers in k8s dynamically ? : Kubernetes에서 InPlacePodVerticalScaling을 사용하면 CPU를 동적으로 조정할 수 있는데 항상 CPU를 80% 사용하는 전략, 기하급수적으로 증가하면서 CPU를 80% 사용하도록 하는 전략, CPU usage와 pressure를 이용해서 100% 사용하도록 하는 전략을 소개한다. 이론상은 3번째 전략이 제일 좋지만, 현실에서는 2번이 잘 작동한다고 얘기한다.(영어)
볼만한 링크
Postmortem of my 9 year journey at Google : Google에서 9년 동안 일하다가 퇴사하면서 SRE였기에 퇴사도 포스트모템으로 작성한 글이다. 스타트업에 다니다가 구글로 이직했는데 처음에는 높은 보상과 엔지니어링 수준, 리더십 기술, 환경이 매력적이었지만 시간이 지나면서 점점 덜 매력적으로 느껴졌고 일해온 과정에서 잘된 점과 잘 안된 점을 정리했다.(영어)
이렇게 고객을 속여도 되나요? : 제품을 만들기로 기획하면서 가짜문 테스트를 한 과정을 설명한다. 가짜문 테스트는 사용자에게 요구하는 액션을 실제로 수행하는지 보기 위해 랜딩페이지를 만들어서 사용자를 유입시키고 실제 액션을 수행하면 해당 기능은 아직 준비 안 된 걸 얘기한다. 비용을 많이 들이지 않고 실제 요구사항이 있는지 확인하기 위해 사용하는 방법인데 이를 위해 랜딩페이지를 기획하고 초기에 전환율이 넘어와서 페이지 개선을 통해 전환율도 만족스러운 정도까지 올렸다.(한국어)
Leaving Neovim for Zed : 오랫동안 Neovim의 사용자로 있다가 다양한 에디터를 시도해 보다가 항상 Neovim으로 돌아오곤 했다. 최근 대량의 코드 작업을 하다가 다시 에디터를 테스트하기 시작했고 Zed를 사용해 보고 맘에 들었다고 한다. Neovim과 달리 기본적으로 필요한 많은 기능이 포함되어 있어서 바로 사용할 수 있고 VS Code에 적응하지 못한 가장 큰 이유인 vim 모드도 Zed에서 직접 만들어서 아주 좋고 에디터의 성능 자체도 너무 뛰어나서 한 번도 랙을 느낀 적이 없으며 내장된 AI 기능도 훌륭하다. 뒷부분에는 Neovim처럼 심플하게 Zed를 설정하는 방법을 소개한다.(영어)
오픈소스 License에 대해 알아보기. : 소스코드 제공 의무에 따라 Reciprocal와 Permissive 라이센스로 구분하고 각 대표 라이센스의 특징을 정리한 글이다.(한국어)
Comments