<?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[HEROPY.DEV]]></title><description><![CDATA[웹 개발 기술을 공유하는 HEROPY.DEV 블로그입니다.]]></description><link>https://www.heropy.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 14 Mar 2026 23:01:00 GMT</lastBuildDate><atom:link href="https://www.heropy.dev/rss" rel="self" type="application/rss+xml"/><language><![CDATA[ko]]></language><item><title><![CDATA[개발자 소개 | HEROPY.DEV]]></title><description><![CDATA[안녕하세요, 박영웅입니다.]]></description><link>https://www.heropy.dev/about</link><guid isPermaLink="false">/about</guid><category><![CDATA[개발자]]></category><category><![CDATA[강사]]></category><category><![CDATA[소개]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 14 Mar 2026 23:01:00 GMT</pubDate></item><item><title><![CDATA[HEROPY.DEV 짧은 글]]></title><description><![CDATA[웹 개발 기술을 공유하는 HEROPY.DEV 기술 블로그의 짧은 글 목록입니다.]]></description><link>https://www.heropy.dev/s</link><guid isPermaLink="false">/s</guid><category><![CDATA[짧은 글]]></category><category><![CDATA[목록]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 14 Mar 2026 23:01:00 GMT</pubDate></item><item><title><![CDATA[React Hooks 핵심 정리]]></title><description><![CDATA[React에서 제공하는 모든 내장 훅(Hooks)의 사용법과 커스텀 훅 작성 방법을 살펴봅니다.]]></description><link>https://www.heropy.dev/p/revOrg</link><guid isPermaLink="false">/p/revOrg</guid><category><![CDATA[React]]></category><category><![CDATA[Hooks]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 21 Nov 2025 08:36:28 GMT</pubDate></item><item><title><![CDATA[JS Blob(블랍) 이해하기]]></title><description><![CDATA[Blob(Binary Large Object, 블랍)은 이미지, 사운드, 비디오와 같은 멀티미디어 데이터를 다룰 때 사용할 수 있습니다. 이 글에서는 Blob의 생성과 읽고 쓰는 방법들에 대해서 알아보겠습니다.]]></description><link>https://www.heropy.dev/p/QlwiuS</link><guid isPermaLink="false">/p/QlwiuS</guid><category><![CDATA[JS]]></category><category><![CDATA[Blob]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 21 Jul 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[CSS Flex 완벽 가이드]]></title><description><![CDATA[CSS Flex는 효율적인 레이아웃 설계를 위한 기술로, 컨테이너 내 항목의 공간 배분과 정렬을 유연하게 관리합니다. 이를 통해 반응형 디자인 레이아웃이 쉬워지고 복잡한 계산 없이도 요소를 원하는 대로 배치할 수 있습니다.]]></description><link>https://www.heropy.dev/p/Ha29GI</link><guid isPermaLink="false">/p/Ha29GI</guid><category><![CDATA[CSS]]></category><category><![CDATA[Flex]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 15 Nov 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[Svelte 완벽 가이드]]></title><description><![CDATA[Svelte 기본 문법을 이해했다면, 핵심 Core API를 이해하고 다양한 활용 패턴을 알아보세요!]]></description><link>https://www.heropy.dev/p/AciIGD</link><guid isPermaLink="false">/p/AciIGD</guid><category><![CDATA[Svelte]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 12 May 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Git/GitHub 설치 및 사용 가이드]]></title><description><![CDATA[버전 관리 시스템(VCS)의 개념과 Git의 기본 명령어, GitHub 원격 저장소 연동 방법을 학습합니다. 설치부터 init, add, commit, push, pull, clone까지 전체 워크플로우를 정리합니다.]]></description><link>https://www.heropy.dev/p/z9Z49c</link><guid isPermaLink="false">/p/z9Z49c</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[VCS]]></category><category><![CDATA[버전 관리]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 08 Mar 2026 07:53:58 GMT</pubDate></item><item><title><![CDATA[한눈에 보는 타입스크립트]]></title><description><![CDATA[타입스크립트는 Microsoft에서 개발하고 유지/관리하는 Apache 라이센스가 부여된 오픈 소스로, 자바스크립트에 강한 타입 시스템을 적용해 대부분의 에러를 컴파일 환경에서 코드를 입력하는 동안 체크할 수 있습니다.]]></description><link>https://www.heropy.dev/p/WhqSC8</link><guid isPermaLink="false">/p/WhqSC8</guid><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 22 Jun 2025 00:25:36 GMT</pubDate></item><item><title><![CDATA[HTML 주요 요소와 속성, 한눈에 보기]]></title><description><![CDATA[웹 개발 프로젝트에 필요한 HTML 요소(Elements)와 속성(Attributes)에 대해 간단한 개요와 설명을 통해 웹 페이지를 설계하고 구현하는 데 필요한 정보를 알아봅니다. 이를 통해 웹 표준을 준수하는 동시에, 효과적이고 의미론적(Semantic) 마크업 구조를 구현할 수 있도록 돕습니다.]]></description><link>https://www.heropy.dev/p/LWIk13</link><guid isPermaLink="false">/p/LWIk13</guid><category><![CDATA[HTML]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 15 May 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Next.js 번들 사이즈 최적화]]></title><description><![CDATA[Next.js 애플리케이션의 번들 사이즈를 최적화하는 방법을 알아봅니다. 번들 사이즈를 분석하고 코드 스플리팅, 트리 쉐이킹 등의 기법을 통해 번들 크기를 효과적으로 줄이는 방법을 설명합니다.]]></description><link>https://www.heropy.dev/p/pd8CoS</link><guid isPermaLink="false">/p/pd8CoS</guid><category><![CDATA[React]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[Bundle]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 11 Dec 2025 15:44:50 GMT</pubDate></item><item><title><![CDATA[Git 핵심 명령어 모음]]></title><description><![CDATA[버전 관리 시스템(VCS) Git에서 주로 사용하는 명령을 빠르게 정리합니다.]]></description><link>https://www.heropy.dev/p/PcUkdT</link><guid isPermaLink="false">/p/PcUkdT</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 08 Mar 2026 06:03:35 GMT</pubDate></item><item><title><![CDATA[React 핵심 패턴 with TS]]></title><description><![CDATA[React 기본 문법의 다양한 사용 패턴을 TypeScript 활용과 함께 살펴봅니다.]]></description><link>https://www.heropy.dev/p/QduRma</link><guid isPermaLink="false">/p/QduRma</guid><category><![CDATA[React]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 11 Jul 2025 23:25:04 GMT</pubDate></item><item><title><![CDATA[Auth.js(NextAuth.js) 핵심 정리]]></title><description><![CDATA[Auth.js(NextAuth.js)는 Next.js 프로젝트의 사용자 인증 및 세션 관리를 위한 라이브러리로 Google, GitHub 등의 다양한 인증 공급자를 지원하며, Next.js의 서버와 클라이언트 측 모두에서 인증 및 세션 관리를 손쉽게 처리할 수 있습니다.]]></description><link>https://www.heropy.dev/p/MI1Khc</link><guid isPermaLink="false">/p/MI1Khc</guid><category><![CDATA[React]]></category><category><![CDATA[Next.js]]></category><category><![CDATA[NextAuth.js]]></category><category><![CDATA[Auth.js]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 03 Oct 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[GA4 Query Explorer와 Google Analytics Data API 활용하기]]></title><description><![CDATA[GA4 Query Explorer와 Google Analytics Data API를 활용해, Google Analytics에서 웹사이트의 트래픽 정보를 가져오는 방법을 알아봅니다.(GA4 쿼리 익스플로러, 구글 애널리틱스 데이터 API)]]></description><link>https://www.heropy.dev/p/wc7QvJ</link><guid isPermaLink="false">/p/wc7QvJ</guid><category><![CDATA[GA4 Query Explorer]]></category><category><![CDATA[Google Analytics Data API]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[번들러와 빌드 도구의 이해]]></title><description><![CDATA[Webpack이나 Parcel, Rollup 등의 번들러(Bundler)는 현대적인 웹 개발의 필수적인 도구로, 번들러의 기본 개념, 동작 원리, 간단한 예제 등을 살펴보고, 추가로 빌드 도구의 개념과 예제도 같이 살펴봅니다.]]></description><link>https://www.heropy.dev/p/x8iedW</link><guid isPermaLink="false">/p/x8iedW</guid><category><![CDATA[Bundler]]></category><category><![CDATA[Webpack]]></category><category><![CDATA[SWC]]></category><category><![CDATA[Parcel]]></category><category><![CDATA[Vite]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 10 Dec 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[JS 클래스 핵심 패턴]]></title><description><![CDATA[자바스크립트는 객체 지향 프로그래밍에서의 프로토타입(Prototype) 기반 언어로 프로토타입 무엇인지 이해하고, ES2015부터 추가된 클래스(Class) 문법의 핵심적인 패턴을 살펴봅니다.]]></description><link>https://www.heropy.dev/p/CPE3zl</link><guid isPermaLink="false">/p/CPE3zl</guid><category><![CDATA[JS]]></category><category><![CDATA[Classes]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 07 Dec 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[React Unit/E2E 테스트 자동화 w. Vite/Next]]></title><description><![CDATA[React 프로젝트에서 Vitest와 Testing Library를 사용한 단위 테스트, MSW를 활용한 API 모킹, 그리고 Cypress를 이용한 E2E 테스트 방법을 이해합니다.]]></description><link>https://www.heropy.dev/p/Bgimsk</link><guid isPermaLink="false">/p/Bgimsk</guid><category><![CDATA[React]]></category><category><![CDATA[Vitest]]></category><category><![CDATA[Testing Library]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 11 Dec 2025 14:51:21 GMT</pubDate></item><item><title><![CDATA[SCSS/Sass 완벽 가이드]]></title><description><![CDATA[Style(CSS) 작업 시 필수가 되어버린 CSS Preprocessor(전처리기) SCSS/Sass에 대해서 이해하고, CSS로 컴파일하는 방법부터 자세한 SCSS 문법까지 살펴봅니다.]]></description><link>https://www.heropy.dev/p/Y7OrPe</link><guid isPermaLink="false">/p/Y7OrPe</guid><category><![CDATA[SCSS]]></category><category><![CDATA[Sass]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 07 Apr 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Fetch vs Axios - HTTP 데이터 통신 가이드]]></title><description><![CDATA[서버와 클라이언트 간의 데이터 통신은 웹 개발의 핵심 개념 중 하나로, 자바스크립트에서의 데이터 통신을 위한 fetch 함수와 axios 라이브러리의 사용법을 알아봅니다.]]></description><link>https://www.heropy.dev/p/QOWqjV</link><guid isPermaLink="false">/p/QOWqjV</guid><category><![CDATA[JS]]></category><category><![CDATA[Fetch]]></category><category><![CDATA[Axios]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 25 Feb 2026 01:37:08 GMT</pubDate></item><item><title><![CDATA[(초안) SvelteKit]]></title><description><![CDATA[SvelteKit은 Svelte 프레임워크로, 서버 사이드 렌더링(SSR) 기반의 빠른 빌드 속도와 간편한 라우팅 시스템을 제공하며, SEO 최적화 등 성능 향상을 위한 여러 기능을 제공합니다.]]></description><link>https://www.heropy.dev/p/QWrwz3</link><guid isPermaLink="false">/p/QWrwz3</guid><category><![CDATA[Svelte]]></category><category><![CDATA[SvelteKit]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Supabase Database, Prisma로 빠르게 시작하기 w. Next.js]]></title><description><![CDATA[오픈소스 백엔드 서비스인 Supabase의 PostgreSQL 데이터베이스와 Prisma를 사용해 Next.js 프로젝트를 빠르고 쉽게 구성하고 다루는 방법을 알아봅니다.]]></description><link>https://www.heropy.dev/p/bCffI2</link><guid isPermaLink="false">/p/bCffI2</guid><category><![CDATA[Prisma]]></category><category><![CDATA[Supabase]]></category><category><![CDATA[Next.js]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 27 Mar 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[JS Intersection Observer, 요소의 가시성 관찰]]></title><description><![CDATA[Intersection observer는 브라우저 뷰포트(Viewport)와 설정한 요소(Element)의 교차점을 관찰하며, 요소가 뷰포트에 포함되는지 포함되지 않는지, 더 쉽게는 사용자 화면에 지금 보이는 요소인지 아닌지를 구별하는 기능을 제공합니다.]]></description><link>https://www.heropy.dev/p/ydKoQO</link><guid isPermaLink="false">/p/ydKoQO</guid><category><![CDATA[JS]]></category><category><![CDATA[Intersection Observer]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[CSS Grid 완벽 가이드]]></title><description><![CDATA[CSS Grid는 2차원 레이아웃 시스템을 제공하는 CSS 기술로, 웹페이지의 요소를 행과 열로 구성된 그리드 형태로 배치할 수 있게 해줍니다. 복잡한 레이아웃도 쉽게 구현할 수 있어, 정밀한 디자인 작업에 적합합니다.]]></description><link>https://www.heropy.dev/p/c6ROLZ</link><guid isPermaLink="false">/p/c6ROLZ</guid><category><![CDATA[CSS]]></category><category><![CDATA[Grid]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 16 Nov 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[CSS before, after 선택자]]></title><description><![CDATA[CSS의 ::before와 ::after 가상 요소 선택자는 HTML의 특정 요소 안에 CSS로 내용을 추가할 수 있는 강력한 도구입니다. 이를 통해 HTML 구조를 변경하지 않고도 시각적 요소를 추가하거나 변경할 수 있어, 더욱 동적이고 세련된 웹 페이지를 만들 수 있습니다.]]></description><link>https://www.heropy.dev/p/yUnC6g</link><guid isPermaLink="false">/p/yUnC6g</guid><category><![CDATA[CSS]]></category><category><![CDATA[Before]]></category><category><![CDATA[After]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 21 Sep 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[사례로 이해하는 GitHub Flow]]></title><description><![CDATA[GitHub Flow는 GitHub을 활용하는 브랜치 전략으로, 브랜치를 어떻게 생성하고 병합하는지에 대한 개념입니다. GitHub Flow의 간단한 사용 사례를 통해 브랜치 전략을 이해해 봅시다.]]></description><link>https://www.heropy.dev/p/6hdJi6</link><guid isPermaLink="false">/p/6hdJi6</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 24 Aug 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[CSS Multi Column 완벽 가이드]]></title><description><![CDATA[CSS 다단(Multi-Column)은 요소의 내용(텍스트 등)을 신문이나 잡지처럼 여러 단으로 나누어, 보다 많은 내용을 한눈에 볼 수 있어 가독성을 높이는 레이아웃 기능입니다.]]></description><link>https://www.heropy.dev/p/NSH7aj</link><guid isPermaLink="false">/p/NSH7aj</guid><category><![CDATA[CSS]]></category><category><![CDATA[Multi Column]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 20 Jul 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[React Router 핵심 정리 (Data Mode)]]></title><description><![CDATA[React Router 라이브러리를 통해 React 애플리케이션에서 여러 페이지를 쉽게 관리하고 내비게이션을 구현할 수 있습니다. 동적 라우팅, 중첩 라우팅, 여러 방식의 내비게이션 등 다양한 기능을 지원하는 React Router의 핵심 개념과 사용법을 살펴봅니다.]]></description><link>https://www.heropy.dev/p/9tesDt</link><guid isPermaLink="false">/p/9tesDt</guid><category><![CDATA[React]]></category><category><![CDATA[React Router]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 21 Jan 2026 05:58:35 GMT</pubDate></item><item><title><![CDATA[Vue Composition API 핵심 패턴 w. 타입스크립트]]></title><description><![CDATA[Vue 3버전의 기초 문법 학습이 끝났다면, Composition API와 타입스크립트를 사용한 핵심 패턴을 빠르게 탐색해 보세요!]]></description><link>https://www.heropy.dev/p/zDWwNL</link><guid isPermaLink="false">/p/zDWwNL</guid><category><![CDATA[Vue]]></category><category><![CDATA[Composition API]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 27 Oct 2025 10:54:26 GMT</pubDate></item><item><title><![CDATA[CSS Animation 완벽 가이드]]></title><description><![CDATA[CSS Animation(애니메이션)은 여러 CSS 스타일 속성으로 요소의 크기, 색상, 모양 등을 제어해 애니메이션 효과를 부여하는 기술로 자바스크립트 없이도 요소에 동적 효과를 부여할 수 있어, 보다 좋은 성능으로 애니메이션을 구현할 수 있습니다.]]></description><link>https://www.heropy.dev/p/26YKpK</link><guid isPermaLink="false">/p/26YKpK</guid><category><![CDATA[CSS]]></category><category><![CDATA[Animation]]></category><category><![CDATA[Loader]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 11 May 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Tailwind CSS 핵심 패턴]]></title><description><![CDATA[Tailwind CSS는 별도의 CSS 파일 작성을 최소화하며 HTML 마크업 내에서 유틸리티 클래스로 스타일을 바로 적용할 수 있어 빠른 스타일링이 가능한 CSS 프레임워크로, 반응형 디자인, 다크 모드, 호버 상태 등의 기타 스타일링도 HTML 안에서 처리할 수 있습니다.]]></description><link>https://www.heropy.dev/p/E67ZHS</link><guid isPermaLink="false">/p/E67ZHS</guid><category><![CDATA[React]]></category><category><![CDATA[CSS]]></category><category><![CDATA[Tailwindcss]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 19 Mar 2025 14:34:31 GMT</pubDate></item><item><title><![CDATA[내가 보려고 작성한, 처음 맥북 세팅하기]]></title><description><![CDATA[새로운 맥북을 구입하고 처음 세팅할 때 필요한 내용을 정리했습니다. 시스템 설정부터 Homebrew, Git, NVM, 터미널 테마, 필수 앱 등의 설치와 세팅 방법을 공유합니다.]]></description><link>https://www.heropy.dev/p/XQ4pkx</link><guid isPermaLink="false">/p/XQ4pkx</guid><category><![CDATA[macOS]]></category><category><![CDATA[macbook]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 11 Jan 2025 00:00:00 GMT</pubDate></item><item><title><![CDATA[타입스크립트 유틸리티 타입(Utility Types) 자세히 보기]]></title><description><![CDATA[타입스크립트는 타입을 변환하고 조작하는 데 사용할 수 있는 다양한 내장 유틸리티 타입을 제공합니다. 이를 통해 코드의 재사용성을 높이고 더 간결하며 가독성 좋은 코드를 작성할 수 있습니다.]]></description><link>https://www.heropy.dev/p/zZIUWd</link><guid isPermaLink="false">/p/zZIUWd</guid><category><![CDATA[TypeScript]]></category><category><![CDATA[Utility Types]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 21 Jun 2025 08:36:14 GMT</pubDate></item><item><title><![CDATA[동해 망상오토캠핑리조트 워케이션 24년 12월]]></title><description><![CDATA[12월 10일(화)부터 13일(금)까지 서울경제진흥원(SBA)에서 지원하는 동해 망상오토캠핑리조트 워케이션으로 회사 동료들과 같이 다녀왔습니다.]]></description><link>https://www.heropy.dev/p/JKIAj3</link><guid isPermaLink="false">/p/JKIAj3</guid><category><![CDATA[Workation]]></category><category><![CDATA[DongHae]]></category><category><![CDATA[SBA]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 14 Dec 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Svelte 개요 및 기본 문법]]></title><description><![CDATA[Svelte는 '프레임워크가 없는 프레임워크' 혹은 '컴파일러'라고 소개하는 새로운 방식의 프레임워크로, 가상 DOM이 없고 런타임에 로드할 프레임워크가 없습니다.]]></description><link>https://www.heropy.dev/p/UKy78n</link><guid isPermaLink="false">/p/UKy78n</guid><category><![CDATA[Svelte]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 12 May 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[JSON Server 핵심 정리]]></title><description><![CDATA[JSON Server는 JSON 파일을 이용해 모의용 REST API 서버 및 DB를 구축할 수 있는 도구입니다. 이를 통해 백엔드 API 서버나 DB가 준비되지 않은 상황에서도 프로토타입을 개발하거나 테스트할 수 있습니다.]]></description><link>https://www.heropy.dev/p/zZdlXx</link><guid isPermaLink="false">/p/zZdlXx</guid><category><![CDATA[JSON]]></category><category><![CDATA[Server]]></category><category><![CDATA[DB]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 07 Sep 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Yarn 설치 및 사용법]]></title><description><![CDATA[Meta(Facebook)에서 만든 자바스크립트 패키지 매니저인 Yarn을 사용해 봅시다.]]></description><link>https://www.heropy.dev/p/ijqX9h</link><guid isPermaLink="false">/p/ijqX9h</guid><category><![CDATA[Yarn]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 25 Nov 2017 00:00:00 GMT</pubDate></item><item><title><![CDATA[이미 사용 중인 MongoDB 인스턴스 종료하기]]></title><description><![CDATA[시동 중이던 MongoDB가 비정상적으로 종료된 후 다시 MongoDB를 시동하기 위해 기존 포트를 찾아 종료하는 방법을 알아봅니다.]]></description><link>https://www.heropy.dev/p/qzeuNi</link><guid isPermaLink="false">/p/qzeuNi</guid><category><![CDATA[MongoDB]]></category><category><![CDATA[DB]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 07 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[타입스크립트 Enum 타입 자세히 보기]]></title><description><![CDATA[타입스크립트에서 타입이자 데이터로 사용할 수 있는 Enum(열거형)에 대해 자세하게 살펴봅니다. Enum의 기본적인 숫자와 문자 패턴, 그리고 활용 예제까지 정리했습니다.]]></description><link>https://www.heropy.dev/p/arpi5F</link><guid isPermaLink="false">/p/arpi5F</guid><category><![CDATA[TypeScript]]></category><category><![CDATA[Enum]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 15 Jun 2025 11:34:05 GMT</pubDate></item><item><title><![CDATA[TanStack Query(React Query) 핵심 정리]]></title><description><![CDATA[TanStack Query는 서버로부터 데이터 가져오기, 데이터 캐싱, 캐시 제어 등 데이터를 쉽고 효율적으로 관리할 수 있는 라이브러리로, React Query라는 이름으로 시작했지만, v4부터 Vue나 Svelte 등의 다른 프레임워크에서도 활용할 수 있도록 기능이 확장되며 TanStack Query라는 이름으로 변경되었습니다.]]></description><link>https://www.heropy.dev/p/HZaKIE</link><guid isPermaLink="false">/p/HZaKIE</guid><category><![CDATA[TanStack Query]]></category><category><![CDATA[React Query]]></category><category><![CDATA[React]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 08 Dec 2025 08:58:01 GMT</pubDate></item><item><title><![CDATA[Next.js 16 핵심 정리]]></title><description><![CDATA[Next.js는 Vercel에서 개발한 React 프레임워크로, 서버 사이드 렌더링(SSR), 클라이언트 사이드 렌더링(CSR), API 라우팅 등의 다양한 최적화 기능을 제공합니다. Next.js를 사용하면, React의 기본 기능을 확장해, 보다 빠르고 안정적으로 웹 애플리케이션을 개발할 수 있습니다.]]></description><link>https://www.heropy.dev/p/n7JHmI</link><guid isPermaLink="false">/p/n7JHmI</guid><category><![CDATA[React]]></category><category><![CDATA[Next.js]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 11 Dec 2025 13:49:07 GMT</pubDate></item><item><title><![CDATA[React 핵심 패턴]]></title><description><![CDATA[React 기본 문법의 다양한 사용 패턴을 살펴봅니다.]]></description><link>https://www.heropy.dev/p/OidQSe</link><guid isPermaLink="false">/p/OidQSe</guid><category><![CDATA[React]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 05 Aug 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[구글 크롬 원격 데스크톱 설치 및 사용 가이드]]></title><description><![CDATA[구글 크롬(Google Chrome) 원격 데스크톱을 통해 멘티(학생)의 화면을 멘토(강사)에게 공유하고 그 화면을 제어하는 과정을 설명합니다.]]></description><link>https://www.heropy.dev/p/XLGqke</link><guid isPermaLink="false">/p/XLGqke</guid><category><![CDATA[Remote Desktop]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 04 Nov 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[React Compiler 핵심 정리]]></title><description><![CDATA[React Compiler는 빌드 타임에 React 애플리케이션을 자동으로 최적화하는 도구로, 수동 메모이제이션 없이도 최적의 성능을 제공할 수 있습니다.]]></description><link>https://www.heropy.dev/p/IURkhb</link><guid isPermaLink="false">/p/IURkhb</guid><category><![CDATA[React]]></category><category><![CDATA[Compiler]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 01 Dec 2025 13:35:56 GMT</pubDate></item><item><title><![CDATA[Vue Router 핵심 정리]]></title><description><![CDATA[Vue Router는 Vue 공식 라우터 라이브러리로, Vue 애플리케이션의 동적/중첩 경로, 탐색 제어, HTML5/해시 모드, 스크롤 처리 등의 다양한 기능을 지원합니다. 이 글을 통해 Vue Router의 핵심적인 기능과 사용 예제를 살펴봅시다.]]></description><link>https://www.heropy.dev/p/2Hstmu</link><guid isPermaLink="false">/p/2Hstmu</guid><category><![CDATA[Vue]]></category><category><![CDATA[Vue Router]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 07 Jun 2025 08:04:33 GMT</pubDate></item><item><title><![CDATA[JS 함수 핵심 패턴]]></title><description><![CDATA[자바스크립트 함수에 대한 기본적인 사용 방법부터 관련 용어, 고급 기법 등의 관련된 다양한 함수 패턴과 여러 개념을 살펴봅니다.]]></description><link>https://www.heropy.dev/p/N6phSt</link><guid isPermaLink="false">/p/N6phSt</guid><category><![CDATA[JS]]></category><category><![CDATA[Functions]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 03 Dec 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[JS Resize Observer, 요소의 크기 변화 관찰]]></title><description><![CDATA[Resize Observer는 요소(Element)의 크기를 관찰하며, 요소의 크기가 변화할 때 실행할 최적화 콜백(callback)을 제공할 수 있습니다.]]></description><link>https://www.heropy.dev/p/0pVrDl</link><guid isPermaLink="false">/p/0pVrDl</guid><category><![CDATA[JS]]></category><category><![CDATA[Resize Observer]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[사용자 정보 API]]></title><description><![CDATA[가짜 사용자 정보(Mock Data)가 필요할 때 사용할 수 있는 REST API를 제공합니다. JSON 형식으로 사용자 정보를 조회, 생성, 수정, 삭제(CRUD / Create, Read, Update, Delete)할 수 있습니다.]]></description><link>https://www.heropy.dev/p/5PlGxB</link><guid isPermaLink="false">/p/5PlGxB</guid><category><![CDATA[API]]></category><category><![CDATA[Users]]></category><category><![CDATA[JSON]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 06 Jan 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[HTML, CSS 첫걸음]]></title><description><![CDATA[웹 개발을 시작하기 위한, HTML과 CSS의 기초를 학습합니다. 처음 시작하는 분들을 위한 최적의 가이드입니다.]]></description><link>https://www.heropy.dev/p/xCoQJR</link><guid isPermaLink="false">/p/xCoQJR</guid><category><![CDATA[HTML]]></category><category><![CDATA[CSS]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 22 Mar 2025 11:13:57 GMT</pubDate></item><item><title><![CDATA[JS 비동기 핵심 패턴]]></title><description><![CDATA[동기적으로 동작하는 코드와 비동기적으로 동작하는 코드의 차이점을 알아보고, 비동기 코드를 작성할 때 사용하는 여러 핵심 패턴을 알아봅니다.]]></description><link>https://www.heropy.dev/p/Zr4RfI</link><guid isPermaLink="false">/p/Zr4RfI</guid><category><![CDATA[JS]]></category><category><![CDATA[Async/Await]]></category><category><![CDATA[Promise]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 15 Dec 2023 00:00:00 GMT</pubDate></item><item><title><![CDATA[태백 오투리조트 워케이션 24년 12월]]></title><description><![CDATA[서울경제진흥원(SBA)에서 지원하는 24년 마지막 워케이션을 신청해서, 12월 17일(화)부터 20일(금)까지 태백 오투리조트로 다녀왔습니다.]]></description><link>https://www.heropy.dev/p/OBQx3v</link><guid isPermaLink="false">/p/OBQx3v</guid><category><![CDATA[Workation]]></category><category><![CDATA[TaeBaek]]></category><category><![CDATA[SBA]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 21 Dec 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[지연 응답 API]]></title><description><![CDATA[지연 응답이 필요할 때 사용할 수 있는 API를 제공합니다. 최대 5초까지 지연 응답이 가능합니다.]]></description><link>https://www.heropy.dev/p/71PGfA</link><guid isPermaLink="false">/p/71PGfA</guid><category><![CDATA[API]]></category><category><![CDATA[Delay]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Tue, 09 Jul 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Vue 프로젝트 시작하기 w. Vite]]></title><description><![CDATA[Vite.js 빌드 도구를 사용해 Vue 프로젝트를 시작하는 방법을 살펴보며, 자바스크립트와 타입스크립트 프로젝트에서의 구성을 구분해 설명합니다.]]></description><link>https://www.heropy.dev/p/aBLqC5</link><guid isPermaLink="false">/p/aBLqC5</guid><category><![CDATA[Vue]]></category><category><![CDATA[Vite]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 15 Sep 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Zustand 핵심 정리]]></title><description><![CDATA[Zustand(주스탠드)는 작고 빠르며 확장 가능한 React 프로젝트에서 사용하는 상태 관리(Store) 라이브러리입니다.]]></description><link>https://www.heropy.dev/p/n74Tgc</link><guid isPermaLink="false">/p/n74Tgc</guid><category><![CDATA[React]]></category><category><![CDATA[Zustand]]></category><category><![CDATA[Store]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 17 Oct 2025 13:04:21 GMT</pubDate></item><item><title><![CDATA[마크다운(MarkDown) 사용법 총정리]]></title><description><![CDATA[자바스크립트 함수에 대한 기본적인 사용 방법부터 관련 용어, 고급 기법 등의 관련된 다양한 함수 패턴과 여러 개념을 살펴봅니다.]]></description><link>https://www.heropy.dev/p/B74sNE</link><guid isPermaLink="false">/p/B74sNE</guid><category><![CDATA[Markdown]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Tue, 10 Mar 2026 13:16:05 GMT</pubDate></item><item><title><![CDATA[React 프로젝트 시작하기 w. Vite]]></title><description><![CDATA[Vite.js 빌드 도구를 사용해 React 프로젝트를 시작하는 방법을 살펴보며, 자바스크립트와 타입스크립트 프로젝트에서의 구성을 구분해 설명합니다.]]></description><link>https://www.heropy.dev/p/6iFzkB</link><guid isPermaLink="false">/p/6iFzkB</guid><category><![CDATA[React]]></category><category><![CDATA[Vite]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 08 Dec 2025 11:35:15 GMT</pubDate></item><item><title><![CDATA[React Context API 핵심 정리]]></title><description><![CDATA[React Context API는 프로젝트의 상위/하위 컴포넌트 간 데이터 공유 방식으로, 예제를 통해 개념과 사용법을 이해합니다.]]></description><link>https://www.heropy.dev/p/EdhHX2</link><guid isPermaLink="false">/p/EdhHX2</guid><category><![CDATA[React]]></category><category><![CDATA[Context API]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 09 Nov 2025 02:09:32 GMT</pubDate></item><item><title><![CDATA[양양 쏠비치 워케이션 24년 12월]]></title><description><![CDATA[서울 소재 중소기업에 재직 중이라면 서울경제진흥원(SBA)에서 지원하는 워케이션을 신청할 수 있습니다. 근로의욕 제고와 기업의 새로운 복지 제공을 목적으로 하고 있는데, 저렴한 비용으로 각 지역의 질 좋은 숙소와 공유 오피스를 이용할 수 있습니다. 색다른 장소에서 일하고 퇴근 후 바로 여행 온 것처럼 즐길 수 있습니다.]]></description><link>https://www.heropy.dev/p/eU4fA8</link><guid isPermaLink="false">/p/eU4fA8</guid><category><![CDATA[Workation]]></category><category><![CDATA[Yangyang]]></category><category><![CDATA[SBA]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 07 Dec 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Zod 핵심 정리 - 런타임 타입 검증 with 타입스크립트]]></title><description><![CDATA[타입스크립트는 컴파일 단계에서 강력한 타입 검사를 제공하지만, 런타임 단계에서의 타입 안전성까지 보장하지는 못합니다. Zod는 런타임에서 데이터의 유효성을 검증하는 라이브러리로 타입스크립트의 컴파일 타입 검사와 함께 사용하면 더욱 강력한 타입 안전성을 보장할 수 있습니다.]]></description><link>https://www.heropy.dev/p/mJAAl7</link><guid isPermaLink="false">/p/mJAAl7</guid><category><![CDATA[Zod]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 29 Aug 2025 00:22:30 GMT</pubDate></item><item><title><![CDATA[HTML IMG의 srcset과 sizes 속성]]></title><description><![CDATA[일반적으로 반응형 웹에서 이미지를 지원하기 위해 '미디어쿼리'라고 부르는 CSS Media Rule(`@media`)을 사용할 수 있으며, 반응형 이미지를 처리하기 위해 뷰포트(Viewport)의 크기부터 사용자 화면의 해상도 등 많은 환경을 고려해야 하지만, 우리는 HTML IMG의 `srcset`과 `sizes`를 통해 쉽게는 이미지의 크기를 설정하는 것만으로 대부분의 고려 사항을 사용자 브라우저에 맡길 수 있습니다.]]></description><link>https://www.heropy.dev/p/5Gl8hX</link><guid isPermaLink="false">/p/5Gl8hX</guid><category><![CDATA[HTML]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 15 May 2024 00:00:00 GMT</pubDate></item><item><title><![CDATA[Node.js(NPM) 설치 및 NVM 버전 관리 가이드]]></title><description><![CDATA[Node.js와 NPM을 설치하는 방법을 알아봅니다. 공식 설치 프로그램이나 NVM를 활용한 설치와 버전 관리 방법을 자세하게 알아봅니다.]]></description><link>https://www.heropy.dev/p/bVoDlS</link><guid isPermaLink="false">/p/bVoDlS</guid><category><![CDATA[Node.js]]></category><category><![CDATA[NPM]]></category><category><![CDATA[NVM]]></category><category><![CDATA[NVM-Windows]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 05 Mar 2026 08:34:41 GMT</pubDate></item><item><title><![CDATA[Pinia 핵심 정리]]></title><description><![CDATA[Pinia는 Vue Composition API와 TypeScript에 최적화된 간단하고 유연한 상태 관리 라이브러리입니다. 스토어의 상태, 게터, 액션뿐만 아니라 $patch, $subscribe 같은 유용한 인스턴스 멤버의 활용법도 같이 살펴봅니다.]]></description><link>https://www.heropy.dev/p/bdPf3j</link><guid isPermaLink="false">/p/bdPf3j</guid><category><![CDATA[Vue]]></category><category><![CDATA[Pinia]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Tue, 03 Jun 2025 10:54:59 GMT</pubDate></item><item><title><![CDATA[Create React App(CRA) 공식 지원 중단]]></title><description><![CDATA[2025년 2월 14일부터 Create React App(CRA)의 새로운 앱 생성이 공식적으로 폐기되었습니다.
이전에 CRA에 최신 프레임워크와 빌드 도구를 도입하자는 의견이 있었지만, CRA 측은 React 앱을 시작하기 위한 최소한의 도구로 유지하고 필요한 경우에는 별도의 최신 도구 사용을 권장한다고 했었습니다. 
하지만 이번에는 아예 공식적으로 폐기가 결정되었습니다.
따라서 CRA는 더 이상 신규 프로젝트에 적합하지 않으며, Next.js, React Router 등의 다른 프레임워크나 최신 빌드 도구로 개발하는 것을 권장합니다.

