<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>thewavelet</title>
    <link>https://thewavelet.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 7 May 2026 03:49:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>thewavelet</managingEditor>
    <item>
      <title>React Native 0.83 and Expo 55</title>
      <link>https://thewavelet.tistory.com/202</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;hero&quot;&gt;
&lt;div class=&quot;hero-badge&quot;&gt;Release Notes&lt;/div&gt;
&lt;h1&gt;Expo SDK 55 릴리즈 노트&lt;/h1&gt;
&lt;div class=&quot;hero-meta&quot;&gt;2026년 2월 25일 &amp;middot; React Native 0.83 &amp;middot; React 19.2&lt;/div&gt;
&lt;p class=&quot;hero-desc&quot; data-ke-size=&quot;size16&quot;&gt;Expo SDK 55가 출시되었습니다. 이번 릴리즈에는 React Native 0.83과 React 19.2가 포함되어 있으며, 레거시 아키텍처 지원 종료, AI 도구 확장, 네이티브 UI 개선 등 굵직한 변화가 가득합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;toc-wrap&quot;&gt;
&lt;div class=&quot;toc&quot;&gt;
&lt;div class=&quot;toc-title&quot;&gt;목차&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#transition&quot;&gt;전환 기간 안내 (Expo Go)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#template&quot;&gt;기본 템플릿 개편&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#legacy&quot;&gt;레거시 아키텍처 지원 종료&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#hermes&quot;&gt;Hermes v1 옵트인 지원&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#bsdiff&quot;&gt;Hermes 바이트코드 diff 업데이트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ai&quot;&gt;AI 도구 확장&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#brownfield&quot;&gt;Brownfield 지원 개선&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#router&quot;&gt;Expo Router 네이티브 기능&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ui&quot;&gt;Expo UI (Jetpack Compose / SwiftUI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#versioning&quot;&gt;패키지 버전 체계 변경&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#modules&quot;&gt;Expo Modules Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#cli&quot;&gt;Expo CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#widgets&quot;&gt;expo-widgets (iOS, Alpha)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#blur&quot;&gt;expo-blur Android 안정화&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#sharing&quot;&gt;expo-sharing 수신 기능&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#other&quot;&gt;기타 주요 업데이트&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#deprecations&quot;&gt;Deprecations (지원 중단 예정)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#breaking&quot;&gt;주요 Breaking Changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#tools&quot;&gt;도구 버전 변경&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#upgrade&quot;&gt;업그레이드 가이드&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;content&quot;&gt;&lt;!-- 1. Transition --&gt;
&lt;div id=&quot;transition&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;전환 기간 안내 (Expo Go)&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 릴리즈 직후 잠시 동안, App Store / Play Store의 &lt;b&gt;Expo Go는 SDK 54 버전을 유지&lt;/b&gt;합니다. 또한 &lt;code&gt;npx create-expo-app&lt;/code&gt;으로 생성되는 기본 프로젝트도 일관성을 위해 잠시 SDK 54를 사용합니다.&lt;/p&gt;
&lt;div class=&quot;highlight-box&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이 전환 기간을 활용해 &lt;b&gt;Development Build&lt;/b&gt;로 마이그레이션하는 것을 권장합니다. Development Build는 앱스토어에 배포할 앱을 만들기 위해 필요한 모든 것을 제공합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SDK 55용 Expo Go 설치 방법:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Android&lt;/b&gt;: Expo CLI를 통해 직접 디바이스에 설치 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iOS&lt;/b&gt;: &lt;a style=&quot;color: var(--accent);&quot; href=&quot;https://testflight.apple.com/join/GZJxxfUU&quot;&gt;TestFlight External Beta&lt;/a&gt; 이용, 또는 새로운 &lt;code&gt;eas go&lt;/code&gt; 명령어로 본인 TestFlight 팀에 업로드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 55 프로젝트를 새로 만들려면: &lt;code&gt;npx create-expo-app --template default@sdk-55&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!-- 2. Template --&gt;
&lt;div id=&quot;template&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 프로젝트 템플릿 개편&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 템플릿이 네이티브 플랫폼 관행과 개선된 폴더 구조에 초점을 맞춰 새롭게 디자인되었습니다.&lt;/p&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;  Native Tabs API 기본 적용&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS/Android에서 플랫폼 네이티브 탭 경험 제공, 브라우저에서는 반응형 웹 최적화 레이아웃 사용&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;✨ 새로운 디자인&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 제공 경험(out-of-the-box) 향상을 위한 전면 디자인 리프레시&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;  새 /src 폴더 구조&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 코드가 이제 &lt;code&gt;/app&lt;/code&gt; 대신 &lt;code&gt;/src/app&lt;/code&gt;에 위치하여 프로젝트 설정 파일과 앱 코드가 명확히 분리됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;새 템플릿으로 프로젝트 생성하기&lt;/h3&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;# npm
npx create-expo-app@latest --template default@sdk-55

# bun
bun create expo-app --template default@sdk-55

# pnpm
pnpm create expo-app --template default@sdk-55

