๊ด€๋ฆฌ ๋ฉ”๋‰ด

<Hello Hosung๐Ÿ˜Ž/>

[Expo + React Native] 1. ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ๊ตฌ์กฐ ์™„๋ฒฝ ์ดํ•ด ๋ณธ๋ฌธ

๐Ÿ“ฑ JavaScript/ใ…คReact, RN

[Expo + React Native] 1. ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ๊ตฌ์กฐ ์™„๋ฒฝ ์ดํ•ด

์ขŒ์ถฉ์šฐ๋Œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ผ๊ธฐ๐Ÿง 2025. 11. 30. 21:01

1. ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Expo + React Native๋ฅผ ์ด์šฉํ•ด ์•ฑ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”ํ•˜๊ณ ,
ํ•„์š” ์—†๋Š” ํŒŒ์ผ ์ œ๊ฑฐ + ํด๋” ๊ตฌ์กฐ์™€ ์ฃผ์š” ํŒŒ์ผ ์—ญํ• ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”Œ๋ž˜์‹œ ํ™”๋ฉด์€ ์ œ์™ธํ•˜๊ณ , ์ดˆ๋ณด์ž๊ฐ€ ํด๋”/ํŒŒ์ผ ์—ญํ• ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

1๏ธโƒฃ ํ™˜๊ฒฝ ์ค€๋น„

1-1. Node.js ์„ค์น˜ ํ™•์ธ

node -v
npm -v

 

  • ๊ถŒ์žฅ Node.js ๋ฒ„์ „: LTS (์˜ˆ: v20.x)
  • ๋งŒ์•ฝ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋ฉด nvm ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜:
nvm install --lts
nvm use --lts

 

1-2. Expo CLI ์„ค์น˜ ํ™•์ธ

์ตœ๊ทผ Expo๋Š” npx create-expo-app ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

npx create-expo-app --version

 

๊ธฐ์กด์— expo-cli ์„ค์น˜๋˜์–ด ์žˆ์–ด๋„ ์ด์ œ npx ์‚ฌ์šฉ์ด ๊ณต์‹ ๊ถŒ์žฅ


2๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

2-1. ์ƒˆ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

npx create-expo-app JJIK-F

ํ…œํ”Œ๋ฆฟ: blank (TypeScript) ์ถ”์ฒœ

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™:

cd JJIK-F

2-2. ์‹คํ–‰ ํ™•์ธ

npx expo start

 

๋ธŒ๋ผ์šฐ์ €์—์„œ Metro Bundler๊ฐ€ ์—ด๋ฆผ

QR ์ฝ”๋“œ๋กœ iOS / Android ์•ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ฐ€๋Šฅ 


3๏ธโƒฃ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์‚ญ์ œ

์ดˆ๊ธฐ ํ…œํ”Œ๋ฆฟ์—๋Š” ์ƒ˜ํ”Œ ์ฝ”๋“œ์™€ ์˜ˆ์ œ ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ์Œ.
์ดˆ๋ณด์ž๋Š” ์ง€์›Œ์„œ ๊น”๋”ํ•˜๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๊ฑธ ์ถ”์ฒœ.

 

3-1. ์‚ญ์ œ ๋ชฉ๋ก

