홈시리즈멘토링

© 2026 정기창. All rights reserved.

본 블로그의 콘텐츠는 CC BY-NC-SA 4.0 라이선스를 따릅니다.

☕후원하기소개JSON Formatter러닝 대기질개인정보처리방침이용약관

© 2026 정기창. All rights reserved.

콘텐츠: CC BY-NC-SA 4.0

☕후원하기
소개|JSON Formatter|러닝 대기질|개인정보처리방침|이용약관

Xcode 설치부터 아이폰 실기기 설치까지, 무료 계정으로 뚫은 관문 여섯 개

정기창·2026년 7월 25일

시뮬레이터로만 확인하던 앱을 실제 아이폰에 올려보려고 했습니다. Xcode만 설치하면 될 줄 알았는데, 설치가 끝난 뒤에도 관문이 다섯 개쯤 더 남아 있었습니다. 그리고 그 관문들은 하나같이 에러 메시지만 봐서는 무엇을 해야 할지 알기 어려운 종류였습니다.

결론부터 적자면, 연 99달러짜리 유료 개발자 프로그램 없이 무료 Apple ID만으로 실기기 설치까지 됩니다. 다만 무료 계정이 못 하는 일이 명확히 있고, 그것을 모르면 서명 단계에서 한참 헤매게 됩니다. 이 글은 제가 실제로 막혔던 여섯 지점과 그때 나온 원문 에러를 순서대로 정리한 기록입니다.

확인한 환경

버전에 따라 화면과 명령이 조금씩 다르므로 먼저 적어둡니다.

항목 버전
맥 macOS 26.5.2 (Apple Silicon)
Xcode 26.6
아이폰 iPhone 16 Plus / iOS 26.5.2
앱 Expo SDK 54 (prebuild 방식)
CocoaPods 1.17.0

React Native나 Expo가 아니라 순수 네이티브로 개발하더라도 관문 1부터 5까지는 그대로 적용됩니다. Expo를 쓰는 분만 마지막 항목을 추가로 보시면 되겠습니다.

관문 1. 커맨드라인 도구는 Xcode가 아닙니다

제 맥에는 이미 커맨드라인 도구(Command Line Tools)가 깔려 있었습니다. git도 되고 clang도 되니 당연히 준비가 끝난 줄 알았습니다. 그런데 확인해보니 이런 상태였습니다.

xcode-select -p
# /Library/Developer/CommandLineTools

xcodebuild -version
# xcode-select: error: tool 'xcodebuild' requires Xcode,
# but active developer directory '/Library/Developer/CommandLineTools'
# is a command line tools instance

커맨드라인 도구에는 컴파일러는 있지만 iOS SDK도, 시뮬레이터도, 서명 도구도 없습니다. 실기기 빌드에는 풀 Xcode가 필요합니다. 설치는 App Store에서 "Xcode"를 검색해 받는 방법이 가장 단순하고, 여러 버전을 오가야 한다면 brew install xcodes 로 설치하는 xcodes CLI가 편합니다.

진짜 관문은 용량이었습니다

App Store에 표시되는 크기는 몇 기가바이트에 불과합니다. 그런데 그것은 압축된 초기 다운로드일 뿐입니다. 압축 해제 공간과 플랫폼 지원 파일, 그리고 뒤에 나올 시뮬레이터 런타임까지 더하면 실질적으로 수십 기가바이트의 여유가 필요합니다. 저는 여유 공간이 27GB밖에 없어서 먼저 디스크부터 비워야 했습니다.

애플 공식 시스템 요구사항 페이지에는 디스크 용량이 아예 명시되어 있지 않습니다. 그래서 확정된 수치를 믿기보다 여유를 크게 잡고 시작하시길 권합니다. 설치 도중 공간이 부족해 실패하면 처음부터 다시 받아야 하는데, 그게 가장 아깝습니다.

관문 2. 설치가 끝나도 아직 끝난 게 아닙니다

Xcode를 설치했다고 곧바로 빌드가 되지는 않습니다. 네 가지가 더 남아 있습니다.

# 1) 활성 개발자 디렉터리를 CLT에서 Xcode로 전환
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

# 2) 라이선스 동의
sudo xcodebuild -license accept

# 3) 부속 컴포넌트 설치
xcodebuild -runFirstLaunch

# 4) 설치된 시뮬레이터 런타임 확인
xcrun simctl list runtimes

네 번째 명령의 결과가 비어 있다면, 시뮬레이터 런타임은 Xcode 본체와 별도 다운로드라는 뜻입니다. 제 경우 iOS 26.5 런타임이 8.52GB였습니다. 아래 명령으로 받거나 Xcode의 Settings → Components에서 받으면 됩니다.

xcodebuild -downloadPlatform iOS

그리고 React Native·Expo처럼 CocoaPods에 의존하는 프로젝트라면 brew install cocoapods 도 따로 필요합니다. Xcode에 딸려오지 않습니다.

관문 3. 서명 — 무료 계정이 되는 것과 안 되는 것

여기가 가장 헷갈렸던 구간입니다. 빌드를 돌리면 이런 에러가 납니다.