2016년 출시 당시 CRA는 React 프로젝트를 쉽게 시작하면서도 프로덕션 요구사항을 해결할 수 있는 좋은 방법이었습니다.
하지만 현재는 CRA의 고성능 프로덕션 앱 개발의 한계, 유지보수 담당자의 부재, 그리고 Next.js, React Router 등 다른 프레임워크가 CRA의 여러 문제들을 이미 해결한 상황으로 인해 더 이상 CRA를 사용할 필요성이 크게 줄어들었습니다.

그래서 이제 CRA는 유지보수 모드로 전환되며, React 19 지원 버전은 출시되었으나 신규 설치 시 경고 메시지를 표시해 더 이상 사용하지 않도록 권장합니다.

![create-react-app is deprecated.](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/77/XBDF "--557x117")

이제 새로운 앱은 Next.js, React Router, Expo 같은 프레임워크를 사용해 개발하고, 기존 앱의 경우 프레임워크로 이전하거나 Vite 등의 최신 빌드 도구로의 전환을 권장합니다.

- [React 프로젝트 시작하기 w. Vite](https://www.heropy.dev/p/6iFzkB)
- [React Router 핵심 정리](https://www.heropy.dev/p/9tesDt)
- [Next.js 15 핵심 정리](https://www.heropy.dev/p/n7JHmI)
]]></description><link>https://www.heropy.dev/s/77</link><guid isPermaLink="false">/s/77</guid><category><![CDATA[React]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 07 Mar 2025 00:50:00 GMT</pubDate></item><item><title><![CDATA[🚨 React(Next.js) 서버 컴포넌트 보안 취약점 긴급 업데이트 권고]]></title><description><![CDATA[React Server Components(RSC)와 관련된 심각한 보안 취약점이 발견되어, 관련 보안 패치가 권고되었습니다!

- [CVE-2025-55182](https://nvd.nist.gov/vuln/detail/CVE-2025-55182)
- [CVE-2025-55183](https://www.cve.org/CVERecord?id=CVE-2025-55183)
- [CVE-2025-55184](https://www.cve.org/CVERecord?id=CVE-2025-55184)
- [CVE-2025-66478](https://nvd.nist.gov/vuln/detail/CVE-2025-66478)
- [CVE-2025-67779](https://www.cve.org/CVERecord?id=CVE-2025-67779)

해당 취약점들은 사전 인증 원격 코드 실행(Pre-Authentication Remote Code Execution, RCE) 공격으로 이어질 수 있는 위험성을 내포하고 있으므로, 영향을 받는 버전의 모든 개발 프로젝트는 심각한 보안 사고 예방을 위해 아래의 즉시 해결 버전으로 업데이트해야 ㅎㅂ니다.

<div class="table-wrap">
<table>
  <thead>
    <tr>
      <th>제품명</th>
      <th>영향받는 버전</th>
      <th>해결 버전</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td rowspan="3">
        react-server-dom-parcel<br/>
        react-server-dom-webpack<br/>
        react-server-dom-turbopack
      </td>
      <td>19.0</td>
      <td>19.0.3</td>
    </tr>
    <tr>
      <td>19.1.0 ~ 19.1.1</td>
      <td>19.1.4</td>
    </tr>
    <tr>
      <td>19.2.0</td>
      <td>19.2.3</td>
    </tr>
    <tr>
      <td rowspan="8">next</td>
      <td>14.x, >=13.3</td>
      <td>14.2.35</td>
    </tr>
    <tr>
      <td>15.0.x</td>
      <td>15.0.7</td>
    </tr>
    <tr>
      <td>15.1.x</td>
      <td>15.1.11</td>
    </tr>
    <tr>
      <td>15.2.x</td>
      <td>15.2.8</td>
    </tr>
    <tr>
      <td>15.3.x</td>
      <td>15.3.8</td>
    </tr>
    <tr>
      <td>15.4.x</td>
      <td>15.4.10</td>
    </tr>
    <tr>
      <td>15.5.x</td>
      <td>15.5.9</td>
    </tr>
    <tr>
      <td>16.0.x</td>
      <td>16.0.10</td>
    </tr>
  </tbody>
</table>
</div>

```bash --caption=React 관련 패키지 업데이트
npm update react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
```

```bash --caption=Next.js 업데이트
npm i next@latest
# 또는
npx fix-react2shell-next
```

- [Denial of Service and Source Code Exposure in React Server Components](https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components)
- [Next.js Security Update: December 11, 2025](https://nextjs.org/blog/security-update-2025-12-11)]]></description><link>https://www.heropy.dev/s/86</link><guid isPermaLink="false">/s/86</guid><category><![CDATA[React]]></category><category><![CDATA[Next]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 15 Dec 2025 07:04:56 GMT</pubDate></item><item><title><![CDATA[TanStack Vue Query의 useQuery를 활용한 영화 정보 검색 및 목록 출력 예제]]></title><description><![CDATA[Vue에서 TanStack Query를 사용할 때 반환 데이터를 반응형으로 처리하려면, `useQuery` 함수의 옵션으로 계산된 데이터 참조(ComputedRef)를 전달합니다.
그러면 쿼리 키(`queryKey`)나 활성화(`enabled`) 같은 쿼리 옵션의 반응성도 감지됩니다.

```vue --line-active=16,33,39
<script setup lang="ts">
import { ref, computed } from 'vue'
import { useQuery, useQueryClient } from '@tanstack/vue-query'
import type { UseQueryOptions } from '@tanstack/vue-query'

type Movies = Movie[]
interface Movie {
  imdbID: string
  Title: string
  Poster: string
  Year: string
}

const inputText = ref('') // input 요소와 연결해 지속적으로 변경
const searchText = ref('') // 검색할 때만 변경
const queryOptions = computed(() => {
  return {
    queryKey: ['movies', searchText.value],
    queryFn: async () => {
      const res = await fetch(`https://omdbapi.com?apikey=7035c60c&s=${searchText.value}`)
      const { Search: movies = [] } = await res.json()
      return movies as Movies
    },
    staleTime: 1000 * 60 * 60, // 1시간 캐시
    placeholderData: prev => prev, // 이전 데이터를 대기 데이터로 사용(깜빡임 방지)
    enabled: !!searchText.value // 검색어가 없으면 실행하지 않음
  } satisfies UseQueryOptions<Movies>
})
console.log(queryOptions) // ComputedRef
console.log(queryOptions.value) // 쿼리 옵션 값

const queryClient = useQueryClient()
const { data, isFetching } = useQuery<Movie[]>(queryOptions) // ComputedRef 객체를 전달

async function fetchMovies() {
  searchText.value = inputText.value // 입력된 문자를 검색어로 반영
  if (!searchText.value.trim()) return
  // fetchQuery는 캐시된 데이터를 사용하거나 없으면 새 데이터를 가져옴!
  await queryClient.fetchQuery(queryOptions) // ComputedRef 객체를 전달
}
</script>

<template>
  <div>
    <input
      v-model="inputText"
      @keydown.enter="fetchMovies" />
    <button @click="fetchMovies">검색</button>
  </div>
  {{ isFetching ? '로딩중...' : '' }}
  <ul>
    <li
      v-for="movie in data"
      :key="movie.imdbID">
      {{ movie.Title }} ({{ movie.Year }})
    </li>
  </ul>
  <RouterView />
</template>
```]]></description><link>https://www.heropy.dev/s/83</link><guid isPermaLink="false">/s/83</guid><category><![CDATA[Vue]]></category><category><![CDATA[TanStack Query]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 05 Jul 2025 05:46:04 GMT</pubDate></item><item><title><![CDATA[서울경제진흥원(SBA) 워케이션 지원 사업 3월 종료]]></title><description><![CDATA[서울경제진흥원(SBA)에서 지원하는 서울 소재 중소기업 재직자 워케이션 사업이 25년 2월까지만 운영하고 3월부터는 종료한다고 해요.
현재는 부안, 속초, 부산, 제주 중에 선택할 수 있습니다.
[퇴근만큼즐거운출근](https://worcation.sba.kr/)의 메인 페이지에 뜨는 팝업 중 선택해서 신청할 수 있습니다.
저는 마지막으로 2월 초에 다녀오는 제주 워케이션을 신청했습니다.
사업 종료 전에 꼭 신청해서 다녀오세요!

![s1.jpg](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/67/_QLf "--399x501")

2024년 워케이션~🏖️

- [양양 쏠비치 워케이션 24년 12월](https://www.heropy.dev/p/eU4fA8)
- [동해 망상오토캠핑리조트 워케이션 24년 12월](https://www.heropy.dev/p/JKIAj3)
- [태백 오투리조트 워케이션 24년 12월](https://www.heropy.dev/p/OBQx3v)]]></description><link>https://www.heropy.dev/s/67</link><guid isPermaLink="false">/s/67</guid><category><![CDATA[Workation]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 30 Jan 2025 22:26:27 GMT</pubDate></item><item><title><![CDATA[크롬 개발자 도구 콘솔에서 붙여넣기 안 될 때]]></title><description><![CDATA[크롬 개발자 도구의 콘솔에서 복사한 텍스트를 붙여 넣으려 할 때, 경고 메시지가 표시되면서 붙여넣기가 되지 않을 수 있습니다.
이런 경우 콘솔에 `붙여넣기 허용` 또는 `allow pasting`을 입력하면 정상적으로 붙여넣기를 할 수 있습니다.

![붙여넣기 허용 입력](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/50/A-Gq "--599x235")]]></description><link>https://www.heropy.dev/s/50</link><guid isPermaLink="false">/s/50</guid><category><![CDATA[DevTools]]></category><category><![CDATA[Chrome]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 15 Jan 2025 08:23:52 GMT</pubDate></item><item><title><![CDATA[CodeMirror에서 기본 바인딩 키와 사용자 지정 키 조합하기]]></title><description><![CDATA[[CodeMirror](https://codemirror.net/)를 사용하다 보면 `Backspace`나 `Enter` 같은 기본 키를 눌렀을 때 텍스트 삭제나 줄 바꿈 같은 기본 동작 외에 추가적인 사용자 지정 동작을 실행해야 하는 경우가 있습니다.
하지만 CodeMirror는 [`standardKeymap`](https://codemirror.net/docs/ref/#commands.standardKeymap), [`defaultKeymap`](https://codemirror.net/docs/ref/#commands.defaultKeymap) 같은 기본 키맵이 우선하기 때문에 일반적인 `keymap.of`로 바인딩하면 사용자 지정 동작(함수)을 실행할 수 없습니다.
이때 `Prec`(Precedence) 모듈의 `highest` 메소드를 통해 사용자 지정 키맵이 기본 키맵보다 더 우선 동작하게 할 수 있습니다.

```ts --line-active=8
import { EditorView } from 'codemirror'
import { keymap } from '@codemirror/view'
import { Prec } from '@codemirror/state'

new EditorView({
  // ...
  extensions: [
    Prec.highest(
      keymap.of([
        {
          key: 'Backspace',
          run: () => {
            console.log('Backspace key!')
            return false // 다음 동작으로 넘어가 텍스트를 삭제할 수 있습니다.
          }
        },
        {
          key: 'Enter',
          run: () => {
            console.log('Enter key!')
            return true // 다음 동작으로 넘어가지 않아 줄 바꿈되지 않습니다.
          }
        }
      ])
    )
  ]
})
```

만약 각 키맵의 `run` 함수에서 `true`를 반환하면 다음 동작으로 넘어가지 않아 기본 키맵을 비활성화할 수 있습니다.
반면에 `false`를 반환하면 다음 동작으로 넘어가 기본 키맵과 조합해서 사용할 수 있습니다.

]]></description><link>https://www.heropy.dev/s/76</link><guid isPermaLink="false">/s/76</guid><category><![CDATA[Library]]></category><category><![CDATA[CodeMirror]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 02 Mar 2025 08:07:24 GMT</pubDate></item><item><title><![CDATA[2025 디자인역량강화 멘토링(온라인) 신청 / 한국디자인진흥원]]></title><description><![CDATA[![2025 디자인역량강화 1대1 멘토링 포스터](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/84/FXUe "--2480x3508")

![2025 디자인역량강화 멘토진](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/84/4Ume "--1172x1317")

누구나 참여할 수 있는 디자인 멘토링!
"나와 나의 다음 여정을 찾아가는 시간, 진로와 커리어를 함께 고민하는 순간 NAVER• HYBE 삼성전자• LIXIL • Phoenix Design 등 국내외 다양한 디자인 직무에서 활약 중인 현직 디자이너 멘토들과의 1:1 온라인 멘토링!
진로 • 취업 • 포트폴리오 등 당신의 고민을 함께 나눠보세요.

- 다회 / 중복 참여 선택 가능 
- 선착순 50건 (신청 수 기준, 인원 수 무관)
  - 예) 1인당 2회 이상 신청 시, 약 25명 내외 진행

__신청 기간__

2025.11.16(일) 자정까지 신청 순서대로 희망 멘토링으로 배정 가능성이 높아집니다. 
제출 서류 (택1): 포트폴리오, CV, 자기소개서, 사전 질문 등 자유 양식

__배정 일정 안내__

2025.11.17(월) 부터 신청 순서대로 순차적으로 개별 안내(이메일)됩니다.

__멘토링 진행 기간__

2025.11.18(화) ~ 11.28(금) / 오전 10시 ~ 오후 18시
비대면(ZOOM) 1:1 멘토링 / 1인당 약 20분
오프라인 멘토링은 11.13(목) ~ 11.14(금) Design Korea 2025 에서 진행 예정

__신청 방법__

일정 및 전형은 주최 측 사정에 따라 변경될 수 있습니다.
다음 희망 분야 선택 (중복 가능) 후 희망 횟수 및 희망 매칭 선택.

- 그래픽 디자인(브랜드/패키지/편집)
- 브랜드 디자인
- 산업(제품) 디자인
- U/UX 디자인

__기타 문의__

2025 디자인역량강화 멘토링 운영사무국(데이원컴퍼니)
contact_b2b_gov@day1company.co.kr
]]></description><link>https://www.heropy.dev/s/84</link><guid isPermaLink="false">/s/84</guid><category><![CDATA[Design]]></category><category><![CDATA[KIDP]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 05 Nov 2025 07:22:39 GMT</pubDate></item><item><title><![CDATA[타입스크립트, Go 네이티브 포팅으로 성능 10배 향상]]></title><description><![CDATA[지난 3월 11일 마이크로소프트가 기존 타입스크립트 자체로 작성된 타입스크립트 컴파일러와 도구셋를 Go로 이식해 성능을 대폭 향상시키고 개발자 경험을 개선하겠다고 발표했습니다.
현재 타입스크립트 컴파일러인 `tsc`는 Node.js 환경에서 실행되므로 자바스크립트 런타임이 필요하고 그렇기 때문에 대규모 프로젝트에서는 성능 저하의 원인이 되기도 했습니다. 
하지만 이번 Go 네이티브 포팅으로 `tsc`는 별도의 런타임 환경 없이 운영체제에서 직접 실행될 수 있게 됩니다. 
아직 개발 초기 단계이지만, 이를 통해 대규모 코드베이스에서 `tsc` 실행 시간을 10배 이상 단축할 수 있다고 밝혔습니다. 

![타입스크립트 각 코드베이스 실행 시간 비교](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/79/h6jL "--496x300")

현재 5버전인 타입스크립트는 다음 6버전에서 네이티브 전환을 위한 일부 기능의 사용 중단 및 변경 사항을 도입하겠다고 하며, Go 기반 네이티브 컴파일러가 기능 동등성에 도달하면 타입스크립트 7버전으로 출시할 예정이라고 합니다.
그리고 개발자가 필요에 따라 자바스크립트 기반 버전과 네이티브 버전을 선택할 수 있도록 하는 게 장기 목표라고 밝혔습니다.

[A 10x Faster TypeScript](https://devblogs.microsoft.com/typescript/typescript-native-port/)]]></description><link>https://www.heropy.dev/s/79</link><guid isPermaLink="false">/s/79</guid><category><![CDATA[TypeScript]]></category><category><![CDATA[Go]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 17 Mar 2025 02:25:30 GMT</pubDate></item><item><title><![CDATA[Zustand Persist Middleware(스토리지 사용)의 선택 옵션 정리]]></title><description><![CDATA[Zustand의 [Persist 미들웨어](https://www.heropy.dev/p/n74Tgc#h3_%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80_%EC%82%AC%EC%9A%A9_Persist)에서 사용할 수 있는 선택 옵션들을 정리합니다.
`name`은 필수 옵션입니다.

모든 옵션은 다음 예제를 기준으로 설명합니다.

```ts --path=/src/store/count.ts
import { create } from 'zustand'
import { combine, persist } from 'zustand/middleware'

export const useCountStore = create(
  persist(
    combine(
      {
        count: 0,
        double: 0
      },
      set => ({
        increase: () => set(state => ({ count: state.count + 1 }))
      })
    ),
    {
      name: 'count'
    }
  )
)
```

/// message-box --icon=info
Zustand의 전반적인 사용 방법은 [Zustand 핵심 정리](https://www.heropy.dev/p/n74Tgc)를 참고하세요!
///

#### storage

기본의 [로컬 스토리지(`localStorage`)](https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage)가 아닌 세션 스토리지나 IndexedDB 등의 다른 스토리지를 사용할 수 있습니다.
만약 새로운 나만의 스토리지를 원하면, `StateStorage` 인터페이스와 일치하는 객체를 `createJSONStorage` 헬퍼 함수를 통해 반환하면 됩니다.

```ts --path=/node_modules/zustand/esm/middleware/persist.d.mts --caption=StateStorage 인터페이스
export interface StateStorage {
  getItem: (name: string) => string | null | Promise<string | null>;
  setItem: (name: string, value: string) => unknown | Promise<unknown>;
  removeItem: (name: string) => unknown | Promise<unknown>;
}
```

```ts --path=/src/store/count.ts
// ...
export const useCountStore = create(
  persist(
    // combine(),
    {
      name: 'count',
      storage: createJSONStorage(() => sessionStorage) // 세션 스토리지 사용
    }
  )
)
```

#### Partialize

모든 상태를 스토리지에 저장하지 않고 원하는 상태만 저장하려면, `partialize` 옵션을 사용해 저장할 상태만 포함하는 객체를 반환합니다.
팩토리 함수이므로 저장 시 상태를 가공할 수 있지만, 리하이드레이션(Rehydration) 전까지는 현재 상태(`currentState`)와 스토리지 상태(`persistedState`)가 다를 수 있습니다.
하이드레이션에 대해서는 다음 옵션에서 설명합니다.

```ts --path=/src/store/count.ts
// ...
export const useCountStore = create(
  persist(
    // combine(),
    {
      name: 'count',
      partialize: currentState => ({ 
        count: currentState.count // count 속성만 스토리지에 저장!
      })
    }
  )
)
```

#### onRehydrateStorage

`onRehydrateStorage` 옵션은 스토리지가 하이드레이션(Hydration)되면 실행되는 함수입니다.
하이드레이션 직후에 처리해야 하는 로직을 작성할 수 있으며, `onRehydrateStorage`의 `state` 매개변수는 액션을 포함합니다.

/// message-box --icon=info
Zustand에서 **하이드레이션(Hydration)** 은 스토리지에 저장된 상태를 현재 상태와 병합하는 프로세스를 말합니다.
`useCountStore.persist.rehydrate()` 메소드를 통해 수동으로도 언제든지 다시 하이드레이션(Rehydration)할 수 있습니다.
스토리지 상태를 현재 상태로 병합한다고 이해하면 쉽습니다.
///

```ts --path=/src/store/count.ts
// ...
export const useCountStore = create(
  persist(
    // combine(),
    {
      name: 'count',
      onRehydrateStorage: state => {
        console.log('스토리지 상태와 병합 완료!', state)
      }
    }
  )
)
```

#### skipHydration

`skipHydration` 옵션을 사용해 최초 하이드레이션을 건너뛸 수 있습니다.
`useCountStore.persist.rehydrate()` 메소드를 통해 수동으로 리하이드레이션 할 수 있습니다.

```ts --path=/src/store/count.ts --caption=스토리지 상태를 하이드레이션 하지 않음.
// ...
export const useCountStore = create(
  persist(
    // combine(),
    {
      name: 'count',
      skipHydration: true
    }
  )
)
```

```tsx --path=/src/components/RehydrateButton.tsx --caption=버튼을 선택해 하이드레이션.
import { useCountStore } from './store/count'

export default function RehydrateCountStore() {
  return (
    <button onClick={() => useCountStore.persist.rehydrate()}>
      Rehydrate!
    </button>
  )
}
```

#### version

이미 스토리지에 저장된 데이터와 크게 다른 변경 사항을 도입하는 경우, 새로운 버전을 숫자로 지정해서 버전이 일치하지 않는 스토리지 데이터가 사용되지 않도록 할 수 있습니다.
만약 기존 버전을 무시하는 것이 아니라 활용해야 한다면, 다음에 설명하는 `migrate` 옵션을 사용할 수도 있습니다.

```ts --path=/src/store/count.ts
// ...
export const useCountStore = create(
  persist(
    // combine(),
    {
      name: 'count',
      version: 1 // 기본값: 0
    }
  )
)
```

#### migrate

하이드레이션 될 때 현재 상태의 버전이 스토리지의 버전과 다른 경우에 `migrate` 함수가 실행됩니다.
함수는 최신 버전과 일치하는 타입의 상태를 반환해야 하며, 스토리지의 데이터를 활용해야 하나 구조나 이름이 변경되었을 때 유용합니다.

```ts --path=/src/store/count.ts
import { create } from 'zustand'
import { combine, persist } from 'zustand/middleware'

interface StateVersion0 {
  count: number
  double: number
}
interface StateVersion1 {
  amount: number
  multiplier: number
  max: number
}

export const useCountStore = create(
  persist(
    combine(
      {
        amount: 0,
        multiplier: 0
      },
      set => ({
        increase: () => set(state => ({ amount: state.amount + 1 }))
      })
    ),
    {
      name: 'count',
      version: 1,
      migrate: (persistedState, version) => {
        if (version === 0) {
          const oldState = persistedState as StateVersion0
          const newState: StateVersion1 = {
            amount: oldState.count,
            multiplier: oldState.double,
            max: 100
          }
          return newState
        }
        return persistedState
      }
    }
  )
)
```

#### merge

`merge` 옵션은 하이드레이션 될 때 스토리지 상태를 현재 상태와 병합하는 방식을 지정할 수 있습니다.
기본적으로 스토리지와 현재의 상태는 얕은 병합(Shallow Merge)이 이뤄지지만, 깊은 병합(Deep Merge)이 필요한 경우 Lodash의 `merge` 함수를 사용할 수 있습니다.
`migrate` 함수보다 나중에 실행되며(두 옵션 모두 지정한 경우), `migrate` 함수가 반환하는 값을 첫 번째 매개변수(`persistedState`)로 받습니다.

```bash --caption=깊은 병합이 필요한 경우 Lodash 설치
npm i lodash-es
npm i -D @types/lodash-es
```

```ts --path=/src/store/count.ts
// ...
import { merge } from 'lodash-es'

export const useCountStore = create(
  persist(
    // combine(),
    {
      name: 'count',
      merge: (persistedState, currentState) => {
        return merge(currentState, persistedState) // 현재 상태와 스토리지 상태를 깊은 병합
      }
    }
  )
)
```
]]></description><link>https://www.heropy.dev/s/70</link><guid isPermaLink="false">/s/70</guid><category><![CDATA[React]]></category><category><![CDATA[Zustand]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 02 Feb 2025 06:58:25 GMT</pubDate></item><item><title><![CDATA[타입스크립트에서 interface와 type 중에 뭘 사용해야 하나요?]]></title><description><![CDATA[타입스크립트를 주제로 자주 받는 질문 중 하나가 객체 타입을 정의할 때 `interface`와 `type` 키워드 중 무엇을 사용하는 것이 좋겠냐는 것입니다.
일단 타입스크립트 공식 문서에서는 다음과 같이 설명합니다.

> [Differences Between Type Aliases and Interfaces](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#differences-between-type-aliases-and-interfaces) - 
> For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface until you need to use features from type.

정리하자면, `interface`와 `type` 키워드는 개인적인 선호나 상황에 따라 선택하되, 굳이 기준을 제시하자면 `type`이 필요한 상황이 되기 전에는 `interface`를 사용하라는 것입니다.

위 내용과 별개로도 저는 객체 타입을 정의할 때 주로 `interface`를 사용하는데, 가장 큰 이유는 선언 병합이 가능하기 때문입니다.
선언 병합(Declaration Merging)은 같은 이름의 `interface`를 여러 번 선언하면 하나로 병합되어 확장되는 것을 말합니다.

```ts --caption=선업 병합
interface User {
  name: string
}
interface User {
  age: number
}

const user: User = {
  name: 'Neo',
  age: 85
}
```

그래서 기존에 인터페이스로 선언된 객체 타입에 새로운 속성을 추가할 때 유용합니다.
예를 들면, 다음과 같이 전역 객체에 원하는 속성을 추가할 수 있습니다.

```ts --path=/types/global.d.ts --line-active=3 --caption=Window 객체에 커스텀 속성 추가
declare global {
  interface Window {
    hello?: string
  }
}
```

```ts
window.hello = 'Hello world!'
```

그리고 사용하는 라이브러리를 직접 수정하지 않고도 인터페이스로 정의된 특정 객체 타입을 확장할 수 있습니다.

```ts --path=/types/axios.d.ts --caption=라이브러리에 커스텀 속성 추가
import 'axios'

declare module 'axios' {
  interface AxiosRequestConfig {
    hello?: string
  }
}
```

```ts --line-active=4 --caption=커스텀 속성 추가
import axios from 'axios'

axios({
  hello: 'Hello world!',
})
```

예를 들어 [Vue](https://vuejs.org/)는 컴포넌트에서 사용하는 전역 속성을 추가할 때, 컴포넌트 타입을 직접 수정하는 대신 별도로 제공되는 [ComponentCustomProperties](https://vuejs.org/api/utility-types#componentcustomproperties) 타입을 통해 확장합니다. 
복잡한 기존 타입의 직접 수정은 예기치 않은 문제를 일으킬 수 있기 때문에 기존 타입을 유지하면서 새로운 속성을 추가하는 방법을 제공하는 것입니다.
직접 라이브러리를 만들 때도 보다 안전한 타입을 제공하는 유용한 방법입니다.

```ts --path=/types/vue.d.ts --caption=Vue 컴포넌트에 전역 속성 추가
import axios from 'axios'

declare module 'vue' {
  interface ComponentCustomProperties {
    $http: typeof axios
    $translate: (key: string) => string
  }
}
```

```vue --line-active=2,3 --caption=전역 속성 사용
<template>
  <button @click="$http.get('/api/user')">Fetch User</button>
  <p>{{ $translate('hello') }}</p>
</template>
```

이런 이유 등으로 저는 객체 타입을 정의할 때 `interface` 키워드 사용을 추천합니다.
물론 명확한 이유나 상황이 없다면 개인적인 선호는 충분히 다를 수 있습니다.
]]></description><link>https://www.heropy.dev/s/65</link><guid isPermaLink="false">/s/65</guid><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 24 Jan 2025 10:42:40 GMT</pubDate></item><item><title><![CDATA[구글 계정 삭제 후 '계정 관련 조치 필요' 알림 문제 해결하기]]></title><description><![CDATA[업무용으로 사용하던 구글 계정을 삭제한 뒤, 갤럭시 스마트폰에서 '계정 관리 조치 필요' 알림이 반복해서 뜨는 상황을 겪었습니다. 
알림을 꺼도 일정 시간이 지나면 다시 알림이 뜨는데, 계정이 스마트폰에서도 삭제되지 않아서 생긴 문제였습니다.
그래서 스마트폰에서 계정을 삭제하는 간단한 방법을 공유합니다.

![계정 관리 조치 필요 알림](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/53/Echz "--800x449")

스마트폰 설정으로 이동해 '**계정 및 백업**'의 '**계정 관리**' 메뉴를 선택합니다.

![설정 > 계정 및 백업 > 계정 관리](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/53/5l3V "--800x961")

보유한 계정(메일) 목록에서 삭제할 메일을 선택하고 삭제합니다.

![계정 삭제](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/53/C-WD "--800x961")
]]></description><link>https://www.heropy.dev/s/53</link><guid isPermaLink="false">/s/53</guid><category><![CDATA[Mobile]]></category><category><![CDATA[Galaxy]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Mon, 20 Jan 2025 03:23:29 GMT</pubDate></item><item><title><![CDATA[Safari 브라우저에서 CSP Upgrade Insecure Requests 지시어로 인한 개발 서버 접근 문제 해결]]></title><description><![CDATA[```html --caption=CSP Upgrade Insecure Requests 지시
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests" />
```

`upgrade-insecure-requests`는 CSP(Content-Security-Policy)의 지시어(Directive)로, 웹 페이지 내의 모든 HTTP 요청(이미지, 스크립트, API 등)을 자동으로 HTTPS로 업그레이드하도록 브라우저에 지시합니다.
만약 HTTPS로 제공되는 웹 페이지에서 HTTP 리소스를 로드하면 XSS, MITM, 데이터 가로채기 등의 보안 취약점을 유발할 수 있으므로, 대부분의 브라우저에서는 이를 차단하거나 혼합 콘텐츠(Mixed Content) 경고를 발생시킵니다.
이때 HTTP 리소스 요청을 자동으로 HTTPS로 변환하면 혼합 콘텐츠 문제를 쉽게 해결할 수 있습니다.

/// message-box --icon=error
`block-all-mixed-content` 지시어를 사용하는 혼합 콘텐츠 차단 기능은 지원 중단되었으며, `upgrade-insecure-requests` 지시어와 충돌합니다.
///

개발 환경에서는 기본적으로 `http://localhost:5173` 같이 HTTP 주소를 사용합니다.
`upgrade-insecure-requests` 지시어를 사용하면 이런 로컬 개발 서버도 HTTPS로 리다이렉트해야 하는데, Chrome이나 Firefox 등의 일반적인 브라우저는 예외 처리를 통해 HTTP 요청도 정상적으로 동작할 수 있습니다.
그런데 대표적으로 Safari 브라우저는 이런 예외 처리를 하지 않으며, 엄격하게 HTTP 요청을 HTTPS로 리다이렉트 시도합니다.
따라서 `http://localhost` 주소가 `https://localhost`로 리다이렉트 되면, HTTPS를 지원하지 않는 로컬 개발 서버로는 접근할 수 없게 됩니다.

![Safari 브라우저에서의 문제 발생](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/85/Q8mM "--1336x576")

이 문제를 해결하는 간단한 방법은 로컬 개발 환경에서는 Upgrade Insecure Requests 지시어를 사용하지 않도록 제거하는 것입니다.
지시어를 프로덕션 환경에서만 사용하도록 환경 변수 등을 활용해 조건부 적용합니다.

__Vite 구성 예시__

빌드 타임에 조건부로 CSP 메타 태그를 주입합니다.

```bash
npm i -D vite-plugin-html
```

```ts --path=/vite.config.ts
import { defineConfig } from 'vite'
import { createHtmlPlugin } from 'vite-plugin-html'

const tags = []
if (process.env.NODE_ENV === 'development') {
  tags.push({
    tag: 'meta',
    attrs: {
      httpEquiv: 'Content-Security-Policy',
      content: 'upgrade-insecure-requests'
    }
  })
}
export default defineConfig({
  plugins: [
    createHtmlPlugin({
      inject: { tags }
    })
  ]
})
```

__Next.js 구성 예시__

모든 경로 요청에 대해 CSP 헤더를 추가합니다.

```ts --path=/next.config.ts
import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
  async headers() {
    return [
      {
        source: '/:path*',
        headers: [
          {
            key: 'Content-Security-Policy',
            value: process.env.NODE_ENV === 'production' ? 'upgrade-insecure-requests' : ''
          }
        ]
      }
    ]
  }
}
export default nextConfig
```

__Sveltekit 구성 예시__

애플리케이션에서 조건부로 CSP 메타 태그를 추가합니다.

```svelte --path=/app/routes/+layout.svelte
<script lang="ts">
  import { dev } from '$app/environment'
</script>

<svelte:head>
  {#if !dev}
    <meta
      http-equiv="Content-Security-Policy"
      content="upgrade-insecure-requests" />
  {/if}
</svelte:head>
```

__HTTPS 개발 서버 구성 예시__

처음 로컬 Vite 개발 서버를 실행하면 비밀번호를 입력하라는 메시지가 표시될 수 있으며, 시스템 및 브라우저에 로컬 인증서가 설치됩니다.
이후로는 `https://localhost`으로 접근할 수 있습니다.

```bash
npm i -D vite-plugin-mkcert
```

```ts --path=/vite.config.ts
import { defineConfig } from 'vite'
import mkcert from 'vite-plugin-mkcert'

export default defineConfig({
  plugins: [
    mkcert()
  ]
})
```
]]></description><link>https://www.heropy.dev/s/85</link><guid isPermaLink="false">/s/85</guid><category><![CDATA[Safari]]></category><category><![CDATA[CSP]]></category><category><![CDATA[Vite]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sat, 29 Nov 2025 05:00:07 GMT</pubDate></item><item><title><![CDATA[Offset과 Cursor 페이지네이션 방식]]></title><description><![CDATA[Offset(Start)과 Limit을 활용하는 오프셋 기반 페이지네이션(Offset-based Pagination) 방식을 주로 사용하지만, 커서 기반 페이지네이션(Cursor-based Pagination) 방식도 있습니다.
Offset 방식의 페이지 단위로 데이터를 가져오면, 실시간으로 빠르게 데이터가 추가 혹은 삭제될 때 중복이나 누락 문제가 발생할 수 있는 단점이 있습니다.
반면, Cursor 방식은 마지막 데이터의 위치를 커서로 삼아 그 이후 데이터부터 가져올 수 있어 데이터 추가나 삭제가 잦은 환경에서 특히 유용합니다.

```sql
-- 오프셋
SELECT *
FROM table_name
ORDER BY created_at DESC
LIMIT 10
OFFSET 10

-- 커서
SELECT *
FROM table_name
WHERE created_at < :cursor_created_at
ORDER BY created_at DESC
LIMIT 10
```
]]></description><link>https://www.heropy.dev/s/48</link><guid isPermaLink="false">/s/48</guid><category><![CDATA[DB]]></category><category><![CDATA[SQL]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 12 Jan 2025 00:07:23 GMT</pubDate></item><item><title><![CDATA[KRDS(Korea Design System) 대한민국 정부 디자인 시스템]]></title><description><![CDATA[정부 웹사이트나 공공 서비스의 UX/UI를 표준화하기 위해 [KRDS(Korea Republic Design System, 대한민국 정부 디자인 시스템)](https://www.krds.go.kr/html/site/index.html)을 참고해 보세요.
행정안전부에서 제공하는 이 가이드라인은 편의성, 일관성, 접근성, 사용성 등을 보장하기 위한 디자인 시스템을 제안합니다.

