1.1CocoaPods
ios의 의존성 관리 도구 CocoaPods
TL;DR
추억의 쪽지 시험
React Native 프로젝트에 온보딩하며, 기본적인 세팅을 하는 중 CocoaPods 관련 에러(이후 언급할 Ruby gem compilation issue)가 발생한지라 관련해서 개념을 정리하고자 한다.
CocoaPods란?

CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. (공식문서)
Node.js 생태계의 npm
, yarn
에 대응하는 ios 및 macOS 개발의 의존성 관리 도구이다.
React Native로 개발을 할 때 설치하는 외부 의존성 라이브러리는 단순히 JS코드만 있는게 아니라 iOS 네이티브 코드(Objective-C나 Swift)도 포함되어 있다. 이 네이티브 부분을 Xcode 프로젝트에 포함시켜야 실제 앱 빌드 시 작동하기 때문에 React Native의 npm 외에도 CocoaPods가 필요하게 된다.
따라서 npm install
로 JS 패키지를 설치한 뒤, iOS에선 pod install
을 실행해 네이티브 라이브러리를 추가해줘야 리액트 네이티브 앱이 연결되어 있는 자바스크립트 코드 및 iOS 네이티브 코드가 모두 포함된다.
CocoaPods의 동작 원리
CocoaPods는 Podfile이라는 설정 파일을 기반으로 동작한다. CocoaPods는 기본적으로 Ruby로 작성되었기 때문에, Podfile 또한 Ruby로 되어 있다. React Native에선 프로젝트를 생성할 때 기본적으로 ios/
폴더 안에 Podfile
이 생성된다.
rubytarget 'MyApp' do pod 'React', :path => '../node_modules/react-native/' pod 'Firebase/Core' end
새로운 네이티브 모듈이 추가되면, cd ios && pod install
을 실행해서 Pod 라이브러리를 설치해줘야 한다. 이 라이브러리들은 iOS 빌드 과정에서 자동으로 링크된다.
라이브러리 관련 용어, Gem과 Pod
Gem은 Ruby의 패키지(라이브러리)다. 예를 들어, cocoapods
또한 Ruby로 쓰인 라이브러리, 즉 Gem의 한 예다. 반면 Pod은 iOS/macOS 개발에서 CocoaPods가 관리하는 라이브러리다. 앞서 살펴본 Firebase가 pod이다.
xcodeproj와 xcworkspace
iOS 개발의 프로젝트 설정, 빌드 타겟 정보 등은 Xcode 프로젝트 파일인 프로젝트명.xcodeproj
에 저장된다. 원래는 이 폴더만으로 개발했지만, CocoaPods써서 pod install
을 하면 프로젝트명.xcworkspace
폴더가 생성된다.
이 폴더는 내 앱 프로젝트인 프로젝트명.xcodeproj
와 CocoaPods가 만든 외부 라이브러리 프로젝트인 Pods.xcodeproj
를 묶는 묶음 역할을 한다. 따라서 CocoaPods를 쓰는 React Native 프로젝트에선 항상 .xcworkspace
를 열고 실행해야 Pod 라이브러리들이 정상 동작한다.
종종 발생하는 문제들
React Native 프로젝트에서 발생하는 CocoaPods 관련 문제들은 대표적으로 아래와 같다:
- Ruby 버전 충돌: CocoaPods가 Ruby로 동작하기 때문에 Ruby 버전 충돌 시 빌드 에러가 난다.
- 의존성 충돌: Pod간 버전 호환성 문제로
pod update
가 필요할 때가 있다.
내가 마주한 문제는 CocoaPods 설치/업데이트를 하려는데 Ruby 버전 차이 때문에 gem을 컴파일(빌드)하는 과정에서 에러가 생겼다는 의미였다.