error: Signing for "ReelCut" requires a development team.
Select a development team in the Signing & Capabilities editor.

개발 팀을 고르라는 말인데, 팀 목록은 Xcode에 Apple ID를 로그인해야 생깁니다. Xcode → Settings(⌘,) → Accounts에서 Apple ID를 추가하면 "(Personal Team)"이라는 항목이 자동으로 만들어집니다. 이것이 무료 계정에 주어지는 개인 팀이고, 유료 프로그램 가입 없이 서명할 수 있게 해줍니다.

팀을 골랐더니 다음 에러가 이어졌습니다. 이 메시지가 무료 계정의 경계를 가장 정확하게 알려줍니다.

Cannot create a iOS App Development provisioning profile for "info.kichang.reelcut".
Personal development teams, including "기창 정",
do not support the Push Notifications capability.

즉 무료 개인 팀은 원격 푸시 알림 기능을 가진 앱에 프로비저닝 프로파일을 발급하지 못합니다. 제 앱은 로컬 알림만 쓰고 원격 푸시는 아직 쓰지 않는 상태였기 때문에, Signing & Capabilities 화면에서 Push Notifications 항목을 삭제하고 다시 빌드하니 통과했습니다.

무료와 유료의 차이를 정리하면 이렇습니다.

항목 무료 Apple ID 유료 (연 99달러)
시뮬레이터 실행 가능 가능
실기기 설치 가능 (7일 유효) 가능 (1년)
로컬 알림 가능 가능
원격 푸시 알림 불가 가능
TestFlight · 스토어 배포 불가 가능

그래서 판단 기준은 단순해집니다. 내 기기에서 동작만 확인하는 단계라면 무료로 충분하고, 남에게 배포하거나 원격 푸시를 붙이는 순간부터 유료가 필요합니다. 처음부터 99달러를 결제할 이유는 없다는 뜻입니다.

관문 4. 개발자 모드는 토글만으로 켜지지 않습니다

아이폰 설정에서 개발자 모드를 켜고 재부팅했는데도 맥에서는 여전히 기기를 인식하지 못했습니다. 확인해보니 이런 상태였습니다.

xcrun devicectl list devices
# jeongkichang ... unavailable  iPhone 16 Plus

xcrun devicectl device info details --device <기기ID> | grep developerMode
# • developerModeStatus: disabled

원인은 단순했습니다. iOS의 개발자 모드는 토글 → 재부팅 → 재부팅 후 잠금 해제 → 확인 팝업에서 "켜기" + 암호 입력까지 마쳐야 실제로 활성화됩니다. 저는 재부팅까지만 하고 폰을 잠긴 채로 두었기 때문에 마지막 확인 단계가 남아 있었던 것입니다. 잠금을 풀자 곧바로 바뀌었습니다.

• developerModeStatus: enabled
• ddiServicesAvailable: true
jeongkichang ... connected  iPhone 16 Plus

돌이켜 생각해보면 이 단계가 가장 허무했습니다. 빌드 스크립트나 서명 설정을 의심하며 시간을 썼는데, 실제로는 폰이 잠겨 있었던 것이 전부였으니까요. 기기가 unavailable로 보인다면 코드를 보기 전에 폰의 잠금부터 풀어보시길 권합니다.

관문 5. 설치는 됐는데 실행이 안 됩니다

설치까지 성공한 뒤 앱을 실행하려는데 이번엔 이런 에러가 났습니다.

Unable to launch info.kichang.reelcut because it has an invalid code signature,
inadequate entitlements or its profile has not been explicitly trusted by the user.
(FBSOpenApplicationErrorDomain error 3)

메시지가 세 가지 가능성을 한꺼번에 나열하고 있어서 처음엔 서명이 잘못됐나 싶었습니다. 하지만 대부분의 경우 원인은 마지막 항목, 즉 사용자가 그 개발자를 아직 신뢰하지 않은 것입니다. 아이폰에서 설정 → 일반 → VPN 및 기기 관리로 들어가 본인 Apple ID 항목을 열고 "신뢰"를 누르면 해결됩니다.

이 단계는 맥에서 명령으로 대신할 수 없습니다. 기기 소유자가 직접 눌러야 하도록 설계된 보안 장치이기 때문입니다.

관문 6. 7일마다 다시 설치해야 합니다

무료 개인 팀으로 서명한 앱은 설치 후 7일이 지나면 실행되지 않습니다. 앱 아이콘은 남아 있는데 실행하면 튕기는 식이라, 처음 겪으면 앱이 망가진 줄 알기 쉽습니다.

해결은 재빌드와 재설치입니다. 그래서 무료 계정은 "내가 계속 만지는 개발 기기"에는 충분하지만, 누군가에게 건네주고 며칠 뒤 피드백을 받는 용도로는 맞지 않습니다. 그 지점이 오면 유료 프로그램과 TestFlight를 생각할 때입니다.

Expo를 쓴다면 — expo run:ios 대신 xcodebuild

