React Native 0.87과 SwiftPM 2026: 최신 iOS 빌드 환경과 면접 대비

React Native 0.87의 Swift Package Manager 지원, CocoaPods 마이그레이션, Strict TypeScript API, Metro 0.87 성능 향상에 대해 상세히 설명합니다.

React Native 0.87과 SwiftPM 2026: 최신 iOS 빌드 환경과 면접 대비

2026년 8월 11일 출시된 React Native 0.87은 iOS 빌드에 Swift Package Manager(SwiftPM) 실험적 지원을 도입했습니다. 이 기능을 통해 React Native 프로젝트에서 CocoaPods를 제거하는 첫 번째 단계가 시작되었습니다. 본 릴리스에서는 Strict TypeScript API가 기본값으로 설정되고, Metro 0.87이 소스맵 생성 속도를 2배 향상시켰으며, 최소 툴체인 요구 사항이 Node.js 22, Kotlin 2.0, Android compileSdk 37로 상향되었습니다.

SwiftPM 설정 명령어

CocoaPods 통합 해제 후 npx react-native spm --deintegrate 명령을 한 번 실행하면 설정이 완료됩니다. 이후 빌드에서는 pod install 없이 네이티브 의존성이 자동 링크됩니다.

Swift Package Manager가 iOS 의존성 관리에서 CocoaPods를 대체

React Native 0.87의 SwiftPM 지원은 옵트인 방식의 실험적 기능입니다. 프로덕션 환경에서는 CocoaPods가 여전히 기본 의존성 관리자로 권장됩니다. SwiftPM 경로는 React Native가 이미 공개한 사전 빌드된 XCFrameworks를 사용하므로 추가 바이너리 다운로드가 필요하지 않습니다.

주요 이점은 SwiftPM 기반 프로젝트에서 Xcode만 필요하다는 것입니다. 개발 머신이나 CI 파이프라인에 Ruby, Bundler, CocoaPods를 설치할 필요가 없어집니다.

bash
# ios-swiftpm-setup.sh
# 1단계: iOS 디렉토리로 이동
cd ios

# 2단계: CocoaPods 통합 해제 및 SwiftPM 참조 생성
npx react-native spm --deintegrate

# 3단계: Xcode에서 프로젝트 열기 및 빌드
open MyApp.xcworkspace

spm --deintegrate 명령은 프로젝트 파일을 교체하지 않고 기존 .xcodeproj에 Swift 패키지 참조를 삽입합니다. 코드 서명 설정, 빌드 단계, 기능 설정은 그대로 유지됩니다. 변경 사항을 되돌리려면 npx react-native spm deinit을 실행합니다.

pod install 없이 작동하는 SwiftPM 자동 링크 메커니즘

초기 설정 후 의존성 변경은 자동 링크를 트리거합니다. npm 또는 yarn으로 네이티브 패키지를 설치하거나 제거한 후 빌드를 실행하면 됩니다. 프로젝트는 변경 사항을 감지하고 Xcode 빌드 단계에서 자동 링크를 다시 실행합니다.

bash
# dependency-workflow.sh
# 네이티브 의존성 설치
npm install react-native-reanimated

# 빌드가 자동 링크를 트리거
npx react-native run-ios
# pod install 불필요

새 클론 및 CI 환경에서는 첫 번째 빌드 전에 npx react-native spm을 한 번 실행합니다. 이렇게 하면 Package.swift 파일이 생성되고 Swift 패키지 의존성이 해결됩니다.

SwiftPM 제한 사항 및 프로덕션 준비 상태

0.87의 SwiftPM 지원에는 도입 결정에 영향을 미치는 중요한 제한 사항이 있습니다.

제한 사항영향
커뮤니티 라이브러리 지원각 라이브러리가 Package.swift 파일을 포함해야 함
명령 안정성플래그와 생성 레이아웃이 0.88 이후 변경될 수 있음
CI 구성빌드 전 npx react-native spm 단계 필요
문서화트러블슈팅 리소스 제한적

