React Native์ TypeScript 2026: ํ์ ์์ ํ ์ํคํ ์ฒ์ ๋ฉด์ ์ง๋ฌธ
2026๋ React Native์์ TypeScript๋ฅผ ํ์ฉํ ํ์ ์์ ์ํคํ ์ฒ๋ฅผ ๋ค๋ฃน๋๋ค. Codegen, TurboModules, Strict TypeScript API, ํ์ ์์ ๋ด๋น๊ฒ์ด์ , ๋ฉด์ ์ง๋ฌธ์ ์ฝ๋ ์์ ์ ํจ๊ป ์ค๋ช ํฉ๋๋ค.

2026๋ ์ค๋ฐ ํ์ฌ, React Native์์ TypeScript ํ์ ์์ ์ฑ์ ํฌ๊ฒ ์ฑ์ํ ๋จ๊ณ์ ์ด๋ฅด๋ ์ต๋๋ค. ๋ฒ์ 0.86์์๋ React 19.1, Strict TypeScript API, ๊ทธ๋ฆฌ๊ณ Codegen ๊ธฐ๋ฐ์ ์์ ํ ๋ธ๋ฆฌ์ง๋ฆฌ์ค ์ํคํ ์ฒ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ํ์ฌ๋์์ต๋๋ค. TypeScript๋ ๋ ์ด์ JavaScript์ ๋ค์ดํฐ๋ธ ์ฝ๋ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ์ ํ์ ๋๊ตฌ๊ฐ ์๋๋๋ค. ์ปดํฌ๋ํธ props์์ TurboModule ์ธํฐํ์ด์ค์ ์ด๋ฅด๊ธฐ๊น์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ณ์ฝ์ ์ฃผ๋ํ๋ฉฐ, ํ๋ก๋์ ํฌ๋์ ๋ก๊ทธ๊ฐ ์๋ ๋น๋ ์์ ์ ๋ถ์ผ์น๋ฅผ ๊ฐ์งํ๋ ๊ตฌ์กฐ๋ก ๋ฐ์ ํ์ต๋๋ค.
React Native 0.80์์ ์ตํธ์ธ ๋ฐฉ์์ Strict TypeScript API๊ฐ ๋์ ๋์๊ณ , 0.82์์ ๋ ๊ฑฐ์ ๋ธ๋ฆฌ์ง๊ฐ ์์ ํ ์ ๊ฑฐ๋์์ผ๋ฉฐ, 0.85์์ ๋ง์ง๋ง interop ๋ ์ด์ด๊ฐ ์ญ์ ๋์์ต๋๋ค. 2026๋ 6์ ๊ธฐ์ค 0.86์์๋ ๋ชจ๋ ์ ํ๋ก์ ํธ๊ฐ ์์ค ์ฝ๋์์ ์ง์ ์์ฑ๋ TypeScript ํ์ ์ ์ฌ์ฉํ์ฌ ์์ ํ ๋ธ๋ฆฌ์ง๋ฆฌ์ค ๊ตฌ์ฑ์ผ๋ก ์์๋ฉ๋๋ค.
TypeScript๊ฐ React Native์ ๊ธฐ๋ณธ๊ฐ์ด ๋ ์ด์
๋ฒ์ 0.76 ์ดํ๋ก npx react-native init ๋ช
๋ น์ด๋ก ์์ฑ๋๋ ๋ชจ๋ ํ๋ก์ ํธ๋ TypeScript๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํ์ง๋ง ๋ณธ์ง์ ์ธ ๋ณํ๋ ๋ค์ดํฐ๋ธ ๊ฒฝ๊ณ์์ ์ผ์ด๋ฌ์ต๋๋ค. Codegen ๋์
์ด์ ์ ๊ฐ๋ฐ์๋ค์ JavaScript์์ Objective-C๋ Kotlin์ผ๋ก์ ๊ฒฝ๊ณ๋ฅผ ๋์ ๋ ์๋ ํ์
์ด์ค์
์ ์์ฑํด์ผ ํ์ต๋๋ค. ์ด๋ ๋ฌธ์์ด ๊ธฐ๋ฐ์ ์๋ฌต์ ๊ณ์ฝ์ด์๊ณ , ๋ฐํ์์ ์กฐ์ฉํ ๊นจ์ง๋ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ์ต๋๋ค.
Codegen์ TypeScript ์ฌ์ ํ์ผ์ ์ฝ์ด C++, Objective-C++, Java/Kotlin ์ธํฐํ์ด์ค๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค. TypeScript ์ฌ์์ด number๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ฉด, ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค๊ฐ ํด๋น ์ ์ฝ ์กฐ๊ฑด์ ์ปดํ์ผ ์์ ์ ๊ฐ์ ํฉ๋๋ค.
React Native ๊ณต์ ๋ฌธ์์์๋ ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ๋ค๋ฃจ๊ณ ์์ง๋ง, ํ๋ก๋์ ํ๊ฒฝ์์ ์ค์ํ ํ์ ์์ ํจํด์ ๊ทธ ์ด์์ ๋๋ค. ํ์ ์์ ๋ด๋น๊ฒ์ด์ ์คํ, ์ ๋ค๋ฆญ API ํ , ์ํ ๋จธ์ ์ฉ ํ๋ณ ์ ๋์จ, Codegen ๊ธฐ๋ฐ TurboModule ์ฌ์์ด ํต์ฌ์ ์ด๋ฃน๋๋ค.
Strict TypeScript API ์ค์
React Native 0.80์์ ๋์ ๋ Strict TypeScript API๋ ์์ค ์ฝ๋์์ ์ง์ ์์ฑ๋ ํ์ ์ผ๋ก๋ง ๊ณต๊ฐ API ํ๋ฉด์ ์ ํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ง์ด๋ ๋ฒ์ ๊ฐ์ ๊นจ์ง ์ ์๋ ๋ด๋ถ ๋ชจ๋์ ๋ํ ์ค์๋ก ์ธํ ์์กด์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
{
"compilerOptions": {
"strict": true,
"exactOptionalPropertyTypes": true,
"noUncheckedIndexedAccess": true,
"moduleResolution": "bundler",
"jsx": "react-jsx",
"types": ["react-native/types/strict"]
},
"extends": "@react-native/typescript-config/tsconfig.json"
}์ด ์ค์ ์ ์ ์ฉํ๋ฉด react-native/Libraries/Text/Text์ ๊ฐ์ ํ์ ๊ฒฝ๋ก์์์ ์ํฌํธ๋ ํ์
์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ชจ๋ ์ํฌํธ๋ ๋ฃจํธ react-native ํจํค์ง์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ฉฐ, 0.80๋ถํฐ ๊ฐ์ ๋ ๋ฅ ์ํฌํธ ์ง์ ์ค๋จ ์ ์ฑ
์ ๋ถํฉํฉ๋๋ค.
React Navigation 7์ ํ์ฉํ ํ์ ์์ ๋ด๋น๊ฒ์ด์
React Navigation 7.x๋ TypeScript์ ๋ํ ํผ์คํธ ํด๋์ค ์ง์์ ์ ๊ณตํฉ๋๋ค. ํต์ฌ ํจํด์ ๊ฐ ํ๋ฉด ์ด๋ฆ๊ณผ ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ๋งคํํ๋ RootStackParamList ํ์
์ ์ ์ํ๊ณ , ํด๋น ํ์
์ ๋ค๋น๊ฒ์ดํฐ์ ํ๋ฉด ์ปดํฌ๋ํธ์ ์ ํํ๋ ๊ฒ์
๋๋ค.
export type RootStackParamList = {
Home: undefined;
Profile: { userId: string };
Settings: undefined;
ArticleDetail: { articleId: string; source: 'feed' | 'search' };
};
export type AppTabParamList = {
Dashboard: undefined;
Explore: { category?: string };
Notifications: undefined;
};ํ๋ฉด ์ปดํฌ๋ํธ๋ ์๋ ์บ์คํ ์์ด ํ์ ์ด ์ง์ ๋ props๋ฅผ ๋ฐ์ต๋๋ค.
import type { NativeStackScreenProps } from '@react-navigation/native-stack';
import type { RootStackParamList } from '../navigation/types';
type Props = NativeStackScreenProps<RootStackParamList, 'ArticleDetail'>;
export function ArticleDetailScreen({ route, navigation }: Props) {
// route.params.articleId๋ string โ ํ์
์ ์ํด ๋ณด์ฅ๋จ
// route.params.source๋ 'feed' | 'search' โ ๋ฐํ์ ๊ฒ์ฌ ๋ถํ์
const { articleId, source } = route.params;
// navigation.navigate('Profile', { userId: '123' }) โ ํ์
์ฒดํฌ ์๋ฃ
// navigation.navigate('Profile', {}) โ ์ปดํ์ผ ์๋ฌ: userId ๋๋ฝ
return (
<ArticleView id={articleId} referrer={source} />
);
}์ด ํจํด์ ํตํด ๋ฐํ์ ์๋ฌ์ ํ ๋ฒ์ฃผ๊ฐ ์์ ํ ์ ๊ฑฐ๋ฉ๋๋ค. ์๋ชป๋ ํ๋ผ๋ฏธํฐ ๋๋ ๋๋ฝ๋ ํ๋ผ๋ฏธํฐ๋ก ํ๋ฉด ์ด๋์ ์๋ํ๋ฉด ์ฑ ์คํ ์ ๋น๋ ์์ ์ ์คํจํฉ๋๋ค.
์ง์ ์ ์ธ ํ๋ฉด ์์ ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฒฝ์ฐ, useNavigation<NativeStackNavigationProp<RootStackParamList>>()๋ฅผ ์ฌ์ฉํ๋ฉด props ์ ๋ฌ ์์ด๋ ๋์ผํ ํ์
์์ ์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค.
Codegen์ ํ์ฉํ ํ์ ์์ TurboModule ๊ตฌ์ถ
TurboModules๋ ๊ธฐ์กด Native Modules ์์คํ ์ ๋์ฒดํฉ๋๋ค. TypeScript ์ฌ์ ํ์ผ์ด ๋จ์ผ ์ ๋ณด ์ถ์ฒ(single source of truth)๋ก ๊ธฐ๋ฅํ๋ฉฐ, Codegen์ด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ฌ์๊ณผ ๋ค์ดํฐ๋ธ ๊ตฌํ์ด ์ผ์นํ์ง ์์ผ๋ฉด ๋น๋๊ฐ ์คํจํฉ๋๋ค.
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';
export interface Spec extends TurboModule {
getDeviceModel(): string;
getBatteryLevel(): Promise<number>;
getStorageInfo(): Promise<{
totalBytes: number;
freeBytes: number;
usedPercentage: number;
}>;
onBatteryChange(callback: (level: number) => void): void;
}
export default TurboModuleRegistry.getEnforcing<Spec>('DeviceInfo');npx react-native codegen์ ์คํํ๋ฉด ๋์ํ๋ C++, Objective-C++, Java ์ธํฐํ์ด์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ค์ดํฐ๋ธ ๊ตฌํ์ ๋ชจ๋ ๋ฉ์๋ ์๊ทธ๋์ฒ์ ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด getStorageInfo๋ 3๊ฐ์ ์ซ์ ํ๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ฉฐ, ๋ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๋ฐํํ๋ฉด ๋ค์ดํฐ๋ธ ์ธก์์ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
class DeviceInfoModule(reactContext: ReactApplicationContext) :
NativeDeviceInfoSpec(reactContext) {
// ๋ฐํ ํ์
์ ์์ฑ๋ NativeDeviceInfoSpec์ ์ํด ๊ฐ์ ๋จ
override fun getDeviceModel(): String {
return Build.MODEL
}
override fun getBatteryLevel(): Promise<Double> {
val bm = reactContext.getSystemService(Context.BATTERY_SERVICE)
as BatteryManager
val level = bm.getIntProperty(
BatteryManager.BATTERY_PROPERTY_CAPACITY
).toDouble()
return Promise.resolve(level)
}
}๊ธฐ์กด ์ํคํ
์ฒ์์ ๋ฌธ์ ๊ฐ ๋์๋ ReadableMap๊ณผ NSDictionary ํ์ฑ์ผ๋ก ์ธํ ์๋ฌต์ ํ์
๋ณํ ๋ฒ๊ทธ๊ฐ ์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด ์ ๊ฑฐ๋ฉ๋๋ค.
React Native ๋ฉด์ ์ค๋น๊ฐ ๋์ จ๋์?
์ธํฐ๋ํฐ๋ธ ์๋ฎฌ๋ ์ดํฐ, flashcards, ๊ธฐ์ ํ ์คํธ๋ก ์ฐ์ตํ์ธ์.
์ ๋ค๋ฆญ ํ์ ์ ํ์ฉํ ํ์ ์์ API ํ
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ ํ ํจํด์ ํตํด ํ๋ฉด ๊ฐ ํ์น ๋ก์ง ์ค๋ณต ์์ด ์์ ํ ํ์ ์ถ๋ก ์ ์ ์งํ ์ ์์ต๋๋ค.
import { useQuery, UseQueryOptions } from '@tanstack/react-query';
interface ApiResponse<T> {
data: T;
meta: { page: number; totalPages: number };
}
export function useApiQuery<T>(
key: readonly string[],
endpoint: string,
options?: Omit<UseQueryOptions<ApiResponse<T>>, 'queryKey' | 'queryFn'>
) {
return useQuery<ApiResponse<T>>({
queryKey: key,
queryFn: async () => {
const response = await fetch(`${API_BASE}${endpoint}`);
if (!response.ok) throw new ApiError(response.status);
return response.json() as Promise<ApiResponse<T>>;
},
...options,
});
}
// ์ฌ์ฉ ์์ โ T๋ Article[]๋ก ์ถ๋ก ๋จ
interface Article {
id: string;
title: string;
publishedAt: string;
}
const { data, isLoading } = useApiQuery<Article[]>(
['articles', 'latest'],
'/articles?sort=latest'
);
// data.data๋ Article[] โ ์์ ํ ํ์
์ง์
// data.meta.totalPages๋ number์ ๋ค๋ฆญ ํ๋ผ๋ฏธํฐ T๋ ํ
ํธ์ถ ์ง์ ์์ ์ฟผ๋ฆฌ ํจ์๋ฅผ ๊ฑฐ์ณ ๊ฒฐ๊ณผ๋ฅผ ์๋นํ๋ ์ปดํฌ๋ํธ๊น์ง ์ ์ฒด ์ฒด์ธ์ ๊ฑธ์ณ ์ ํ๋ฉ๋๋ค. as ์บ์คํ
๋ any ํ์
๋ ํ์ํ์ง ์์ต๋๋ค.
ํ๋ณ ์ ๋์จ์ ํ์ฉํ ์ํ ๋จธ์ ์ค๊ณ
ํ๋ฉด์ ๋ณต์กํ ์ํ(๋ก๋ฉ, ์๋ฌ, ๋น ์ํ, ๋ก๋ ์๋ฃ)๋ ์ ํ์ ํ๋์ ์งํฉ์ด ์๋ ํ๋ณ ์ ๋์จ์ผ๋ก ๋ชจ๋ธ๋งํ๋ ๊ฒ์ด ์ต์ ์ ๋๋ค.
type ScreenState<T> =
| { status: 'idle' }
| { status: 'loading' }
| { status: 'error'; error: string; retryCount: number }
| { status: 'empty'; message: string }
| { status: 'loaded'; data: T; refreshedAt: Date };
// components/DataScreen.tsx
function renderContent<T>(state: ScreenState<T>, renderItem: (data: T) => ReactNode) {
switch (state.status) {
case 'idle':
return null;
case 'loading':
return <LoadingSpinner />;
case 'error':
// state.error๋ ์ฌ๊ธฐ์ string โ TypeScript๊ฐ ์๋์ผ๋ก ์ขํ์ค
return <ErrorBanner message={state.error} retries={state.retryCount} />;
case 'empty':
return <EmptyState message={state.message} />;
case 'loaded':
// state.data๋ T โ ์์ ํ ํ์
์ง์
return renderItem(state.data);
}
}์ด ํจํด์ ํตํด ๋ถ๊ฐ๋ฅํ ์ํ๋ฅผ ํ์
์์ค์์ ํํ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. loading ์ํ๊ฐ ์ค๋๋ data๋ฅผ ์๋ชป ๋ณด์ ํ ์ ์์ผ๋ฉฐ, error ์ํ์๋ ํญ์ ๋๋ฒ๊น
์ ์ํ ์ปจํ
์คํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
ํํ ์ํฐํจํด: { isLoading: boolean; error?: string; data?: T }. ์ด ์ ์์์๋ { isLoading: true, error: 'fail', data: [...] }์ ๊ฐ์ ์ํ๊ฐ ํ์ฉ๋ฉ๋๋ค โ ์ธ ๊ฐ์ง ๋ชจ์๋ ์ ํธ๊ฐ ๋์์ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. ํ๋ณ ์ ๋์จ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ํ๋ฅผ ํ์
์์ค์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
React Native TypeScript ๋ฉด์ ์ง๋ฌธ
New Architecture์ TypeScript๊ฐ ํ์ค์ด ๋ 2026๋ , ์๋์ด ๋ชจ๋ฐ์ผ ์์ง๋์ด๋ง ํ ๋ฉด์ ์์ ์ค์ ๋ก ์ถ์ ๋๋ ์ง๋ฌธ๋ค์ ๋ค๋ฃน๋๋ค.
Codegen์ JavaScript-๋ค์ดํฐ๋ธ ๊ฒฝ๊ณ์์ ์ด๋ป๊ฒ ํ์ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๊น?
Codegen์ TypeScript(๋๋ Flow) ์ฌ์ ํ์ผ์ ์ฝ์ด C++, Objective-C++, Java/Kotlin ์ธํฐํ์ด์ค ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์์ฑ๋ ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค๋ ์ฌ์์ ์ ์๋ ๋ฉ์๋ ์๊ทธ๋์ฒ, ํ๋ผ๋ฏธํฐ ํ์
, ๋ฐํ ํ์
์ ์ ํํ๊ฒ ๊ฐ์ ํฉ๋๋ค. ๋ค์ดํฐ๋ธ ๊ตฌํ์ด ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ โ ์ฌ์์ด Double์ ์ ์ธํ๋๋ฐ Int๋ฅผ ๋ฐํํ๊ฑฐ๋ ๊ตฌ์กฐ์ฒด์์ ํ๋๋ฅผ ๋๋ฝํ๋ ๋ฑ โ ๋ค์ดํฐ๋ธ ์ปดํ์ผ๋ฌ๊ฐ ๋น๋๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์
์๋ฌ๊ฐ ๋ฐํ์ ํฌ๋์์์ ๋น๋ ์์ ์ ์คํจ๋ก ์ด๋ํฉ๋๋ค.
Strict TypeScript API๋ ๋ฌด์์ด๋ฉฐ ์ ์ค์ํฉ๋๊น?
React Native 0.80์์ ๋์
๋ Strict TypeScript API๋ ์๋์ผ๋ก ์์ฑ๋ .d.ts ํ์ผ ๋์ React Native์ ์์ค ์ฝ๋์์ ์ง์ ํ์
์ ์์ฑํฉ๋๋ค. ์ํฌํธ๋ฅผ ๋ฃจํธ react-native ํจํค์ง๋ก ์ ํํ๊ณ ๋ฅ ์ํฌํธ๋ฅผ ์ง์ ์ค๋จํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ ์ ์ธ ๊ณต๊ฐ API ํ๋ฉด์ด ์ ์๋๋ฉฐ, ์ฌ์ฉ์๊ฐ strict ํ์
๋ง ์ฌ์ฉํ๋ ํ ๋ด๋ถ ๋ฆฌํฉํ ๋ง์ผ๋ก ์ธํด ์ฌ์ฉ์ ์ฝ๋๊ฐ ๊นจ์ง์ง ์์ต๋๋ค. tsconfig.json์์ "types": ["react-native/types/strict"]๋ฅผ ์ค์ ํ์ฌ ํ์ฑํํ ์ ์์ต๋๋ค.
์ค์ฒฉ๋ ๋ค๋น๊ฒ์ดํฐ ๊ฐ์ React Navigation ํ๋ผ๋ฏธํฐ๋ฅผ ์ด๋ป๊ฒ ํ์ ์ง์ ํฉ๋๊น?
๋ค๋น๊ฒ์ดํฐ๋ณ๋ก ParamList ํ์
์ ์ ์ํ๊ณ NavigatorScreenParams๋ฅผ ์ฌ์ฉํ์ฌ ์กฐํฉํฉ๋๋ค. ์คํ ๋ด์ ์ค์ฒฉ๋ ํญ ๋ค๋น๊ฒ์ดํฐ์ ๊ฒฝ์ฐ, ์คํ์ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ๊ฐ ํญ์ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ๋ฅผ ์ฐธ์กฐํฉ๋๋ค: type RootStack = { Main: NavigatorScreenParams<TabParamList>; Modal: { id: string } }. ๋ชจ๋ navigate() ํธ์ถ์ด ์ ์ฒด ์ค์ฒฉ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํตํด ํ์
์ฒดํฌ๋์ด ์๋ชป๋ ํ๋ฉด ์ด๋ฆ์ด๋ ๋๋ฝ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ปดํ์ผ ์์ ์ ๊ฐ์งํฉ๋๋ค.
ํ๋ณ ์ ๋์จ์ React Native ์ํ ๊ด๋ฆฌ์์ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๊น?
ํ๋ณ ์ ๋์จ์ ์ํธ ๋ฐฐํ์ ์ธ ์ํ(loading, error, loaded)๋ฅผ status ํ๋๋ฅผ ํค๋ก ํ๋ ์ ๋์จ ํ์
์ ๋ณ๋ ๋ถ๊ธฐ๋ก ๋ชจ๋ธ๋งํฉ๋๋ค. TypeScript๋ switch ๋ฌธ์ ๊ฐ ๋ถ๊ธฐ์์ ํ์
์ ์๋์ผ๋ก ์ขํ์ฃผ๋ฏ๋ก, state.data์ ๋ํ ์ ๊ทผ์ state.status === 'loaded'์ธ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๊ฐ ์๋ฌ ๋ฐ์ดํฐ์ ๋์์ ํ์๋๋ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ ํ์ ํ๋์ boolean ํ๋๊ทธ๋ก๋ ์ด ๋ฒ์ฃผ์ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
TurboModules์ ๊ธฐ์กด Native Modules ์์คํ ์ ์ฐจ์ด์ ์ ์ค๋ช ํด ์ฃผ์ญ์์ค.
Native Modules๋ ๋น๋๊ธฐ ๋ธ๋ฆฌ์ง๋ฅผ ํตํด ํต์ ํ๋ฉฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ์ง๋ ฌํํ์ต๋๋ค. TurboModules๋ JSI(JavaScript Interface)๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐ์ ์ด๊ณ ์ง์ ์ ์ธ C++ ํธ์ถ์ ์ํํ๋ฉฐ ์ง๋ ฌํ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ๋ํ ์ง์ฐ ๋ก๋ฉ(์ฑ ์์ ์๊ฐ ์๋ ์ฒซ ์ฌ์ฉ ์ ๋ก๋)์ ํตํด ์ฝ๋ ์คํํธ ์๊ฐ์ ์ค์ด๊ณ , Codegen์ ์ฌ์ฉํ์ฌ TypeScript ์ฌ์์์ ํ์
์์ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค. ๊ธฐ์กด ์์คํ
์ ReadableMap / NSDictionary ํ์ฑ์ ์ํ ๋ฐํ์ ํ์
๋ณํ์ ์์กดํ์ง๋ง, TurboModules๋ ์ปดํ์ผ ์์ ์ ํ์
์ ๊ฐ์ ํฉ๋๋ค.
React Native ๋ฉด์ ์ง๋ฌธ์์๋ JSI, Fabric, ๋ธ๋ฆฌ์ง๋ฆฌ์ค ์ํคํ ์ฒ์ ๋ํด ๋ ์์ธํ ๋ค๋ฃจ๊ณ ์์ต๋๋ค.
์ฐ์ต์ ์์ํ์ธ์!
๋ฉด์ ์๋ฎฌ๋ ์ดํฐ์ ๊ธฐ์ ํ ์คํธ๋ก ์ง์์ ํ ์คํธํ์ธ์.
๊ฒฐ๋ก
- Strict TypeScript API(0.80 ์ดํ)๋ ์์ ์ ์ธ ๊ณต๊ฐ ํ๋ฉด์ผ๋ก ์ํฌํธ๋ฅผ ์ ํํ์ฌ ๋ด๋ถ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ํ์์ ๋ฐฉ์งํฉ๋๋ค โ ๋ชจ๋ ์ ํ๋ก์ ํธ์์ ํ์ฑํํด์ผ ํฉ๋๋ค
- Codegen์ TypeScript ์ฌ์ ํ์ผ์์ ๋ค์ดํฐ๋ธ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ์ฌ JS-๋ค์ดํฐ๋ธ ๊ฒฝ๊ณ์ ํ์ ์๋ฌ๋ฅผ ๋ฐํ์ ํฌ๋์์์ ๋น๋ ์์ ์คํจ๋ก ์ ํํฉ๋๋ค
RootStackParamList์NativeStackScreenProps๋ฅผ ์ฌ์ฉํ ํ์ ์์ ๋ด๋น๊ฒ์ด์ ํ๋ผ๋ฏธํฐ๋ก ์๋ชป๋ ํ๋ฉด ์ด๋ฆ๊ณผ ๋๋ฝ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฑ ์คํ ์ ์ ๊ฐ์งํ ์ ์์ต๋๋ค- ํ๋ณ ์ ๋์จ์ ํ๋ฉด ์ํ๋ฅผ ์ํธ ๋ฐฐํ์ ์ธ ๋ถ๊ธฐ๋ก ๋ชจ๋ธ๋งํ์ฌ ๋ถ๊ฐ๋ฅํ ์ํ๋ฅผ ํ์ ์์ค์์ ํํ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค
- ํ์
์ฌ์์ ๊ฐ์ถ TurboModules๋ ๊ธฐ์กด
ReadableMap/NSDictionaryํ์ฑ์ ๋์ฒดํ์ฌ JavaScript์์ C++, ํ๋ซํผ ๋ค์ดํฐ๋ธ ์ฝ๋๊น์ง ์์ ํ ํ์ ์์ ์ฑ์ ๊ตฌํํฉ๋๋ค - TanStack Query๋ฅผ ์ฌ์ฉํ ์ ๋ค๋ฆญ API ํ ์ ์๋ํฌ์ธํธ์์ ์ปดํฌ๋ํธ๊น์ง ์๋ ์บ์คํ ์์ด ํ์ ์ถ๋ก ์ ์ ์งํฉ๋๋ค
์ฐ์ต์ ์์ํ์ธ์!
๋ฉด์ ์๋ฎฌ๋ ์ดํฐ์ ๊ธฐ์ ํ ์คํธ๋ก ์ง์์ ํ ์คํธํ์ธ์.
ํ๊ทธ
๊ณต์
๊ด๋ จ ๊ธฐ์ฌ