여기서부터는 Expo 사용자에게만 해당하는 이야기입니다. 저는 npx expo run:ios --device 로 실기기 빌드를 시도했는데, Expo가 최신 Xcode의 devicectl 출력 형식(jsonVersion 3)을 해석하지 못해 기기 목록 파싱에서 멈췄습니다. 도구 체인 버전이 어긋날 때 흔히 생기는 문제입니다.

그럴 때는 Expo의 편의 명령을 우회해서 xcodebuild와 devicectl을 직접 호출하면 됩니다.

# 1) 실기기용 빌드 (기기 ID는 devicectl list devices 로 확인)
xcodebuild -workspace ios/MyApp.xcworkspace \
  -scheme MyApp -configuration Debug \
  -destination 'id=<기기ID>' \
  -allowProvisioningUpdates build

# 2) 빌드 산출물을 기기에 설치
xcrun devicectl device install app --device <기기ID> \
  ~/Library/Developer/Xcode/DerivedData/MyApp-*/Build/Products/Debug-iphoneos/MyApp.app

# 3) 실행
xcrun devicectl device process launch --device <기기ID> com.example.myapp

-allowProvisioningUpdates 옵션이 중요합니다. 이것이 있어야 프로비저닝 프로파일을 필요할 때 자동으로 만들어 줍니다.

한 가지 주의할 점이 있습니다. Expo의 prebuild 방식(CNG)에서는 ios/ 디렉터리가 생성물이라 npx expo prebuild --clean 을 돌리면 통째로 다시 만들어집니다. 그래서 Xcode 화면에서 직접 바꾼 서명 설정은 prebuild 한 번에 사라집니다. 계속 유지하려면 app.json이나 config plugin 쪽에 그 설정을 옮겨두어야 합니다. 저는 검증만 하는 단계여서 일단 로컬 변경으로 두었지만, 팀으로 작업한다면 plugin으로 박아두는 편이 안전하겠다는 생각이 들었습니다.

에러 메시지로 되짚어보기

막혔을 때 다시 찾아보기 쉽도록 한 표로 묶었습니다.

증상 · 에러 실제 원인 조치
xcodebuild requires Xcode 커맨드라인 도구만 설치됨 Xcode 설치 후 xcode-select -s
requires a development team Xcode에 Apple ID 미로그인 Settings → Accounts에서 로그인
do not support the Push Notifications 무료 팀의 기능 제약 해당 capability 제거
기기가 unavailable 개발자 모드 미활성 · 폰 잠김 재부팅 후 잠금 해제까지 완료
FBSOpenApplicationErrorDomain error 3 개발자 프로파일 미신뢰 설정 → VPN 및 기기 관리 → 신뢰
며칠 뒤 앱이 실행되지 않음 무료 서명 7일 만료 재빌드 후 재설치

정리하며

이 과정을 한 번 통과하고 나니, 관문들이 서로 다른 성격을 갖고 있다는 생각이 들었습니다. 관문 1과 2는 도구를 갖추는 문제이고, 3은 권한의 경계를 이해하는 문제이며, 4와 5는 기기 소유자가 직접 동의해야 하는 문제입니다. 마지막 성격의 관문들은 아무리 자동화해도 사람 손이 필요하도록 설계되어 있습니다. 애플이 의도적으로 남겨둔 마찰이라고 보는 편이 맞겠습니다.

그리고 처음부터 유료 계정을 결제하지 않아도 됐다는 점이 개인적으로는 가장 큰 수확이었습니다. 무료 계정으로 실기기에서 동작을 확인하고, 실제로 남에게 나눠줄 시점이 왔을 때 99달러를 판단하면 됩니다. 지출을 필요한 순간까지 미룰 수 있다는 것은 혼자 만드는 입장에서 꽤 중요한 이야기라는 생각이 들었습니다.

XcodeiOSReact NativeExpo코드 서명개발 환경

관련 글

인스타그램 자동 발행, 본인 계정이면 무료였습니다

카드뉴스 PNG를 손으로 올리던 제가, 인스타그램 Content Publishing API는 본인 계정이면 무료라는 걸 뒤늦게 알았습니다. 텍스트와 달리 이미지는 image_url(공개 URL)만 받아 외부 호스팅이 한 겹 더 필요했던 이야기를 담았습니다.

관련도 91%

PWA로 admin 페이지에 모바일 푸시 알림 붙이기

알림 하나 받자고 네이티브 앱을 만드는 건 오버킬이었습니다. 그래서 이미 쓰던 admin 웹앱에 PWA를 최소한으로 얹어 모바일 푸시 알림만 받기로 했습니다. iOS 설치형 제약과 푸시 전용 service worker, Slack fan-out까지 직접 부딪쳐 얻은 교훈을 담았습니다.

관련도 90%

아이폰에서 웹 배경음이 안 나던 이유 — WKWebView와 Web Audio

데스크톱은 멀쩡한데 아이폰에서만 웹게임 배경음이 무음이었습니다. 원인은 WKWebView의 Web Audio 라우팅 제약이었고, 무음 audio 요소로 오디오 세션을 먼저 열어 해결한 과정을 정리했습니다.

관련도 90%