Capstone#3. Kotlin๋Œ€์‹  React Native๋ฅผ ์„ ํƒํ•œ ์ด์œ  / React Native ๋ผˆ๋Œ€ ์žก๊ธฐ(Navigation ์„ค์ • ๋ฐ ํด๋” ๊ตฌ์กฐ)

2024. 11. 11. 16:45ใ†Study_Develop/React Native

๋ฐ˜์‘ํ˜•

 

 

 

์•ˆ๋…•ํ•˜์„ธ์š”.

์˜ค๋Š˜์€ ๋ฒŒ์จ ์ €์˜ Capstone์„ ์„ค๋ช…ํ•˜๋Š” ์„ธ ๋ฒˆ์งธ ์‹œ๊ฐ„์ด๋„ค์š”!

์ผ๋‹จ ์ €ํฌ๋Š”.. ์–ด๋– ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์–ดํ”Œ์„ ์ œ์ž‘ํ•˜์˜€์–ด์š”

์–ด๋–ค ์ปค๋ฎค๋‹ˆํ‹ฐ์ธ์ง€๋Š” ๋‚˜์ค‘์— ๋”ฐ๋กœ ํฌ์ŠคํŒ…ํ• ๊ฒŒ์š” ^__^

 

์•”ํŠผ ์ €๋Š” ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ์„ ์ „๋ถ€ ๋งก๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ

๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์–ด๋–ค ์Šคํƒ์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ์ •๊ถŒ์ด ์žˆ์—ˆ์–ด์š”.

 

์ง€๊ธˆ๊นŒ์ง€ ์•ˆ๋“œ๋กœ์ด๋“œ ์–ดํ”Œ์„ ๋งŒ๋“œ๋Š” ์Šคํƒ์€ Kotlin, React Native ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฒฝํ—˜ํ•ด ๋ณด์•˜๋Š”๋ฐ

๋‘˜ ์ค‘์— ๋ญ˜๋กœ ํ• ๊นŒ... ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ 

React Native ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์–ด์š”.

 

์™œ๋ƒํ•˜๋ฉด

 

์™œ React Native๋ฅผ ์„ ํƒํ•˜์˜€๋Š”์ง€?

 

 

์ €๋Š” React Native๋ณด๋‹ค Kotlin์ด ์ข€ ๋” ๋ฏธ์ˆ™ํ–ˆ์–ด์š”.

๊ทธ๋ž˜์„œ ๊ธฐํšŒ์— ์ข€ ๋” ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•ด ๋ณด์ž!๋ผ๋Š” ๋А๋‚Œ์œผ๋กœ

Kotlin์„ ์™ธ์ณค์ง€๋งŒ ๋ง‰ํŒ์— React Native๋กœ ํ•ด์•ผ๊ฒ ๋‹ค.. ํ•ด์„œ ๊ณ„ํš์„œ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์ œ์ถœํ•˜์˜€์ฃ ..ใ…‹ใ…‹

 

๋‘ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ

 

์ฒซ ๋ฒˆ์งธ๋Š”, ์ €๋Š” ํ˜ผ์ž ํ”„๋ก ํŠธ ์—…๋ฌด๋ฅผ ๋‹ค ๋งก๊ฒŒ ๋˜์–ด์„œ

๋น ๋ฅธ ์‹œ๊ฐ„ ์•ˆ์— ํ™”๋ฉด์„ ๋‹ค ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ์ž„๋ฌด๊ฐ€ ์žˆ์—ˆ์–ด์š”!

๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ React Native์˜ Hot reload ๊ธฐ๋Šฅ ๋ชป ์žƒ์–ด...

 

์ฝ”ํ‹€๋ฆฐ์€ ์ž๋™ ์žฌ๋กœ๋“œ ๊ธฐ๋Šฅ์ด ์ข€ ๋А๋ ค์š” ํ•œ์ฐธ ๋กœ๋”ฉ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•„์„œ

์ข€ ๋‹ต๋‹ตํ–ˆ๋˜ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ

React Native๋Š” ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ๋ฐ”๋€Œ๊ฑฐ๋“ ์š”! 

์ด๊ฒŒ ๋„ˆ๋ฌด ์ข‹์•˜์–ด์š”