<iframe width="1920" height="1080" src="https://www.youtube.com/embed/GcUlb1VKP_U" title="KRDS 튜토리얼 - 개발자 시작하기" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

디자이너와 정부 관계자뿐만 아니라 개발자도 활용할 수 있도록 다양한 컴포넌트와 바로 복사해 사용할 수 있는 코드까지 제공하므로, 공공 서비스나 신뢰감이 중요한 서비스 개발에 많은 도움이 될 것입니다.
폰트는 [Pretendard GOV](https://github.com/orioncactus/pretendard/tree/main/packages/pretendard-gov)를 사용합니다.

![헤더 컴포넌트 코드](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/68/Uhzm "--937x682")

디자인 스타일, 컴포넌트, 기본 패턴, 서비스 패턴의 KRDS 문서를 꼭 읽어 보세요.
웹 개발 입문자뿐만 아니라 전문가에게도 유용한 내용이 담겨 있습니다.

[디자인 스타일](https://www.krds.go.kr/html/site/style/style_01.html)은 색상, 타이포그래피, 형태, 레이아웃, 아이콘 등을 체계적으로 정의합니다.

![색상 팔레트](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/68/5SrL "--919x203")

[컴포넌트](https://www.krds.go.kr/html/site/component/component_summary.html)는 버튼, 입력 필드 등 공통 UI 요소의 특성과 상태, 역할을 정리하고 사용성 및 접근성 가이드를 제공합니다.

![운영기관 식별자 컴포넌트](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/68/ZJVv "--924x196")

[기본 패턴](https://www.krds.go.kr/html/site/global/global_summary.html)은 자주 사용되는 UI 요소들의 적용 가이드입니다.
_"사용자가 입력할 수 있는 모든 문자의 입력과 표시를 지원한다."_ 같은 기준으로 모범 사례와 피해야 할 사례 등의 사용성을 설명합니다.

![개인 식별 정보 입력 - 이름](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/68/1F6r "--403x156")

[서비스 패턴](https://www.krds.go.kr/html/site/service/service_summary.html)은 사용자 기반의 경험 설계 가이드로, 주요 과업별로 최적의 UX를 제시하고 필수, 권장, 우수로 적용 수준을 나눠 가이드를 제공합니다.

![적용 수준 제공](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/68/6XyZ "--548x280")]]></description><link>https://www.heropy.dev/s/68</link><guid isPermaLink="false">/s/68</guid><category><![CDATA[Design]]></category><category><![CDATA[KRDS]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Fri, 31 Jan 2025 09:02:00 GMT</pubDate></item><item><title><![CDATA[Supabase 테이블 컬럼의 데이터 타입 정리]]></title><description><![CDATA[Supabase(PostgreSQL)에서 테이블을 생성할 때 각 컬럼의 데이터 타입 선택은 데이터를 효율적으로 활용하고 검색이나 처리 성능을 최적화하는 데 중요합니다.
그리고 단순히 데이터를 저장하는 것뿐만 아니라 이후 데이터베이스를 확장하거나 유지/보수하는 부분에도 영향을 미치기 때문에 신중한 설계가 필요합니다.

![Supabase Table Data Type](https://somwpkzlplaovldnfahk.supabase.co/storage/v1/object/public/heropy.dev_shorts/51/hjyd "--507x438")

처음 PostgreSQL 데이터 타입을 접하거나 익숙하지 않다면 어떤 타입을 선택해야 할지 막막할 수 있습니다.
그래서 데이터 타입을 선택하는 데 도움이 될 수 있도록 다음과 같이 설명과 함께 표로 정리했습니다.
표를 참고해서 프로젝트에 적합한 데이터베이스 구조를 설계해 보세요!

Supabase | Prisma | TypeScript | 설명
---|---|---|---
`int2` | `Int` | `number` | 등급, 나이, 평점 등 작은 범위의 정수 값(`-32,768` ~ `+32,767`)을 다룰 때 사용합니다.<br/>대규모 데이터를 처리할 때 저장 공간을 좀 더 절약할 수 있습니다.
`int4` | `Int` | `number` | 가장 보편적인 범위의 정수 값(`-2,147,483,648` ~ `+2,147,483,647`)입니다.
`int8` | `BigInt` | `bigint` | 매우 큰 범위의 정수 값(`-9,223,372,036,854,775,808` ~ `+9,223,372,036,854,775,807`)입니다.<br/>대량 데이터의 ID, 조회수, 큰 금액 등 값이 범위가 매우 커야 하는 경우에 사용합니다.
`float4` | `Float` | `number` | 소수점 아래 6자리까지의 정확도를 제공하는 부동소수점 값입니다.<br/>메모리 효율성이 중요하거나 온도, 좌표 같은 높은 정밀도가 필요하지 않은 경우에 사용합니다.
`float8` | `Float` | `number` | 소수점 아래 15자리까지의 정확도를 제공하는 부동소수점 값입니다.<br/>과학 계산, 항공 데이터 등의 보다 정밀한 계산이 필요한 경우에 사용합니다.
`numeric` | `Decimal` | `Decimal` | 금융 거래나 회계 계산처럼 오차가 허용되지 않는 완벽한 정확도를 요구하는 십진수 계산이 필요한 경우에 사용합니다.<br/>상대적으로 처리 속도가 느립니다.
`json` | `Json` | `Prisma.JsonValue` | 구조화된 JSON 데이터를 문자열로 저장합니다.<br/>데이터를 처리할 때마다 파싱해야 하므로 단순 저장이 아닌 이상 `jsonb` 사용을 추천합니다.
`jsonb` | `Json` | `Prisma.JsonValue` | JSON 데이터를 바이너리 형태로 저장합니다.<br/>처리 속도가 빠르고 인덱싱이 가능해 데이터 검색이나 수정이 자주 필요한 경우에 유용합니다.
`text` | `String` | `string` | 긴 텍스트, 게시글 내용 등 길이 제한이 없는 문자열입니다.
`varchar` | `String` | `string` | 사용자 이름, 이메일 등 길이가 제한적인 문자열입니다.<br/>길이 제한을 확인하는 과정에서 약간의 오버헤드가 발생할 수 있으므로 대부분의 경우 `text` 사용을 추천합니다.
`uuid` | `String` | `string` | 범용 고유 식별자를 저장합니다.<br/>고유한 ID가 필요한 경우에 사용하며 32자리의 16진수로 구성됩니다.
`date` | `DateTime` | `Date` | 시간 정보를 제외한 날짜를 저장하며 생년월일, 기념일 등을 다룰 때 사용합니다.<br/>`timestamptz` 사용을 추천합니다.<br/>예시) `2025-12-16` => `2025-12-16T00:00:00.000Z`
`time` | `DateTime` | `Date` | 날짜 정보를 제외한 시간만을 저장하며 영업 시간, 일과 시간 등을 다룰 때 사용합니다.<br/>`timestamptz` 사용을 추천합니다.<br/>예시) `08:10:28` => `1970-01-01T08:10:28.000Z`
`timetz` | `DateTime` | `Date` | 시간과 시간대(Time Zone) 정보를 함께 저장합니다.<br/>`timestamptz` 사용을 추천합니다.<br/>예시) `08:10:28+00` => `1970-01-01T08:10:28.000Z`
`timestamp` | `DateTime` | `Date` | 날짜와 시간을 함께 저장하며 이벤트 발생 시각, 데이터 생성/수정 시각 등을 다룰 때 사용합니다.<br/>`timestamptz` 사용을 추천합니다.<br/>예시) `2025-01-15 08:10:28.000` => `2025-01-15T08:10:28.000Z`
`timestamptz` | `DateTime` | `Date` | 날짜, 시간, 시간대(Time Zone) 정보를 모두 저장합니다.<br/>글로벌 서비스에서 시간대를 고려해야 하는 경우에 사용하며 가장 추천하는 방식입니다.<br/>예시) `2025-01-15 08:10:28.000+00` => `2025-01-15T08:10:28.000Z`
`bool` | `Boolean` | `boolean` | 참/거짓의 불린 값을 저장합니다. 
]]></description><link>https://www.heropy.dev/s/51</link><guid isPermaLink="false">/s/51</guid><category><![CDATA[DB]]></category><category><![CDATA[PostgreSQL]]></category><category><![CDATA[Supabase]]></category><category><![CDATA[Prisma]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Thu, 16 Jan 2025 00:35:27 GMT</pubDate></item><item><title><![CDATA[Next.js 프로젝트에서 새로운 Tailwind CSS v4 시작하기]]></title><description><![CDATA[지난 1월 23일에 Tailwind CSS v4가 정식 출시되었습니다.
주요 변경사항과 함께 성능과 사용성이 더욱 향상되었습니다.

