React Native 시작하기 — 환경 설정부터 첫 앱 실행까지
React Native는 JavaScript로 iOS와 Android 앱을 동시에 만들 수 있는 크로스플랫폼 프레임워크입니다.
면접에서 "React Native를 왜 선택했나요?"라는 질문을 받으면, 단순히 "크로스플랫폼이니까"가 아니라 어떤 트레이드오프를 이해하고 선택했는지 를 설명할 수 있어야 합니다.
React Native란?
React Native는 Meta(구 Facebook)가 만든 오픈소스 프레임워크입니다. React의 컴포넌트 기반 패러다임을 그대로 사용하면서, 웹 브라우저가 아닌 네이티브 플랫폼 위에서 실행 됩니다.
핵심 포인트:
- JavaScript로 작성 하지만, 결과물은 네이티브 UI 컴포넌트
<div>대신<View>,<span>대신<Text>사용- 하나의 코드베이스로 iOS/Android 동시 대응
Expo vs React Native CLI
프로젝트를 시작할 때 가장 먼저 마주치는 선택지입니다.
Expo
# Expo로 프로젝트 생성
npx create-expo-app MyApp
cd MyApp
npx expo start
- 설정이 간단하고 빠르게 시작 가능
- Expo Go 앱으로 실제 디바이스에서 바로 테스트
- 네이티브 모듈 접근에 제한이 있었지만, EAS Build 도입 이후 대부분 해결
- 2024년 이후로는 공식 문서에서도 Expo를 기본 권장
React Native CLI
# CLI로 프로젝트 생성
npx react-native init MyApp
cd MyApp
# iOS 실행 (macOS 필요)
npx react-native run-ios
# Android 실행
npx react-native run-android
- Xcode, Android Studio 등 네이티브 개발 환경 직접 설정 필요
- 네이티브 코드를 직접 수정해야 하는 경우에 적합
- 설정이 복잡하지만 자유도가 높음
어떤 걸 선택해야 하나?
| 기준 | Expo | CLI |
|---|---|---|
| 시작 속도 | 빠름 | 느림 |
| 네이티브 모듈 | EAS로 대부분 커버 | 완전 자유 |
| 초보자 추천 | O | X |
| 기업 프로젝트 | 충분히 가능 | 복잡한 네이티브 연동 시 |
공부하다 보니 처음에는 무조건 Expo로 시작하는 게 좋았습니다. 나중에 네이티브 모듈이 필요해지면
npx expo prebuild로 네이티브 프로젝트를 꺼낼 수 있거든요.
개발 환경 설정
공통 필수 도구
# Node.js 설치 (LTS 버전 권장)
brew install node
# Watchman 설치 (파일 변경 감지)
brew install watchman
iOS 개발 (macOS 전용)
# Xcode 설치 (App Store)
# Command Line Tools 설정
xcode-select --install
# CocoaPods 설치
sudo gem install cocoapods
# iOS 시뮬레이터 실행
npx react-native run-ios
Android 개발
- Android Studio 설치
- SDK Manager에서 필요한 SDK 설치
- 환경 변수 설정
# ~/.zshrc 또는 ~/.bashrc에 추가
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
첫 번째 앱 만들기
// App.tsx — 기본 앱 구조
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
export default function App() {
return (
// View는 웹의 div와 비슷한 컨테이너
<View style={styles.container}>
{/* Text 없이 직접 문자열을 쓸 수 없음 */}
<Text style={styles.title}>안녕하세요!</Text>
<Text style={styles.subtitle}>첫 React Native 앱입니다.</Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center', // 세로 중앙 정렬
alignItems: 'center', // 가로 중앙 정렬
backgroundColor: '#f5f5f5',
},
title: {
fontSize: 24,
fontWeight: 'bold',
marginBottom: 8,
},
subtitle: {
fontSize: 16,
color: '#666',
},
});
웹 React와 다른 점
| 웹 React | React Native |
|---|---|
<div> | <View> |
<span>, <p> | <Text> |
<img> | <Image> |
<input> | <TextInput> |
<button> | <TouchableOpacity>, <Pressable> |
| CSS 파일 | StyleSheet.create() |
onClick | onPress |
면접에서 이 포인트를 자주 물어보더라고요. "React Native에서
<div>를 쓸 수 있나요?" — 답은 No입니다. 모든 UI는 네이티브 컴포넌트로 매핑되기 때문에 전용 컴포넌트를 사용해야 합니다.
프로젝트 구조
MyApp/
├── App.tsx # 앱 진입점
├── package.json # 의존성 관리
├── tsconfig.json # TypeScript 설정
├── babel.config.js # Babel 설정
├── metro.config.js # Metro 번들러 설정
├── ios/ # iOS 네이티브 코드 (CLI)
├── android/ # Android 네이티브 코드 (CLI)
└── src/ # 소스 코드 (직접 구성)
├── components/
├── screens/
├── navigation/
└── utils/
Hot Reloading과 Fast Refresh
React Native의 개발 경험을 좋게 만드는 핵심 기능입니다.
- Fast Refresh: 코드를 저장하면 앱이 자동으로 업데이트
- 컴포넌트 상태를 유지한 채 UI만 갱신
- 문법 에러가 있으면 에러 화면을 보여주고, 수정하면 자동 복구
// 코드를 수정하고 저장하면 바로 반영됨
<Text style={styles.title}>수정된 텍스트!</Text>
디버깅 도구
React Native Debugger
# 개발 메뉴 열기
# iOS 시뮬레이터: Cmd + D
# Android 에뮬레이터: Cmd + M
# Chrome DevTools로 디버깅
# 개발 메뉴 → "Debug with Chrome"
Flipper (Meta 공식 디버거)
- 네트워크 요청 모니터링
- React DevTools 통합
- 레이아웃 인스펙터
- 로그 뷰어
콘솔 로그
// 기본 로그
console.log('데이터:', data);
console.warn('경고 메시지');
console.error('에러 발생');
// Metro 터미널에서 확인 가능
면접에서 자주 나오는 질문
"React Native는 어떻게 동작하나요?"
핵심 키워드는 Bridge(기존)와 New Architecture(최신)입니다.
- 기존: JavaScript ↔ Bridge ↔ Native (JSON 직렬화)
- 최신: JavaScript ↔ JSI ↔ Native (직접 참조)
"하이브리드 앱과 뭐가 다른가요?"
- ** 하이브리드 앱** (Cordova, Ionic): WebView 안에서 웹앱 실행
- React Native: 네이티브 UI 컴포넌트를 직접 렌더링
- 성능 차이가 큼 — RN은 네이티브에 가까운 성능
정리
- React Native는 Expo로 시작 하는 것이 가장 빠르고 안전합니다
- 웹 React를 알면 문법은 비슷하지만, 컴포넌트와 스타일링 방식이 다릅니다
- 네이티브 앱과 하이브리드 앱의 차이를 명확히 이해해두면 면접에서 강점이 됩니다
- 개발 환경이 복잡하게 느껴지더라도, 한번 세팅해두면 Fast Refresh 덕분에 개발 속도가 빠릅니다
댓글 로딩 중...