์ผ๋‹จ React Native์˜ ๊ฐœ๋ฐœ์†๋„๊ฐ€ ๋” ๋น ๋ฅด๋‹ค

์ด๊ฒŒ ์ฒซ ๋ฒˆ์งธ ์ด์œ ์ด๊ณ 

 

๋‘ ๋ฒˆ์งธ ์ด์œ ๋Š” ์ €ํฌ๊ฐ€ Firebase๋กœ ์ผ๋ถ€ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ์—ˆ๋Š”๋ฐ,

Firebase ์—๋Š” React Native ๊ฐ€ ์ข€ ๋” ํ˜ธํ™˜์ด ์ž˜๋œ๋‹ค??๋ผ๋Š” ๋ง์ด ์žˆ์–ด์š”!

 

https://rnfirebase.io/

 

ํŠนํžˆ ์ด๋Ÿฐ React Native๋ž‘ Firebase์™€ ์—ฐ๋™ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋ณด๋‹ˆ

๊ฒฐ์ •ํ•˜๊ธฐ์— ๋”์šฑ ์‰ฌ์› ๋˜ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

React Native ๊ธฐ๋ณธ ๋ผˆ๋Œ€ ์žก๊ธฐ( navigation ์„ค์ • ๋ฐ ํด๋” ๊ตฌ์กฐ) 

 

 

์šฐ์„  ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „ ์ €๋Š” navigation๋จผ์ € ์„ค์ •ํ•ด ์ฃผ์—ˆ์–ด์š”.

navigation์ด ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๋ผˆ๋Œ€๋ฅผ ์žก์•„์ค€๋‹ค๋Š” ๋А๋‚Œ์ด ์žˆ์–ด์„œ

 

์ผ๋‹จ navigation์ด ๋”ฑ~ ๋ฌด๊ฒŒ๋ฅผ ์žก์•„์ฃผ๋ฉด ๋ญ๋ž„๊นŒ ํ”„๋กœ์ ํŠธ์˜ ์ ˆ๋ฐ˜์ด ์™„์„ฑ๋˜์—ˆ๋‹ค๋Š” ๋А๋‚Œ์ด...(์•„๋‹˜)

 

๊ณ ๋ คํ•ด์•ผ ๋  ์‚ฌํ•ญ์€ ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ฌ๋ผ์š”

์ผ๋‹จ ์•„๋ž˜ ์‚ฌ์ง„์€ ์ œ๊ฐ€ ์ œ์ž‘ํ•œ figma ๊ธฐํš์•ˆ์ž…๋‹ˆ๋‹ค ใ…Ž

 

 

 

๋””์ž์ธํ•˜๋Š” ๊ฒŒ ์€๊ทผํžˆ ์žฌ๋ฏธ๋„ ์žˆ์œผ๋ฉด์„œ

์–ด๋ ต๋”๋ผ๊ณ ์š”

๊ทธ๋ž˜๋„ ๋ญ”๊ฐ€ ์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ?? ๋””์ž์ธ์€ ์žฌ๋ฏธ๋‚œ ๊ฑฐ ๊ฐ™์•„์š”

๋กœ๊ณ ๋„ ๋‹ค ์ง์ ‘ ์ œ์ž‘ํ–ˆ์–ด์š”!

 

 

์–ด๋–ค๊ฐ€์š”?

ใ…‹ใ…Žใ…Ž

์•™์ฆ๋งž์œผ๋ฉด์„œ...

์•„ ์ฐธ, ๋กœ๊ณ ๋Š” ์บ”๋ฐ”๋กœ ์ œ์ž‘ํ–ˆ์–ด์š”...ใ…‹ใ…‹ใ…‹ใ…‹

์š”์ฆ˜ ์บ”๋ฐ”, ๋ฏธ๋ฆฌ์บ”๋ฒ„์Šค ๊ธฐ๋Šฅ์ด ์—„์ฒญ ์ข‹๋”๋ผ๊ณ ์š” ๐Ÿ‘๐Ÿ‘

 

 

๋จธ ์•”ํŠผ!

์ €๋Š” ํฌ๊ฒŒ

 

- ์‹œ์ž‘ํ™”๋ฉด

- ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด 