프로덕션 애플리케이션에는 CocoaPods가 여전히 권장 경로입니다. SwiftPM을 평가하는 팀은 마이그레이션을 확정하기 전에 브랜치에서 프로토타입을 만들고 전체 의존성 트리를 테스트해야 합니다.

React Native 면접 준비가 되셨나요?

인터랙티브 시뮬레이터, flashcards, 기술 테스트로 연습하세요.

주요 변경 사항: iOS 네임스페이스 헤더 임포트

React Native 0.87은 새로운 XCFrameworks(ReactNativeHeaders.xcframeworkReactNativeDependenciesHeaders.xcframework)를 포함합니다. 베어 형식의 앵글 인클루드를 사용하는 네이티브 모듈은 React/ 네임스페이스 접두사를 추가해야 합니다.

AppDelegate.mobjective-c
// 0.87 이전 - 베어 인클루드
#import <RCTAppDelegate.h>
#import <RCTBridge.h>
#import <RCTRootView.h>

// 0.87 이후 - 네임스페이스 인클루드
#import <React/RCTAppDelegate.h>
#import <React/RCTBridge.h>
#import <React/RCTRootView.h>

이 변경 사항은 CocoaPods 빌드와 SwiftPM 빌드 모두에 적용됩니다. 커스텀 네이티브 모듈이 있는 프로젝트는 업그레이드 전에 모든 헤더 임포트를 업데이트해야 합니다.

Strict TypeScript API: 새로운 기본 JavaScript 인터페이스

0.80에서 프리뷰되었던 Strict TypeScript API가 0.87에서 기본값이 되었습니다. 타입이 이제 React Native 소스 코드에서 직접 생성되어 TypeScript 정의와 실제 런타임 동작 간의 드리프트가 제거됩니다.

component-refs.tsxtypescript
import { useRef } from 'react';
import { View, TextInput, ViewInstance, TextInputInstance } from 'react-native';

export function FormComponent() {
  // 새로운 전용 ref 타입이 제네릭 RefObject<T>를 대체
  const containerRef = useRef<ViewInstance>(null);
  const inputRef = useRef<TextInputInstance>(null);

  const focusInput = () => {
    // 타입 안전 메서드 접근
    inputRef.current?.focus();
  };

  return (
    <View ref={containerRef}>
      <TextInput ref={inputRef} placeholder="Email" />
    </View>
  );
}

