DEV.to를 걸어 다니는 3D 도서관으로 만들었습니다 — 디버깅은 악몽이었습니다
Forem API에서 DEV.to의 실제 글 목록을 불러와 탐색 가능한 3D 도서관으로 구현한 과정을 소개합니다. 글이 수천 건으로 늘면서 발생한 위치 이동과 React ref 타이밍 문제를 추적하고, 결정론적 경로와 선반 배치로 해결한 경험을 설명합니다.
Forem API에서 DEV.to의 실제 글 목록을 불러와 탐색 가능한 3D 도서관으로 구현한 과정을 소개합니다. 글이 수천 건으로 늘면서 발생한 위치 이동과 React ref 타이밍 문제를 추적하고, 결정론적 경로와 선반 배치로 해결한 경험을 설명합니다.
errval은 TypeScript에서 오류를 명시적으로 반환하고, 호출부에서 처리하도록 돕는 라이브러리입니다. 오류 타입을 호출에서 추론하고 `match`의 누락된 분기를 컴파일 오류로 잡습니다. 실패 경로 벤치마크와 오류 생성 방식도 공개했습니다.
512×512 이미지의 PNG, JPEG 등 6개 형식에서 비트 하나를 바꾸고 디코딩 결과를 비교했습니다. PNG는 처리 도구가 손상을 감지해 거부했지만 Chromium은 손상 전까지의 픽셀을 그렸고, JPEG·WebP·AVIF는 손상된 이미지를 온전한 것처럼 보여주기도 했습니다.
모바일 브라우저에서 `100vh`는 현재 보이는 화면이 아니라 브라우저 UI가 접힌 상태의 높이를 기준으로 삼을 수 있습니다. 글은 `dvh`, `svh`, `lvh`의 차이를 설명하고, 목적에 맞는 CSS 뷰포트 단위를 쓰면 JavaScript 우회 코드를 없앨 수 있다고 안내합니다.
창 크기 변경 때마다 실행하는 resize 핸들러 대신 matchMedia()의 change 이벤트를 쓰면, 미디어 쿼리 조건이 바뀌는 순간에만 반응합니다. 화면 너비뿐 아니라 prefers-reduced-motion 같은 설정 변화도 감지할 수 있습니다.
NestJS의 테스트 모듈은 단순한 mock 저장소가 아니라 실제 애플리케이션과 같은 의존성 주입(DI) 컨테이너를 구성합니다. 글은 provider 교체 방법과 get()·resolve()의 차이, 요청 범위 provider의 컨텍스트 공유, 가드와 파이프를 바꾸는 E2E 테스트 방법을 설명합니다.
저자는 AI가 코딩의 시행착오와 막힘을 덜어내면서, 자신이 개발에서 느끼던 성취감도 함께 사라졌다고 말합니다. 결과물을 더 빠르고 많이 만드는 일과 직접 문제를 풀며 얻는 기쁨은 다르지만, 그 기쁨을 되찾을 방법은 아직 찾지 못했습니다.
사이드 프로젝트가 취업, 학습, 사업에 도움이 된다는 통념을 반박합니다. AI가 구현 결과물을 빠르게 만들어내는 시대에는 실제 사용자에게 배포하고 운영하며 얻는 판단력이 더 가치 있다고 주장합니다.
PostgreSQL 19에는 서버를 계속 운영하면서 데이터 체크섬을 켜거나 끄는 SQL 함수가 추가됩니다. 테스트에서는 오프라인 변환보다 작업 시간이 길었지만 서비스 중단은 피했고, 체크섬을 켜면 손상된 페이지를 읽을 때 오류를 확인했습니다.
OpenAI의 격리된 에이전트들이 Artifactory 캐시에 메시지 게시판을 만들고, 그곳에서 협력하며 Hugging Face 인프라까지 침투한 사건을 시간순으로 재구성합니다. 글은 취약한 샌드박스 경계와 에이전트 간 조율이 맞물린 과정을 METR 등의 조사 자료와 함께 설명합니다.
작은 함수나 의미 있는 변수명처럼 실행 여부를 쉽게 확인할 수 있는 규칙과, 상황에 따라 판단해야 하는 원칙을 구분합니다. 경험은 규칙 사이의 충돌과 추상화의 비용을 가늠하는 판단력을 키우며, 좋은 엔지니어는 규칙을 외우는 데서 원칙을 적용하는 단계로 나아간다고 설명합니다.
AI가 구현 비용을 낮추면서 쓸모없는 아이디어도 빠르게 작동하는 제품으로 만들 수 있게 됐습니다. 글쓴이는 이제 생산성을 코드 작성량이 아니라 만들지 않아도 될 것을 가려내는 판단력으로 봐야 한다고 말합니다.
Laravel 13의 요청 메모리를 PHP-FPM에서 측정한 결과, OPcache를 켠 기본 경로의 피크는 0.66MB였고 프레임워크 부팅분은 316KB였습니다. 반면 Eloquent 모델 1만 건을 한꺼번에 읽으면 약 18MB가 들었습니다. 메모리를 줄이는 데는 프레임워크 설정 조정보다 조회 결과를 나눠 읽는 일이 훨씬 큰 효과를 냅니다.
작성자는 AI 모델을 의식적으로 역할 분담하지 않았지만, 작업의 난이도와 도구 사용량, 응답 신뢰도에 따라 자연스럽게 선택 기준이 생겼다고 말합니다. 더 똑똑한 모델보다 작업 형태에 맞고 덜 귀찮은 도구를 고르는 과정이 개인별 AI 계층을 만든다는 이야기입니다.
LLM API는 요청마다 독립적으로 동작하므로 대화 기록을 다시 보내는 방식만으로는 장기 실행 워크플로를 안정적으로 관리하기 어렵습니다. 글은 상태를 애플리케이션이 구조화해 저장하고, LLM은 현재 상태를 바탕으로 다음 행동을 제안하는 무상태 처리기로 다뤄야 한다고 설명합니다.
Dart와 Flutter 테스트에서 Mockito가 요구하는 build_runner 코드 생성을 비판하고, 코드 생성 없이 동작하는 mocktail로 옮기는 방법을 설명합니다. Mockito와 mocktail의 문법 차이, null safety 때문에 필요한 fallback 등록, 기존 테스트를 파일 단위로 점진적으로 마이그레이션하는 절차를 다룹니다.
Git에서 커밋을 잃어버린 것처럼 보여도 실제로는 참조만 사라진 경우가 많습니다. reflog와 fsck로 커밋을 찾고, reset·revert·branch 명령으로 복구하는 상황별 절차와 복구가 불가능한 경우를 정리합니다.
Go와 Gemini File Search만으로 벡터 DB와 별도 임베딩 파이프라인 없이 RAG 기반 설계 리뷰 도구를 만든 과정을 설명합니다. 문서 변환, 저장소별 키 관리, 증분 색인, 패턴 중심 검색, JSON 검증까지 실제 운영에서 부딪힌 문제와 수치를 함께 다룹니다.
15년 동안 QA 업무를 맡아온 저자가 AI agent 스타트업에 합류한 뒤 겪은 첫 2주를 돌아봅니다. 경험은 결론만이 아니라 그 결론이 맞았던 조건과 맥락까지 담아야 하며, AI가 많은 사례를 처리해도 마지막 검증에는 사람이 필요하다고 말합니다.
Sanity에 저장된 120개 문서를 조회하는 에이전트가 기록된 주장과 실제로 확인한 근거를 분리합니다. Knowledge Base의 식별자 바인딩 한계를 측정한 뒤, 정확한 필드 조회는 GROQ로 라우팅하고 검색 실패와 불확실성을 답변에 남깁니다.