- ๋ฉ”์ธํ™”๋ฉด

 

์„ธ ๊ฐ€์ง€์˜ stack์œผ๋กœ ๋‚˜๋ˆ„์–ด์•ผ๊ฒ ๋‹จ ์ƒ๊ฐ์„ ํ•˜์˜€์–ด์š”

 

 

์—ฌ๊ธฐ์„œ ์•„์ฃผ ์‚ด์ง ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์€

๋ฉ”์ธํ™”๋ฉด์—์„œ๋งŒ

 

 

 

์ด๋Ÿฐ bottom navigation์ด ๋ณด์ด๊ฒŒ ๋˜๋Š”๋ฐ 

๋ฉ”์ธํ™”๋ฉด ์•ˆ์—์„œ๋„ bottom navigation์ด ๋ณด์ด๋Š” ํ™”๋ฉด์ด ์žˆ๊ณ 

bottom navigation์ด ์•ˆ ๋ณด์ด๋Š” ํ™”๋ฉด์ด ์žˆ์„ ๊ฑฐ ์•„๋…œ์š”

 

๊ทธ๋ž˜์„œ MainStack.Screen ์Šคํƒ ์•ˆ์—

MainBottomScreen์ด๋ผ๋Š” Tab.Navigator์„ ๋งŒ๋“ค์—ˆ์–ด์š”!
์ด๊ฒŒ ๊ณง ์Šคํƒ ์•ˆ์˜ ๋˜ ๋‹ค๋ฅธ ๋‚ด๋น„๊ฒŒ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ์ธ ๊ฑฐ์ฃ 

 

์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด๋ฉด

 

export default function AppStackNavigation() {

  return (
    <AppStack.Navigator>
      <AppStack.Screen
        name="StartScreen"
        component={StartScreen}
        options={{headerShown: false}}
      />
      <AppStack.Screen
        name="AuthStack"
        component={AuthStackNavigation}
        options={{
          headerShown: false,
        }}
      />
      <AppStack.Screen
        name="MainStack"
        component={MainStackNavigation}
        options={{headerShown: false}}
      />
    </AppStack.Navigator>
  );
}

 

์ด๊ฑด ๊ฐ€์žฅ ํฐ?

๊ฐ€์žฅ ๋ผˆ๋Œ€๊ฐ€ ๋˜๋Š” ์•ฑ์˜ stack ์ด์ฃ 

 

์œ„์—์„œ ๋งํ•œ ์‹œ์ž‘ํ™”๋ฉด, ์ธ์ฆ ํ™”๋ฉด, ๋ฉ”์ธํ™”๋ฉด์œผ๋กœ ์Šคํƒ์„ ์„ธ ๊ฐœ ์Œ“์•„์ค˜์š”

์‹œ์ž‘ํ™”๋ฉด์€ ํ™”๋ฉด์ด ํ•˜๋‚˜๋ผ ๊ทธ๋ƒฅ ๋ฐ”๋กœ ๋ฉ”์ธ ์Šคํƒ์— ๋„ฃ์–ด์ฃผ์—ˆ๊ณ 

 

export default function AuthStackNavigation() {
  const AuthStack = createNativeStackNavigator();

  return (
    <>
      <AuthStack.Navigator>
        <AuthStack.Screen
          name="LoginScreen"
          component={LoginScreen}
          })}
        />
        .
        .
        .

 

 

 

๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ์Šคํƒ์€ ํ™”๋ฉด์ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ผ

์ด๋ ‡๊ฒŒ ์Šคํƒ๋“ค์„ ์ •์˜ํ•ด ์ค˜์š”

 

