<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title><![CDATA[kyu-log]]></title>
        <description><![CDATA[kyu-log]]></description>
        <link>https://www.kyu-log.com</link>
        <generator>RSS for Node</generator>
        <lastBuildDate>Sun, 25 Oct 2026 12:50:32 GMT</lastBuildDate>
        <atom:link href="https://www.kyu-log.com/feed.xml" rel="self" type="application/rss+xml"/>
        <language><![CDATA[ko]]></language>
        <ttl>1440</ttl>
        <item>
            <title><![CDATA[성급한 추상화를 피해보자]]></title>
            <description><![CDATA[aha-programming 을 통해서 성급한 추상화를 피하는 방법에 대해서 배워봅니다. DRY, WET 과 같은 소프트웨어 공학 법칙과 같은 원칙을 명목적으로 따르다보면 생기는 문제점들을 다룹니다.]]></description>
            <link>https://www.kyu-log.com/aha-programming</link>
            <guid isPermaLink="true">https://www.kyu-log.com/aha-programming</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=3ec68e26-5a7c-80f2-8a4f-eb79927752e0" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[몇 픽셀을 갖고 싸운다? : 접근성에도 법이 있다 - WCAG]]></title>
            <description><![CDATA[오픈 소스 이슈에서 시작된 접근성 논쟁을 따라가며 WCAG를 정리합니다. A / AA / AAA는 버전이 아니라 등급이라는 점, 버전과 등급이 따로 논다는 점, SC 번호 읽는 법까지 실제 이슈에 적용해 보며 확인합니다.]]></description>
            <link>https://www.kyu-log.com/web-content-accessibility-guidelines</link>
            <guid isPermaLink="true">https://www.kyu-log.com/web-content-accessibility-guidelines</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=3d268e26-5a7c-8019-8d65-c0d7ab5455ce" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[접근성 트리: 브라우저는 DOM 옆에 하나를 더 만든다]]></title>
            <description><![CDATA[DOM에 선언한 ARIA 속성이 실제 접근성 트리에 어떻게 반영되는지, combobox와 aria-multiline 충돌을 수정한 오픈소스 기여 사례로 살펴봅니다.]]></description>
            <link>https://www.kyu-log.com/accessibility-tree-aria-multiline</link>
            <guid isPermaLink="true">https://www.kyu-log.com/accessibility-tree-aria-multiline</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=3d768e26-5a7c-8071-a874-e12b6cc4c512" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[잘게 쪼갤수록 좋다는 착각에서 벗어나기 - "모듈성은 받아들이되, 세분도를 조심하라"]]></title>
            <description><![CDATA[잘게 쪼갤수록 좋다는 통념을 세분도(granularity) 관점에서 다시 봅니다. Atomic Design이 끝까지 지켜지지 않는 이유, 수정할 이유가 하나인데 파일이 둘인 상황을 짚고, 좋은 세분도는 크기가 아니라 경계로 정해진다는 결론에 닿습니다.]]></description>
            <link>https://www.kyu-log.com/modularity-with-fined-granularity</link>
            <guid isPermaLink="true">https://www.kyu-log.com/modularity-with-fined-granularity</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=39868e26-5a7c-8055-a1aa-fd6b4b1719d2" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Suspense Query - 선언성을 대가로 지불하는 Suspend 상태]]></title>
            <description><![CDATA[useSuspenseQuery는 코드를 선언적으로 만들지만, suspend는 결국 throw입니다. 받아 줄 경계가 없으면 화면이 사라집니다. 경계를 어느 깊이에 둘지, Next.js에서는 무엇이 달라지는지, 그래서 언제 쓸 만한지를 정리합니다.]]></description>
            <link>https://www.kyu-log.com/suspense-query-tradeoff</link>
            <guid isPermaLink="true">https://www.kyu-log.com/suspense-query-tradeoff</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=38168e26-5a7c-80d1-8f31-f5a0fe6cf50b" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Zod는 런타임에 어떻게 타입을 검증하는가? - (2) 직접 만든 zod 구조의 한계 ]]></title>
            <description><![CDATA[직접 만든 Zod 구조가 부딪힌 두 한계를 넘습니다. optional 키에 진짜 ?를 붙이는 key remapping, input 타입을 실어 나르는 phantom 타입을 구현하고 실제 Zod 4 소스와 대조해 봅니다.]]></description>
            <link>https://www.kyu-log.com/how-do-zod-specify-type-2</link>
            <guid isPermaLink="true">https://www.kyu-log.com/how-do-zod-specify-type-2</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=38068e26-5a7c-80f9-9513-f8b3bbb19989" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Zod는 런타임에 어떻게 타입을 검증하는가? - (1) 직접 Zod를 흉내내보며 이해해보기]]></title>
            <description><![CDATA[Zod를 직접 흉내 내며 런타임 타입 검증의 구조를 파악합니다. 조건부 타입과 infer로 스키마에서 타입을 꺼내고, 왜 타입 → 값이 아니라 값 → 타입 순서일 수밖에 없는지를 확인합니다.]]></description>
            <link>https://www.kyu-log.com/how-do-zod-specify-type-1</link>
            <guid isPermaLink="true">https://www.kyu-log.com/how-do-zod-specify-type-1</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=37c68e26-5a7c-80d7-b1c8-e6a44f1809e2" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Turbo Cache 와 Github actions/cache 로 CI 시간 -94% 단축시키기]]></title>
            <description><![CDATA[문서 한 줄짜리 PR에도 CI가 3분 걸리던 monorepo에서 죽어 있던 cache를 살린 기록입니다. Turborepo의 그래프와 해시로 판단하고 actions/cache로 보관하는 구조를 나눠 설명하고, 무효화 범위를 시나리오로 따라갑니다.]]></description>
            <link>https://www.kyu-log.com/turbo-cache-git-actions-cache</link>
            <guid isPermaLink="true">https://www.kyu-log.com/turbo-cache-git-actions-cache</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=37c68e26-5a7c-80f7-a5c2-f215811d3c4b" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Rust 학습 노트 (4) - 잠시 빌려쓰는 변수, borrow]]></title>
            <description><![CDATA[소유권을 넘기지 않고 잠시 빌려 쓰는 방법, borrow를 정리합니다. & 한 글자가 하는 일, &와 &mut 두 종류의 차이, 그리고 컴파일러가 빌림을 막아서는 순간을 예시로 따라갑니다.]]></description>
            <link>https://www.kyu-log.com/rust-study-4</link>
            <guid isPermaLink="true">https://www.kyu-log.com/rust-study-4</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=35968e26-5a7c-8028-8166-dd0acf6c1a7a" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Rust 학습 노트 (5) - 빌림 상태는 언제까지 유효한가, lifetime]]></title>
            <description><![CDATA[빌림이 가리키는 데이터가 먼저 사라지면 무슨 일이 생기는지에서 출발해 Rust의 lifetime을 정리합니다. 'a 표기가 등장하는 순간, 매번 적지 않아도 되는 이유, 그리고 'static의 의미까지 다룹니다.]]></description>
            <link>https://www.kyu-log.com/rust-study-5</link>
            <guid isPermaLink="true">https://www.kyu-log.com/rust-study-5</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=35e68e26-5a7c-803f-b383-d0563c4bab13" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Rust 학습 노트 (3) - Rust는 매 순간이 소유권 분쟁이다.]]></title>
            <description><![CDATA[let a = b; 한 줄을 Rust 컴파일러가 막아선 이유를 소유권으로 설명합니다. TypeScript에서는 일어나지 않는 일이 왜 여기서는 문제가 되는지, move가 왜 책임의 이전인지, Copy 타입은 왜 예외인지를 다룹니다.]]></description>
            <link>https://www.kyu-log.com/rust-study-3</link>
            <guid isPermaLink="true">https://www.kyu-log.com/rust-study-3</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=35668e26-5a7c-8010-8437-f81fc59885f7" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Rust 학습일지 (2) - Rust의 Compiler는 과할만큼 친절하다 ]]></title>
            <description><![CDATA[Rust 컴파일러를 까다롭다가 아니라 친절하다고 느끼게 된 과정을 정리합니다. Option<T>로 null이 새어나오지 않게 하고, Result<T, E>로 실패를 타입으로 만들고, match로 모든 경우를 강제하는 세 장치를 살펴봅니다.]]></description>
            <link>https://www.kyu-log.com/rust-study-2</link>
            <guid isPermaLink="true">https://www.kyu-log.com/rust-study-2</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=35668e26-5a7c-80e7-8646-ee3803b9c6b5" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Rust 학습일지 (1) - Rust의 정수 타입이 12개인 이유]]></title>
            <description><![CDATA[TypeScript에 익숙한 눈으로 Rust를 처음 열었을 때 드는 의문, 왜 정수 타입이 12개인가를 다룹니다. 비트 패턴은 같은데 해석이 다르다는 점, usize/isize의 정체, number 하나의 편안함이 감춰온 것을 짚습니다.]]></description>
            <link>https://www.kyu-log.com/rust-study-1</link>
            <guid isPermaLink="true">https://www.kyu-log.com/rust-study-1</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=35668e26-5a7c-80bd-a1bc-fd90dc07b5e1" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[10번 봐도 이해 안 되는 Lexical Scope 이야기]]></title>
            <description><![CDATA[JavaScript의 스코프 규칙은 lexical scoping입니다. "lexical"이라는 단어 하나에서 closure, stale closure, 메모리 누수 패턴이 파생됩니다. 어원부터 LexicalEnvironment 구조와 메모리까지 따라가 봅니다.]]></description>
            <link>https://www.kyu-log.com/lexical-scope</link>
            <guid isPermaLink="true">https://www.kyu-log.com/lexical-scope</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=34f68e26-5a7c-8046-b151-d86aa581873c" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[프론트엔드 테스트 생태계 구조]]></title>
            <description><![CDATA[Jest, Vitest, jsdom, Testing Library, MSW, Playwright가 각각 어느 레이어를 맡는지 정리합니다. Test Runner, DOM 환경, Component Rendering, Network Mocking으로 나눠 보고 실제 조합 패턴까지 살펴봅니다.]]></description>
            <link>https://www.kyu-log.com/frontend-testing-ecosystem</link>
            <guid isPermaLink="true">https://www.kyu-log.com/frontend-testing-ecosystem</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33c68e26-5a7c-809a-835f-fcc13343b2d7" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[당신의 useEffect에 이름을 붙여야 하는 이유]]></title>
            <description><![CDATA[useEffect의 첫 인자로 화살표 함수를 넘기는 것은 React 생태계의 사실상 표준입니다. 여기에 이름을 붙이면 가독성뿐 아니라 stack trace가 달라집니다. cleanup 함수 네이밍과 ESLint로 팀에 적용하는 방법까지 다룹니다.]]></description>
            <link>https://www.kyu-log.com/give-a-name-to-useEffect</link>
            <guid isPermaLink="true">https://www.kyu-log.com/give-a-name-to-useEffect</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33768e26-5a7c-80de-bfdb-fc88bcd1fb5d" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[좋은 테스트 코드, 나쁜 테스트 코드 — component, hook 편 (2)]]></title>
            <description><![CDATA[util 함수에서 세운 네 가지 테스트 원칙을 component와 hook에 적용합니다. 테스트 이름을 사용자 관점의 시나리오로 쓰는 법, 그리고 util 테스트와 무엇이 결정적으로 달랐는지를 Testing Library 코드로 정리합니다.]]></description>
            <link>https://www.kyu-log.com/good-test-bad-test-2</link>
            <guid isPermaLink="true">https://www.kyu-log.com/good-test-bad-test-2</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33368e26-5a7c-804c-aa46-dd6283ac245f" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[가치 사슬의 역전 : 개발자 ]]></title>
            <description><![CDATA[개발자가 코드를 작성하고 테스트로 검증하던 순서가 뒤집히고 있습니다. AI가 코드를 쓰는 시대에 테스트가 안전망이 아니라 설계도가 되는 과정을, "가치 사슬의 역전"이라는 표현에서 출발해 정리합니다.]]></description>
            <link>https://www.kyu-log.com/inversion-of-value-chain-in-development</link>
            <guid isPermaLink="true">https://www.kyu-log.com/inversion-of-value-chain-in-development</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33368e26-5a7c-8014-b9fe-d63e0f481de3" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[2025 서울대학교 디자인과 전시 사이트 외주를 회고하며]]></title>
            <description><![CDATA[서울대학교 디자인과 졸업 전시 SNU DESIGN WEEK 2025 사이트를 설계부터 배포·운영까지 담당한 외주 회고입니다. 기술 스택 선택의 이유, 개발 과정에서 만난 기술적 도전과 해결, 그리고 끝내 풀지 못한 과제까지 남깁니다.]]></description>
            <link>https://www.kyu-log.com/look-back-snud2025</link>
            <guid isPermaLink="true">https://www.kyu-log.com/look-back-snud2025</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33168e26-5a7c-8067-b234-f9d2c2643258" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[좋은 테스트 코드, 나쁜 테스트 코드 — util편 (1)]]></title>
            <description><![CDATA[좋은 테스트와 나쁜 테스트를 가르는 네 가지 원칙을 util 함수 기준으로 정리합니다. 테스트 이름을 문서처럼 쓰는 법, 구현이 아닌 동작을 검증하는 법, 독립 실행과 "실패할 수 있는 테스트"의 조건을 실제 코드로 살펴봅니다.]]></description>
            <link>https://www.kyu-log.com/good-test-bad-test-1</link>
            <guid isPermaLink="true">https://www.kyu-log.com/good-test-bad-test-1</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33368e26-5a7c-80e9-806c-d24b27ddacec" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Page Router 내의 SSR 와 SSG 심층 비교]]></title>
            <description><![CDATA[Next.js Pages Router에서 SSR과 SSG가 화면을 그리기까지의 과정을 timeline 단위로 분해합니다. getServerSideProps와 getStaticProps가 각각 어떤 순서를 밟는지, HTML이 도착하기까지 무엇이 다른지를 비교합니다.]]></description>
            <link>https://www.kyu-log.com/compare-ssr-ssg-in-page-router</link>
            <guid isPermaLink="true">https://www.kyu-log.com/compare-ssr-ssg-in-page-router</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=31368e26-5a7c-800c-af61-ffbc8019c043" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Compound Component 부터 Headless Pattern까지 - (3)]]></title>
            <description><![CDATA[Compound Component의 마지막 한계인 style 종속을 Headless 패턴으로 넘습니다. Props Getter Pattern을 구현하고 두 패턴을 결합한 최종 형태를 만든 뒤, Radix UI의 내부 설계와 대조해 봅니다. 시리즈 3편입니다.]]></description>
            <link>https://www.kyu-log.com/compound-component-to-headless-pattern-3</link>
            <guid isPermaLink="true">https://www.kyu-log.com/compound-component-to-headless-pattern-3</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33168e26-5a7c-802f-9275-fd77cf136f1e" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Compound Component 부터 Headless Pattern까지 - (2)]]></title>
            <description><![CDATA[기본 Compound Component만으로 해결되지 않는 세 가지 한계를 넘는 기법을 다룹니다. state를 바깥에서 쓰는 Render Props, layout 순서를 강제하는 Slot Pattern, 그리고 각 기법의 선택 기준을 정리합니다. 시리즈 2편입니다.]]></description>
            <link>https://www.kyu-log.com/compound-component-to-headless-pattern-2</link>
            <guid isPermaLink="true">https://www.kyu-log.com/compound-component-to-headless-pattern-2</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=32e68e26-5a7c-80e5-8094-d3751b716203" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[Compound Component 부터 Headless Pattern까지 - (1)]]></title>
            <description><![CDATA[props가 끝없이 늘어나는 component 설계 문제를 Compound Component Pattern으로 풉니다. Select를 직접 구현하고 같은 공식을 Accordion, Tabs, ToggleGroup에 적용하며 Context가 몇 개 필요한지까지 비교합니다. 시리즈 1편입니다.]]></description>
            <link>https://www.kyu-log.com/compound-component-to-headless-pattern-1</link>
            <guid isPermaLink="true">https://www.kyu-log.com/compound-component-to-headless-pattern-1</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=32e68e26-5a7c-8032-a130-d1674103081b" length="0" type="image/jpeg"/>
        </item>
        <item>
            <title><![CDATA[useEffect 범벅에서 벗어나기: 진짜 필요한 곳에만 쓰는 법]]></title>
            <description><![CDATA[class lifecycle이 그리운 진짜 이유에서 출발해, useEffect에 다 넣는 습관을 짚습니다. useEffect가 필요 없는 경우와 외부 시스템 동기화라는 진짜 용도를 나누고, 쓰기 전 확인할 checklist로 닫습니다.]]></description>
            <link>https://www.kyu-log.com/runaway-from-useEffect</link>
            <guid isPermaLink="true">https://www.kyu-log.com/runaway-from-useEffect</guid>
            <pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate>
            <enclosure url="https://www.kyu-log.com/api/social-image?id=33168e26-5a7c-809e-86a0-d4d83b3fd65a" length="0" type="image/jpeg"/>
        </item>
    </channel>
</rss>