React Native 0.85 (2026): ์๋ก์ด ์ ๋๋ฉ์ด์ ๋ฐฑ์๋, ์๊ฒฉํ TypeScript API ๋ฐ ๋ฉด์ ์ง๋ฌธ
React Native 0.85์ ๊ณต์ ์ ๋๋ฉ์ด์ ๋ฐฑ์๋, ํฌ์คํธ ๋ธ๋ฆฌ์ง ์ํคํ ์ฒ, Metro TLS์ ๋ํด ์ฝ๋ ์์ ์ ๋ฉด์ ์ง๋ฌธ์ ํตํด ์ฌ์ธต ๋ถ์ํฉ๋๋ค.

2026๋ React Native ์๋ก์ด ์ํคํ ์ฒ: Hermes V1, ๋ธ๋ฆฟ์ง๋ฆฌ์ค ๋ชจ๋์ ๋ฉด์ ์ง๋ฌธ
React Native ์๋ก์ด ์ํคํ ์ฒ ์ฌ์ธต ๋ถ์. Hermes V1 ์์ง, ๋ธ๋ฆฟ์ง๋ฆฌ์ค ๋ชจ๋, TurboModules, Fabric ๋ ๋๋ฌ์ ๊ธฐ์ ์ ์ธ๋ถ์ฌํญ, ์ฑ๋ฅ ๋ฒค์น๋งํฌ, ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋, ๊ธฐ์ ๋ฉด์ Q&A๋ฅผ ํฌํจํฉ๋๋ค.

Expo Router๋ก ๋ฐฐ์ฐ๋ React Native ํ์ผ ๊ธฐ๋ฐ ๋ด๋น๊ฒ์ด์ ์๋ฒฝ ๊ฐ์ด๋
Expo Router๋ฅผ ํ์ฉํ React Native ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ์ฒด๊ณ์ ์ผ๋ก ๋ค๋ฃน๋๋ค. ๋ ์ด์์, ๋์ ๋ผ์ฐํธ, ํ์ ์์ ๋ด๋น๊ฒ์ด์ , ํญ, ๋ชจ๋ฌ, ๋ฏธ๋ค์จ์ด ๋ฑ 2026๋ ์ต์ ํจํด์ ์ข ํฉ์ ์ผ๋ก ์ค๋ช ํฉ๋๋ค.