- 최대 100배 더 빠른 빌드 속도
- 설치 및 구성 코드 최소화
- 최신 CSS 기술(`@layer`, `@property`, `color-mix()` 등) 적극 활용
- 컨테이너 쿼리, 3D 변환, 새로운 색상 시스템 지원
- JS 없이도 CSS에서 직접 설정해 더 직관적인 커스터마이징 가능

최신의 Next.js 15 프로젝트를 설치하면 기본적으로 Tailwind CSS v4가 적용됩니다.
기존 Next 프로젝트에서 Tailwind CSS v4를 사용하고 싶다면 다음 과정으로 구성해 보세요.

먼저 각 패키지를 최신 버전으로 설치합니다.

```bash --caption=최신 패키지 설치
npm i -D tailwindcss@4 postcss @tailwindcss/postcss
```

PostCSS 구성의 옵션 이름을 변경합니다.

```mjs --path=/postcss.config.mjs --line-active=5 --line-error=4 --caption=PostCSS 구성 변경
/** @type {import('postcss-load-config').Config} */
const config = {
  plugins: {
    // tailwindcss: {}
    "@tailwindcss/postcss": {}
  }
}

export default config
```

전역으로 가져오는 스타일 코드도 변경합니다.

```css --path=/app/globals.css --line-active=4 --line-error=1-3 --caption=전역 스타일 변경
/* @tailwind base;
@tailwind components;
@tailwind utilities; */
@import "tailwindcss";

/* 생략.. */
```]]></description><link>https://www.heropy.dev/s/69</link><guid isPermaLink="false">/s/69</guid><category><![CDATA[CSS]]></category><category><![CDATA[Tailwindcss]]></category><category><![CDATA[Next]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Wed, 19 Mar 2025 12:50:39 GMT</pubDate></item><item><title><![CDATA[타입스크립트 구성(tsconfig.json) 정리]]></title><description><![CDATA[#### tsconfig.json

