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๋ฅผ ํฌํจํฉ๋๋ค.

React Native 0.84์ Hermes V1: ์ฑ๋ฅ ์ต์ ํ, ํ๋ฆฌ์ปดํ์ผ ๋ฐ์ดํธ์ฝ๋, ๊ธฐ์ ๋ฉด์ ๊ฐ์ด๋
Hermes V1์ด React Native 0.84์ ๊ธฐ๋ณธ JavaScript ์์ง์ผ๋ก ์ฑํ๋์ด ๋ฐ์ดํธ์ฝ๋ ํ๋ฆฌ์ปดํ์ผ, Hades ๊ฐ๋น์ง ์ปฌ๋ ํฐ, ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ๋ฅผ ํตํด ํ๊ธฐ์ ์ธ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ์ ๋ฉด์ ์์ ์์ฃผ ์ถ์ ๋๋ Hermes ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์์ธํ ๋ค๋ฃน๋๋ค.