export default function MainStackNavigation() {
  const MainStack = createNativeStackNavigator();

  return (
    <>
      <MainStack.Navigator>
        <MainStack.Screen
          name="MainBottomScreen"
          component={MainBottomScreen}
          options={{headerShown: false}}
        />
        <MainStack.Screen
          name="ProfileSettingScreen"
          component={ProfileSettingScreen}
			.
            .
            .

 

 

๋‹ค์Œ์€ ๋ฉ”์ธํ™”๋ฉด!

์œ„์—์„œ ๋งํ•œ ๊ณ ๋ ค์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด

 

export default function MainBottomScreen() {
  const Tab = createBottomTabNavigator();

  return (
    <View style={{height: '100%'}}>
      <Tab.Navigator
        initialRouteName="๋ฉ”์ธํ™”๋ฉด"
       			.
                .
        })}>
        <Tab.Screen
          name="์ฑ„ํŒ…"
          component={ChattingRoomListScreen}
        		.
                .
        />
        <Tab.Screen
          name="๋ฉ”์ธํ™”๋ฉด"
          component={HomeScreen}
          		.
                .
        />
        <Tab.Screen
          name="ํ”„๋กœํ•„"
          component={ProfileScreen}
         		.
                .
        />
      </Tab.Navigator>
    </View>
  );
}

 

 

์„ค๋ช…์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์˜ต์…˜๋“ค์€ ์ง€์› ์–ด์š”!

์—ฌ๊ธฐ Tab.Navigator ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด ๊ฐ๊ฐ ๋„ฃ๊ณ  ์‹ถ์€ ์Šคํฌ๋ฆฐ๋“ค์„ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ€๋Š” Stack ๋ถ€๋ถ„์—๋Š” Bottom navigation์ด ํ‘œ์‹œ๋˜๊ฒ ์ฃ ?

Bottom navigaion์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ฉ”์ธ ์Šคํƒ์˜ ํ™”๋ฉด๋“ค์€

MainStackNavigation์— ์ถ”๊ฐ€๋กœ ์ •์˜ํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

 

๋~~

 

์—ฌ๊ธฐ์„œ name์œผ๋กœ ์ •์˜ํ•ด ๋‘” ํ™”๋ฉด์œผ๋กœ

์ž์œ ๋กญ๊ฒŒ ํ™”๋ฉด ๊ฐ„ ์ด๋™์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค!

 

 

์ด๊ฑธ ์šฐ์„  ์ •์˜ํ•˜๊ณ  ๋‚˜์„œ...

๋‹ค์Œ์œผ๋กœ๋Š” ํด๋” ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•ด ๋‘์—ˆ์–ด์š”

 

 

ํ”„๋กœ์ ํŠธ ๊ธฐ๋ณธ ๊ตฌ์กฐ

 

 

src
 โ”œโ”€โ”€ network
 โ”‚       โ””โ”€โ”€ client
 โ”‚               โ”œโ”€โ”€ api-endpoint.js
 โ”‚               โ”œโ”€โ”€ http-client.js
 โ”‚               โ””โ”€โ”€ index.js
 โ”œโ”€โ”€ assets
 โ”‚   โ””โ”€โ”€ images
 โ”œโ”€โ”€ components
 โ”‚   โ””โ”€โ”€ AuthStackComponent
 โ”œโ”€โ”€ constants
 โ”‚    โ”œโ”€โ”€ colors
 โ”‚    โ””โ”€โ”€ data
 โ”œโ”€โ”€ navigation
 โ”œโ”€โ”€ redux
 โ”‚    โ”œโ”€โ”€ slices
 โ”‚    โ””โ”€โ”€ store
 โ”œโ”€โ”€ screens
 โ”œโ”€โ”€ utils
 โ”‚   โ””โ”€โ”€ constants
 โ”œโ”€โ”€ styles
 โ”œโ”€โ”€ App.tsx
 โ”œโ”€โ”€ index.tsx
 โ””โ”€โ”€ serverAccountKey.json

 

 

httpํ†ต์‹ ์€ network๋‹จ์— ๋”ฐ๋กœ 

assetํด๋”์—” ์ด๋ฏธ์ง€

component ํด๋”์—” ๊ฐ์ข… ์ปดํฌ๋„ŒํŠธ๋“ค

constants ํด๋”์—” colors, data ๋“ค

navigation

redux

screens

utils

styles

ํด๋”๋กœ

ํด๋”๋ฅผ ์ •์˜ํ•ด ๋‘์—ˆ์–ด์š”

 

 

์˜ค๋Š˜์˜ ํฌ์ŠคํŒ… ๋!

 

 

๋‹ค์Œ ํฌ์ŠคํŒ…์‹œ๊ฐ„์— ๋ด…์‹œ๋‹น~~~