rm -rf app/(tabs) app/modal.tsx
rm -rf components/* services/* utils/* store/*
rm README.md package-lock.json expo-env.d.ts eslint.config.js

3-2. ๋‚จ๊ฒจ์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ํŒŒ์ผ

  • app/_layout.tsx
  • app/index.tsx
  • package.json
  • app.json
  • tsconfig.json
  • assets/

4๏ธโƒฃ ํด๋”๋ณ„ ์—ญํ•  

ํด๋”/ํŒŒ์ผ ์—ญํ™œ
app/ ํ™”๋ฉด(Screen) ๋‹จ์œ„, ๋ผ์šฐํŒ… ๊ฒฝ๋กœ ๊ด€๋ฆฌ
_layout.tsx ์ „์ฒด ๋ ˆ์ด์•„์›ƒ, ๊ณตํ†ต ๋„ค๋น„๊ฒŒ์ด์…˜
index.tsx ์ฒซ ํ™”๋ฉด, ์•ฑ ์ง„์ž…์ 
assets/ ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์ •์  ์ž์›
components/ ์žฌ์‚ฌ์šฉ UI ์ปดํฌ๋„ŒํŠธ
services/ ์„œ๋ฒ„/API ์š”์ฒญ ๊ด€๋ฆฌ
store/ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ
utils/ ๊ณตํ†ต ์œ ํ‹ธ ํ•จ์ˆ˜
package.json ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์Šคํฌ๋ฆฝํŠธ/์˜์กด์„ฑ ๊ด€๋ฆฌ
app.json Expo ์•ฑ ์„ค์ •
tsconfig.json TypeScript ์„ค์ •
node_modules/ ์„ค์น˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 


5๏ธโƒฃ ํ•ต์‹ฌ ํŒŒ์ผ ์—ญํ• 

5-1. _layout.tsx

import { Stack } from "expo-router";

export default function RootLayout() {
  return <Stack />;
}

 

๋ชจ๋“  ํ™”๋ฉด์˜ ๊ณตํ†ต ๊ตฌ์กฐ ๋‹ด๋‹น

Stack Navigation์œผ๋กœ ํ™”๋ฉด ์ „ํ™˜ ๊ด€๋ฆฌ

ํƒญ/ํ—ค๋” ๋“ฑ ๊ณตํ†ต ์š”์†Œ ํฌํ•จ ๊ฐ€๋Šฅ

 

5-2. index.tsx

import { View, Text } from "react-native";

export default function Index() {
  return (
    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Hello! Expo App</Text>
    </View>
  );
}

 

์•ฑ ์ง„์ž… ํ™”๋ฉด

_layout.tsx ์•ˆ์— ํฌํ•จ๋˜์–ด ์ตœ์ดˆ๋กœ ํ‘œ์‹œ

์˜จ๋ณด๋”ฉ, ํ™ˆ ํ™”๋ฉด ๋“ฑ ๋ผ์šฐํŒ… ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ


6๏ธโƒฃ ํด๋” ์ƒ์„ฑ (์ดˆ๊ธฐํ™” ๊ธฐ์ค€) 

mkdir components utils services store

 

์•ž์œผ๋กœ ์ปดํฌ๋„ŒํŠธ, ์œ ํ‹ธ, API, ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์—ฌ๊ธฐ์— ๋ชจ์•„ ๊ด€๋ฆฌ


 7๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์‹คํ–‰

๋ฃจํŠธ ํด๋”์—์„œ ์‹คํ–‰:

npx expo start

QR ์ฝ”๋“œ ์Šค์บ” → iOS / Android์—์„œ ์•ฑ ํ™•์ธ

์•ฑ ์‹คํ–‰ ํ›„ ํ™”๋ฉด์ด ๊นจ๋—ํ•˜๊ฒŒ “Hello! Expo App” ํ‘œ์‹œ๋จ


8๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ตœ์ข… ์ •๋ฆฌ

JJIK-F/
 โ”œโ”€โ”€ app/
 โ”‚   โ”œโ”€โ”€ _layout.tsx
 โ”‚   โ””โ”€โ”€ index.tsx
 โ”‚
 โ”œโ”€โ”€ assets/
 โ”‚   โ””โ”€โ”€ images/
 โ”œโ”€โ”€ components/
 โ”œโ”€โ”€ services/
 โ”œโ”€โ”€ store/
 โ”œโ”€โ”€ utils/
 โ”œโ”€โ”€ package.json
 โ”œโ”€โ”€ app.json
 โ”œโ”€โ”€ tsconfig.json
 โ””โ”€โ”€ node_modules/