`tsconfig.json` 파일을 사용해 타입스크립트 컴파일러가 프로젝트를 JS로 변환하는 방법을 지정합니다.

```json --caption=tsconfig.json 예시
{
  "files": ["node_modules/my-library/index.ts"],
  "exclude": ["node_modules", "dist"],
  "include": ["src/**/*"],
  "extends": "config/base.json",
  "compilerOptions": {}
}
```

| 옵션 | 우선순위 | 설명 |
| --- | --- | --- |
| files | 1 | 컴파일할 개별 파일 목록(확장자 필수!) |
| exclude | 2 | 컴파일에서 제외할 파일 경로 목록 |
| include | 3 | 컴파일할 파일 경로 목록<br>`.ts`, `.tsx`, `.d.ts` 확장자 생략이 가능하며, `allowJS: true`인 경우 `.js`, `.jsx` 추가 |
| extends | - | 상속할 다른 TS 구성 |
| compilerOptions | - | 컴파일러 옵션 지정 |

##### CompilerOptions

`CompilerOptions`에서 사용할 수 있는 주요 세부 옵션을 정리했습니다.

```json --caption=compilerOptions 예시
{
  "compilerOptions": {
    "target": "ES2015",
    "module": "ESNext",
    "moduleResolution": "Node",
    "jsx": "preserve",
    "strict": true,
    "esModuleInterop": true,
    "lib": ["ESNext", "DOM"]
  }
}
```

