메모리 비용 관점에서의 Proxy 객체와 공유 프로토타입 비교2026.07.14메모리 비용 관점에서의 Proxy 객체와 공유 프로토타입 비교Javascript#dsl#proxy#tanstack+2 more categories or tags2026.07.14메모리 비용 관점에서의 Proxy 객체와 공유 프로토타입 비교Javascript#dsl#proxy#tanstack+2 more categories or tags예전에 Proxy를 이용해 브라켓 문법을 DSL로 확장하는 실험을 한 적이 있다. obj[WHERE](predicate)[VALUES]()처럼, 자바스크립트의 기본 문법은 그대로 두되 그 해석만 바꿔 작은 쿼리 엔진처럼 동작하게 만드는 글이었다. 그때는 "문법은 고정되어 있지만 해석은…
Dialog.Root는 정말 번들 크기를 키울까?2026.07.09Dialog.Root는 정말 번들 크기를 키울까?ReactNext.js#performance#component+3 more categories or tags2026.07.09Dialog.Root는 정말 번들 크기를 키울까?ReactNext.js#performance#component+3 more categories or tagsDialog.Root 같은 API를 볼 때마다 약간 궁금했다. 이거, 번들 크기에는 괜찮을까? 겉으로 보기에는 별문제 없어 보인다. Dialog.Root, Dialog.Trigger, Dialog.Content처럼 이름이 잘 묶여 있고, 사용하는 쪽에서도 읽기 쉽다. React 컴포넌트…
OpenCodeReview를 Ollama Cloud와 같이 쓰기2026.07.07OpenCodeReview를 Ollama Cloud와 같이 쓰기Agentic Coding유용한 도구들#ollama#ai-agent+2 more categories or tags2026.07.07OpenCodeReview를 Ollama Cloud와 같이 쓰기Agentic Coding유용한 도구들#ollama#ai-agent+2 more categories or tagsAI 코드 리뷰 도구는 이제 너무 많다. Claude Code에게 “현재 변경사항 리뷰해줘”라고 말할 수도 있고, Codex나 Cursor에서도 비슷한 일을 시킬 수 있다. 문제는 그 다음이다. 리뷰라는 작업은 생각보다 귀찮게 정확해야 한다. 어떤 파일을 봐야 하는지, 어느 라인에 코멘…
Next.js에서 Active NavLink 컴포넌트 만들기2026.07.05Next.js에서 Active NavLink 컴포넌트 만들기ReactNext.js번역#navigation+4 more categories or tags2026.07.05Next.js에서 Active NavLink 컴포넌트 만들기ReactNext.js번역#navigation+4 more categories or tags이 포스트는 Vercel의 Next.js 팀 소속 개발자 Aurora Scharff가 자신의 블로그에 올린 Building an Active NavLink Component in Next.js 게시글을 번역한 것이다. 번역 과정에서 약간의 의역이 있고, 일부에는 내 의견도 섞여 있다.…
Fragment는 빈 태그가 아니었다2026.06.30Fragment는 빈 태그가 아니었다React#readability#frontend2026.06.30Fragment는 빈 태그가 아니었다React#readability#frontend리액트에서 리스트를 렌더링하다 보면 손이 먼저 움직이는 순간이 있다. 한 아이템에서 여러 요소를 반환해야 하니 일단 <>...</>로 감싼다. items.map((item) => ( <> <span>{item.title}</span> <span>{item.description}</spa…
Zustand 미들웨어를 읽는 순서로 돌려놓기2026.06.22Zustand 미들웨어를 읽는 순서로 돌려놓기TypescriptReact유용한 도구들#readability+3 more categories or tags2026.06.22Zustand 미들웨어를 읽는 순서로 돌려놓기TypescriptReact유용한 도구들#readability+3 more categories or tagsZustand로 스토어를 만들다 보면 처음에는 코드가 꽤 단정해 보인다. 상태 타입을 만들고, create()에 생성 함수를 넘기고, 필요한 미들웨어를 하나씩 감싸면 된다. persist를 붙이면 새로고침 뒤에도 값이 남고, devtools를 붙이면 Redux DevTools에서 변경을…
ESLint와 AGENTS.md로 AI 협업 경계 세우기2026.06.19ESLint와 AGENTS.md로 AI 협업 경계 세우기Agentic Coding#agentsmd#ai-agent#frontend+1 more categories or tags2026.06.19ESLint와 AGENTS.md로 AI 협업 경계 세우기Agentic Coding#agentsmd#ai-agent#frontend+1 more categories or tags처음에는 단순히 ESLint를 설정하는 과제라고 생각했다. 프론트엔드 프로젝트에서 ESLint와 Prettier를 붙이고, Husky와 lint-staged를 연결하고, 커밋 전에 어느 정도 코드 품질을 확인하게 만드는 일. 익숙한 일까지는 아니어도, 적어도 낯선 일은 아니라고 생각했다…
기존 API 앞에 MCP 서버 세우기2026.06.14기존 API 앞에 MCP 서버 세우기Agentic Coding#opencode#mcp2026.06.14기존 API 앞에 MCP 서버 세우기Agentic Coding#opencode#mcpAI 에이전트에게 API 문서를 건네는 것과 도구를 건네는 것은 다르다. 사람은 문서를 읽고 endpoint를 고르고, 필요한 header와 body를 맞춰서 요청을 만든다. 모델도 어느 정도는 그렇게 할 수 있지만, 매번 그렇게 시키면 작업이 API 사용법 설명으로 흘러간다. 자동화를…
Promise Resolution Procedure2026.06.11Promise Resolution ProcedureJavascript2026.06.11Promise Resolution ProcedureJavascriptasync function에서 Promise를 반환하면 조금 이상한 일이 일어난다. 아래의 코드를 보면 async function은 원래 Promise를 반환하고, 그 안에서 다시 Promise.resolve(1)을 반환했으니 결과가 Promise<Promise<number>>처럼 남아…
:empty로 비어 있는 wrapper 다루기2026.06.10:empty로 비어 있는 wrapper 다루기CSS#tailwindcss#frontend#styling2026.06.10:empty로 비어 있는 wrapper 다루기CSS#tailwindcss#frontend#stylingUI를 만들다 보면 내용은 없는데 wrapper만 남는 경우가 있다. 카드의 보조 설명 영역, 필터 결과 안내 영역, 혹은 children을 받아서 그리는 작은 레이아웃 컴포넌트가 그렇다. 실제로 보여줄 내용은 없는데 padding이나 border가 적용된 부모 요소만 화면에 남으면,…
AI 에이전트의 비밀값을 macOS Keychain에 맡기기2026.06.07AI 에이전트의 비밀값을 macOS Keychain에 맡기기Agentic Coding2026.06.07AI 에이전트의 비밀값을 macOS Keychain에 맡기기Agentic CodingAI 에이전트나 스킬을 만들다보면 비밀값을 어떻게 관리하면 좋을지 하는 생각을 자주 하게 된다. API를 호출하려면 API Key가 필요하고, 특정 기능을 자동화하는 과정에서 아이디와 비밀번호가 필요할 수도 있다. 그런데 그 값을 프롬프트에 박아버리면 대화 기록에 남고, 명령어 인자로…
React Server Components를 위한 컴포넌트 아키텍처2026.06.01React Server Components를 위한 컴포넌트 아키텍처ReactNext.js번역#suspense+2 more categories or tags2026.06.01React Server Components를 위한 컴포넌트 아키텍처ReactNext.js번역#suspense+2 more categories or tags이 포스트는 Vercel의 Next.js 팀 소속 개발자 Aurora Scharff가 자신의 블로그에 올린 Component Architecture for React Server Components 게시글을 번역한 것이다. 번역하는 과정에서 다소 의역이 있을 수 있으며, 일부 번역에는…
차트는 멈췄는데 윈도우가 움직인다2026.05.26차트는 멈췄는데 윈도우가 움직인다TypescriptReactError Case#debugging+1 more categories or tags2026.05.26차트는 멈췄는데 윈도우가 움직인다TypescriptReactError Case#debugging+1 more categories or tags상황 어느날 서비스를 살펴보시던 팀장님께서 이런 말씀을 slack에 남기셨다. 진호님, 예측 차트에서 zoom을 계속하면 어느 순간 라인 차트가 아니라 단일 스캐터 차트처럼 보이는 데, 이거 수정하면 좋을 거 같아요. 어느정도 zoom을 하면 그 이후로는 zoom이 안 되도록 할 수 없…
store와 state가 함께 만드는 상태 미들웨어 파이프라인2026.05.11store와 state가 함께 만드는 상태 미들웨어 파이프라인ilokesto#store#state2026.05.11store와 state가 함께 만드는 상태 미들웨어 파이프라인ilokesto#store#state상태 관리 코어를 작게 유지하려고 하면 곧바로 한 가지 질문을 만나게 된다. 상태를 읽고, 바꾸고, 구독하게 해주는 것만으로 충분한가. 처음에는 충분해 보인다. 하지만 실제 애플리케이션으로 들어가면 업데이트를 기록하고 싶고, 잘못된 값은 막고 싶고, 들어온 값을 정규화하고 싶고, 상태가…
프레임워크 밖의 상태를 UI 안으로 들이는 법2026.05.10프레임워크 밖의 상태를 UI 안으로 들이는 법ilokesto#store2026.05.10프레임워크 밖의 상태를 UI 안으로 들이는 법ilokesto#store외부 상태는 프레임워크 내부에서 만들어진 상태가 아니다. React의 useState, Vue의 ref, Svelte의 $state, Solid의 createSignal처럼 프레임워크가 직접 소유하고 추적하는 값이 아니라, 프레임워크 바깥에서 먼저 존재하고 바깥에서 변하는 값이다. We…
작은 Store 클래스가 상태 관리의 출발점이 되는 이유2026.05.10작은 Store 클래스가 상태 관리의 출발점이 되는 이유ilokesto#store2026.05.10작은 Store 클래스가 상태 관리의 출발점이 되는 이유ilokesto#store상태 관리 라이브러리를 볼 때 먼저 눈에 들어오는 것은 보통 기능 목록이다. selector가 있는지, devtools와 연결되는지, persistence를 지원하는지, React 훅이 준비되어 있는지 같은 것들 말이다. 그런데 @ilokesto/store의 Store 클래스를 보면 질…
TanStack Router 파일 기반 라우팅과 타입 안전하게 React 구조 잡기2026.05.09TanStack Router 파일 기반 라우팅과 타입 안전하게 React 구조 잡기유용한 도구들2026.05.09TanStack Router 파일 기반 라우팅과 타입 안전하게 React 구조 잡기유용한 도구들React 앱의 라우팅은 처음에는 별일 아닌 것처럼 보인다. /about으로 가면 About 화면을 보여주고, /posts/1로 가면 1번 글을 보여주면 된다. 문제는 앱이 조금만 커져도 URL이 더 이상 주소표시줄의 문자열로만 남아 있지 않다는 데 있다. URL은 권한의 경계가 되고,…
Changesets 실무 운영 가이드: 내부 의존성, prerelease, 운영 Q&A2026.05.05Changesets 실무 운영 가이드: 내부 의존성, prerelease, 운영 Q&A유용한 도구들#changesets#monorepo2026.05.05Changesets 실무 운영 가이드: 내부 의존성, prerelease, 운영 Q&A유용한 도구들#changesets#monorepo이 글은 Changesets로 모노레포 릴리즈를 관리하는 시리즈의 3편이다. 1편에서는 changeset 파일을 작성하는 방법을, 2편에서는 GitHub Actions로 Version Packages PR과 publish를 자동화하는 흐름을 다뤘다. 이번 글에서는 실제 운영 중 자주 헷…
Changesets와 GitHub Actions로 릴리즈 자동화하기2026.05.05Changesets와 GitHub Actions로 릴리즈 자동화하기유용한 도구들#changesets#monorepo2026.05.05Changesets와 GitHub Actions로 릴리즈 자동화하기유용한 도구들#changesets#monorepo이 글은 Changesets로 모노레포 릴리즈를 관리하는 시리즈의 2편이다. 1편에서 changeset 파일로 변경 의도를 기록했다면, 이번 글에서는 그 파일을 기준으로 GitHub Actions가 Version Packages PR을 만들고 publish까지 이어지는 흐름을 다룬다.…
Changesets로 모노레포 버전 관리 시작하기2026.05.05Changesets로 모노레포 버전 관리 시작하기유용한 도구들#changesets#monorepo2026.05.05Changesets로 모노레포 버전 관리 시작하기유용한 도구들#changesets#monorepo이 글은 Changesets로 모노레포 릴리즈를 관리하는 시리즈의 1편이다. 여기서는 Changesets를 왜 도입하는지, 어떤 파일을 남기는지, PR 단계에서 semver 판단을 어떻게 기록하는지에 집중한다. 1편: Changesets로 모노레포 버전 관리 시작하기 2편: Change…