마이그레이션 시 주의가 필요한 세 가지 주요 타입 변경 사항이 있습니다.

  1. 딥 임포트 차단: react-native/Libraries/* 경로는 이제 타입 오류를 발생시킵니다. 모든 익스포트는 루트 react-native 패키지에서 가져와야 합니다.

  2. ref 타입 업데이트: ViewInstanceTextInputInstance가 제네릭 ref 타입을 대체합니다. *Properties 타입 별칭은 *Props로 대체되어 제거되었습니다.

  3. useColorScheme 변경: 이전의 'unspecified' 문자열 값 대신 ColorSchemeName | null을 반환합니다.

마이그레이션 기간 중 Strict TypeScript 옵트아웃

마이그레이션에 더 많은 시간이 필요한 팀은 React Native 0.88까지 레거시 딥 임포트를 복원할 수 있습니다.

tsconfig.jsonjson
{
  "extends": "@react-native/typescript-config",
  "compilerOptions": {
    "customConditions": ["react-native", "react-native-legacy-deep-imports"]
  }
}

이 이스케이프 해치는 React Native 0.89에서 제거됩니다. 프로젝트는 해당 릴리스 전에 마이그레이션을 우선시해야 합니다.

Metro 0.87: 소스맵 2배 빠른 생성 및 메모리 50% 절감

Metro 번들러 버전 0.87은 개발 워크플로우와 React Native DevTools 시작 시간에 영향을 미치는 상당한 성능 개선을 포함합니다.

소스맵 생성은 최적화된 문자열 처리로 2배 빨라졌습니다. DevTools는 개발 빌드 중 소스맵이 더 효율적으로 생성되기 때문에 더 빠르게 로드됩니다.

메모리 사용량은 더 효율적인 소스맵 저장으로 50% 감소했습니다. 이는 긴 개발 세션 동안 Metro가 상당한 RAM을 소비했던 대규모 코드베이스에 중요합니다.

기타 Metro 변경 사항:

  • TypeScript 설정 파일(metro.config.mts) 안정적 지원
  • CommonJS와 함께 ESM 설정 파일 지원
  • 리졸버에서 패키지 자체 해결
  • .es6 파일 확장자 및 YAML 설정 파일 지원 중단

React Native 0.87 최소 툴체인 요구 사항

이번 릴리스에서는 툴체인 전반의 최소 버전 요구 사항이 상향되었습니다. CI 파이프라인과 개발 환경은 업그레이드 전에 업데이트가 필요합니다.

요구 사항버전
Node.js≥ 22.13.0
Kotlin≥ 2.0 (번들 버전: 2.2.0)
Android minCompileSdk34
Android compileSdk37
Android Gradle Plugin9.x

AGP 9 호환성 문제의 경우 android/gradle.properties에 옵트아웃을 추가합니다.

properties
# android/gradle.properties
# AGP 9 마이그레이션을 위한 임시 옵트아웃
android.builtInKotlin=false
android.newDsl=false

React Native 0.87에서 제거된 API

이번 릴리스에서는 여러 deprecated API가 제거되었습니다. 이러한 API를 사용하는 프로젝트는 업그레이드 전에 리팩토링이 필요합니다.

제거된 API대체
InteractionManagerrequestIdleCallback
Modal animated 프로퍼티기본 트랜지션 동작 사용
NativeMethods 타입HostInstance
useTurboModules 플래그항상 활성화됨, 플래그 제거
Touchable 루트 익스포트ViewProps 직접 확장
react-native/rn-get-polyfills@react-native/js-polyfills

향후 제거를 대상으로 하는 추가 deprecation에는 ImageBackground(절대 위치 지정된 Image가 있는 View 사용), DrawerLayoutAndroid(react-native-drawer-layout 사용), react-native/Libraries/Core/InitializeCore(react-native/setup-env 사용)가 포함됩니다.

시니어 개발자를 위한 React Native 0.87 면접 질문

다음 질문들은 React Native 메이저 릴리스 이후 시니어 모바일 개발자 면접에서 출제됩니다. SwiftPM 지원과 Strict TypeScript API 뒤에 있는 아키텍처 결정을 이해하면 프레임워크 수준의 지식을 보여줄 수 있습니다.

Q: React Native 0.87이 CocoaPods를 즉시 대체하지 않고 SwiftPM을 실험적 기능으로 도입한 이유는 무엇입니까?

SwiftPM 지원은 커뮤니티 라이브러리가 Package.swift 파일을 포함하는 것에 의존합니다. 중앙 Podspec 레지스트리가 존재하는 CocoaPods와 달리, SwiftPM에서는 각 라이브러리 작성자가 네이티브 Swift 패키지 구성을 추가해야 합니다. 실험 단계를 통해 CocoaPods가 프로덕션 앱에서 안정적으로 유지되면서 생태계는 점진적으로 SwiftPM을 채택할 수 있습니다. 또한 CLI 명령과 생성되는 프로젝트 레이아웃은 안정화 전에 개발자 피드백을 기반으로 변경될 수 있습니다.

Q: Strict TypeScript API는 수동으로 관리되는 타입 정의로 해결할 수 없었던 어떤 문제를 해결합니까?

수동으로 관리되는 타입 정의는 릴리스 간에 런타임 동작에서 드리프트됩니다. 함수 시그니처를 변경하거나 매개변수를 추가하는 내부 리팩토링은 타입에 즉시 반영되지 않을 수 있으며, TypeScript가 잡아야 할 런타임 크래시를 유발합니다. Strict API는 소스 코드에서 직접 타입을 생성하여 타입을 희망적인 것이 아닌 권위적인 것으로 만듭니다. 또한 불안정한 내부 API에 접근하는 딥 임포트를 차단하여 해당 내부가 변경될 때 발생하는 문제를 방지합니다.

Q: SwiftPM 자동 링크는 React Native의 CocoaPods 자동 링크와 어떻게 다릅니까?

CocoaPods 자동 링크는 pod install 중에 실행되며, 개발자는 의존성 변경 후 이를 실행하는 것을 기억해야 합니다. SwiftPM 자동 링크는 Xcode 빌드 단계에서 자동으로 실행됩니다. 빌드 시스템이 의존성 변경을 감지하고 수동 개입 없이 패키지 매니페스트를 다시 생성합니다. 이를 통해 개발자가 변경 사항을 풀한 후 pod install을 실행하는 것을 잊는 "내 머신에서는 작동함" 문제의 일반적인 원인이 제거됩니다.

React Native 면접 준비에 대한 자세한 내용은 네이티브 모듈 심층 분석테스트 전략 질문 뱅크를 참조하십시오.

React Native 면접 준비가 되셨나요?

인터랙티브 시뮬레이터, flashcards, 기술 테스트로 연습하세요.

React Native 0.87 프로젝트 업그레이드 전략

React Native Upgrade Helper는 현재 프로젝트 템플릿과 0.87 간의 diff를 생성합니다. 이 diff는 변경이 필요한 파일을 정확하게 보여줍니다.

다음 마이그레이션 단계를 우선시하십시오.

  1. Node.js를 22.13.0 이상으로 업데이트하고 CI 환경이 일치하는지 확인
  2. TypeScript 컴파일 실행하여 딥 임포트 위반 식별
  3. ref 타입 업데이트하여 제네릭에서 전용 인스턴스 타입으로 변경
  4. iOS 헤더 임포트 업데이트하여 네임스페이스 형식으로 변경
  5. 전체 네이티브 의존성 트리 테스트 후 SwiftPM 활성화

Expo 프로젝트의 경우 React Native 0.87은 expo@canary 릴리스에서 사용할 수 있습니다. 프로덕션 Expo 프로젝트는 안정적인 SDK 릴리스를 기다려야 합니다.

0.87 SwiftPM 지원이 iOS 빌드 시간에 미치는 영향

SwiftPM은 개발 워크플로우에서 pod install을 제거하지만, 초기 프로젝트 설정에는 더 많은 시간이 필요합니다. npx react-native spm 명령은 소스에서 Swift 패키지를 해결하므로 사전 빌드된 CocoaPods 바이너리를 다운로드하는 것보다 시간이 더 걸립니다.

후속 빌드는 Xcode의 점진적 패키지 해결의 이점을 받습니다. 변경된 패키지만 다시 가져옵니다. 의존성 변경이 빈번한 팀의 경우 이 점진적 접근 방식이 반복적인 pod install 사이클보다 빠를 수 있습니다.

CI 최적화는 두 접근 방식에서 다릅니다. CocoaPods는 Pods/ 디렉토리를 효과적으로 캐시합니다. SwiftPM은 Xcode의 derived data를 통해 캐시하므로 다른 캐시 키 전략이 필요합니다. CI 파이프라인을 마이그레이션하는 팀은 특정 의존성 세트로 두 접근 방식을 벤치마크해야 합니다.

관련 iOS 빌드 최적화 기법에 대해서는 Hermes V1 및 브리지리스 모드 성능 특성을 다루는 React Native New Architecture 가이드를 참조하십시오.

연습을 시작하세요!

면접 시뮬레이터와 기술 테스트로 지식을 테스트하세요.

오늘의 챌린지

React Native 코드의 버그를 찾을 수 있나요

실제 코드 한 조각, 숨은 버그 하나, 하루 한 번. 계정 없이 바로 도전할 수 있습니다.

Anthony Fillion-Maillet

작성자

Anthony Fillion-Maillet

SharpSkill 창업자

10년 이상 풀스택 개발을 해왔습니다. SharpSkill을 운영하며 이곳에 게시되는 모든 내용에 책임을 집니다.

2026년 9월 3일 업데이트

공유

관련 기사