| 옵션 | 기본값 | 설명 |
| --- | --- | --- |
| target | `"ES3"` | 컴파일될 ES 버전 명시.
| lib | - | 컴파일에서 사용할 라이브러리 지정.
| module | `"CommonJS"` | 모듈 시스템 지정.
| moduleResolution | `"Node"` | 모듈 해석 방식 지정.<br>`"NodeNext"`는 `exports` 필드나 조건적 해석을 지원.<br>`"bundler"`는 Vite, Webpack 등의 번들러에 맞춘 해석 방식. |
| esModuleInterop | `false` | ESM 모듈 방식 호환성 활성화.
| isolatedModules | `false` | 모든 파일을 모듈로 컴파일, `import` 혹은 `export`가 없는 경우 에러.
| moduleDetection | - | 모듈 감지 방식 지정.<br>`"force"`는 모든 파일을 모듈로 강제해 전역 스코프 충돌 방지. |
| allowSyntheticDefaultImports | `true` | 기본 내보내기(`export default`)가 없는 모듈에서 기본 가져오기 가능. |
| allowImportingTsExtensions | `false` | `.ts`, `.tsx` 확장자를 가진 파일을 `import` 문에서 직접 사용 가능. |
| baseUrl | - | 모듈 해석에 사용할 기준 경로 지정. |
| paths | - | 모듈 해석에 사용할 경로 별칭 지정. |
| types | - | 컴파일러가 참조할 `@types` 패키지의 목록을 지정하며, 명시되지 않으면 무시. |
| typeRoots | `["./node_modules/@types"]` | 컴파일러가 참조할 타입 선언(`.d.ts`)의 경로 목록을 지정, 명시되지 않으면 무시. |
| allowJS | `false` | JS 파일 컴파일 허용. |
| checkJs | `false` | `.js` 파일의 오류 보고 여부.<br>`allowJS`가 `true`일 때만 유효. |
| jsx | `"preserve"` | JSX 지정.<br>`"react-jsx"`는 React 17+의 새로운 JSX Transform 방식으로 컴파일. |
| declaration | `true` | 모든 TS(JS) 파일의 타입 정보를 포함한 선언 파일(`*.d.ts`) 생성 여부. |
| declarationMap | `false` | `.d.ts` 파일과 함께 소스 코드 매핑 파일(`.d.ts.map`) 생성 여부.<br/>디버깅 시 소스 코드 이동에 유용. |
| sourceMap | `false` | 소스맵 파일 생성 여부.<br/>디버깅 도구 등에서 JS 파일의 원본 TS 파일 표시 가능. |
| noEmit | `false` | 컴파일 후 출력 파일(`.js`, `.d.ts` 등)을 생성하지 않음.<br/>타입 체크만 수행할 때 사용. |
| skipLibCheck | `false` | `.d.ts` 파일의 타입 검사를 건너뜀.<br/>서드파티 라이브러리 오류 무시 및 빌드 속도 향상. |
| strict | `false` | 더 엄격한 타입 검사 활성화.<br/>모든 엄격 옵션(`noImplicitAny`, `strictNullChecks` 등)을 포함. |
| noImplicitAny | `false` | (strict) 암시적 `any` 타입 검사 활성화. |
| noImplicitThis | `false` | (strict) 암시적 `this` 타입 검사 활성화. |
| strictNullChecks | `false` | (strict) 엄격한 `null`, `undefined` 타입 검사 활성화. |
| strictFunctionTypes | `false` | (strict) 엄격한 함수의 매개변수 타입 검사 활성화. |
| strictPropertyInitialization | `false` | (strict) 엄격한 클래스의 속성 초기화 검사 활성화. |
| strictBindCallApply | `false` | (strict) 엄격한 `bind`, `call`, `apply` 메서드의 인수 검사 활성화. |
| noUnusedLocals | `false` | 사용되지 않는 지역 변수가 있을 경우 오류 발생.
| noUnusedParameters | `false` | 사용되지 않는 함수 매개변수가 있을 경우 오류 발생.
| noFallthroughCasesInSwitch | `false` | 논리 오류 방지를 위해 `switch` 문의 `case` 블록이 다음 `case`로 넘어가는 Fall-Through 금지. |
| noUncheckedIndexedAccess | `false` | 객체의 인덱스 접근 시 `undefined` 가능성을 타입에 반영.
| noUncheckedSideEffectImports | `false` | 모듈의 부수 효과를 유발하는 `import`가 체크되지 않을 경우 오류 발생.<br/>타입 안전성 강화(TypeScript 5.0+). |
| useDefineForClassFields | `false` | 클래스 필드 선언 시 ECMAScript 표준(`defineProperty`) 동작을 따름.<br/>`target: "ES2022"` 이상에서 기본값 `true`. |
| resolveJsonModule | `false` | `.json` 파일을 모듈로 가져오기 허용. |
| tsBuildInfoFile | `.tsbuildinfo` | 증분 컴파일(이전 컴파일 결과에서 변경된 부분만 다시 컴파일) 시 `.tsbuildinfo` 파일의 경로 지정. |
| verbatimModuleSyntax | `false` | ES 모듈(ECMAScript Modules) 구문을 보다 엄격하고 정확하게 해석 | 
]]></description><link>https://www.heropy.dev/s/80</link><guid isPermaLink="false">/s/80</guid><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[ParkYoungWoong]]></dc:creator><pubDate>Sun, 22 Jun 2025 15:05:11 GMT</pubDate></item></channel></rss>