# yarn
yarn create expo-app --template default@sdk-55&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;!-- 3. Legacy Architecture --&gt;
&lt;div id=&quot;legacy&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;레거시 아키텍처 지원 종료&lt;/h2&gt;
&lt;/div&gt;
&lt;div class=&quot;warning-box&quot;&gt;
&lt;div class=&quot;icon&quot;&gt;⚠️&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 54에서 예고된 대로, &lt;b&gt;SDK 55부터 레거시 아키텍처(Legacy Architecture)를 더 이상 사용할 수 없습니다.&lt;/b&gt; &lt;code&gt;app.json&lt;/code&gt;의 &lt;code&gt;newArchEnabled&lt;/code&gt; 설정 옵션도 제거되었습니다. 자세한 내용은 &quot;React Native's New Architecture&quot; 가이드를 참고하세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 4. Hermes v1 --&gt;
&lt;div id=&quot;hermes&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt;⚡&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hermes v1 옵트인 지원&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hermes v1은 JS 엔진의 큰 도약으로, 다양한 시나리오에서 &lt;b&gt;성능 개선&lt;/b&gt;이 초기 지표에서 확인되었습니다. 또한 &lt;b&gt;모던 JavaScript 기능&lt;/b&gt; (ES6 클래스, const/let, async/await) 지원이 크게 향상됩니다.&lt;/p&gt;
&lt;div class=&quot;warning-box&quot;&gt;
&lt;div class=&quot;icon&quot;&gt;⚠️&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의:&lt;/b&gt; SDK 55 / React Native 0.83에서 Hermes v1을 사용하려면 React Native를 소스에서 빌드해야 하므로 &lt;b&gt;네이티브 빌드 시간이 크게 증가합니다.&lt;/b&gt; 또한 Android 모노레포 프로젝트에서는 아직 권장하지 않습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;expo-build-properties&lt;/code&gt;의 &lt;code&gt;useHermesV1&lt;/code&gt; 필드로 활성화할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;expo&quot;: {
    &quot;plugins&quot;: [
      [
        &quot;expo-build-properties&quot;,
        {
          &quot;buildReactNativeFromSource&quot;: true,
          &quot;useHermesV1&quot;: true
        }
      ]
    ]
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 &lt;code&gt;package.json&lt;/code&gt;의 &lt;code&gt;overrides&lt;/code&gt;에 &lt;code&gt;hermes-compiler&lt;/code&gt; 버전을 지정해야 합니다:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;overrides&quot;: {
    &quot;hermes-compiler&quot;: &quot;250829098.0.4&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;!-- 5. Hermes bsdiff --&gt;
&lt;div id=&quot;bsdiff&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Hermes 바이트코드 Diff 업데이트 (EAS Update)&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;expo-updates&lt;/code&gt;와 EAS Update에 &lt;b&gt;Hermes 바이트코드 diff 기능&lt;/b&gt;이 추가되었습니다. 업데이트 전체 파일을 다운로드하는 대신, 이전 버전에 대한 바이너리 패치(diff)만 다운로드하여 적용합니다.&lt;/p&gt;
&lt;div class=&quot;stat-grid&quot;&gt;
&lt;div class=&quot;stat-card&quot;&gt;
&lt;div class=&quot;stat-num&quot;&gt;~75%&lt;/div&gt;
&lt;div class=&quot;stat-label&quot;&gt;바이트코드 다운로드 시간 단축 (iOS/Android)&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;stat-card&quot;&gt;
&lt;div class=&quot;stat-num&quot;&gt;&amp;darr;&lt;/div&gt;
&lt;div class=&quot;stat-label&quot;&gt;대역폭 사용량 절감&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;stat-card&quot;&gt;
&lt;div class=&quot;stat-num&quot;&gt;&amp;uarr;&lt;/div&gt;
&lt;div class=&quot;stat-label&quot;&gt;업데이트 채택률 향상&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 55에서는 옵트인 방식이며, SDK 56에서 기본 활성화 예정입니다. 활성화 방법:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;expo&quot;: {
    &quot;updates&quot;: {
      &quot;url&quot;: &quot;https://u.expo.dev/[your-project-id]&quot;,
      &quot;enableBsdiffPatchSupport&quot;: true
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EAS 대시보드 &amp;rarr; Update Details &amp;rarr; Update Group에서 diff가 적용되고 있는지 확인할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- 6. AI Tools --&gt;
&lt;div id=&quot;ai&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Expo 개발자를 위한 AI 도구 확장&lt;/h2&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MCP: CLI 액션 및 EAS 서비스 연동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Expo 모듈이 Expo CLI에 플러그인과 명령어를 노출하면, &lt;code&gt;[SHIFT] + M&lt;/code&gt; 메뉴에서 이 액션들을 &lt;b&gt;Expo MCP 서버&lt;/b&gt;에 자동으로 설치할 수 있게 되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MCP를 통해 EAS에 질의 가능 &amp;mdash; &quot;최근 빌드가 왜 실패했나요?&quot; 같은 질문을 AI에게 직접 물어볼 수 있습니다.&lt;/li&gt;
&lt;li&gt;TestFlight 크래시 리포트와 피드백도 조회 가능 (ASC 키가 Expo 계정에 연결된 경우).&lt;/li&gt;
&lt;li&gt;예: &quot;TestFlight에서 최근 크래시 리포트와 피드백을 분석해줘&quot; &amp;rarr; AI가 자동으로 조사.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Agent Skills&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: var(--accent);&quot; href=&quot;https://github.com/expo/skills&quot;&gt;expo/skills&lt;/a&gt; 저장소는 Expo 앱 빌드&amp;middot;배포&amp;middot;디버깅을 위한 공식 AI 에이전트 스킬 컬렉션입니다. 주로 Claude Code와 함께 사용하며, Opus 모델에 최적화되어 있지만 모든 AI 에이전트에서 사용 가능합니다.&lt;/p&gt;
&lt;div class=&quot;highlight-box&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;업그레이드 스킬&lt;/b&gt;도 포함되어 있어 SDK 55로 업그레이드할 때 도움이 됩니다. 커뮤니티에서 만든 유사 스킬들이 많지만, &lt;b&gt;Expo 팀이 공식적으로 관리하는 스킬은 expo/skills 저장소의 것뿐&lt;/b&gt;임을 주의하세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 7. Brownfield --&gt;
&lt;div id=&quot;brownfield&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;Brownfield&quot; &amp;mdash; 기존 네이티브 앱에 Expo 추가&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 55는 Brownfield 앱 지원을 개선하고, 새로운 &lt;code&gt;expo-brownfield&lt;/code&gt; 패키지를 통해 &lt;b&gt;격리된(isolated) 방식&lt;/b&gt;의 통합을 도입합니다.&lt;/p&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;  통합 방식 (Integrated)&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native 코드가 기존 네이티브 프로젝트 내부에 위치. 양쪽을 함께 개발하는 팀에 적합.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;  격리 방식 (Isolated)&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native 앱을 네이티브 라이브러리(AAR/XCFramework)로 패키징. Node.js 환경 없이 네이티브 개발자가 사용 가능.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;config 플러그인, 아티팩트 빌드용 CLI, 네이티브 &amp;harr; Expo 앱 간 양방향 메시징 API가 포함됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- 8. Expo Router --&gt;
&lt;div id=&quot;router&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Expo Router 네이티브 기능 강화&lt;/h2&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;&lt;span class=&quot;tag tag-new&quot;&gt;NEW&lt;/span&gt; Colors API&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android에 동적 Material 3 스타일, iOS에 적응형 색상을 적용. 앱 색상이 OS 테마에 자동으로 맞춰집니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;&lt;span class=&quot;tag tag-new&quot;&gt;NEW&lt;/span&gt; Apple Zoom 트랜지션&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS에서 네이티브 줌 트랜지션과 제스처를 사용한 인터랙티브 공유 요소 전환 지원. 현재 iOS 전용이며 기본 활성화.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;&lt;span class=&quot;tag tag-new&quot;&gt;NEW&lt;/span&gt; Stack.Toolbar API&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS 앱을 위한 &lt;code&gt;UIToolbar&lt;/code&gt; API. 화면 하단 버튼으로 메뉴/액션을 수행할 때 탭 대안으로 유용. 현재 iOS 전용.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;&lt;span class=&quot;tag tag-new&quot;&gt;NEW&lt;/span&gt; SplitView 지원 (실험적)&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native에서 오랫동안 기다려온 SplitView 레이아웃 지원. 현재 실험적 단계.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;&lt;span class=&quot;tag tag-new&quot;&gt;NEW&lt;/span&gt; Android Form Sheet 푸터 (실험적)&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android 모달 시트에 액션 버튼이나 확인 프롬프트를 위한 푸터 추가 가능.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;✅ 기타 개선 사항&lt;/div&gt;
&lt;ul style=&quot;margin-top: 8px; margin-bottom: 0;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;iOS/Android native-tabs 레이아웃에서 safe area 자동 처리 &amp;mdash; 더 이상 수동 inset 처리 불필요&lt;/li&gt;
&lt;li&gt;화면 동기 레이아웃 업데이트 기본 활성화 &amp;mdash; 네비게이션 전환 시 레이아웃 점프 감소&lt;/li&gt;
&lt;li&gt;iOS 26+: Form Sheet 헤더가 자동으로 Liquid Glass 디자인 언어 채택&lt;/li&gt;
&lt;li&gt;Native tabs 및 헤더에서 Xcasset 아이콘 지원&lt;/li&gt;
&lt;li&gt;&lt;code&gt;react-native-screens&lt;/code&gt; 4.23.0으로 업그레이드&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 9. Expo UI --&gt;
&lt;div id=&quot;ui&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Expo UI (2026년 중반 안정화 목표)&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 중반 안정 버전 출시를 목표로, SDK 55에서 기능이 크게 개선되었습니다. SwiftUI와 Jetpack Compose를 위한 스킬도 &lt;a style=&quot;color: var(--accent);&quot; href=&quot;https://github.com/expo/skills&quot;&gt;expo/skills&lt;/a&gt;에 추가되었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Jetpack Compose &lt;span class=&quot;tag tag-beta&quot;&gt;Beta&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Alpha에서 &lt;b&gt;Beta로 승격&lt;/b&gt;되었습니다. 테스트 케이스로 WikiReader 클론 앱(&lt;code&gt;expo/wiki-reader&lt;/code&gt;)이 제작되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;함수형 DSL 패턴으로 전환&lt;/b&gt;: 클래스 기반에서 &lt;code&gt;View(&quot;MyView&quot;) { props -&amp;gt; }&lt;/code&gt; 형태로 변경&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새 Material3 컴포넌트 다수 추가&lt;/b&gt;: &lt;code&gt;Card&lt;/code&gt;, &lt;code&gt;LazyColumn&lt;/code&gt;, &lt;code&gt;ListItem&lt;/code&gt;, &lt;code&gt;PullToRefreshBox&lt;/code&gt;, &lt;code&gt;FlowRow&lt;/code&gt;, &lt;code&gt;Surface&lt;/code&gt;, &lt;code&gt;Icon&lt;/code&gt;, &lt;code&gt;DockedSearchBar&lt;/code&gt;, &lt;code&gt;FilterChip&lt;/code&gt;, &lt;code&gt;ToggleButton&lt;/code&gt;, &lt;code&gt;RadioButton&lt;/code&gt;, &lt;code&gt;ModalBottomSheet&lt;/code&gt;, &lt;code&gt;Carousel&lt;/code&gt;, &lt;code&gt;IconButton&lt;/code&gt;, 웨이브 프로그레스 인디케이터&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Modifier 지원&lt;/b&gt;: SwiftUI 스타일 modifier를 Compose 컴포넌트에 적용 가능. 예: &lt;code&gt;&amp;lt;Box modifiers={[size(100,100), background(...)]} /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;&amp;lt;Icon&amp;gt;&lt;/code&gt; 컴포넌트&lt;/b&gt;: Material Symbols XML 벡터 드로어블을 네이티브로 렌더링&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Host.colorScheme&lt;/code&gt;으로 동적 테마 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SwiftUI &lt;span class=&quot;tag tag-beta&quot;&gt;Beta&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SwiftUI 관행에 더 가깝게 API가 업데이트되었습니다. &lt;b&gt;Breaking Changes 포함&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;API 이름 변경&lt;/b&gt;: &lt;code&gt;DateTimePicker&lt;/code&gt; &amp;rarr; &lt;code&gt;DatePicker&lt;/code&gt;, &lt;code&gt;Switch&lt;/code&gt; &amp;rarr; &lt;code&gt;Toggle&lt;/code&gt;, &lt;code&gt;CircularProgress&lt;/code&gt;/&lt;code&gt;LinearProgress&lt;/code&gt; &amp;rarr; &lt;code&gt;ProgressView&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새 컴포넌트&lt;/b&gt;: &lt;code&gt;ConfirmationDialog&lt;/code&gt;, &lt;code&gt;ScrollView&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새 Modifier&lt;/b&gt;: &lt;code&gt;contentShape()&lt;/code&gt;, &lt;code&gt;monospacedDigit&lt;/code&gt;, &lt;code&gt;scaleEffect&lt;/code&gt;(축별), &lt;code&gt;ignoreSafeArea&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Text&lt;/code&gt; 컴포넌트에서 &lt;b&gt;Markdown 지원&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커스텀 SwiftUI 뷰&amp;middot;modifier 지원&lt;/b&gt; &amp;mdash; 직접 컴포넌트와 modifier를 확장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- 10. Versioning --&gt;
&lt;div id=&quot;versioning&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;새로운 Expo SDK 패키지 버전 체계&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 55부터, &lt;b&gt;모든 Expo SDK 패키지의 메이저 버전이 SDK 버전과 동일&lt;/b&gt;하게 맞춰집니다.&lt;/p&gt;
&lt;div class=&quot;highlight-box&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예: SDK 55와 호환되는 &lt;code&gt;expo-camera&lt;/code&gt;의 버전은 &lt;code&gt;^55.0.0&lt;/code&gt;입니다. 패키지 버전만 봐도 어떤 SDK 버전용인지 한눈에 알 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;stat-grid&quot;&gt;
&lt;div class=&quot;stat-card&quot;&gt;
&lt;div class=&quot;stat-num&quot;&gt;55&lt;/div&gt;
&lt;div class=&quot;stat-label&quot;&gt;Modules&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;stat-card&quot;&gt;
&lt;div class=&quot;stat-num&quot;&gt;55&lt;/div&gt;
&lt;div class=&quot;stat-label&quot;&gt;CLIs&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;stat-card&quot;&gt;
&lt;div class=&quot;stat-num&quot;&gt;55&lt;/div&gt;
&lt;div class=&quot;stat-label&quot;&gt;Updates&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;stat-card&quot;&gt;
&lt;div class=&quot;stat-num&quot;&gt;55&lt;/div&gt;
&lt;div class=&quot;stat-label&quot;&gt;Builds&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 11. Modules Core --&gt;
&lt;div id=&quot;modules&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Expo Modules Core&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS와 Android 모두를 위한 통합 네이티브 모듈 빌드 기반입니다. SDK 55에서의 개선 사항:&lt;/p&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;Swift 6 언어 모드 채택&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이티브 모듈 유지 관리자라면, 이제 코드의 데이터 레이스가 컴파일 타임에 검사되어 스레드 안전성 보장이 강화됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;ArrayBuffer 지원 추가&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript와 네이티브 코드 간에 바이너리 데이터(오디오, 이미지, 파일 등)를 효율적으로 전송할 수 있게 됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;StaticFunction / StaticAsyncFunction 추가&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈 API의 Class에서 인스턴스 생성 없이 함수를 직접 호출할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 12. CLI --&gt;
&lt;div id=&quot;cli&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Expo CLI 개선 사항&lt;/h2&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개발 서버 시작 화면 개선&lt;/b&gt;: 작은 터미널에서 QR 코드가 잘리지 않도록 최적화. Alacritty, Ghostty, Kitty, Windows Terminal에서 소형 QR 코드 지원.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경 파일 지원(@expo/env)&lt;/b&gt;: Node.js의 빌트인 &lt;code&gt;parseEnv&lt;/code&gt;를 사용하도록 업데이트.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발 빌드에서 첫 로컬 네트워크 접근 안정화&lt;/b&gt;: iOS + expo-dev-client에 Apple Bonjour 지원 추가. iOS 첫 실행 시 개발 서버 연결 실패 문제 해결.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;동적 앱 설정 로딩 개선&lt;/b&gt;: &lt;code&gt;app.config.js&lt;/code&gt; 등 동적 설정 파일 로딩이 Node.js 모듈 로딩과 맞춰졌습니다. &lt;code&gt;.mjs&lt;/code&gt;, &lt;code&gt;.cjs&lt;/code&gt;, &lt;code&gt;.cts&lt;/code&gt;, &lt;code&gt;.mts&lt;/code&gt; 확장자 실험적 지원.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새 Log Box 실험적 지원&lt;/b&gt;: 웹에서는 기본 활성화. 모바일 개발 시 &lt;code&gt;EXPO_UNSTABLE_LOG_BOX=1&lt;/code&gt; 설정 후 네이티브 재빌드하면 사용 가능 (Expo Go 미지원).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- 13. expo-widgets --&gt;
&lt;div id=&quot;widgets&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;expo-widgets iOS 알파 릴리즈&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;tag tag-alpha&quot;&gt;Alpha&lt;/span&gt; &lt;code&gt;expo-widgets&lt;/code&gt;를 사용하면 &lt;b&gt;네이티브 코드 없이 Expo UI 컴포넌트만으로 iOS 홈 화면 위젯과 Live Activities를 만들&lt;/b&gt;을 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위젯 타임라인 생성&amp;middot;업데이트 API&lt;/li&gt;
&lt;li&gt;Live Activities 시작&amp;middot;관리&lt;/li&gt;
&lt;li&gt;Push-to-start 토큰 수신 대기&lt;/li&gt;
&lt;li&gt;레이아웃은 &lt;code&gt;@expo/ui&lt;/code&gt; SwiftUI 컴포넌트와 modifier로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- 14. expo-blur --&gt;
&lt;div id=&quot;blur&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;expo-blur Android 안정화&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Android 개발자들의 오랜 고민이었던 배경 블러가 드디어 &lt;b&gt;안정화&lt;/b&gt;되었습니다. SDK 55부터 &lt;code&gt;expo-blur&lt;/code&gt;는 Android 12 이상에서 훨씬 효율적인 &lt;b&gt;RenderNode API&lt;/b&gt;를 사용하여 낮은 성능 비용으로 배경 블러를 적용합니다.&lt;/p&gt;
&lt;div class=&quot;warning-box&quot;&gt;
&lt;div class=&quot;icon&quot;&gt; &lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마이그레이션 필요:&lt;/b&gt; 블러 가능한 배경 콘텐츠를 &lt;code&gt;&amp;lt;BlurTargetView&amp;gt;&lt;/code&gt; 래퍼로 감싸야 합니다. 기존 API는 하위 호환을 유지하므로 즉시 마이그레이션이 필요하지는 않습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 15. expo-sharing --&gt;
&lt;div id=&quot;sharing&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;expo-sharing &amp;mdash; 공유 데이터 수신 기능 (실험적)&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;tag tag-new&quot;&gt;NEW&lt;/span&gt; 오랫동안 요청되어온 기능: 다른 앱에서 Expo 앱으로 데이터를 &lt;b&gt;공유받을 수 있는&lt;/b&gt; 기능이 추가되었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;iOS: config 플러그인이 &lt;code&gt;share-extension&lt;/code&gt; 앱 타겟 추가&lt;/li&gt;
&lt;li&gt;Android: 적절한 intent-filter 추가&lt;/li&gt;
&lt;li&gt;공유 요청은 deep link를 통해 JavaScript에서 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 55에서는 실험적(experimental) 단계로 표시됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;!-- 16. Other Highlights --&gt;
&lt;div id=&quot;other&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt;✨&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기타 주요 업데이트&lt;/h2&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;Expo Go&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;UI가 완전히 개선되어 SDK 54의 expo-dev-client 변경사항과 일치, Hermes 디버깅 경험 향상.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;Expo Web&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;에러 오버레이 재작성, 서버 사이드 렌더링 알파 지원, 실험적 데이터 로더 출시.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-contacts/next&lt;br /&gt;expo-media-library/next&lt;br /&gt;expo-calendar/next&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;SharedObjects를 활용한 새 객체지향 API로 연락처, 이벤트, 미디어를 더 쉽게 관리. 더 강력한 쿼리 기능 추가.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-notifications&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;최신 Android Firebase 알림 의존성 업데이트. 백그라운드 작업 미실행, Android 11/12 크래시, FCM intent 검증, 커스텀 사운드 유효성 검사 등 주요 버그 수정.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-audio&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;잠금화면 컨트롤, 배경 녹음, 모든 플랫폼 플레이리스트 지원, 네이티브 프리로딩, Android 포그라운드 서비스 개선, iOS &lt;code&gt;shouldRouteThroughEarpiece&lt;/code&gt;, 웹 지원 확대 (미터링, 녹음 입력 선택, 미디어 컨트롤).&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-sqlite&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;새 SQLite Inspector DevTools 플러그인으로 실시간 DB 조회 가능. 타입 안전 파라미터 바인딩을 위한 태그드 템플릿 리터럴 API 추가: &lt;code&gt;await db.sql`SELECT * FROM users WHERE age &amp;gt; ${age}`&lt;/code&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-crypto&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;AES-GCM 암호화 및 복호화 지원 추가.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-camera&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;녹화 시 영상 안정화 모드, Android 전면 카메라 스크린 플래시 추가. 앱 크기 절감을 위한 바코드 스캐너 API 제외 옵션 추가.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-web-browser&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;auth universal links 콜백 지원 추가. 앱이 백그라운드 전환 후 브라우저가 닫히는 Android 문제 수정.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-video&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;&lt;code&gt;seekTolerance&lt;/code&gt;, &lt;code&gt;scrubbingModeOptions&lt;/code&gt; 추가로 스크러빙 성능 향상. Android Picture-in-Picture 개선 (다중 VideoView 지원). 오디오&amp;middot;자막 트랙에 &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;isDefault&lt;/code&gt;, &lt;code&gt;autoSelect&lt;/code&gt; 필드 추가.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-image&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;iOS HDR 이미지 지원, SF Symbols 렌더링 가능, Android 쿠키 지원 (인증된 이미지 요청).&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-server&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;SDK 54 주기에 &lt;code&gt;@expo/server&lt;/code&gt;를 대체하는 새 패키지. 다양한 서버 환경과 호스팅 제공자용 어댑터 제공.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-file-system&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;파일에 데이터를 추가(append)하기 위한 쓰기 메서드에 append 옵션 추가.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-location&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;iOS 권한 응답에 정확도 인증(accuracy authorization) 포함 &amp;mdash; 사용자가 전체 정확도 또는 제한 정확도를 허용했는지 확인 가능.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;expo-maps&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;iOS Apple Maps에서 UI 스타일 옵션 추가 &amp;mdash; 시스템 설정과 무관하게 라이트/다크 지도 모드 강제 설정 가능.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;pkg-row&quot;&gt;
&lt;div class=&quot;pkg-name&quot;&gt;create-expo-module&lt;/div&gt;
&lt;div class=&quot;pkg-desc&quot;&gt;비대화형 모드 지원 추가 &amp;mdash; AI 에이전트 및 CI 파이프라인에서 인터랙티브 프롬프트 없이 모듈 스캐폴딩 가능.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;warning-box&quot; style=&quot;margin-top: 20px;&quot;&gt;
&lt;div class=&quot;icon&quot;&gt; &lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;최소 iOS 버전 예고:&lt;/b&gt; SDK 56에서 최소 iOS 버전이 15.1 &amp;rarr; &lt;b&gt;16.4&lt;/b&gt;로 상향 예정. SDK 55의 최소 iOS 버전은 여전히 15.1입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 17. Deprecations --&gt;
&lt;div id=&quot;deprecations&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt;⚠️&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Deprecations (지원 중단 예정)&lt;/h2&gt;
&lt;/div&gt;
&lt;ul class=&quot;dep-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;여러 Expo 모듈의 &lt;code&gt;removeSubscription&lt;/code&gt; 함수 deprecated&lt;/b&gt; &amp;mdash; &lt;code&gt;subscription.remove()&lt;/code&gt; 사용으로 전환.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-video-thumbnails&lt;/code&gt; deprecated&lt;/b&gt; &amp;mdash; &lt;code&gt;expo-video&lt;/code&gt;의 &lt;code&gt;generateThumbnailsAsync&lt;/code&gt;로 대체. SDK 56에서 삭제 예정, 패치 미제공.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-video&lt;/code&gt;의 &lt;code&gt;bitrate&lt;/code&gt; 필드 deprecated&lt;/b&gt; &amp;mdash; &lt;code&gt;averageBitrate&lt;/code&gt;, &lt;code&gt;peakBitrate&lt;/code&gt; 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-navigation-bar&lt;/code&gt; 대부분 메서드 deprecated&lt;/b&gt; &amp;mdash; Android 엣지-투-엣지 의무화로 배경색, 테두리색, 동작, 위치, 버튼 스타일 API 모두 no-op. app.json의 &lt;code&gt;androidNavigationBar&lt;/code&gt; 설정도 deprecated.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-status-bar&lt;/code&gt;의 &lt;code&gt;backgroundColor&lt;/code&gt;, &lt;code&gt;translucent&lt;/code&gt;, &lt;code&gt;networkActivityIndicatorVisible&lt;/code&gt; deprecated&lt;/b&gt; &amp;mdash; 엣지-투-엣지 적용으로 no-op. app.json의 &lt;code&gt;androidStatusBar.backgroundColor&lt;/code&gt;, &lt;code&gt;androidStatusBar.translucent&lt;/code&gt;도 deprecated.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- 18. Breaking Changes --&gt;
&lt;div id=&quot;breaking&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 Breaking Changes&lt;/h2&gt;
&lt;/div&gt;
&lt;ul class=&quot;breaking-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;app.json의 &lt;code&gt;notification&lt;/code&gt; 설정 필드 제거&lt;/b&gt; &amp;mdash; &lt;code&gt;prebuild&lt;/code&gt; 시 에러 발생. &lt;code&gt;expo-notifications&lt;/code&gt; config 플러그인으로 마이그레이션 필요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Expo Go Android에서 푸시 알림 사용 시 에러 발생&lt;/b&gt; (이전: 경고). 푸시 알림 사용을 위해서는 Development Build로 마이그레이션 필요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;앱 설정 평가 툴체인 변경&lt;/b&gt; &amp;mdash; &lt;code&gt;app.config.ts&lt;/code&gt;가 이제 내부 도구 대신 설치된 TypeScript로 트랜스파일됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;eas update&lt;/code&gt;에 &lt;code&gt;--environment&lt;/code&gt; 플래그 필수&lt;/b&gt; &amp;mdash; CI에서 사용 시 반드시 플래그 추가.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-av&lt;/code&gt; Expo Go에서 제거&lt;/b&gt; &amp;mdash; &lt;code&gt;expo-video&lt;/code&gt;, &lt;code&gt;expo-audio&lt;/code&gt;로 대체되었으며, 더 이상 패치를 받지 않음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-video&lt;/code&gt;: &lt;code&gt;allowsFullscreen&lt;/code&gt; prop 제거&lt;/b&gt; &amp;mdash; &lt;code&gt;fullscreenOptions.enable&lt;/code&gt; 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-clipboard&lt;/code&gt;: 이벤트 리스너의 &lt;code&gt;content&lt;/code&gt; 프로퍼티 제거&lt;/b&gt; &amp;mdash; &lt;code&gt;getStringAsync()&lt;/code&gt; 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-cellular&lt;/code&gt;: 사업자 관련 상수 제거&lt;/b&gt; &amp;mdash; iOS 메서드는 이제 &lt;code&gt;null&lt;/code&gt; 반환.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-router&lt;/code&gt;: &lt;code&gt;ExpoRequest&lt;/code&gt;, &lt;code&gt;ExpoResponse&lt;/code&gt; 타입 제거&lt;/b&gt; &amp;mdash; 표준 &lt;code&gt;Request&lt;/code&gt;/&lt;code&gt;Response&lt;/code&gt; 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;app.json에서 &lt;code&gt;edgeToEdgeEnabled&lt;/code&gt; 제거&lt;/b&gt; &amp;mdash; Android 16+ 타겟 시 엣지-투-엣지 의무화.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-router&lt;/code&gt;: headless tabs의 &lt;code&gt;reset&lt;/code&gt; prop &amp;rarr; &lt;code&gt;resetOnFocus&lt;/code&gt;로 이름 변경.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;expo-blur&lt;/code&gt;: &lt;code&gt;experimentalBlurMethod&lt;/code&gt; &amp;rarr; &lt;code&gt;blurMethod&lt;/code&gt;로 이름 변경.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모노레포에서 &lt;code&gt;expo.experiments.autolinkingModuleResolution&lt;/code&gt; 기본 활성화.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빠른 리졸버와 &lt;code&gt;EXPO_USE_FAST_RESOLVER&lt;/code&gt; 환경 변수 제거&lt;/b&gt; &amp;mdash; 이제 리졸버 구현이 하나뿐이며 별도 설정 불필요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;experiments.reactCanary&lt;/code&gt; 플래그 제거&lt;/b&gt; &amp;mdash; React 19가 기본값이 되어 플래그 불필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;!-- 19. Tool version bumps --&gt;
&lt;div id=&quot;tools&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;도구 버전 변경&lt;/h2&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;최소 Xcode 버전: 26&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EAS Build는 SDK 55의 경우 기본적으로 Xcode 26.2를 사용합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;div class=&quot;card-title&quot;&gt;최소 Node.js 버전 상향&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDK 55에서 지원되는 Node.js 버전: &lt;code&gt;^20.19.4&lt;/code&gt;, &lt;code&gt;^22.13.0&lt;/code&gt;, &lt;code&gt;^24.3.0&lt;/code&gt;, &lt;code&gt;^25.0.0&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;!-- 20. Upgrade Guide --&gt;
&lt;div id=&quot;upgrade&quot; class=&quot;section&quot;&gt;
&lt;div class=&quot;section-header&quot;&gt;
&lt;div class=&quot;section-icon&quot;&gt; &lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SDK 55 업그레이드 가이드&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Claude Code 또는 &lt;a style=&quot;color: var(--accent);&quot; href=&quot;https://github.com/expo/skills/tree/main/plugins/upgrading-expo&quot;&gt;업그레이드 스킬&lt;/a&gt;을 활용하는 것을 권장합니다.&lt;/p&gt;
&lt;div class=&quot;upgrade-step&quot;&gt;
&lt;div class=&quot;step-num&quot;&gt;1&lt;/div&gt;
&lt;div class=&quot;step-body&quot;&gt;&lt;b&gt;모든 의존성을 SDK 55에 맞게 업그레이드&lt;/b&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;margin-top: 8px;&quot;&gt;&lt;code&gt;npx expo install expo@^55.0.0 --fix&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;upgrade-step&quot;&gt;
&lt;div class=&quot;step-num&quot;&gt;2&lt;/div&gt;
&lt;div class=&quot;step-body&quot;&gt;&lt;b&gt;Expo Doctor로 알려진 문제 확인&lt;/b&gt;
&lt;pre class=&quot;nginx&quot; style=&quot;margin-top: 8px;&quot;&gt;&lt;code&gt;npx expo-doctor@latest&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;margin-top: 8px; font-size: 14px;&quot; data-ke-size=&quot;size16&quot;&gt;중복 네이티브 모듈 경고가 보이면 가이드를 따라 해결하세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;upgrade-step&quot;&gt;
&lt;div class=&quot;step-num&quot;&gt;3&lt;/div&gt;
&lt;div class=&quot;step-body&quot;&gt;&lt;b&gt;Deprecations 및 Breaking Changes 검토&lt;/b&gt;
&lt;p style=&quot;margin-top: 6px; font-size: 14px;&quot; data-ke-size=&quot;size16&quot;&gt;위의 두 섹션을 반드시 확인하고, 전체 목록은 &lt;a style=&quot;color: var(--accent);&quot; href=&quot;https://github.com/expo/expo/blob/main/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt;를 참고하세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;upgrade-step&quot;&gt;
&lt;div class=&quot;step-num&quot;&gt;4&lt;/div&gt;
&lt;div class=&quot;step-body&quot;&gt;&lt;b&gt;Xcode 26 업그레이드 확인&lt;/b&gt;
&lt;p style=&quot;margin-top: 6px; font-size: 14px;&quot; data-ke-size=&quot;size16&quot;&gt;iOS 네이티브 프로젝트 컴파일에 Xcode 26이 필요합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;upgrade-step&quot;&gt;
&lt;div class=&quot;step-num&quot;&gt;5&lt;/div&gt;
&lt;div class=&quot;step-body&quot;&gt;&lt;b&gt;CNG(Continuous Native Generation) 사용자&lt;/b&gt;
&lt;p style=&quot;margin-top: 6px; font-size: 14px;&quot; data-ke-size=&quot;size16&quot;&gt;이전 SDK 버전으로 생성된 &lt;code&gt;android&lt;/code&gt;, &lt;code&gt;ios&lt;/code&gt; 디렉터리를 삭제하세요. 다음 빌드 시 자동으로 재생성됩니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;upgrade-step&quot;&gt;
&lt;div class=&quot;step-num&quot;&gt;6&lt;/div&gt;
&lt;div class=&quot;step-body&quot;&gt;&lt;b&gt;Development Build 사용자&lt;/b&gt;
&lt;p style=&quot;margin-top: 6px; font-size: 14px;&quot; data-ke-size=&quot;size16&quot;&gt;업그레이드 후 새 Development Build를 생성하세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;warning-box&quot; style=&quot;margin-top: 16px;&quot;&gt;
&lt;div class=&quot;icon&quot;&gt; &lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 있으면 &lt;a style=&quot;color: var(--accent);&quot; href=&quot;https://expo.fyi/troubleshooting-sdk-upgrades&quot;&gt;업그레이드 트러블슈팅 가이드&lt;/a&gt;를 참고하거나, 매주 수요일 오후 12시(태평양 시간) &lt;a style=&quot;color: var(--accent);&quot; href=&quot;https://chat.expo.dev/&quot;&gt;Discord 오피스 아워&lt;/a&gt;에 참여하세요.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;footer&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원문: &lt;a href=&quot;https://expo.dev/changelog/sdk-55&quot;&gt;expo.dev/changelog/sdk-55&lt;/a&gt; &amp;middot; 번역: 블로그용 한국어 정리&lt;/p&gt;
&lt;p style=&quot;margin-top: 8px; color: #475569;&quot; data-ke-size=&quot;size16&quot;&gt;Copyright &amp;copy; 2026 650 Industries, Inc. All rights reserved.&lt;/p&gt;
&lt;/footer&gt;</description>
      <category>REACT &amp;amp; NODE</category>
      <category>Android</category>
      <category>eas</category>
      <category>Expo</category>
      <category>Expo Router</category>
      <category>Expo SDK 55</category>
      <category>Hermes</category>
      <category>ios</category>
      <category>React Native</category>
      <category>릴리즈 노트</category>
      <category>모바일 개발</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/202</guid>
      <comments>https://thewavelet.tistory.com/202#entry202comment</comments>
      <pubDate>Tue, 31 Mar 2026 14:50:30 +0900</pubDate>
    </item>
    <item>
      <title>한의원 추나요법, 건강보험에 실비까지 된다고요? 직접 받아보고 비용 다 정리했습니다</title>
      <link>https://thewavelet.tistory.com/201</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허리 디스크 진단받고 나서 정형외과 물리치료만 계속 다녔어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가도 가도 별로 나아지는 게 없고, 도수치료는 회당 5~8만 원씩 하니까 부담이 너무 크더라고요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다 지인 추천으로 한의원 추나요법을 받아봤는데, 이게 건강보험도 되고 실비보험 청구까지 된다는 걸 그때 처음 알았어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 비싼 비급여일 거라 생각해서 아예 알아볼 생각도 안 했거든요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르면 진짜 손해인 내용들, 직접 겪어보고 알게 된 거 전부 정리해드릴게요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추나요법, 건강보험 급여 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2019년 4월부터 추나요법이 건강보험 급여 항목으로 지정됐어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허리 디스크, 목 디스크, 척추관협착증, 골반 틀어짐, 각종 근골격계 질환이 있는 분들은 누구나 건강보험 적용을 받을 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전엔 추나 받으면 전액 본인 부담이었는데 이제는 건강보험이 절반 이상을 커버해줘요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;추나요법 종류별 가격 (2026년 기준)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추나요법은 종류에 따라 총 수가와 본인부담금이 달라요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종류 총 수가 공단부담금 본인부담금 본인부담률&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단순추나&lt;/td&gt;
&lt;td&gt;26,330원&lt;/td&gt;
&lt;td&gt;13,165원&lt;/td&gt;
&lt;td&gt;13,165원&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복잡추나 (디스크&amp;middot;협착증)&lt;/td&gt;
&lt;td&gt;44,450원&lt;/td&gt;
&lt;td&gt;22,225원&lt;/td&gt;
&lt;td&gt;22,225원&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;복잡추나 (기타 근골격계)&lt;/td&gt;
&lt;td&gt;44,450원&lt;/td&gt;
&lt;td&gt;8,890원&lt;/td&gt;
&lt;td&gt;35,560원&lt;/td&gt;
&lt;td&gt;&lt;b&gt;80%&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡추나 중에서도 &lt;b&gt;디스크&amp;middot;협착증은 50% 부담&lt;/b&gt;, 그 외 근골격계 질환은 &lt;b&gt;80% 부담&lt;/b&gt;이라는 게 핵심이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정형외과 도수치료 회당 5~8만 원이랑 비교하면 훨씬 저렴하죠?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연간 20회 급여 &amp;ndash; 이게 핵심 포인트예요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추나요법 건강보험은 &lt;b&gt;연간 20회&lt;/b&gt;까지 적용돼요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주 1~2회씩 받으면 2~5개월 정도 건강보험으로 커버할 수 있어요. 초기 집중 치료 기간에 딱 맞아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 건강보험 급여 추나의 경우 한의사 1인이 하루에 진료할 수 있는 인원이 &lt;b&gt;18명&lt;/b&gt;으로 제한되어 있어요. 다만 비급여로 자비 부담해서 받는 추나는 이 카운팅에 포함되지 않아요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;20회 다 쓰고 나서도 계속 받을 수 있어요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;급여 20회 소진 후엔 추나가 비급여로 전환되는데, 한의원마다 다르지만 &lt;b&gt;단순추나 기준 2~4만 원대&lt;/b&gt;로 이어받을 수 있는 곳이 많아요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정형외과 도수치료의 절반도 안 되는 가격이에요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;침&amp;middot;부항&amp;middot;전기치료는 추나와 완전히 별개로 건강보험 급여가 계속 적용돼요.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;치료 항목 급여 여부 비고&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;침&lt;/td&gt;
&lt;td&gt;급여 (횟수 제한 없음)&lt;/td&gt;
&lt;td&gt;소액 본인부담&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;뜸&lt;/td&gt;
&lt;td&gt;급여&lt;/td&gt;
&lt;td&gt;소액 본인부담&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;부항&lt;/td&gt;
&lt;td&gt;급여&lt;/td&gt;
&lt;td&gt;소액 본인부담&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;전기치료 (저주파&amp;middot;초음파)&lt;/td&gt;
&lt;td&gt;급여&lt;/td&gt;
&lt;td&gt;소액 본인부담&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추나요법&lt;/td&gt;
&lt;td&gt;급여 (연 20회)&lt;/td&gt;
&lt;td&gt;13,165~35,560원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추나요법 (20회 초과)&lt;/td&gt;
&lt;td&gt;비급여&lt;/td&gt;
&lt;td&gt;한의원마다 상이&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;여기서부터가 진짜 핵심 &amp;ndash; 실비보험까지 됩니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한의원 치료는 실비보험이 안 된다고 알고 계신 분들 많으시죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저도 그렇게 알았는데, &lt;b&gt;됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추나요법이 2019년에 급여 항목으로 바뀌면서 실비보험 청구도 가능해졌어요. 침&amp;middot;부항&amp;middot;전기치료도 마찬가지예요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실비 적용 구조 &amp;ndash; 이게 진짜 포인트예요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실비보험은 &lt;b&gt;그날 한의원에서 발생한 급여 항목 본인부담금 전체 합산액&lt;/b&gt;에서 &lt;b&gt;1만 원을 공제한 나머지를 환급&lt;/b&gt;해줘요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 추나만 따로 계산하는 게 아니라 &lt;b&gt;추나 + 침 + 부항 + 전기치료 본인부담금을 다 합친 금액&lt;/b&gt;에서 1만 원 빼고 돌려받는 구조예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 단순추나 + 침 + 부항 + 전기치료를 같이 받은 날 본인부담금 합산이 18,000원이면, 실비로 &lt;b&gt;8,000원 환급&lt;/b&gt; &amp;rarr; 실질 부담 &lt;b&gt;1만 원&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡추나(디스크&amp;middot;협착증)를 받은 날은 추나 본인부담금 22,225원에 침&amp;middot;부항 등을 더한 합산액에서 1만 원 공제 후 나머지 &lt;b&gt;대부분을 환급&lt;/b&gt; 받을 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, &lt;b&gt;질병이나 사고 치료 목적&lt;/b&gt;이어야 해요. 미용&amp;middot;다이어트 목적의 치료는 실비 청구 불가예요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실비보험 세대별로 보장이 달라요 &amp;ndash; 꼭 확인하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실비보험은 가입 시기(세대)에 따라 보장 범위가 달라요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세대 가입 시기 추나 실비 보장&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1세대&lt;/td&gt;
&lt;td&gt;~2009년 9월&lt;/td&gt;
&lt;td&gt;보장 범위 가장 넓음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2세대&lt;/td&gt;
&lt;td&gt;2009년 10월~2017년 3월&lt;/td&gt;
&lt;td&gt;가입 약관에 따라 다름, 확인 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3세대&lt;/td&gt;
&lt;td&gt;2017년 4월~2021년 6월&lt;/td&gt;
&lt;td&gt;급여 항목 실비 가능, 특약 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4세대&lt;/td&gt;
&lt;td&gt;2021년 7월~&lt;/td&gt;
&lt;td&gt;급여 항목 실비 가능, 사용량 따라 할증 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 건 &lt;b&gt;내 보험이 몇 세대인지 먼저 확인&lt;/b&gt;하는 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보험사 앱이나 고객센터에 전화해서 &quot;추나요법 실비 청구 가능한지&quot; 딱 한 번만 물어보면 돼요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실비보험 청구 방법 &amp;ndash; 어렵지 않아요&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;준비 서류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의료비 규모 필요 서류&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10만 원 이하&lt;/td&gt;
&lt;td&gt;진료비 영수증, 진료비 세부내역서, 보험금 청구서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10만 원 초과&lt;/td&gt;
&lt;td&gt;위 서류 + 진단서 또는 진료확인서&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서류는 한의원에서 다 발급해줘요. &quot;실비 청구용 서류 일체 주세요&quot;라고 하면 바로 챙겨줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;청구 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보험사 모바일 앱, 홈페이지, 팩스, 우편, 지점 방문 중 편한 방법으로 하면 돼요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;청구 기한&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;치료 후 &lt;b&gt;3년 이내&lt;/b&gt;에 청구하면 돼요. 예전에 받은 치료도 영수증만 있으면 소급 청구 가능한 경우가 있으니 챙겨보세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실비 청구 때 이것만 주의하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;과거에 &quot;한의원 추나는 실비 안 된다&quot;고 들으셨던 분들&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2019년 이후로 급여 항목이 됐기 때문에 이제는 달라졌어요. 예전 보험이라도 한번 더 확인해보세요. 보험 설계사도 헷갈리는 경우가 있어서 직접 보험사 고객센터에 확인하는 게 가장 정확해요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;급여 20회 초과 비급여 추나&lt;/b&gt;는 실비 청구가 까다로울 수 있어요. 이 부분은 가입한 보험 약관을 꼭 확인해보세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이런 분들이라면 지금 바로 알아보세요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;허리 디스크, 목 디스크로 오래 고생하고 있는 분&lt;/li&gt;
&lt;li&gt;정형외과 도수치료비가 너무 부담스러운 분&lt;/li&gt;
&lt;li&gt;어깨, 무릎, 골반 통증이 있는 분&lt;/li&gt;
&lt;li&gt;치료비 걱정에 꾸준한 치료를 못 받고 있는 분&lt;/li&gt;
&lt;li&gt;실비보험 가지고 있는데 한의원 치료에 쓸 수 있는지 몰랐던 분&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리하면 이렇습니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추나요법은 건강보험으로 연 20회, 단순추나 기준 본인부담 13,165원에 받을 수 있어요. 그리고 그날 받은 침&amp;middot;부항&amp;middot;전기치료까지 포함한 본인부담금 합산액에서 1만 원만 내고 나머지는 실비보험으로 돌려받을 수 있는 구조예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;건강보험 + 실비보험을 제대로 활용하면, 정형외과 도수치료에 수십만 원 쓰던 비용을 한의원에서 훨씬 저렴하게 해결할 수 있어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모르면 손해, 아는 만큼 아끼는 거예요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 포스팅은 개인 경험과 보건복지부 건강보험 공식 정책 정보를 바탕으로 작성된 정보성 글입니다. 실제 치료비 및 실비보험 보장 여부는 한의원 및 가입 보험 약관에 따라 다를 수 있으므로, 치료 전 반드시 확인하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>한의원</category>
      <category>목디스크추나</category>
      <category>추나건강보험</category>
      <category>추나실비보험</category>
      <category>추나요법</category>
      <category>추나요법가격</category>
      <category>추나요법후기</category>
      <category>한의원건강보험</category>
      <category>한의원실비청구</category>
      <category>한의원치료비</category>
      <category>허리디스크한의원</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/201</guid>
      <comments>https://thewavelet.tistory.com/201#entry201comment</comments>
      <pubDate>Fri, 27 Feb 2026 05:54:39 +0900</pubDate>
    </item>
    <item>
      <title>임플란트 비용 얼마가 적당할까? 2026년 최신 가격 총정리 (보험 적용&amp;middot;덤핑 주의까지)</title>
      <link>https://thewavelet.tistory.com/199</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;임플란트.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqqkNe/dJMcafFGREz/InNkYRqU13bSXQEjUsXfT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqqkNe/dJMcafFGREz/InNkYRqU13bSXQEjUsXfT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqqkNe/dJMcafFGREz/InNkYRqU13bSXQEjUsXfT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqqkNe%2FdJMcafFGREz%2FInNkYRqU13bSXQEjUsXfT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;630&quot; data-filename=&quot;임플란트.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 임플란트 평균 비용은 80만~180만 원. 65세 이상 건강보험 적용 시 30만~40만 원대 가능. 재료별 가격 차이, 덤핑 치과 구별법, 치과 선택 기준까지 한 번에 정리했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;임플란트, 도대체 얼마가 '정상 가격'일까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;치과 앞을 지나다 보면 &quot;임플란트 69만 원!&quot;, &quot;임플란트 특가 49만 원!&quot; 같은 현수막을 자주 보게 된다. 그런데 주변에서 임플란트를 했다는 지인은 150만 원을 냈다고 하고, 인터넷에는 30만 원짜리 광고도 보인다. 도대체 어느 가격이 맞는 걸까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하면 &lt;b&gt;2026년 기준 임플란트 1개의 전국 평균 비용은 약 115만~140만 원&lt;/b&gt; 수준이다. 하지만 건강보험심사평가원이 공개한 실제 비급여 진료비를 보면 최저 55만 원에서 최고 461만 원까지, 같은 시술인데 무려 8배 이상의 가격 차이가 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 그 이유가 무엇인지, 어느 가격대가 합리적인지, 그리고 보험은 어떻게 활용할 수 있는지를 정리해 드린다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2026년 임플란트 가격 &amp;mdash; 재료별 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임플란트는 크게 세 가지 부품으로 구성된다. 뼈에 심는 &lt;b&gt;픽스처(인공치근)&lt;/b&gt;, 픽스처와 치아를 연결하는 &lt;b&gt;어버트먼트&lt;/b&gt;, 겉으로 보이는 **크라운(보철물)**이다. 이 중 크라운 재료가 가격을 가장 크게 좌우한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크라운 재료 평균 가격 (1개 기준) 특징&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;지르코니아&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;약 114만 원&lt;/td&gt;
&lt;td&gt;자연치아와 색상 유사, 내구성 우수, 가장 많이 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;PFM (금속+도자기)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;약 100만~120만 원&lt;/td&gt;
&lt;td&gt;오래된 방식, 건강보험 기준 재료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;골드 (금)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;약 156만 원&lt;/td&gt;
&lt;td&gt;내구성 최고, 가격 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;PFG (금+도자기)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;약 183만 원&lt;/td&gt;
&lt;td&gt;심미성+내구성 모두 높음, 최고가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 건강보험심사평가원 비급여 진료비 자료 기준. 지르코니아는 전년 대비 1.8% 하락, 금 포함 재료는 소폭 인상됐다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;합리적인 가격대는 얼마일까?&lt;/b&gt; 전문가들이 공통적으로 말하는 적정 가격은 &lt;b&gt;80만~120만 원&lt;/b&gt; 선이다. 이 범위 내에서 국산 브랜드(오스템, 덴티움, 디오 등)를 사용하면 품질과 가격의 균형을 맞출 수 있다. 이보다 훨씬 싸다면 재료 품질이나 포함 항목을 꼼꼼히 확인해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 치과마다 가격이 이렇게 다를까? &amp;mdash; 5가지 이유&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 임플란트 브랜드 (국산 vs 수입)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국산 임플란트(오스템, 덴티움 등)는 기술력이 상향 평준화되어 있어 합리적인 가격에 좋은 품질을 제공한다. 수입 브랜드(스트라우만, 노벨바이오케어 등)는 재료비만 2~3배 이상 비싸다. 대부분의 케이스에서 국산으로도 충분하지만, 특수한 케이스에서는 수입 브랜드를 권하는 경우도 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 크라운 재료&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 설명한 것처럼 어떤 재료를 쓰느냐에 따라 기본 가격이 달라진다. 광고에 표시된 '저가 임플란트'는 대부분 기본 재료(PFM) 기준이며, 지르코니아로 업그레이드하면 추가 금액이 붙는 경우가 많다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 뼈이식&amp;middot;추가 수술 여부&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잇몸뼈가 부족하면 뼈이식(골이식술)이나 상악동 거상술 같은 추가 수술이 필요하다. 이 비용은 별도로 청구되며, &lt;b&gt;30만~100만 원 이상&lt;/b&gt; 추가될 수 있다. 광고에 표시된 가격에 이 비용이 포함되어 있는지 반드시 확인해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 병원 위치와 규모&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서울 강남, 대형 치과병원은 같은 재료를 써도 기본 단가가 높다. 임대료, 인건비, 장비 비용 등 운영비가 가격에 반영되기 때문이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 의사의 경력과 사후관리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임플란트는 시술 난이도보다 &lt;b&gt;정확한 위치 선정과 사후관리&lt;/b&gt;가 성공을 좌우한다. 경험 많은 의사와 탄탄한 A/S 보증이 포함된 곳은 단가가 높을 수밖에 없다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;65세 이상이라면 꼭 알아야 할 &amp;mdash; 건강보험 적용 제도&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만 65세 이상이라면 &lt;b&gt;임플란트 건강보험 혜택&lt;/b&gt;을 받을 수 있다. 핵심 조건은 두 가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;만 65세 이상&lt;/b&gt; (생일이 속한 해의 다음 해 1월 1일부터 적용) ✅ &lt;b&gt;자연치아가 1개 이상 남아있는 부분 무치악 상태&lt;/b&gt; (완전 무치악은 틀니 대상)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 두 조건을 모두 충족하면, &lt;b&gt;평생 2개까지&lt;/b&gt; 건강보험을 적용받아 시술비의 &lt;b&gt;30%만 본인이 부담&lt;/b&gt;하면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실제 본인부담금은?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임플란트 1개 총 진료비가 약 120만 원이라고 가정하면 이렇게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상 본인부담률 실제 부담금 (120만 원 기준)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;일반 건강보험 가입자 (65세 이상)&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;약 36만~40만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;의료급여 2종 수급자&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;약 24만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;의료급여 1종 수급자&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;약 12만~13만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65세 미만 (비보험)&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;전액 본인 부담&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의사항 &amp;mdash; 이것만큼은 꼭 확인하자&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뼈이식, 상악동 거상술은 &lt;b&gt;비급여 항목&lt;/b&gt;으로 건강보험 미적용 &amp;rarr; 별도 비용 전액 본인 부담&lt;/li&gt;
&lt;li&gt;건강보험 기준 보철물은 &lt;b&gt;PFM 재료&lt;/b&gt;. 지르코니아 선택 시 차액 발생 가능&lt;/li&gt;
&lt;li&gt;시술 시작한 치과에서 중간에 다른 치과로 이동하면 &lt;b&gt;보험 적용 불가&lt;/b&gt; (폐업 등 불가피한 경우 제외)&lt;/li&gt;
&lt;li&gt;건강보험 임플란트는 &lt;b&gt;등록된 치과&lt;/b&gt;에서만 시술 가능. 시술 전 치과에서 공단 등록 여부 확인 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;임플란트 69만 원&quot; 광고, 믿어도 될까? &amp;mdash; 덤핑 치과 구별법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 보건복지부와 치과계가 공동으로 경고하는 문제가 있다. 바로 &lt;b&gt;덤핑 치과&lt;/b&gt;다. 지나치게 낮은 가격으로 환자를 유인한 뒤, 갑자기 폐업하거나 추가 비용을 청구하는 사례가 늘고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 항목 중 하나라도 해당되면 주의가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주의해야 할 신호들&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시중 평균 대비 절반 이하의 가격을 광고하는 곳&lt;/li&gt;
&lt;li&gt;가격에 포함된 항목(픽스처, 어버트먼트, 크라운 모두 포함인지)을 명확히 설명하지 않는 곳&lt;/li&gt;
&lt;li&gt;뼈이식 필요 여부를 상담 전에 미리 확인하지 않는 곳&lt;/li&gt;
&lt;li&gt;A/S(보증) 기간과 조건을 서면으로 제공하지 않는 곳&lt;/li&gt;
&lt;li&gt;임플란트 전문의 자격이나 경력을 확인할 수 없는 곳&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;합리적인 치과 고르는 법&lt;/b&gt; 가격만 보고 결정하는 것은 위험하다. 보건복지부는 &quot;여러 곳을 방문해 가격을 비교하고, 기타 비용이 포함되어 있는지 반드시 물어보라&quot;고 안내한다. 실제로 치료비의 30%는 의사 기술료, 30%는 재료비, 나머지는 운영 비용으로 구성되기 때문에, 지나치게 낮은 가격은 어딘가를 줄인다는 의미일 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;임플란트 시술 과정 &amp;mdash; 얼마나 걸릴까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 임플란트를 고민하는 분들이 가장 많이 묻는 것 중 하나가 기간이다. 일반적인 흐름은 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1단계 &amp;mdash; 발치 및 준비 (1~2개월)&lt;/b&gt; 기존 치아를 뽑고 잇몸이 아물길 기다린다. 뼈이식이 필요한 경우 이 기간이 더 길어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2단계 &amp;mdash; 픽스처 식립 (시술 당일)&lt;/b&gt; 티타늄 인공치근을 잇몸뼈에 심는다. 수면 마취나 국소 마취 후 진행하며 30분~1시간 소요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3단계 &amp;mdash; 골유착 대기 (3~6개월)&lt;/b&gt; 인공치근이 뼈와 단단히 결합되는 기간이다. 이 기간이 임플란트 전체 과정에서 가장 길다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4단계 &amp;mdash; 보철물 장착 (2~3회 내원)&lt;/b&gt; 인공치아(크라운)를 제작해 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 기간은 빠르면 3~4개월, 뼈이식 등 추가 시술이 있으면 6개월~1년까지 걸릴 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;임플란트 vs 브릿지 vs 틀니 &amp;mdash; 비용과 장단점 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;치아를 잃었을 때 선택지는 임플란트만이 아니다. 각각의 특징을 비교해보면 선택이 쉬워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 임플란트 브릿지 틀니&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;초기 비용&lt;/td&gt;
&lt;td&gt;80만~180만 원/개&lt;/td&gt;
&lt;td&gt;50만~120만 원&lt;/td&gt;
&lt;td&gt;30만~80만 원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;수명&lt;/td&gt;
&lt;td&gt;10~20년 이상&lt;/td&gt;
&lt;td&gt;7~10년&lt;/td&gt;
&lt;td&gt;5~7년&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;인접치아 손상&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;있음 (양쪽 치아 삭제)&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;편의성&lt;/td&gt;
&lt;td&gt;자연치아와 동일&lt;/td&gt;
&lt;td&gt;양호&lt;/td&gt;
&lt;td&gt;불편함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;뼈 손실 예방&lt;/td&gt;
&lt;td&gt;가능&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;td&gt;불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;건강보험&lt;/td&gt;
&lt;td&gt;65세 이상 2개&lt;/td&gt;
&lt;td&gt;일부 적용&lt;/td&gt;
&lt;td&gt;65세 이상 적용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장기적으로 보면 임플란트가 가장 비용 효율이 높다. 틀니는 초기 비용이 적지만 교체 주기가 짧고 생활 불편이 크다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;치과 선택 전 꼭 해야 할 3가지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 최소 2~3곳 상담 후 비교&lt;/b&gt; 같은 치아 상태를 놓고도 진단과 치료 계획, 가격이 다를 수 있다. 한 곳의 말만 듣고 결정하지 말고 비교 상담을 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 포함 항목 서면으로 확인&lt;/b&gt; 픽스처, 어버트먼트, 크라운이 모두 포함된 가격인지, 뼈이식 비용은 별도인지, A/S 조건은 어떻게 되는지를 반드시 확인하고 서면으로 받아두자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 치과 전문의 자격 확인&lt;/b&gt; 구강악안면외과 전문의나 보철과 전문의 자격이 있는 의사에게 시술받으면 복잡한 케이스에서도 더 안전하다. 치과 홈페이지나 건강보험심사평가원 병원 정보에서 확인할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리 &amp;mdash; 가격보다 중요한 것&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임플란트는 일생에 몇 번 하기 힘든 시술이다. 가격이 중요한 것은 사실이지만, 지나치게 싼 곳을 쫓다가 재시술 비용이 더 드는 경우도 많다. &lt;b&gt;80만~120만 원 선에서, 포함 항목을 명확히 설명해주고, A/S를 보장하는 치과&lt;/b&gt;를 선택하는 것이 결국 가장 경제적인 선택이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;65세 이상이라면 건강보험 혜택을 꼭 챙기고, 뼈이식 필요 여부를 먼저 확인한 뒤 전체 비용을 파악해 결정하길 권한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 본 글은 정보 제공을 목적으로 작성되었습니다. 개인의 구강 상태에 따라 치료 방법과 비용이 다를 수 있으므로, 정확한 진단과 비용은 반드시 치과 전문의와 직접 상담하시기 바랍니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>치과</category>
      <category>65세임플란트</category>
      <category>건강보험임플란트</category>
      <category>덤핑치과</category>
      <category>임플란트가격</category>
      <category>임플란트보험</category>
      <category>임플란트비용</category>
      <category>임플란트적정가격</category>
      <category>임플란트종류</category>
      <category>임플란트후기</category>
      <category>치과임플란트</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/199</guid>
      <comments>https://thewavelet.tistory.com/199#entry199comment</comments>
      <pubDate>Thu, 26 Feb 2026 18:33:31 +0900</pubDate>
    </item>
    <item>
      <title>리니지 클래식 완벽 정리 &amp;mdash; 2026년 2월 출시, 월정액&amp;middot;직업&amp;middot;논란까지 한 번에</title>
      <link>https://thewavelet.tistory.com/198</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;리니지클래식.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ule4C/dJMcaa5rSuj/GjvX7RKgx4CJHkIj7QC6g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ule4C/dJMcaa5rSuj/GjvX7RKgx4CJHkIj7QC6g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ule4C/dJMcaa5rSuj/GjvX7RKgx4CJHkIj7QC6g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fule4C%2FdJMcaa5rSuj%2FGjvX7RKgx4CJHkIj7QC6g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;630&quot; data-filename=&quot;리니지클래식.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 2월 7일 출시된 리니지 클래식 완벽 정리! 월정액 29,700원, 군주&amp;middot;기사&amp;middot;요정&amp;middot;마법사 4직업 특징, 공성전&amp;middot;혈맹 시스템, 논란까지 솔직하게 담았습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&quot;린저씨들, 집결&quot;&amp;hellip; 아덴 대륙이 2026년에 다시 열렸다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC방에서 밤을 새우며 공성전을 뛰던 그 시절. 채팅창에 &quot;혈맹 가입 구합니다&quot;를 치며 처음 만난 사람들과 어느새 전우가 되던 경험. 2000년대 초반 한국 게임 문화를 상징했던 &lt;b&gt;리니지&lt;/b&gt;가 그 시절 모습 그대로 돌아왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔씨소프트가 2026년 2월 7일, 공개 발표 이후 무려 5년을 기다리게 했던 &lt;b&gt;리니지 클래식&lt;/b&gt;을 마침내 출시했다. 출시 직후 동시접속자 32만 명, 누적 매출 400억 원 돌파, 유튜브 누적 조회수 1억 4,700만 회. 숫자가 말해주듯, 이 게임을 기다린 사람은 생각보다 훨씬 많았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 리니지 클래식이 무엇인지, 어떻게 즐기면 되는지, 그리고 논란은 무엇인지까지 있는 그대로 정리해 드린다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;리니지 클래식이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리니지 클래식은 엔씨소프트가 1998년부터 서비스해온 원조 리니지의 &lt;b&gt;2000년대 초반 버전을 2026년 기술로 재현&lt;/b&gt;한 PC MMORPG다. 정확히는 리니지 2.0 버전을 기반으로 제작되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핵심 철학은 단순하다. 자동 사냥도, 화려한 스킬 연출도, 복잡한 성장 시스템도 없던 그 시절로 돌아가는 것. 유저가 직접 컨트롤하고, 채팅으로 소통하고, 혈맹원들과 함께 성을 지키던 그 낭만을 다시 꺼내 들겠다는 선언이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 지역은 한국, 대만, 홍콩, 마카오이며 &lt;b&gt;PC 전용&lt;/b&gt;으로만 즐길 수 있다. 모바일 버전은 제작되지 않는다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요금제 &amp;mdash; 월정액 29,700원, 이게 얼마나 의미 있는 숫자냐면&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리니지 클래식의 요금제는 &lt;b&gt;월정액 29,700원&lt;/b&gt;이다. 이 금액이 특별한 이유가 있다. 바로 1998년 리니지 출시 당시와 &lt;b&gt;동일한 가격&lt;/b&gt;이기 때문이다. 28년의 물가 상승을 무시하고 그 시절 요금을 그대로 가져왔다는 점에서, 개발진 나름의 복고 정신이 담겨 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교해 보면 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임 월정액&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;리니지 클래식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;29,700원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;월드 오브 워크래프트&lt;/td&gt;
&lt;td&gt;약 18,000~22,000원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파이널 판타지 14&lt;/td&gt;
&lt;td&gt;약 18,000~20,000원&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 정액제 MMORPG와 비교하면 만 원 정도 비싼 편이다. 부분 유료화 게임에 익숙해진 요즘 기준으로는 부담스럽게 느껴질 수도 있다. 하지만 월정액 요금제의 핵심은 **&quot;한 번 내면 모두가 동등한 출발선&quot;**이라는 데 있다. 과금으로 강해지는 구조가 아니기 때문이다. (단, 뒤에서 설명할 논란도 있으니 끝까지 읽어보길 권한다.)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4대 직업 완벽 정리 &amp;mdash; 군&amp;middot;기&amp;middot;요&amp;middot;마&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리니지 클래식의 직업은 딱 4가지다. 다크엘프 이후에 추가된 직업은 등장하지 않는다. 복잡한 파생 직업 없이 각자의 역할이 명확한, 리니지 원조의 그 구성이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;군주 &amp;mdash; 혈맹을 이끄는 지도자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리니지에서 &lt;b&gt;혈맹(길드)을 창설&lt;/b&gt;할 수 있는 유일한 직업이다. 군주 없이는 공성전 선전포고도, 혈맹 아지트 구매도 불가능하다. 레벨 5부터 혈맹 창설, 레벨 25부터 공성전 참가가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 전투 능력은 솔직히 떨어진다. 사냥도 느리고 PvP도 약하다. 조직을 꾸리고 사람들과 소통하는 데서 재미를 찾는 유저에게 어울리는 직업이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기사 &amp;mdash; 리니지를 대표하는 올라운더&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사냥, PK, 보스전 모두 무난하게 잘하는 &lt;b&gt;올라운더&lt;/b&gt;다. 리니지 역사에 이름을 남긴 유저 '빛', '포세이든'도 기사를 선택했을 만큼 이 게임을 상징하는 직업이다. 컨트롤도 상대적으로 간단하고 생존력도 좋아 &lt;b&gt;처음 시작하는 유저에게 가장 추천&lt;/b&gt;된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요정 &amp;mdash; 원거리 딜러 + 채집&amp;middot;제작&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활을 사용하는 원거리 딜러로, 이동하면서 공격하는 독특한 전투 방식이 특징이다. 요정만의 채집&amp;middot;제작 시스템이 있어 경제 활동을 즐기는 유저에게도 매력적이다. '엔트 노가다'로 자금을 모을 수 있다는 점도 포인트.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마법사 &amp;mdash; 전장의 게임 체인저&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 전투보다 &lt;b&gt;집단전에서 진가&lt;/b&gt;를 발휘하는 직업이다. 앱솔루트 배리어(10초 이상 무적), 디스인티그레이트, 인비저빌리티 등 독특하고 강력한 스킬들이 전장의 흐름을 바꾼다. 공성전에서 가장 각광받는 직업 중 하나다. 다만 스킬 활용 타이밍과 빠른 손이 요구된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 콘텐츠 &amp;mdash; 혈맹과 공성전&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리니지 클래식의 핵심은 개인 성장이 아니라 &lt;b&gt;집단전&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혈맹은 군주를 중심으로 같은 목표를 가진 유저들이 모이는 조직이다. 군주, 부군주, 수호기사, 정예, 일반, 수련의 6단계 계급이 있으며 각 계급에 따라 권한이 다르게 설정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공성전은 성을 차지하기 위해 혈맹과 혈맹이 전면전을 벌이는 콘텐츠다. 리니지 클래식의 꽃이자 존재 이유이기도 하다. 출시 시점에는 켄트성 공성전이 먼저 오픈되며, 이후 하이네, 오렌, 아덴 등 추가 영지가 순차적으로 열릴 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 오픈된 주요 지역은 말하는 섬, 글루디오 영지, 기란 지역이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출시 성적 &amp;mdash; 숫자로 보는 반응&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출시 후 리니지 클래식은 동시접속자 32만 명과 누적 매출 400억 원을 돌파했으며, 2월 25일 기준 PC방 점유율 9.63%로 국내 서비스 중인 PC 게임 중 2위를 기록했다. 유튜브 누적 조회수도 1억 4,700만 회를 넘어섰다. 오랜 기다림이 무색하지 않은 성적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;논란도 솔직하게 &amp;mdash; 알고 들어가자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋은 점만 쓰면 광고글이다. 출시 전후로 몇 가지 논란이 있었으니 알고 시작하는 게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;유료 패스 논란 (&amp;rarr; 해결됨)&lt;/b&gt; 출시 직전인 1월 20일, 운영진이 유료 시즌 패스 판매 계획과 다중 클라이언트 허용 방침을 공지하면서 유저들의 거센 반발을 샀다. &quot;스탯을 돈 받고 팔겠다는 것 아니냐&quot;는 비판이 쏟아졌고, 16시간 만에 운영진이 시즌 패스의 유료 보상 부분을 삭제하겠다고 번복했다. 민심에 빠르게 반응했다는 점은 긍정적이나, 초기 방침 자체가 '클래식'의 정신에 맞지 않았다는 비판은 여전히 남아있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정식 서비스 하루 만에 자동 사냥&amp;middot;확률형 캐시템 등장&lt;/b&gt; 정액제 게임이라는 기대와 달리, 유료 서비스 시작 하루 만에 자동 사냥 허용과 확률형 캐시 아이템이 등장했다는 반응이 나왔다. 구 유저들 사이에서 &quot;프리서버 같다&quot;는 평가도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;신규 유저의 진입 장벽&lt;/b&gt; 2000년대 초반 감성을 그대로 재현한 만큼, 당시 게임을 경험하지 않은 신규 유저에게는 불친절하게 느껴질 수 있다. 애니메이션 프레임이 적고, 편의 기능이 부족하다는 피드백이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 이슈들을 알고도 &quot;그게 리니지지&quot;라고 생각한다면, 이 게임은 당신을 위한 게임이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이런 분들에게 추천&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2000년대 초반 PC방에서 리니지를 해봤던 30~40대 게이머&lt;/li&gt;
&lt;li&gt;자동 사냥 없이 직접 컨트롤하며 성장하는 하드코어 MMORPG를 원하는 분&lt;/li&gt;
&lt;li&gt;혈맹 활동, 공성전 등 집단전의 재미를 원하는 분&lt;/li&gt;
&lt;li&gt;과금 경쟁 없이 월정액 하나로 동등하게 즐기고 싶은 분&lt;/li&gt;
&lt;li&gt;정통 MMORPG를 처음 경험해 보고 싶은 20대&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한 줄 요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리니지 클래식은 단순한 추억팔이가 아니다. 자동화와 과금 경쟁에 지친 게이머들에게, &quot;게임이 원래 이런 거였잖아&quot;를 다시 보여주려는 시도다. 완벽하진 않지만, 출시 직후의 동시접속자 32만 명이라는 숫자가 이 게임의 가능성을 충분히 말해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아덴 대륙의 문은 이미 열렸다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 본 글의 수치 및 정보는 2026년 2월 기준이며, 업데이트에 따라 변경될 수 있습니다.&lt;/p&gt;</description>
      <category>게임</category>
      <category>2026신작게임</category>
      <category>PC온라인게임</category>
      <category>리니지클래식</category>
      <category>리니지클래식가격</category>
      <category>리니지클래식공성전</category>
      <category>리니지클래식직업</category>
      <category>리니지클래식혈맹</category>
      <category>리니지클래식후기</category>
      <category>엔씨소프트신작</category>
      <category>월정액MMORPG</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/198</guid>
      <comments>https://thewavelet.tistory.com/198#entry198comment</comments>
      <pubDate>Thu, 26 Feb 2026 18:19:19 +0900</pubDate>
    </item>
    <item>
      <title>스픽(Speak) 앱 솔직 후기 &amp;mdash; AI랑 영어로 실제로 말하는데 한 달에 만원대?</title>
      <link>https://thewavelet.tistory.com/197</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;월 10,000 원대로 AI원어민 회화.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd21gh/dJMcadA1YSP/kvTmZTdVyrkBxDZ6rIxvzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd21gh/dJMcadA1YSP/kvTmZTdVyrkBxDZ6rIxvzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd21gh/dJMcadA1YSP/kvTmZTdVyrkBxDZ6rIxvzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd21gh%2FdJMcadA1YSP%2FkvTmZTdVyrkBxDZ6rIxvzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;630&quot; data-filename=&quot;월 10,000 원대로 AI원어민 회화.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스픽(Speak) 앱의 핵심 기능, 가격, 장단점을 솔직하게 정리했습니다. OpenAI 기반 AI와 실시간 영어 회화 연습이 가능한 스픽, 다른 앱과 비교해 왜 가성비가 뛰어난지 알아보세요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;영어 공부 20년인데 왜 아직도 입이 안 떨어질까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토익 800점은 넘는데, 외국인 앞에만 서면 머리가 하얘지는 경험. 누구나 한 번쯤 해봤을 거다. 문제는 우리가 영어를 &lt;b&gt;'읽고 쓰는 것'&lt;/b&gt; 위주로만 배웠다는 데 있다. 말하는 연습을 거의 안 했으니 입이 안 떨어지는 게 당연하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 요즘 &lt;b&gt;스픽(Speak)&lt;/b&gt; 이라는 앱이 이 고민을 제법 빠르게 해소해주고 있다는 얘기가 많다. 실제로 국내 누적 다운로드 500만 건을 돌파했고, 앱스토어 교육 카테고리 1위를 꾸준히 유지하고 있다. 무엇이 이 앱을 이토록 많은 사람들이 쓰게 만드는 걸까.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스픽(Speak)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스픽은 미국 샌프란시스코에 본사를 둔 스타트업 &lt;b&gt;Speakeasy Labs&lt;/b&gt;가 개발한 AI 기반 영어 스피킹 앱이다. 이름 그대로, '말하기(Speak)'에 모든 기능이 집중되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 주목할 포인트는 &lt;b&gt;OpenAI와의 공식 기술 파트너십&lt;/b&gt;이다. 스픽은 ChatGPT를 만든 OpenAI의 스타트업 펀드로부터 380억 원 규모의 투자를 유치했고, GPT 기반의 언어 모델을 영어 회화 학습에 최적화해서 탑재했다. 단순히 ChatGPT에 &quot;영어로 대화해줘&quot;라고 치는 것과는 차원이 다른, &lt;b&gt;학습에 특화된 AI 경험&lt;/b&gt;을 제공한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 기능 4가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 오늘의 수업 (Daily Lesson)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매일 새로운 수업이 제공된다. LA 현지 원어민 튜터가 영상으로 등장해 그날 배울 문장을 설명하고, 사용자가 직접 그 문장을 발음해보는 식이다. 한 수업은 '오늘의 수업 &amp;rarr; 스피킹 연습 &amp;rarr; 실전 대화' 3단계로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20분 안에 무려 &lt;b&gt;100문장&lt;/b&gt;을 직접 발화하도록 설계되어 있다. 수동적으로 강의를 듣는 게 아니라, 쉴 새 없이 말을 시킨다. 처음엔 좀 힘들게 느껴질 수 있지만, 그게 정확히 스픽의 의도다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 프리톡 (AI 자유 대화)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스픽의 가장 독보적인 기능. 주제를 정하거나 상황을 설정하면 AI와 실시간으로 자유롭게 영어 대화를 나눌 수 있다. &quot;레스토랑에서 주문하기&quot;, &quot;낯선 사람과 스몰톡 하기&quot; 등 실생활 시나리오로 연습이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이게 왜 저렴하게 가능한가?&lt;/b&gt; 바로 AI 덕분이다. 화상영어 플랫폼은 원어민 강사의 시간에 비용을 지불하는 구조라 1시간에 4~8만 원 선이다. 스픽은 AI가 24시간 무제한으로 대화 상대가 되어주기 때문에, 연간 구독료를 12개월로 나누면 월 1만 원대에 무제한 AI 회화 연습이 가능해진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 스픽 튜터 (AI 개인 선생님)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 대화를 넘어, &lt;b&gt;개인 과외 선생님&lt;/b&gt; 역할을 한다. 내가 틀린 발음, 어색한 표현, 자주 실수하는 문법 패턴을 분석해서 맞춤 피드백을 주고 추가 레슨까지 생성해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;영어 면접 준비해줘&quot;, &quot;오픽 IM 등급 올리고 싶어&quot;처럼 구체적인 목표를 말하면, 그에 맞는 커리큘럼을 직접 설계해서 제안한다. 내 영어 수준, 관심사, 목표를 기반으로 온전히 나만을 위한 학습 플랜이 나온다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 음성 인식 피드백&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스픽의 음성 인식 기술은 &lt;b&gt;0.1초 이내, 95% 이상의 정확도&lt;/b&gt;로 한국인의 영어 발음을 인식한다고 알려져 있다. 발음이 어색하거나 틀렸을 때 즉각적으로 교정해주기 때문에, 잘못된 발음이 굳어지는 것을 방지한다. 화면을 터치하거나 조작하지 않아도 자연스럽게 대화가 이어지는 것도 실제 대화하는 느낌을 높여준다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;가격 정보 (2025~2026년 기준)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스픽은 기본적으로 &lt;b&gt;연간 구독&lt;/b&gt; 방식이다. 월 구독도 앱 내 인앱결제로 가능하지만, 할인이 없어 비싸기 때문에 실제로 이용하는 사람은 거의 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요금제 연간 정가 월 환산&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;프리미엄&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;129,000원&lt;/td&gt;
&lt;td&gt;약 10,750원/월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;프리미엄 플러스&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;299,000원&lt;/td&gt;
&lt;td&gt;약 24,916원/월&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;평생 이용권&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;약 450,000원&lt;/td&gt;
&lt;td&gt;&amp;mdash;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 파트너 링크나 할인 코드를 이용하면 2~7만 원 추가 할인이 적용된다. 블랙프라이데이, 연초 이벤트 기간에는 최대 7만 원까지 할인되는 경우도 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 요금제의 차이는?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프리미엄:&lt;/b&gt; 프리톡(AI 자유 대화) 무제한 + 스픽 튜터 제한 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프리미엄 플러스:&lt;/b&gt; 프리톡 무제한 + 스픽 튜터 &lt;b&gt;무제한&lt;/b&gt; + AI 레슨 리뷰 + Vocab 레슨 + 30일 습관 완성 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI와의 자유 대화를 집중적으로 활용하고 싶은 사람, 혹은 맞춤 레슨을 자주 쓸 것 같은 사람이라면 플러스가 낫다. 커리큘럼 위주로 공부하는 사람이라면 프리미엄으로 충분하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다른 앱이나 서비스와 비교하면?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교 항목 스픽 (프리미엄) 화상영어 듀오링고&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;월 비용&lt;/td&gt;
&lt;td&gt;약 10,750원&lt;/td&gt;
&lt;td&gt;40,000~80,000원&lt;/td&gt;
&lt;td&gt;무료~약 15,000원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI 회화&lt;/td&gt;
&lt;td&gt;✅ 무제한&lt;/td&gt;
&lt;td&gt;❌ (원어민)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;발화량&lt;/td&gt;
&lt;td&gt;매우 많음&lt;/td&gt;
&lt;td&gt;중간&lt;/td&gt;
&lt;td&gt;적음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24시간 이용&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스피킹 특화&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;화상영어의 퀄리티를 완전히 대체하긴 어렵다. 하지만 &lt;b&gt;가성비와 접근성&lt;/b&gt;만 놓고 보면, 시간&amp;middot;장소 제약 없이 AI와 무제한으로 말하기 연습을 할 수 있는 앱은 현재 스픽이 독보적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;솔직한 장단점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;말을 아주 많이 시킨다 &amp;mdash; 실제로 스피킹이 는다&lt;/li&gt;
&lt;li&gt;OpenAI 기반이라 자연스러운 대화 흐름&lt;/li&gt;
&lt;li&gt;월 1만 원대 가격에 무제한 AI 회화&lt;/li&gt;
&lt;li&gt;LA 원어민이 제작한 실용적인 커리큘럼&lt;/li&gt;
&lt;li&gt;초급부터 고급까지 수준별 콘텐츠&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연간 일시불 구매 방식 (월 구독은 비쌈)&lt;/li&gt;
&lt;li&gt;AI 대화가 아직 완벽한 원어민 수준은 아님&lt;/li&gt;
&lt;li&gt;읽기&amp;middot;쓰기&amp;middot;문법 공부는 약한 편 (스피킹 특화 앱이라서)&lt;/li&gt;
&lt;li&gt;7일 무료체험 후 환불 정책이 다소 까다로움 (결제 전 확인 필수)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이런 분들에게 추천&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토익은 잘 보는데 회화에서 막히는 직장인&lt;/li&gt;
&lt;li&gt;해외여행 전 기초 회화를 빠르게 끌어올리고 싶은 분&lt;/li&gt;
&lt;li&gt;화상영어는 부담스럽고, 혼자 공부하면 말할 기회가 없는 분&lt;/li&gt;
&lt;li&gt;오픽, 토익스피킹, 영어 면접을 준비 중인 분&lt;/li&gt;
&lt;li&gt;매일 꾸준히 짧게(20~30분) 습관을 만들고 싶은 분&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스픽이 500만 다운로드를 넘긴 이유는 단순하다. &quot;말을 많이 시킨다&quot;는 단순한 철학을 OpenAI 기술력으로 구현했기 때문이다. 영어 공부는 결국 얼마나 많이 입을 열어봤느냐의 싸움인데, 스픽은 그 환경을 가장 저렴하고 편리하게 만들어 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7일 무료체험이 가능하니, 한 번쯤 직접 써보고 판단하는 걸 추천한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 가격 정보는 2025~2026년 초 기준이며, 프로모션에 따라 변동될 수 있습니다. 결제 전 공식 홈페이지에서 최신 가격을 확인하세요.&lt;/p&gt;</description>
      <category>ETC</category>
      <category>스픽</category>
      <category>스픽가격</category>
      <category>스픽튜터</category>
      <category>스픽후기</category>
      <category>영어공부앱</category>
      <category>영어스피킹앱</category>
      <category>영어회화앱</category>
      <category>영어회화추천</category>
      <category>오픽준비</category>
      <category>토익스피킹</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/197</guid>
      <comments>https://thewavelet.tistory.com/197#entry197comment</comments>
      <pubDate>Thu, 26 Feb 2026 17:48:55 +0900</pubDate>
    </item>
    <item>
      <title>추천 웹하드 파일 공유 사이트 순위를 공유합니다.</title>
      <link>https://thewavelet.tistory.com/196</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #3a3a3a; text-align: start;&quot;&gt;추천 웹하드 파일 공유 사이트 순위를 공유합니다.&amp;nbsp;&lt;/h1&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #444444; text-align: start;&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 338px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;피디팝&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;&lt;a href=&quot;https://pdpop.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://pdpop.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;1600-8744&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;스마트파일&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://smartfile.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://smartfile.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1899-5771&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;파일캐스트&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://filecast.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://filecast.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1600-0335&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;메가파일&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://www.megafile.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.megafile.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1688-7587&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;파일시티&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://www.filecity.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.filecity.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1666-2169&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;셰어박스&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://sharebox.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://sharebox.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1661-0872&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;7&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;온디스크&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://m.ondisk.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://m.ondisk.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1599-6221&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;파일조&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://www.filejo.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.filejo.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1588-2943&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;9&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;파일스타&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://filestar.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://filestar.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1644-4743&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;s&gt;지파일&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;s&gt;&lt;a href=&quot;https://www.gfile.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.gfile.co.kr/&lt;/a&gt;&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1544-4811&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;11&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;파일몽&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://filemong.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://filemong.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1833-4725&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;12&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;애플파일&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://www.applefile.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.applefile.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1599-9054&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #a52a2a;&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;13&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;파일이즈&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://fileis.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fileis.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1544-9097&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;14&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;미투디스크&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://me2disk.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://me2disk.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1544-8638&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;15&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;예스파일&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://www.yesfile.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.yesfile.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1599-9052&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;16&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;파일마루&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://www.filemaru.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.filemaru.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1522-0576&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;17&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;싸다파일&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;&lt;a href=&quot;https://ssadafile.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ssadafile.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left; height: 19px;&quot;&gt;1522-1557&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;18&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;투디스크&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://www.todisk.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.todisk.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1644-7879&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;19&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;꿀파일&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://ggulfile.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ggulfile.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1555-1326&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;20&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;파일썬&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&lt;a href=&quot;https://www.filesun.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.filesun.com/&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;1600-6093&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;text-align: left; height: 17px;&quot;&gt;21&lt;/td&gt;
&lt;td&gt;지니파일&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://geniefile.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://geniefile.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1551-5772&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;22&lt;/td&gt;
&lt;td&gt;파일보고&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.filebogo.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.filebogo.com/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1800-4505&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;23&lt;/td&gt;
&lt;td&gt;티플&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.tple.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.tple.co.kr/&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1688-8474&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <category>webhard</category>
      <category>웹하드</category>
      <category>웹하드사이트</category>
      <category>웹하드순위</category>
      <category>웹하드추천</category>
      <category>파일공유</category>
      <category>파일공유사이트</category>
      <category>파일다운로드</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/196</guid>
      <comments>https://thewavelet.tistory.com/196#entry196comment</comments>
      <pubDate>Tue, 20 Jan 2026 08:42:51 +0900</pubDate>
    </item>
    <item>
      <title>TypeScript 실무 개발 가이드 (2025)</title>
      <link>https://thewavelet.tistory.com/195</link>
      <description>&lt;h1&gt;TypeScript 실무 개발 가이드 (2025)&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서 하나만 보면 TypeScript를 제대로 사용할 수 있도록 핵심만 정리한 실용적인 가이드입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  목차&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;a href=&quot;#-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95&quot;&gt;환경 설정&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%ED%95%B5%EC%8B%AC-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C&quot;&gt;핵심 타입 시스템&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EC%99%80-%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98&quot;&gt;인터페이스와 타입 정의&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%A0%9C%EB%84%A4%EB%A6%AD-%ED%99%9C%EC%9A%A9&quot;&gt;제네릭 활용&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%ED%83%80%EC%9E%85-%EA%B0%80%EB%93%9C%EC%99%80-%EC%95%88%EC%A0%84%EC%84%B1&quot;&gt;타입 가드와 안전성&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0-%ED%83%80%EC%9E%85&quot;&gt;유틸리티 타입&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EA%B3%A0%EA%B8%89-%ED%83%80%EC%9E%85-%ED%8C%A8%ED%84%B4&quot;&gt;고급 타입 패턴&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-react%EC%99%80-%ED%95%A8%EA%BB%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot;&gt;React와 함께 사용하기&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-%EC%8B%A4%EB%AC%B4-%EB%B2%A0%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%9E%99%ED%8B%B0%EC%8A%A4&quot;&gt;실무 베스트 프랙티스&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#-2025%EB%85%84-%EC%B5%9C%EC%8B%A0-%EA%B8%B0%EB%8A%A5&quot;&gt;2025년 최신 기능&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  환경 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로젝트 시작하기&lt;/h3&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;# 새 프로젝트 생성
npm init -y
npm install typescript @types/node
npx tsc --init

# 글로벌 설치 (IDE 지원용)
npm install -g typescript&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;필수 tsconfig.json 설정&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;target&quot;: &quot;ES2020&quot;,
    &quot;module&quot;: &quot;ESNext&quot;,
    &quot;lib&quot;: [&quot;ES2020&quot;, &quot;DOM&quot;],
    &quot;strict&quot;: true,
    &quot;esModuleInterop&quot;: true,
    &quot;skipLibCheck&quot;: true,
    &quot;forceConsistentCasingInFileNames&quot;: true,
    &quot;resolveJsonModule&quot;: true,
    &quot;allowSyntheticDefaultImports&quot;: true,
    &quot;moduleResolution&quot;: &quot;node&quot;
  },
  &quot;include&quot;: [&quot;src/**/*&quot;],
  &quot;exclude&quot;: [&quot;node_modules&quot;, &quot;dist&quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  핵심 타입 시스템&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 타입 (매일 사용)&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 원시 타입
const name: string = &quot;김개발&quot;;
const age: number = 30;
const isActive: boolean = true;
const nothing: null = null;
const notDefined: undefined = undefined;

// 배열과 튜플
const numbers: number[] = [1, 2, 3];
const fruits: Array&amp;lt;string&amp;gt; = [&quot;apple&quot;, &quot;banana&quot;];
const coordinates: [number, number] = [10, 20];

// 리터럴 타입 (매우 유용!)
type Status = &quot;pending&quot; | &quot;completed&quot; | &quot;failed&quot;;
type Theme = &quot;light&quot; | &quot;dark&quot;;
const currentStatus: Status = &quot;pending&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Union과 Intersection 타입&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// Union 타입 (OR 관계)
type StringOrNumber = string | number;
type RequestState = &quot;idle&quot; | &quot;loading&quot; | &quot;success&quot; | &quot;error&quot;;

// Intersection 타입 (AND 관계)
type User = {
  id: string;
  name: string;
};

type Admin = {
  permissions: string[];
};

type AdminUser = User &amp;amp; Admin; // 두 타입 모두 포함

// 실무 예시
function formatValue(value: string | number): string {
  if (typeof value === &quot;string&quot;) {
    return value.toUpperCase();
  }
  return value.toFixed(2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  인터페이스와 타입 정의&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인터페이스 (객체 모델링의 핵심)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// 기본 인터페이스
interface User {
  readonly id: string;      // 읽기 전용
  name: string;
  email?: string;           // 선택적 속성
  age: number;
  [key: string]: any;       // 인덱스 시그니처
}

// 확장 가능
interface AdminUser extends User {
  permissions: string[];
  lastLogin: Date;
}

// 함수 인터페이스
interface EventHandler&amp;lt;T&amp;gt; {
  (event: T): void;
}

// 실무 API 응답 모델링
interface ApiResponse&amp;lt;T&amp;gt; {
  data: T;
  status: number;
  message: string;
  success: boolean;
}

interface PaginatedResponse&amp;lt;T&amp;gt; extends ApiResponse&amp;lt;T[]&amp;gt; {
  pagination: {
    page: number;
    limit: number;
    total: number;
  };
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Type Alias vs Interface&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// Type - 더 유연함
type ButtonSize = &quot;small&quot; | &quot;medium&quot; | &quot;large&quot;;
type APIStatus = 200 | 404 | 500;

// Interface - 확장성이 좋음 (선택의 기준: 확장 필요성)
interface ButtonProps {
  size: ButtonSize;
  variant: &quot;primary&quot; | &quot;secondary&quot;;
  children: React.ReactNode;
}

// 함수 타입
type AsyncFunction&amp;lt;T&amp;gt; = () =&amp;gt; Promise&amp;lt;T&amp;gt;;
type EventCallback = (data: any) =&amp;gt; void;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  제네릭 활용&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 제네릭 (재사용성의 핵심)&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 기본 제네릭 함수
function identity&amp;lt;T&amp;gt;(arg: T): T {
  return arg;
}

// 실무에서 자주 사용하는 패턴
function createApiCall&amp;lt;TRequest, TResponse&amp;gt;(
  url: string,
  transform?: (data: any) =&amp;gt; TResponse
) {
  return async (data: TRequest): Promise&amp;lt;TResponse&amp;gt; =&amp;gt; {
    const response = await fetch(url, {
      method: 'POST',
      body: JSON.stringify(data)
    });
    const result = await response.json();
    return transform ? transform(result) : result;
  };
}

// 사용 예시
const loginApi = createApiCall&amp;lt;
  { email: string; password: string },
  { token: string; user: User }
&amp;gt;('/api/login');&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;제네릭 제약조건&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// keyof로 객체 키 제한
function getProperty&amp;lt;T, K extends keyof T&amp;gt;(obj: T, key: K): T[K] {
  return obj[key];
}

// 타입 제약
interface Lengthwise {
  length: number;
}

function logLength&amp;lt;T extends Lengthwise&amp;gt;(arg: T): T {
  console.log(arg.length);
  return arg;
}

// 실무 예시: 폼 데이터 처리
interface FormField {
  value: any;
  error?: string;
  touched: boolean;
}

function createFormState&amp;lt;T extends Record&amp;lt;string, any&amp;gt;&amp;gt;(
  initialData: T
): Record&amp;lt;keyof T, FormField&amp;gt; {
  const formState = {} as Record&amp;lt;keyof T, FormField&amp;gt;;

  for (const key in initialData) {
    formState[key] = {
      value: initialData[key],
      touched: false
    };
  }

  return formState;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 타입 가드와 안전성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;내장 타입 가드&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// typeof 가드 (원시 타입용)
function processValue(value: string | number): string {
  if (typeof value === &quot;string&quot;) {
    return value.toUpperCase(); // TS가 string임을 알고 있음
  }
  return value.toFixed(2); // TS가 number임을 알고 있음
}

// instanceof 가드 (클래스용)
class NetworkError extends Error {
  constructor(public statusCode: number, message: string) {
    super(message);
  }
}

function handleError(error: Error | NetworkError) {
  if (error instanceof NetworkError) {
    console.log(`Network error: ${error.statusCode}`);
  } else {
    console.log(`General error: ${error.message}`);
  }
}

// in 연산자 (객체 속성용)
interface Bird {
  fly(): void;
}

interface Fish {
  swim(): void;
}

function move(animal: Bird | Fish) {
  if (&quot;fly&quot; in animal) {
    animal.fly();
  } else {
    animal.swim();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커스텀 타입 가드 (매우 유용!)&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// 사용자 정의 타입 가드
function isString(value: unknown): value is string {
  return typeof value === &quot;string&quot;;
}

function isUser(obj: any): obj is User {
  return obj &amp;amp;&amp;amp;
         typeof obj.id === &quot;string&quot; &amp;amp;&amp;amp;
         typeof obj.name === &quot;string&quot;;
}

// 실무 예시: API 응답 검증
function isApiSuccess&amp;lt;T&amp;gt;(response: any): response is ApiResponse&amp;lt;T&amp;gt; {
  return response &amp;amp;&amp;amp;
         response.success === true &amp;amp;&amp;amp;
         response.data !== undefined;
}

// 사용
async function fetchUserData(id: string) {
  const response = await fetch(`/api/users/${id}`);
  const data = await response.json();

  if (isApiSuccess&amp;lt;User&amp;gt;(data)) {
    // data.data는 User 타입으로 안전하게 사용 가능
    return data.data;
  }

  throw new Error(&quot;Invalid API response&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 유틸리티 타입&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;내장 유틸리티 타입 (필수!)&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;interface Todo {
  id: string;
  title: string;
  completed: boolean;
  priority: &quot;high&quot; | &quot;medium&quot; | &quot;low&quot;;
  createdAt: Date;
}

// Partial - 모든 속성을 선택적으로
type TodoUpdate = Partial&amp;lt;Todo&amp;gt;;
function updateTodo(id: string, updates: TodoUpdate) {
  // 일부 필드만 업데이트 가능
}

// Pick - 특정 속성만 선택
type TodoMetadata = Pick&amp;lt;Todo, &quot;id&quot; | &quot;title&quot; | &quot;priority&quot;&amp;gt;;

// Omit - 특정 속성 제외
type CreateTodoRequest = Omit&amp;lt;Todo, &quot;id&quot; | &quot;createdAt&quot;&amp;gt;;

// Record - 객체 타입 생성
type TodoStatus = &quot;pending&quot; | &quot;in-progress&quot; | &quot;completed&quot;;
type StatusColors = Record&amp;lt;TodoStatus, string&amp;gt;;
const colors: StatusColors = {
  &quot;pending&quot;: &quot;#yellow&quot;,
  &quot;in-progress&quot;: &quot;#blue&quot;,
  &quot;completed&quot;: &quot;#green&quot;
};

// Required - 모든 속성 필수로
type RequiredTodo = Required&amp;lt;Todo&amp;gt;;

// Readonly - 모든 속성 읽기 전용
type ImmutableTodo = Readonly&amp;lt;Todo&amp;gt;;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커스텀 유틸리티 타입&lt;/h3&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;// 깊은 부분 업데이트
type DeepPartial&amp;lt;T&amp;gt; = {
  [P in keyof T]?: T[P] extends object ? DeepPartial&amp;lt;T[P]&amp;gt; : T[P];
};

// 함수에서 Promise 타입 추출
type Awaited&amp;lt;T&amp;gt; = T extends Promise&amp;lt;infer U&amp;gt; ? U : T;

// 객체의 값 타입들만 추출
type ValueOf&amp;lt;T&amp;gt; = T[keyof T];

// 실무 예시: 폼 에러 타입
type FormErrors&amp;lt;T&amp;gt; = {
  [K in keyof T]?: string;
};

interface LoginForm {
  email: string;
  password: string;
}

const errors: FormErrors&amp;lt;LoginForm&amp;gt; = {
  email: &quot;이메일이 유효하지 않습니다&quot;,
  password: &quot;비밀번호는 최소 8자 이상이어야 합니다&quot;
};&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  고급 타입 패턴&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;조건부 타입&lt;/h3&gt;
&lt;pre class=&quot;fsharp&quot;&gt;&lt;code&gt;// 기본 조건부 타입
type IsString&amp;lt;T&amp;gt; = T extends string ? true : false;
type Test1 = IsString&amp;lt;string&amp;gt;; // true
type Test2 = IsString&amp;lt;number&amp;gt;; // false

// infer로 타입 추론
type ReturnType&amp;lt;T&amp;gt; = T extends (...args: any[]) =&amp;gt; infer R ? R : any;
type FunctionReturn = ReturnType&amp;lt;() =&amp;gt; string&amp;gt;; // string

// 실무 예시: API 응답 타입 추출
type ExtractApiData&amp;lt;T&amp;gt; = T extends ApiResponse&amp;lt;infer U&amp;gt; ? U : never;
type UserData = ExtractApiData&amp;lt;ApiResponse&amp;lt;User&amp;gt;&amp;gt;; // User

// 배열 요소 타입 추출
type ArrayElement&amp;lt;T&amp;gt; = T extends (infer U)[] ? U : never;
type StringElement = ArrayElement&amp;lt;string[]&amp;gt;; // string&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;맵드 타입&lt;/h3&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;// 기본 맵드 타입
type Optional&amp;lt;T&amp;gt; = {
  [P in keyof T]?: T[P];
};

// 수정자 활용
type Mutable&amp;lt;T&amp;gt; = {
  -readonly [P in keyof T]: T[P];
};

type Required&amp;lt;T&amp;gt; = {
  [P in keyof T]-?: T[P];
};

// 실무 예시: 폼 검증 스키마 생성
type ValidationSchema&amp;lt;T&amp;gt; = {
  [K in keyof T]: {
    required?: boolean;
    validator?: (value: T[K]) =&amp;gt; boolean;
    message?: string;
  };
};

const userSchema: ValidationSchema&amp;lt;User&amp;gt; = {
  name: {
    required: true,
    validator: (value) =&amp;gt; value.length &amp;gt; 0,
    message: &quot;이름은 필수입니다&quot;
  },
  email: {
    validator: (value) =&amp;gt; value?.includes(&quot;@&quot;) || false,
    message: &quot;올바른 이메일 형식이 아닙니다&quot;
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;템플릿 리터럴 타입 (2025년 활용도 증가)&lt;/h3&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;// CSS 속성 자동완성
type Direction = &quot;top&quot; | &quot;right&quot; | &quot;bottom&quot; | &quot;left&quot;;
type Margin = `margin-${Direction}`;
// &quot;margin-top&quot; | &quot;margin-right&quot; | &quot;margin-bottom&quot; | &quot;margin-left&quot;

// API 엔드포인트 타입 안전성
type HttpMethod = &quot;GET&quot; | &quot;POST&quot; | &quot;PUT&quot; | &quot;DELETE&quot;;
type ApiEndpoint = `/api/${string}`;
type ApiCall = `${HttpMethod} ${ApiEndpoint}`;

// 실무 예시: 이벤트 이름 생성
type EventName&amp;lt;T extends string&amp;gt; = `on${Capitalize&amp;lt;T&amp;gt;}`;
type ButtonEvents = EventName&amp;lt;&quot;click&quot; | &quot;hover&quot; | &quot;focus&quot;&amp;gt;;
// &quot;onClick&quot; | &quot;onHover&quot; | &quot;onFocus&quot;

// 경로 파라미터 추출
type ExtractPathParams&amp;lt;T extends string&amp;gt; =
  T extends `${string}:${infer Param}/${infer Rest}`
    ? Param | ExtractPathParams&amp;lt;Rest&amp;gt;
    : T extends `${string}:${infer Param}`
    ? Param
    : never;

type UserPath = &quot;/users/:id/posts/:postId&quot;;
type Params = ExtractPathParams&amp;lt;UserPath&amp;gt;; // &quot;id&quot; | &quot;postId&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚛️ React와 함께 사용하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;컴포넌트 타입 정의&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import React, { useState, useEffect, ReactNode } from 'react';

// Props 인터페이스
interface ButtonProps {
  variant: &quot;primary&quot; | &quot;secondary&quot; | &quot;danger&quot;;
  size?: &quot;sm&quot; | &quot;md&quot; | &quot;lg&quot;;
  disabled?: boolean;
  children: ReactNode;
  onClick?: (event: React.MouseEvent&amp;lt;HTMLButtonElement&amp;gt;) =&amp;gt; void;
}

// 함수형 컴포넌트
const Button: React.FC&amp;lt;ButtonProps&amp;gt; = ({
  variant,
  size = &quot;md&quot;,
  disabled = false,
  children,
  onClick
}) =&amp;gt; {
  return (
    &amp;lt;button
      className={`btn btn-${variant} btn-${size}`}
      disabled={disabled}
      onClick={onClick}
    &amp;gt;
      {children}
    &amp;lt;/button&amp;gt;
  );
};

// 제네릭 컴포넌트
interface DropdownProps&amp;lt;T&amp;gt; {
  items: T[];
  value?: T;
  onChange: (item: T) =&amp;gt; void;
  renderItem: (item: T) =&amp;gt; ReactNode;
  getKey: (item: T) =&amp;gt; string;
}

function Dropdown&amp;lt;T&amp;gt;({ items, value, onChange, renderItem, getKey }: DropdownProps&amp;lt;T&amp;gt;) {
  return (
    &amp;lt;div className=&quot;dropdown&quot;&amp;gt;
      {items.map(item =&amp;gt; (
        &amp;lt;div
          key={getKey(item)}
          onClick={() =&amp;gt; onChange(item)}
          className={value === item ? &quot;selected&quot; : &quot;&quot;}
        &amp;gt;
          {renderItem(item)}
        &amp;lt;/div&amp;gt;
      ))}
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;훅 타입 정의&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// useState 타입 추론 활용
const [count, setCount] = useState(0); // number로 추론
const [user, setUser] = useState&amp;lt;User | null&amp;gt;(null); // 명시적 타입

// useEffect 의존성 배열 타입 안전성
useEffect(() =&amp;gt; {
  fetchUserData(user?.id);
}, [user?.id]); // user가 변경될 때만 실행

// 커스텀 훅 타입 정의
interface UseApiResult&amp;lt;T&amp;gt; {
  data: T | null;
  loading: boolean;
  error: string | null;
  refetch: () =&amp;gt; void;
}

function useApi&amp;lt;T&amp;gt;(url: string): UseApiResult&amp;lt;T&amp;gt; {
  const [data, setData] = useState&amp;lt;T | null&amp;gt;(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState&amp;lt;string | null&amp;gt;(null);

  const fetchData = async () =&amp;gt; {
    try {
      setLoading(true);
      const response = await fetch(url);
      const result = await response.json();
      setData(result);
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Unknown error');
    } finally {
      setLoading(false);
    }
  };

  useEffect(() =&amp;gt; {
    fetchData();
  }, [url]);

  return {
    data,
    loading,
    error,
    refetch: fetchData
  };
}

// 사용 예시
const UserProfile: React.FC&amp;lt;{ userId: string }&amp;gt; = ({ userId }) =&amp;gt; {
  const { data: user, loading, error } = useApi&amp;lt;User&amp;gt;(`/api/users/${userId}`);

  if (loading) return &amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;;
  if (error) return &amp;lt;div&amp;gt;Error: {error}&amp;lt;/div&amp;gt;;
  if (!user) return &amp;lt;div&amp;gt;User not found&amp;lt;/div&amp;gt;;

  return &amp;lt;div&amp;gt;Welcome, {user.name}!&amp;lt;/div&amp;gt;;
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이벤트 핸들링&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;// 일반적인 이벤트 타입들
type ClickHandler = (event: React.MouseEvent&amp;lt;HTMLButtonElement&amp;gt;) =&amp;gt; void;
type ChangeHandler = (event: React.ChangeEvent&amp;lt;HTMLInputElement&amp;gt;) =&amp;gt; void;
type SubmitHandler = (event: React.FormEvent&amp;lt;HTMLFormElement&amp;gt;) =&amp;gt; void;

// 폼 컴포넌트 예시
interface FormData {
  email: string;
  password: string;
}

const LoginForm: React.FC = () =&amp;gt; {
  const [formData, setFormData] = useState&amp;lt;FormData&amp;gt;({
    email: '',
    password: ''
  });

  const handleInputChange: ChangeHandler = (event) =&amp;gt; {
    const { name, value } = event.target;
    setFormData(prev =&amp;gt; ({
      ...prev,
      [name]: value
    }));
  };

  const handleSubmit: SubmitHandler = (event) =&amp;gt; {
    event.preventDefault();
    // 폼 제출 로직
  };

  return (
    &amp;lt;form onSubmit={handleSubmit}&amp;gt;
      &amp;lt;input
        type=&quot;email&quot;
        name=&quot;email&quot;
        value={formData.email}
        onChange={handleInputChange}
      /&amp;gt;
      &amp;lt;input
        type=&quot;password&quot;
        name=&quot;password&quot;
        value={formData.password}
        onChange={handleInputChange}
      /&amp;gt;
      &amp;lt;button type=&quot;submit&quot;&amp;gt;Login&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실무 베스트 프랙티스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 타입 네이밍 컨벤션&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 좋은 네이밍
interface User {} // 파스칼 케이스
type ApiStatus = &quot;loading&quot; | &quot;success&quot; | &quot;error&quot;; // 파스칼 케이스
type UserRole = &quot;admin&quot; | &quot;user&quot;; // 의미있는 이름

// 제네릭 타입 매개변수
// T - Type, U - Another Type, K - Key, V - Value, P - Property
function transform&amp;lt;TInput, TOutput&amp;gt;(input: TInput): TOutput {
  // ...
}

// Props와 State 접미사 사용
interface ButtonProps {} // 컴포넌트 Props
interface AppState {} // 상태 타입&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 타입 구성 전략&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// 타입 파일 구조 (types/index.ts)
export interface User {
  id: string;
  name: string;
  email: string;
}

export interface ApiResponse&amp;lt;T&amp;gt; {
  data: T;
  status: number;
  message: string;
}

export type UserResponse = ApiResponse&amp;lt;User&amp;gt;;
export type UsersResponse = ApiResponse&amp;lt;User[]&amp;gt;;

// 도메인별 타입 분리
// types/user.ts
// types/product.ts
// types/api.ts&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 에러 처리 패턴&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// Result 패턴
type Result&amp;lt;T, E = Error&amp;gt; =
  | { success: true; data: T }
  | { success: false; error: E };

async function safeApiCall&amp;lt;T&amp;gt;(url: string): Promise&amp;lt;Result&amp;lt;T&amp;gt;&amp;gt; {
  try {
    const response = await fetch(url);
    const data = await response.json();
    return { success: true, data };
  } catch (error) {
    return {
      success: false,
      error: error instanceof Error ? error : new Error('Unknown error')
    };
  }
}

// 사용
const result = await safeApiCall&amp;lt;User&amp;gt;('/api/user');
if (result.success) {
  console.log(result.data.name); // 타입 안전
} else {
  console.error(result.error.message);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 환경 변수와 설정&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// env.ts
interface Environment {
  API_URL: string;
  DEBUG: boolean;
  VERSION: string;
}

declare global {
  namespace NodeJS {
    interface ProcessEnv extends Environment {}
  }
}

// 타입 안전한 환경 변수 접근
export const config = {
  apiUrl: process.env.API_URL || 'http://localhost:3000',
  debug: process.env.DEBUG === 'true',
  version: process.env.VERSION || '1.0.0'
};&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 상태 관리 타이핑&lt;/h3&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;// Redux Toolkit과 함께
interface UserState {
  currentUser: User | null;
  loading: boolean;
  error: string | null;
}

interface AppState {
  user: UserState;
  posts: PostState;
  ui: UIState;
}

// Zustand와 함께
interface UserStore {
  user: User | null;
  setUser: (user: User) =&amp;gt; void;
  clearUser: () =&amp;gt; void;
  isLoggedIn: () =&amp;gt; boolean;
}

const useUserStore = create&amp;lt;UserStore&amp;gt;((set, get) =&amp;gt; ({
  user: null,
  setUser: (user) =&amp;gt; set({ user }),
  clearUser: () =&amp;gt; set({ user: null }),
  isLoggedIn: () =&amp;gt; get().user !== null
}));&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  2025년 최신 기능&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Native TypeScript Compiler (TypeScript 7.0 예정)&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;// 10배 빠른 컴파일 속도
// 50% 적은 메모리 사용량
// 8배 빠른 에디터 로딩

// 사용법은 동일하지만 성능이 크게 향상
npm install typescript@next&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 향상된 타입 추론&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// 더 정확한 제네릭 추론
function createArray&amp;lt;T&amp;gt;(items: T[]) {
  return items;
}

// 이제 더 정확하게 추론됨
const mixedArray = createArray([1, &quot;hello&quot;, true]);
// (string | number | boolean)[]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 새로운 유틸리티 타입&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;// Satisfies 연산자로 더 나은 타입 체크
const config = {
  apiUrl: &quot;https://api.example.com&quot;,
  timeout: 5000,
  retries: 3
} satisfies Config;

// Using import defer (ES2025)
import defer * as utils from './utils';
// 모듈을 지연 로딩하여 성능 향상&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 개선된 에러 메시지&lt;/h3&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;// 2025년 버전에서는 더 친화적인 에러 메시지
interface User {
  name: string;
  age: number;
}

const user: User = {
  name: &quot;John&quot;
  // Error: Property 'age' is missing in type
  //   Suggestion: Add 'age: number' to fix this error
};&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 퀵 레퍼런스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자주 사용하는 패턴들&lt;/h3&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;// 1. Optional Chaining과 Nullish Coalescing
const userName = user?.profile?.name ?? &quot;Unknown&quot;;

// 2. Assertion Functions
function assertIsNumber(value: any): asserts value is number {
  if (typeof value !== &quot;number&quot;) {
    throw new Error(&quot;Value must be number&quot;);
  }
}

// 3. Branded Types (더 엄격한 타입)
type UserId = string &amp;amp; { __brand: &quot;UserId&quot; };
type ProductId = string &amp;amp; { __brand: &quot;ProductId&quot; };

function createUserId(id: string): UserId {
  return id as UserId;
}

// 4. 함수 오버로딩
function createElement(tag: &quot;button&quot;): HTMLButtonElement;
function createElement(tag: &quot;div&quot;): HTMLDivElement;
function createElement(tag: string): HTMLElement;
function createElement(tag: string): HTMLElement {
  return document.createElement(tag);
}

// 5. 조건부 속성
interface BaseConfig {
  mode: &quot;development&quot; | &quot;production&quot;;
}

interface DevelopmentConfig extends BaseConfig {
  mode: &quot;development&quot;;
  debugTools: boolean;
}

interface ProductionConfig extends BaseConfig {
  mode: &quot;production&quot;;
  optimizations: string[];
}

type Config = DevelopmentConfig | ProductionConfig;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;디버깅과 개발 도구&lt;/h3&gt;
&lt;pre class=&quot;scala&quot;&gt;&lt;code&gt;// 타입 확인용 유틸리티
type Debug&amp;lt;T&amp;gt; = { [K in keyof T]: T[K] };
type Expand&amp;lt;T&amp;gt; = T extends infer O ? { [K in keyof O]: O[K] } : never;

// 컴파일 타임에 타입 테스트
type Assert&amp;lt;T extends true&amp;gt; = T;
type Test1 = Assert&amp;lt;true&amp;gt;; // ✅
// type Test2 = Assert&amp;lt;false&amp;gt;; // ❌ 컴파일 에러

// 런타임 타입 체크 (개발 환경)
const isDev = process.env.NODE_ENV === &quot;development&quot;;
function devAssert(condition: any, message: string): asserts condition {
  if (isDev &amp;amp;&amp;amp; !condition) {
    throw new Error(message);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  추가 학습 리소스&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 문서와 도구&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;TypeScript 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.typescriptlang.org/play&quot;&gt;TypeScript Playground&lt;/a&gt; - 온라인 테스트&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://definitelytyped.org/&quot;&gt;DefinitelyTyped&lt;/a&gt; - 타입 정의 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실무에서 자주 설치하는 타입 패키지&lt;/h3&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;# React 관련
npm install @types/react @types/react-dom

# Node.js 관련
npm install @types/node

# 유틸리티 라이브러리
npm install @types/lodash @types/uuid

# 테스팅
npm install @types/jest @types/testing-library__react&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;성능 최적화 팁&lt;/h3&gt;
&lt;pre class=&quot;dsconfig&quot;&gt;&lt;code&gt;# 컴파일 속도 향상
npx tsc --incremental  # 증분 컴파일
npx tsc --watch        # 파일 변경 감시

# 타입 체크만 (JS 생성 안함)
npx tsc --noEmit

# 프로젝트 레퍼런스 사용 (큰 프로젝트)
# tsconfig.json에 references 설정&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  이 가이드는 실무에서 바로 사용할 수 있는 TypeScript 핵심 패턴들을 담았습니다. 처음에는 기본 타입부터 시작해서 점진적으로 고급 기능을 도입하는 것을 추천합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  정기적으로 업데이트되는 이 문서를 북마크하여 TypeScript 개발 시 참고하세요!&lt;/b&gt;&lt;/p&gt;</description>
      <category>TYPESCRIPT</category>
      <category>Typescript</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/195</guid>
      <comments>https://thewavelet.tistory.com/195#entry195comment</comments>
      <pubDate>Sun, 28 Sep 2025 16:25:13 +0900</pubDate>
    </item>
    <item>
      <title>React Native에서 Cheerio 사용하기: TypeScript 타입 선언 완벽 가이드</title>
      <link>https://thewavelet.tistory.com/194</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;React Native에서 Cheerio 사용하기: TypeScript 타입 선언 완벽 가이드&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Native 프로젝트에서 HTML 파싱을 위해 react-native-cheerio를 사용하다 보면, TypeScript 컴파일 오류가 발생하는 경우가 있습니다. 이는 해당 패키지에 타입 선언이 없기 때문인데, 이 문제를 해결하는 방법을 상세히 알아보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;react-native-cheerio 패키지는 JavaScript로만 작성되어 있어서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript 타입 선언이 없음&lt;/li&gt;
&lt;li&gt;@types/react-native-cheerio도 존재하지 않음&lt;/li&gt;
&lt;li&gt;따라서 TypeScript에서 사용 시 컴파일 오류 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방법: 직접 타입 선언 파일 생성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 타입 선언 파일 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 루트에 types/react-native-cheerio.d.ts 파일을 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;typescript&quot;&gt;&lt;code&gt;declare module 'react-native-cheerio' {
  // Cheerio 요소의 기본 인터페이스
  interface CheerioElement {
    [key: string]: any;
  }

  // Cheerio 인스턴스 (jQuery 스타일 API)
  interface CheerioInstance {
    // 선택자 메서드
    find(selector: string): CheerioInstance;

    // 텍스트 조작
    text(): string;
    text(text: string): CheerioInstance;

    // HTML 조작
    html(): string;
    html(html: string): CheerioInstance;

    // 속성 조작
    attr(name: string): string;
    attr(name: string, value: string): CheerioInstance;

    // 반복 처리
    each(fn: (index: number, element: CheerioElement) =&amp;gt; void): CheerioInstance;

    // 배열 스타일 접근
    length: number;
    [index: number]: CheerioElement;
  }

  // Cheerio 메인 인터페이스
  interface CheerioStatic {
    // 메인 함수 호출 시그니처
    (selector?: any, context?: any, root?: any, options?: any): CheerioInstance;

    // HTML 파싱 메서드
    load(html: string, options?: any): CheerioInstance;

    // 버전 정보
    version: string;
  }

  const reactNativeCheerio: CheerioStatic;
  export default reactNativeCheerio;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. tsconfig.json 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tsconfig.json에서 타입 선언 파일을 인식하도록 설정합니다:&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;typeRoots&quot;: [&quot;./node_modules/@types&quot;, &quot;./types&quot;]
  },
  &quot;include&quot;: [
    &quot;types/**/*&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;사용 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 선언 파일을 생성한 후, 다음과 같이 사용할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import cheerio from 'react-native-cheerio';

const htmlString = '&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;Hello World&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;';
const $ = cheerio.load(htmlString);

// 텍스트 추출
const text = $('p').text(); // &quot;Hello World&quot;

// HTML 조작
$('p').html('&amp;lt;strong&amp;gt;Bold Text&amp;lt;/strong&amp;gt;');

// 속성 조작
$('div').attr('class', 'container');

// 반복 처리
$('p').each((index, element) =&amp;gt; {
  console.log(`Element ${index}:`, element);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Import 스타일 선택&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;권장: Default Import&lt;/h3&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;import cheerio from 'react-native-cheerio';
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대안: Namespace Import&lt;/h3&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;import * as cheerio from 'react-native-cheerio';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Default Import를 권장하는 이유:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 명확한 의미: &quot;하나의 주요 기능을 가져온다&quot;&lt;/li&gt;
&lt;li&gt;현대적 ES Module 스타일&lt;/li&gt;
&lt;li&gt;혼란 방지: Named exports와 구분됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TypeScript 타입 선언 우선순위&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TypeScript는 다음 순서로 타입 선언을 찾습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;node_modules/@types/react-native-cheerio (DefinitelyTyped)&lt;/li&gt;
&lt;li&gt;react-native-cheerio/package.json의 &quot;types&quot; 필드&lt;/li&gt;
&lt;li&gt;react-native-cheerio/index.d.ts (패키지 루트)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 내 타입 선언 파일&lt;/b&gt; &amp;larr; 우리가 만든 파일&lt;/li&gt;
&lt;li&gt;없으면 'any' 타입으로 추론&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 구조 권장사항&lt;/h2&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;your-project/
├── types/           # 외부 패키지 타입 선언
│   └── react-native-cheerio.d.ts
├── typings/         # 프로젝트 내부 커스텀 타입
│   └── custom.ts
└── src/
    └── ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 React Native 프로젝트에서 TypeScript의 타입 안정성을 유지하면서 Cheerio를 사용할 수 있습니다. 타입 선언 파일을 통해 IDE의 자동완성과 타입 체크 기능도 정상적으로 작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요에 따라 더 많은 Cheerio 메서드를 타입 선언에 추가할 수 있으며, 이는 프로젝트의 요구사항에 맞춰 점진적으로 확장 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: src/types/react-native-cheerio.d.ts 전체 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1758423693942&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * ================================================================
 * react-native-cheerio 모듈에 대한 TypeScript 타입 선언 파일
 * ================================================================
 *
 *   목적: TypeScript 컴파일 오류 해결
 * - react-native-cheerio 패키지는 JavaScript로만 작성됨 (타입 없음)
 * - @types/react-native-cheerio도 존재하지 않음
 * - 따라서 직접 타입 선언 파일을 생성하여 타입 안정성 확보
 *
 *   react-native-cheerio 패키지 분석:
 *
 *   실제 파일 구조:
 * - index.js: exports = module.exports = require('./lib/cheerio');
 * - lib/cheerio.js: var Cheerio = module.exports = function(selector, context, root, options) { ... }
 *
 *   CommonJS 패턴:
 * module.exports = function cheerio() { ... }
 * cheerio.load = function(html) { ... }  // 함수에 메서드 추가
 * cheerio.version = &quot;1.0.0&quot;              // 함수에 속성 추가
 *
 *   CommonJS vs ES Modules 호환성:
 *
 *   CommonJS (react-native-cheerio의 실제 방식):
 * - 내보내기: module.exports = function
 * - 특징: 하나의 객체/함수를 내보냄
 * - 런타임: 동기적 로딩
 *
 *   ES Modules (현대적 방식):
 * - Named exports: export const func1 = ..., export const func2 = ...
 * - Default export: export default function
 * - 특징: 정적 분석 가능, 트리 쉐이킹 지원
 *
 *   TypeScript/Babel의 호환성 마법:
 *
 * CommonJS 패키지를 ES Module 스타일로 import 가능:
 * - import * as cheerio from 'pkg' &amp;rarr; const cheerio = require('pkg')
 * - import cheerio from 'pkg' &amp;rarr; const cheerio = require('pkg')
 * - 결과: 둘 다 동일한 함수를 가져옴!
 *
 *   왜 이런 호환성이 필요한가?
 * 1. 역사적 이유: CommonJS가 먼저 존재
 * 2. 점진적 마이그레이션: 기존 패키지들의 ES Module 전환 지원
 * 3. 개발자 편의: 원하는 import 스타일 선택 가능
 *
 *   import 스타일 선택 기준:
 *
 * ❌ 기존 방식: import * as cheerio from 'react-native-cheerio'
 * - CommonJS라서 이렇게 써야 한다는 고정관념
 * - 실제로는 둘 다 동작함
 *
 * ✅ 권장 방식: import cheerio from 'react-native-cheerio'
 * - 논리적으로 더 명확: &quot;하나의 주요 기능을 가져온다&quot;
 * - Named exports와 헷갈리지 않음
 * - 현대적 ES Module 스타일
 *
 *   import 스타일 비교:
 *
 * Named exports 패키지 (여러 기능):
 * export const func1 = ...
 * export const func2 = ...
 * &amp;rarr; import { func1, func2 } from 'pkg' (선택적)
 * &amp;rarr; import * as all from 'pkg' (전체를 namespace로)
 *
 * CommonJS 패키지 (하나의 주요 기능):
 * module.exports = function
 * &amp;rarr; import cheerio from 'pkg' (권장)
 * &amp;rarr; import * as cheerio from 'pkg' (가능하지만 혼란 야기)
 *
 *  ️ 타입 선언 방식 선택:
 *
 * 옵션 1: export = (CommonJS 스타일)
 * declare module 'react-native-cheerio' {
 *   interface CheerioStatic { ... }
 *   const cheerio: CheerioStatic;
 *   export = cheerio;  // TypeScript 전용 문법
 * }
 * 사용: import * as cheerio from 'react-native-cheerio'
 *
 * 옵션 2: export default (ES Module 스타일) &amp;larr; 현재 선택
 * declare module 'react-native-cheerio' {
 *   interface CheerioStatic { ... }
 *   const cheerio: CheerioStatic;
 *   export default cheerio;  // 표준 ES Module 문법
 * }
 * 사용: import cheerio from 'react-native-cheerio'
 *
 *   현재 선택한 이유:
 * 1. 논리적 명확성: 하나의 주요 기능 &amp;rarr; default import
 * 2. 현대적 스타일: ES Module 표준 문법 사용
 * 3. 혼란 방지: Named exports와 구분되는 명확한 패턴
 * 4. 사용자 편의: cheerio.load() 직관적 사용
 *
 *   TypeScript 타입 선언 파일 참조 우선순위:
 * 1️⃣ node_modules/@types/react-native-cheerio (DefinitelyTyped) - ❌ 없음
 * 2️⃣ react-native-cheerio/package.json의 &quot;types&quot; 필드 - ❌ 없음
 * 3️⃣ react-native-cheerio/index.d.ts (패키지 루트) - ❌ 없음
 * 4️⃣ 프로젝트 내 타입 선언 파일 (이 파일!) - ✅ 여기서 발견!
 * 5️⃣ 없으면 'any' 타입으로 추론
 *
 *   타입 선언 충돌과 Module Augmentation:
 *
 *   우선순위에 의한 덮어쓰기:
 * - 높은 우선순위가 낮은 우선순위를 완전히 덮어씀 (병합 안됨!)
 * - 예: @types/react + 프로젝트/react.d.ts &amp;rarr; @types/react만 사용
 *
 *   Module Augmentation (모듈 확장):
 * - 기존 타입에 새로운 속성/메서드 추가
 * - 핵심 요구사항: 파일에 import/export 문이 있어야 함!
 *
 * 예시:
 * // react-augmentation.d.ts
 * import React from 'react';  // 이것이 augmentation 모드로 전환!
 *
 * declare module 'react' {
 *   interface HTMLAttributes&amp;lt;T&amp;gt; {
 *     customProp?: string;  // 기존 interface에 속성 추가
 *   }
 * }
 *
 *   Declaration vs Augmentation 모드:
 * - Declaration 모드 (import/export 없음): 새로운 모듈 선언 &amp;rarr; 우선순위 적용
 * - Augmentation 모드 (import/export 있음): 기존 모듈 확장 &amp;rarr; 병합
 *
 *   타입 선언 우선순위 시스템 상세:
 *
 *   모듈별 개별 우선순위 (declare module 기준):
 * TypeScript는 각 모듈명에 대해 개별적으로 우선순위를 적용합니다.
 *
 * 예시 상황:
 * // @types/lodash/index.d.ts
 * declare module 'lodash' { export function map(): any; }
 * declare module 'lodash/map' { export default function(): any; }
 *
 * // lodash/index.d.ts (패키지 자체)
 * declare module 'lodash' { export function filter(): any; }
 * declare module 'lodash/debounce' { export default function(): any; }
 *
 *   우선순위 적용 결과:
 * - 'lodash' 모듈: @types/lodash 버전 사용 (패키지 버전 무시)
 * - 'lodash/map' 모듈: @types/lodash 버전 사용
 * - 'lodash/debounce' 모듈: lodash 패키지 버전 사용 (@types에 없으므로)
 *
 * ⚠️ 전역 선언의 충돌 (declare const/function/class/var):
 * 모듈 우선순위와 달리 전역 선언은 충돌 시 컴파일 에러 발생!
 *
 * 충돌 예시:
 * // @types/jquery/index.d.ts
 * declare const $: JQueryStatic;
 *
 * // 사용자의 types/jquery.d.ts
 * declare const $: MyCustomType;  // ❌ 컴파일 에러!
 * // Error: Duplicate identifier '$'
 *
 *  ️ 전역 충돌 방지 방법:
 * 1. ES Module 사용: export {} 추가하여 파일을 모듈로 만들기
 * 2. skipLibCheck: true 설정 (tsconfig.json)
 * 3. 전역 이름 피하기: Node, Array, String 등 내장 객체명 사용 금지
 * 4. 적절한 타입 정의 설치: @types/node 등
 *
 *   2025년 TypeScript 프로젝트 구조 베스트 프랙티스:
 *
 *   현재 프로젝트 구조 평가:
 * ✅ types/ - 외부 패키지 타입 선언 (.d.ts 파일들)
 * ✅ typings/ - 프로젝트 내부 커스텀 타입들 (.ts 파일들)
 * &amp;rarr; 업계 표준과 완벽히 일치하는 구조!  
 *
 *   결론:
 * - react-native-cheerio는 CommonJS 방식의 단일 함수 패키지
 * - export default로 타입 선언하여 import cheerio 스타일 사용
 * - 논리적으로 명확하고 현대적인 ES Module 패턴 적용
 * - TypeScript 컴파일 오류 해결과 동시에 타입 안정성 확보
 */

//   TypeScript 타입 선언 키워드들:
//
//   declare의 의미:
// - &quot;어딘가에 이미 존재한다&quot;고 TypeScript에게 알려주는 키워드
// - 실제 구현 없이 타입 정보만 선언
// - 컴파일 시점에만 존재, JavaScript로 변환되면 사라짐
//
//   declare 사용 예시들:
// declare const globalVar: string;        // 전역 변수 타입 선언
// declare function globalFunc(): void;    // 전역 함수 타입 선언
// declare class GlobalClass { ... }       // 전역 클래스 타입 선언
// declare var window: Window;             // 브라우저 전역 객체
//
//   module의 의미:
// - 모듈(패키지)의 네임스페이스를 정의
// - 특정 모듈명에 대한 타입 정보를 그룹화
// - import/export와 연결되는 실제 모듈 시스템
//
//   declare module 조합:
// - &quot;이 모듈명으로 import할 때 어떤 타입을 사용할지&quot; 알려주는 선언
// - 실제 패키지 코드와는 무관하게 타입 정보만 제공함
//
//   namespace의 의미:
// - 관련된 타입들을 그룹화하는 TypeScript 개념
// - 전역 스코프 오염을 방지하고 코드를 구조화
// - 점(.) 표기법으로 접근: MyNamespace.SomeType
// - 컴파일 시점에만 존재 (런타임에서 사라짐)
//
//   namespace 예시:
// declare namespace jQuery {
//   interface JQueryStatic {
//     (selector: string): JQuery;
//     ajax(settings: any): void;
//   }
//   interface JQuery {
//     click(): JQuery;
//     hide(): JQuery;
//   }
// }
// 사용: const $: jQuery.JQueryStatic = ...;
//      const element: jQuery.JQuery = ...;
//
//   핵심 차이점:
//
//   객체 (런타임에 실제 존재):
// const Utils = {
//   formatDate: (date: Date) =&amp;gt; date.toString(),
//   API_URL: 'https://api.com'
// };
// Utils.formatDate(new Date());  // 실행 가능! 실제 함수 호출
//
//   namespace (컴파일 시점에만 존재):
// namespace Utils {
//   export type DateFormat = 'ISO' | 'US';
//   export interface ApiResponse { data: any }
// }
// const format: Utils.DateFormat = 'ISO';  // 타입으로만 사용
// Utils.formatDate(new Date());  // ❌ 에러! 런타임에 존재하지 않음
//
//   module vs namespace 차이:
// - module: 실제 파일/패키지와 연결 (import/export 시스템)
// - namespace: 타입들의 논리적 그룹핑 (점 표기법 접근, 타입 전용)
//
//  ️ 과거 vs 현재:
// - 과거: namespace를 많이 사용 (TypeScript 초기)
// - 현재: ES Modules이 표준이 되면서 declare module을 더 선호
// - namespace는 여전히 타입 그룹화에 유용

declare module 'react-native-cheerio' {
  // Cheerio 요소의 기본 인터페이스
  interface CheerioElement {
    [key: string]: any;
  }

  // Cheerio 인스턴스 (jQuery 스타일 API)
  interface CheerioInstance {
    // 선택자 메서드
    find(selector: string): CheerioInstance;

    // 텍스트 조작
    text(): string;
    text(text: string): CheerioInstance;

    // HTML 조작
    html(): string;
    html(html: string): CheerioInstance;

    // 속성 조작
    attr(name: string): string;
    attr(name: string, value: string): CheerioInstance;

    // 반복 처리
    each(fn: (index: number, element: CheerioElement) =&amp;gt; void): CheerioInstance;

    // 배열 스타일 접근
    length: number;
    [index: number]: CheerioElement;

    // 필요시 더 많은 jQuery 스타일 메서드 추가 가능
    // addClass, removeClass, hasClass, css, etc.
  }

  // Cheerio 메인 인터페이스 (함수이면서 동시에 객체)
  interface CheerioStatic {
    // 메인 함수 호출 시그니처 (cheerio('selector') 형태)
    (selector?: any, context?: any, root?: any, options?: any): CheerioInstance;

    // load 메서드 - HTML 문자열을 파싱하여 Cheerio 인스턴스 반환
    load(html: string, options?: any): CheerioInstance;

    // version 속성 (package.json에서 export됨)
    version: string;
  }

  // react-native-cheerio를 default export로 선언
  // 사용법: import cheerio from 'react-native-cheerio'
  const reactNativeCheerio: CheerioStatic;
  export default reactNativeCheerio;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>REACT &amp;amp; NODE</category>
      <category>cheerio</category>
      <category>CommonJS</category>
      <category>export</category>
      <category>named</category>
      <category>react-native</category>
      <category>react-native-cheerio</category>
      <category>rn</category>
      <category>Typescript</category>
      <category>우선순위</category>
      <category>타입선언</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/194</guid>
      <comments>https://thewavelet.tistory.com/194#entry194comment</comments>
      <pubDate>Sun, 21 Sep 2025 12:02:38 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드에서는 실제 배포된 앱이 아니면 결제가 실제로 이루어지지 않습니다.</title>
      <link>https://thewavelet.tistory.com/193</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드에서는&amp;nbsp;실제&amp;nbsp;배포된&amp;nbsp;앱이&amp;nbsp;아니면&amp;nbsp;결제가&amp;nbsp;실제로&amp;nbsp;이루어지지&amp;nbsp;않습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;안드로이드&amp;nbsp;IAP&amp;nbsp;테스트&amp;nbsp;환경&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;개발/디버그&amp;nbsp;모드에서는:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;✅&amp;nbsp;결제&amp;nbsp;UI는&amp;nbsp;표시됨&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;✅&amp;nbsp;Google&amp;nbsp;Play&amp;nbsp;결제&amp;nbsp;다이얼로그&amp;nbsp;나타남&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;❌&amp;nbsp;실제&amp;nbsp;결제는&amp;nbsp;처리되지&amp;nbsp;않음&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;❌&amp;nbsp;서버로&amp;nbsp;전송할&amp;nbsp;유효한&amp;nbsp;receipt&amp;nbsp;생성&amp;nbsp;안됨&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;실제&amp;nbsp;결제가&amp;nbsp;되는&amp;nbsp;경우:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;Google&amp;nbsp;Play&amp;nbsp;Console에&amp;nbsp;APK&amp;nbsp;업로드&lt;br /&gt;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;Internal&amp;nbsp;Testing&amp;nbsp;또는&amp;nbsp;Closed&amp;nbsp;Testing&amp;nbsp;트랙에&amp;nbsp;배포&lt;br /&gt;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;테스터&amp;nbsp;계정으로&amp;nbsp;Play&amp;nbsp;Store에서&amp;nbsp;다운로드&lt;br /&gt;&amp;nbsp;&amp;nbsp;4.&amp;nbsp;그&amp;nbsp;앱에서&amp;nbsp;결제&amp;nbsp;시도&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;테스트&amp;nbsp;방법:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;1.&amp;nbsp;릴리즈&amp;nbsp;빌드&amp;nbsp;생성&lt;br /&gt;&amp;nbsp;&amp;nbsp;npx&amp;nbsp;react-native&amp;nbsp;run-android&amp;nbsp;--variant=release&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;2.&amp;nbsp;APK&amp;nbsp;생성&lt;br /&gt;&amp;nbsp;&amp;nbsp;cd&amp;nbsp;android&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;./gradlew&amp;nbsp;assembleRelease&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;3.&amp;nbsp;Google&amp;nbsp;Play&amp;nbsp;Console에&amp;nbsp;업로드&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;4.&amp;nbsp;Internal&amp;nbsp;Testing&amp;nbsp;트랙에&amp;nbsp;배포&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;5.&amp;nbsp;테스터&amp;nbsp;계정으로&amp;nbsp;다운로드하여&amp;nbsp;테스트&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;현재&amp;nbsp;상황&amp;nbsp;분석&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;지금까지의&amp;nbsp;문제들은&amp;nbsp;모두&amp;nbsp;개발&amp;nbsp;환경의&amp;nbsp;한계였을&amp;nbsp;가능성이&amp;nbsp;높습니다:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;로딩&amp;nbsp;인디케이터가&amp;nbsp;사라지지&amp;nbsp;않음&amp;nbsp;&amp;rarr;&amp;nbsp;유효한&amp;nbsp;receipt가&amp;nbsp;없어서&amp;nbsp;서버&amp;nbsp;처리&amp;nbsp;실패&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&quot;이미&amp;nbsp;보유한&amp;nbsp;아이템&quot;&amp;nbsp;&amp;rarr;&amp;nbsp;Google&amp;nbsp;Play에서&amp;nbsp;가짜&amp;nbsp;구매&amp;nbsp;상태&amp;nbsp;유지&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;서버&amp;nbsp;요청&amp;nbsp;안됨&amp;nbsp;&amp;rarr;&amp;nbsp;receipt&amp;nbsp;데이터가&amp;nbsp;유효하지&amp;nbsp;않음&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;실제&amp;nbsp;배포된&amp;nbsp;앱에서&amp;nbsp;테스트해야&amp;nbsp;정확한&amp;nbsp;결제&amp;nbsp;플로우를&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;iOS는&amp;nbsp;Simulator/TestFlight&amp;nbsp;환경에서도&amp;nbsp;테스트가&amp;nbsp;가능하지만,&amp;nbsp;안드로이드는&amp;nbsp;반드시&amp;nbsp;Play&amp;nbsp;Store를&amp;nbsp;통해&amp;nbsp;배포된&lt;br /&gt;&amp;nbsp;&amp;nbsp;앱에서만&amp;nbsp;실제&amp;nbsp;결제가&amp;nbsp;작동합니다.&lt;/p&gt;</description>
      <category>REACT &amp;amp; NODE</category>
      <category>Android</category>
      <category>IAP</category>
      <category>Purchase</category>
      <category>test</category>
      <category>결제</category>
      <category>배포</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/193</guid>
      <comments>https://thewavelet.tistory.com/193#entry193comment</comments>
      <pubDate>Thu, 18 Sep 2025 00:45:00 +0900</pubDate>
    </item>
    <item>
      <title>directly 'pod install' deprecated, rosetta2, intell x86 vs arm64</title>
      <link>https://thewavelet.tistory.com/192</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;====================&amp;nbsp;DEPRECATION&amp;nbsp;NOTICE&amp;nbsp;=====================&lt;br /&gt;Calling&amp;nbsp;`pod&amp;nbsp;install`&amp;nbsp;directly&amp;nbsp;is&amp;nbsp;deprecated&amp;nbsp;in&amp;nbsp;React&amp;nbsp;Native&lt;br /&gt;because&amp;nbsp;we&amp;nbsp;are&amp;nbsp;moving&amp;nbsp;away&amp;nbsp;from&amp;nbsp;Cocoapods&amp;nbsp;toward&amp;nbsp;alternative&lt;br /&gt;solutions&amp;nbsp;to&amp;nbsp;build&amp;nbsp;the&amp;nbsp;project.&lt;br /&gt;*&amp;nbsp;If&amp;nbsp;you&amp;nbsp;are&amp;nbsp;using&amp;nbsp;Expo,&amp;nbsp;please&amp;nbsp;run:&lt;br /&gt;`npx&amp;nbsp;expo&amp;nbsp;run:ios`&lt;br /&gt;*&amp;nbsp;If&amp;nbsp;you&amp;nbsp;are&amp;nbsp;using&amp;nbsp;the&amp;nbsp;Community&amp;nbsp;CLI,&amp;nbsp;please&amp;nbsp;run:&lt;br /&gt;`yarn&amp;nbsp;ios`&lt;br /&gt;=============================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[!]&amp;nbsp;Do&amp;nbsp;not&amp;nbsp;use&amp;nbsp;&quot;pod&amp;nbsp;install&quot;&amp;nbsp;from&amp;nbsp;inside&amp;nbsp;Rosetta2&amp;nbsp;(x86_64&amp;nbsp;emulation&amp;nbsp;on&amp;nbsp;arm64).&lt;br /&gt;&lt;br /&gt;[!]&amp;nbsp;&amp;nbsp;-&amp;nbsp;Emulated&amp;nbsp;x86_64&amp;nbsp;is&amp;nbsp;slower&amp;nbsp;than&amp;nbsp;native&amp;nbsp;arm64&lt;br /&gt;&lt;br /&gt;[!]&amp;nbsp;&amp;nbsp;-&amp;nbsp;May&amp;nbsp;result&amp;nbsp;in&amp;nbsp;mixed&amp;nbsp;architectures&amp;nbsp;in&amp;nbsp;rubygems&amp;nbsp;(eg:&amp;nbsp;ffi_c.bundle&amp;nbsp;files&amp;nbsp;may&amp;nbsp;be&amp;nbsp;x86_64&amp;nbsp;with&amp;nbsp;an&amp;nbsp;arm64&amp;nbsp;interpreter)&lt;br /&gt;&lt;br /&gt;[!]&amp;nbsp;Run&amp;nbsp;&quot;env&amp;nbsp;/usr/bin/arch&amp;nbsp;-arm64&amp;nbsp;/bin/bash&amp;nbsp;--login&quot;&amp;nbsp;then&amp;nbsp;try&amp;nbsp;again.&lt;br /&gt;&lt;br /&gt;[!]&amp;nbsp;RNNotifee:&amp;nbsp;using&amp;nbsp;Notification&amp;nbsp;Service&amp;nbsp;Extension.&lt;br /&gt;&lt;br /&gt;[!]&amp;nbsp;hermes-engine&amp;nbsp;has&amp;nbsp;added&amp;nbsp;1&amp;nbsp;script&amp;nbsp;phase.&amp;nbsp;Please&amp;nbsp;inspect&amp;nbsp;before&amp;nbsp;executing&amp;nbsp;a&amp;nbsp;build.&amp;nbsp;See&amp;nbsp;`&lt;a href=&quot;https://guides.cocoapods.org/syntax/podspec.html#script_phases&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://guides.cocoapods.org/syntax/podspec.html#script_phases&lt;/a&gt;`&amp;nbsp;for&amp;nbsp;more&amp;nbsp;information.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⏺&amp;nbsp;1.&amp;nbsp;pod&amp;nbsp;install&amp;nbsp;가&amp;nbsp;Rosetta2에서&amp;nbsp;실행되는&amp;nbsp;이유&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;M2&amp;nbsp;맥북인데도&amp;nbsp;Rosetta2&amp;nbsp;경고가&amp;nbsp;나오는&amp;nbsp;이유는&amp;nbsp;터미널이나&amp;nbsp;Ruby가&amp;nbsp;x86_64&amp;nbsp;모드로&amp;nbsp;실행되고&amp;nbsp;있기&amp;nbsp;때문입니다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;마이그레이션으로&amp;nbsp;옮겨온&amp;nbsp;경우&amp;nbsp;다음이&amp;nbsp;원인일&amp;nbsp;수&amp;nbsp;있습니다:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;터미널&amp;nbsp;앱&amp;nbsp;자체가&amp;nbsp;Rosetta&amp;nbsp;모드로&amp;nbsp;설정됨&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Ruby/rbenv/CocoaPods가&amp;nbsp;Intel&amp;nbsp;버전으로&amp;nbsp;설치됨&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;환경변수나&amp;nbsp;PATH가&amp;nbsp;Intel&amp;nbsp;버전을&amp;nbsp;가리킴&lt;br /&gt;&lt;br /&gt;⏺&amp;nbsp;2.&amp;nbsp;아키텍처&amp;nbsp;혼용&amp;nbsp;문제&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Rosetta2에서&amp;nbsp;pod&amp;nbsp;install을&amp;nbsp;실행하면:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;성능&amp;nbsp;저하:&amp;nbsp;x86_64&amp;nbsp;에뮬레이션으로&amp;nbsp;느려짐&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;아키텍처&amp;nbsp;혼용:&amp;nbsp;ffi_c.bundle&amp;nbsp;같은&amp;nbsp;네이티브&amp;nbsp;라이브러리가&amp;nbsp;x86_64로&amp;nbsp;컴파일되는데&amp;nbsp;Ruby&amp;nbsp;인터프리터는&amp;nbsp;arm64일&amp;nbsp;수&lt;br /&gt;&amp;nbsp;&amp;nbsp;있음&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;빌드&amp;nbsp;오류&amp;nbsp;가능성:&amp;nbsp;혼합된&amp;nbsp;아키텍처로&amp;nbsp;인한&amp;nbsp;예기치&amp;nbsp;못한&amp;nbsp;오류&lt;br /&gt;&lt;br /&gt;⏺&amp;nbsp;3.&amp;nbsp;해결&amp;nbsp;방법&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;즉시&amp;nbsp;해결&amp;nbsp;(임시):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;env&amp;nbsp;/usr/bin/arch&amp;nbsp;-arm64&amp;nbsp;/bin/bash&amp;nbsp;--login&lt;br /&gt;&amp;nbsp;&amp;nbsp;cd&amp;nbsp;ios&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;pod&amp;nbsp;install&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;근본적&amp;nbsp;해결:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;터미널&amp;nbsp;앱&amp;nbsp;확인:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Applications&amp;nbsp;&amp;gt;&amp;nbsp;Terminal&amp;nbsp;&amp;gt;&amp;nbsp;우클릭&amp;nbsp;&amp;gt;&amp;nbsp;Get&amp;nbsp;Info&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;&quot;Open&amp;nbsp;using&amp;nbsp;Rosetta&quot;&amp;nbsp;체크&amp;nbsp;해제&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;Ruby&amp;nbsp;재설치&amp;nbsp;(arm64&amp;nbsp;네이티브):&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;현재&amp;nbsp;아키텍처&amp;nbsp;확인&lt;br /&gt;&amp;nbsp;&amp;nbsp;uname&amp;nbsp;-m&amp;nbsp;&amp;nbsp;#&amp;nbsp;arm64여야&amp;nbsp;함&lt;br /&gt;&amp;nbsp;&amp;nbsp;which&amp;nbsp;ruby&lt;br /&gt;&amp;nbsp;&amp;nbsp;ruby&amp;nbsp;-e&amp;nbsp;&quot;puts&amp;nbsp;RUBY_PLATFORM&quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;rbenv&amp;nbsp;사용&amp;nbsp;시&lt;br /&gt;&amp;nbsp;&amp;nbsp;rbenv&amp;nbsp;uninstall&amp;nbsp;[현재버전]&lt;br /&gt;&amp;nbsp;&amp;nbsp;rbenv&amp;nbsp;install&amp;nbsp;[최신버전]&lt;br /&gt;&amp;nbsp;&amp;nbsp;rbenv&amp;nbsp;global&amp;nbsp;[최신버전]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;#&amp;nbsp;또는&amp;nbsp;Homebrew로&amp;nbsp;Ruby&amp;nbsp;재설치&lt;br /&gt;&amp;nbsp;&amp;nbsp;brew&amp;nbsp;uninstall&amp;nbsp;ruby&lt;br /&gt;&amp;nbsp;&amp;nbsp;brew&amp;nbsp;install&amp;nbsp;ruby&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;CocoaPods&amp;nbsp;재설치:&lt;br /&gt;&amp;nbsp;&amp;nbsp;gem&amp;nbsp;uninstall&amp;nbsp;cocoapods&lt;br /&gt;&amp;nbsp;&amp;nbsp;gem&amp;nbsp;install&amp;nbsp;cocoapods&lt;br /&gt;&lt;br /&gt;⏺&amp;nbsp;4.&amp;nbsp;Deprecation&amp;nbsp;Notice&amp;nbsp;대응&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;React&amp;nbsp;Native은&amp;nbsp;CocoaPods에서&amp;nbsp;다른&amp;nbsp;솔루션으로&amp;nbsp;전환&amp;nbsp;중입니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;권장&amp;nbsp;사용법:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Expo&amp;nbsp;사용&amp;nbsp;시:&amp;nbsp;npx&amp;nbsp;expo&amp;nbsp;run:ios&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;Community&amp;nbsp;CLI&amp;nbsp;사용&amp;nbsp;시:&amp;nbsp;yarn&amp;nbsp;ios&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;현재&amp;nbsp;프로젝트에서는&amp;nbsp;yarn&amp;nbsp;ios&amp;nbsp;명령어를&amp;nbsp;사용하는&amp;nbsp;것이&amp;nbsp;좋습니다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;5.&amp;nbsp;추가&amp;nbsp;경고들&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;RNNotifee:&amp;nbsp;Notification&amp;nbsp;Service&amp;nbsp;Extension&amp;nbsp;사용&amp;nbsp;중&amp;nbsp;(정상)&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;hermes-engine:&amp;nbsp;스크립트&amp;nbsp;단계&amp;nbsp;추가됨&amp;nbsp;(빌드&amp;nbsp;전&amp;nbsp;검토&amp;nbsp;권장)&lt;br /&gt;&lt;br /&gt;⏺&amp;nbsp;요약:&amp;nbsp;마이그레이션으로&amp;nbsp;인해&amp;nbsp;Intel&amp;nbsp;버전&amp;nbsp;Ruby/CocoaPods가&amp;nbsp;설치되어&amp;nbsp;있을&amp;nbsp;가능성이&amp;nbsp;높습니다.&amp;nbsp;arm64&amp;nbsp;네이티브&lt;br /&gt;&amp;nbsp;&amp;nbsp;환경으로&amp;nbsp;재설치하고,&amp;nbsp;앞으로는&amp;nbsp;yarn&amp;nbsp;ios&amp;nbsp;명령어를&amp;nbsp;사용하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;React&amp;nbsp;Native의&amp;nbsp;방향성:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;현재:&amp;nbsp;CocoaPods&amp;nbsp;사용&amp;nbsp;중&amp;nbsp;(하지만&amp;nbsp;deprecated)&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;미래:&amp;nbsp;CocoaPods&amp;nbsp;없이&amp;nbsp;다른&amp;nbsp;솔루션으로&amp;nbsp;전환&amp;nbsp;예정&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;현재&amp;nbsp;상황에서는:&lt;br /&gt;&amp;nbsp;&amp;nbsp;1.&amp;nbsp;yarn&amp;nbsp;ios가&amp;nbsp;내부적으로&amp;nbsp;pod&amp;nbsp;install을&amp;nbsp;자동&amp;nbsp;실행합니다&lt;br /&gt;&amp;nbsp;&amp;nbsp;2.&amp;nbsp;하지만&amp;nbsp;여전히&amp;nbsp;CocoaPods&amp;nbsp;의존성이&amp;nbsp;필요합니다&lt;br /&gt;&amp;nbsp;&amp;nbsp;3.&amp;nbsp;에러&amp;nbsp;코드&amp;nbsp;65는&amp;nbsp;Xcode&amp;nbsp;빌드&amp;nbsp;실패를&amp;nbsp;의미합니다&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;당분간은:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;pod&amp;nbsp;install&amp;nbsp;여전히&amp;nbsp;필요&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;yarn&amp;nbsp;ios&amp;nbsp;사용&amp;nbsp;권장&amp;nbsp;(자동으로&amp;nbsp;pod&amp;nbsp;install&amp;nbsp;실행)&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;빌드&amp;nbsp;실패&amp;nbsp;시&amp;nbsp;pod&amp;nbsp;install&amp;nbsp;수동&amp;nbsp;실행&amp;nbsp;필요할&amp;nbsp;수&amp;nbsp;있음&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;완전히&amp;nbsp;CocoaPods&amp;nbsp;없어지는&amp;nbsp;시기:&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;React&amp;nbsp;Native&amp;nbsp;0.82+&amp;nbsp;이후&amp;nbsp;단계적으로&lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;아직&amp;nbsp;구체적인&amp;nbsp;일정은&amp;nbsp;미정&lt;br /&gt;&lt;br /&gt;⏺&amp;nbsp;결론:&amp;nbsp;지금은&amp;nbsp;여전히&amp;nbsp;CocoaPods가&amp;nbsp;필요하고,&amp;nbsp;yarn&amp;nbsp;ios&amp;nbsp;실패&amp;nbsp;시&amp;nbsp;pod&amp;nbsp;install을&amp;nbsp;직접&amp;nbsp;실행해야&amp;nbsp;할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>REACT &amp;amp; NODE</category>
      <category>arm64</category>
      <category>intel</category>
      <category>M2</category>
      <category>pod install</category>
      <category>ROSETTA</category>
      <category>X86</category>
      <author>thewavelet</author>
      <guid isPermaLink="true">https://thewavelet.tistory.com/192</guid>
      <comments>https://thewavelet.tistory.com/192#entry192comment</comments>
      <pubDate>Wed, 17 Sep 2025 20:46:12 +0900</pubDate>
    </item>
  </channel>
</rss>