๐Ÿš€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ๐Ÿงญ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ๐Ÿงญ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ํ•  ๊ฑฐ์˜ˆ์š”. ๋ฐ”๋กœ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ๊ฑฐ๋“ ์š”. ์ด ์ฃผ์ œ, ์–ด๋– ์„ธ์š”? ๐Ÿ˜Ž ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ํ•œ ๋ฒˆ์ฏค์€ ๊ณ ๋ฏผํ•ด๋ดค์„ ๋‚ด์šฉ์ด์ฃ ?

๋„ค๋น„๊ฒŒ์ด์…˜์ด ๋ญ ๊ทธ๋ฆฌ ๋Œ€๋‹จํ•˜๋ƒ๊ณ ์š”? ใ…‹ใ…‹ใ…‹ ์–ด๋ฆผ๋„ ์—†์ฃ ! ๋„ค๋น„๊ฒŒ์ด์…˜์€ ์•ฑ์˜ ๋ผˆ๋Œ€๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ์—์š”. ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์–ด๋–ป๊ฒŒ ๋Œ์•„๋‹ค๋‹ˆ๋Š๋ƒ๊ฐ€ ์ „์ฒด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ขŒ์šฐํ•˜๋‹ˆ๊นŒ์š”. ๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ ์„ธ๊ณ„๋กœ ํ’๋ฉ~ ๋น ์ ธ๋ณผ ๊ฑฐ์˜ˆ์š”! ๐ŸŠโ€โ™‚๏ธ

์•„, ๊ทธ๋ฆฌ๊ณ  ์ž ๊น! ์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์žฌ๋Šฅ๋„ท์ด๋ผ๋Š” ์‚ฌ์ดํŠธ ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ์—ฌ๊ธฐ์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋˜๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ๋ฐฐ์šธ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜ ์Šคํ‚ฌ๋„ ๊ฑฐ๊ธฐ์„œ ๊ณต์œ ํ•˜๋ฉด ์ข‹๊ฒ ์ฃ ? ๐Ÿ˜‰ ์ž, ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”?

๐Ÿ”‘ Key Point: ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ, ์•ฑ์˜ ํ•ต์‹ฌ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •์ง“๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์€ ํ•œ์ธต ๋” ์‚ฌ์šฉ์ž ์นœํ™”์ ์ด ๋  ๊ฑฐ์˜ˆ์š”!

๐ŸŒŸ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ ๊ธฐ์ดˆ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ํ…๋ฐ์š”. ๋จผ์ € ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ด์š”. ์•„๋‹ˆ, ์ž ๊น๋งŒ์š”! "๊ธฐ์ดˆ๋ผ๊ณ ? ๋‚˜ ์ด๋ฏธ ๊ณ ์ˆ˜์ธ๋ฐ?" ํ•˜์‹œ๋Š” ๋ถ„๋“ค๋„ ๊ณ„์‹ค ๊ฑฐ์˜ˆ์š”. ใ…‹ใ…‹ใ…‹ ํ•˜์ง€๋งŒ ๊ธฐ์ดˆ๊ฐ€ ํŠผํŠผํ•ด์•ผ ์‘์šฉ๋„ ์ž˜ํ•˜๋Š” ๋ฒ•! ํ•จ๊ป˜ ๋ณต์Šตํ•ด๋ณด์ž๊ตฌ์š”. ๐Ÿ˜‰

1. ๋„ค๋น„๊ฒŒ์ด์…˜์ด ๋ญ๊ธธ๋ž˜? ๐Ÿค”

๋„ค๋น„๊ฒŒ์ด์…˜, ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ์•ฑ ๋‚ด์—์„œ์˜ ์ด๋™์„ ๋งํ•ด์š”. ์นดํ†ก์—์„œ ์ฑ„ํŒ…๋ฐฉ ๋ชฉ๋ก์—์„œ ํŠน์ • ์ฑ„ํŒ…๋ฐฉ์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ, ์ธ์Šคํƒ€์—์„œ ํ”ผ๋“œ์—์„œ ํŠน์ • ๊ฒŒ์‹œ๋ฌผ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ, ์ด ๋ชจ๋“  ๊ฒŒ ๋‹ค ๋„ค๋น„๊ฒŒ์ด์…˜์ด์—์š”. ๊ทผ๋ฐ ์ด๊ฒŒ ์™œ ์ค‘์š”ํ•˜๋ƒ๊ณ ์š”?

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX) ํ–ฅ์ƒ ๐Ÿ‘
  • ์•ฑ์˜ ๊ตฌ์กฐ์™€ ํ๋ฆ„ ๊ฒฐ์ • ๐Ÿ—๏ธ
  • ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๐Ÿ’พ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™” ๐Ÿš€

์ด ๋ชจ๋“  ๊ฒŒ ๋„ค๋น„๊ฒŒ์ด์…˜๊ณผ ์—ฐ๊ด€๋˜์–ด ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ์•ฑ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ !

2. ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๐Ÿงญ

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์•„์š”. "์—ฅ? ๊ทธ๋Ÿผ ์–ด๋–กํ•ด์š”?" ๋ผ๊ณ  ์ƒ๊ฐํ•˜์…จ๋‹ค๋ฉด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ใ…‹ใ…‹ใ…‹ ๊ฑฑ์ • ๋งˆ์„ธ์š”. ์šฐ๋ฆฌ์—๊ฒ React Navigation์ด๋ผ๋Š” ๋ฉ‹์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ฑฐ๋“ ์š”! ๐Ÿ˜Ž

๐Ÿ“ข ์•Œ๋ฆผ: React Navigation์€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ˆ์š”. ๊ณต์‹ ๋ฌธ์„œ๋„ ์ž˜ ๋˜์–ด ์žˆ๊ณ , ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์žˆ์–ด์„œ ๋ฏฟ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

3. React Navigation ์‹œ์ž‘ํ•˜๊ธฐ ๐Ÿš€

์ž, ์ด์ œ React Navigation์„ ์„ค์น˜ํ•ด๋ณผ๊นŒ์š”? ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

npm install @react-navigation/native

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ ํ•„์š”ํ•œ ์˜์กด์„ฑ๋„ ์„ค์น˜ํ•ด์ค˜์•ผ ํ•ด์š”:

npm install react-native-screens react-native-safe-area-context

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ ์„ค์น˜๋Š” ๋! ๊ฐ„๋‹จํ•˜์ฃ ? ใ…‹ใ…‹ใ…‹

4. ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ์„ค์ •ํ•˜๊ธฐ ๐Ÿ“ฆ

์ด์ œ ์•ฑ์˜ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— NavigationContainer๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•ด์š”. ๋ณดํ†ต App.js ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ๋ผ์š”:

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';

export default function App() {
  return (
    <navigationcontainer>
      {/* ์—ฌ๊ธฐ์— ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฑฐ์˜ˆ์š” */}
    </navigationcontainer>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์ธ ์„ธํŒ…์€ ๋! ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ๊ตฌํ˜„ํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

๐Ÿ’ก Tip: NavigationContainer๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์•ฑ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ํŠธ๋ฆฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•ด์š”. ๊ผญ ์ตœ์ƒ์œ„์— ์œ„์น˜์‹œ์ผœ์ฃผ์„ธ์š”!

์—ฌ๊ธฐ๊นŒ์ง€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ ๊ธฐ์ดˆ๋ฅผ ์‚ดํŽด๋ดค์–ด์š”. ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด์ œ ๊ธฐ์ดˆ๋Š” ํƒ„ํƒ„ํ•˜๊ฒŒ ๋‹ค์กŒ์œผ๋‹ˆ, ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋” ์‹ฌํ™”๋œ ๋‚ด์šฉ์„ ๋‹ค๋ค„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's go! ๐Ÿš€

๐Ÿงฉ ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒ€์ž… ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ ๋‹ค์–‘ํ•œ ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. "ํƒ€์ž…์ด ๋ญ๊ฐ€ ๊ทธ๋ฆฌ ์ค‘์š”ํ•ด?" ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ค ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๊ฐ ํƒ€์ž…๋งˆ๋‹ค ํŠน์ง•์ด ๋‹ฌ๋ผ์„œ ์•ฑ์˜ ์„ฑ๊ฒฉ์— ๋งž๋Š” ๊ฑธ ๊ณจ๋ผ ์“ฐ๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ž์‹ ์˜ ์žฌ๋Šฅ์— ๋งž๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜‰

1. ์Šคํƒ ๋„ค๋น„๊ฒŒ์ด์…˜ (Stack Navigation) ๐Ÿ“š

์Šคํƒ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒ€์ž…์ด์—์š”. ๋งˆ์น˜ ์ฑ…์„ ์Œ“์•„ ์˜ฌ๋ฆฌ๋“ฏ์ด, ํ™”๋ฉด์„ ์œ„๋กœ ์Œ“์•„ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์ด์ฃ .

์„ค์น˜๋ถ€ํ„ฐ ํ•ด๋ณผ๊นŒ์š”? ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”:

npm install @react-navigation/stack

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

function MyStack() {
  return (
    <stack.navigator>
      <stack.screen name="Home" component="{HomeScreen}"></stack.screen>
      <stack.screen name="Details" component="{DetailsScreen}"></stack.screen>
    </stack.navigator>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Home ํ™”๋ฉด์—์„œ Details ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ์Šคํƒ ๋„ค๋น„๊ฒŒ์ด์…˜์ด ์™„์„ฑ๋ผ์š”!

โš ๏ธ ์ฃผ์˜: ์Šคํƒ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ํ™”๋ฉด์„ ๊ณ„์† ์Œ“์•„๊ฐ€๋Š” ๋ฐฉ์‹์ด๋ผ, ๋„ˆ๋ฌด ๋งŽ์€ ํ™”๋ฉด์„ ์Œ“์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์š”. ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”!

2. ํƒญ ๋„ค๋น„๊ฒŒ์ด์…˜ (Tab Navigation) ๐Ÿ—‚๏ธ

ํƒญ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ํ™”๋ฉด ์•„๋ž˜๋‚˜ ์œ„์— ํƒญ์„ ๋‘๊ณ , ํƒญ์„ ํ„ฐ์น˜ํ•ด ํ™”๋ฉด์„ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ์ธ์Šคํƒ€๊ทธ๋žจ์ด๋‚˜ ์œ ํŠœ๋ธŒ ๊ฐ™์€ ์•ฑ์—์„œ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ์ฃ .

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

npm install @react-navigation/bottom-tabs

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

import React from 'react';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';

const Tab = createBottomTabNavigator();

function MyTabs() {
  return (
    <tab.navigator>
      <tab.screen name="Home" component="{HomeScreen}"></tab.screen>
      <tab.screen name="Settings" component="{SettingsScreen}"></tab.screen>
    </tab.navigator>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Home๊ณผ Settings ์‚ฌ์ด๋ฅผ ํƒญ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜์ด ๋งŒ๋“ค์–ด์ ธ์š”!

๐Ÿ’ก Tip: ํƒญ ์•„์ด์ฝ˜์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, options prop์„ ์‚ฌ์šฉํ•ด ๊ฐ ํƒญ์˜ ์•„์ด์ฝ˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ์œ ์•„์ด์ฝ˜์œผ๋กœ ์•ฑ์˜ ๋งค๋ ฅ์„ ํ•œ์ธต ๋” ์˜ฌ๋ ค๋ณด์„ธ์š”!

3. ๋“œ๋กœ์–ด ๋„ค๋น„๊ฒŒ์ด์…˜ (Drawer Navigation) ๐Ÿšช

๋“œ๋กœ์–ด ๋„ค๋น„๊ฒŒ์ด์…˜์€ ํ™”๋ฉด ์ธก๋ฉด์—์„œ ์„œ๋ž์ฒ˜๋Ÿผ ํŠ€์–ด๋‚˜์˜ค๋Š” ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ์ฃผ๋กœ ๋งŽ์€ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜์ฃ .

์„ค์น˜๋Š” ์ด๋ ‡๊ฒŒ:

npm install @react-navigation/drawer

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•ด์š”:

import React from 'react';
import { createDrawerNavigator } from '@react-navigation/drawer';

const Drawer = createDrawerNavigator();

function MyDrawer() {
  return (
    <drawer.navigator>
      <drawer.screen name="Feed" component="{Feed}"></drawer.screen>
      <drawer.screen name="Article" component="{Article}"></drawer.screen>
    </drawer.navigator>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™”๋ฉด ์™ผ์ชฝ์—์„œ ์„œ๋ž์ฒ˜๋Ÿผ ์—ด๋ฆฌ๋Š” ๋ฉ”๋‰ด๊ฐ€ ์ƒ๊ฒจ์š”!

๐ŸŽจ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•: ๋“œ๋กœ์–ด์˜ ์Šคํƒ€์ผ, ์—ด๋ฆฌ๋Š” ๋ฐฉํ–ฅ, ์ œ์Šค์ฒ˜ ๋“ฑ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์•ฑ์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์ž˜ ๊พธ๋ฉฐ๋ณด์„ธ์š”!

4. ์ค‘์ฒฉ ๋„ค๋น„๊ฒŒ์ด์…˜ (Nested Navigation) ๐ŸŽญ

์—ฌ๋Ÿฌ๋ถ„, ์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ๊ฑธ ํ•ด๋ณผ๊นŒ์š”? ใ…‹ใ…‹ใ…‹ ์ค‘์ฒฉ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ์œ„์—์„œ ๋ฐฐ์šด ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒ€์ž…๋“ค์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํƒญ ๋„ค๋น„๊ฒŒ์ด์…˜ ์•ˆ์— ์Šคํƒ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์ฃ .

์ฝ”๋“œ๋กœ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ๋ผ์š”:

import React from 'react';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createStackNavigator } from '@react-navigation/stack';

const Tab = createBottomTabNavigator();
const HomeStack = createStackNavigator();

function HomeStackScreen() {
  return (
    <homestack.navigator>
      <homestack.screen name="Home" component="{HomeScreen}"></homestack.screen>
      <homestack.screen name="Details" component="{DetailsScreen}"></homestack.screen>
    </homestack.navigator>
  );
}

function MyTabs() {
  return (
    <tab.navigator>
      <tab.screen name="Home" component="{HomeStackScreen}"></tab.screen>
      <tab.screen name="Settings" component="{SettingsScreen}"></tab.screen>
    </tab.navigator>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํƒญ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ Home ํƒญ ์•ˆ์— ์Šคํƒ ๋„ค๋น„๊ฒŒ์ด์…˜์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋ผ์š”. ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์—„์ฒญ ์œ ์šฉํ•˜๋‹ต๋‹ˆ๋‹ค!

๐Ÿง  ์ƒ๊ฐํ•ด๋ณด๊ธฐ: ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์—๋Š” ์–ด๋–ค ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ• ๊นŒ์š”? ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ตœ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ณด์„ธ์š”!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ์ฃผ์š” ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒ€์ž…๋“ค์„ ์‚ดํŽด๋ดค์–ด์š”. ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์žฌ๋ฐŒ์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด์ œ ์ด ํƒ€์ž…๋“ค์„ ์ž˜ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๋ฉ‹์ง„ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ์กฐํ•ฉํ•ด ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์—์š”! ๐Ÿ˜‰

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒ€์ž…๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋” ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์€ ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's dive deeper! ๐ŸŠโ€โ™‚๏ธ

๐Ÿš€ ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹ฌํ™”: ์‹ค์ „ ํ™œ์šฉ๊ณผ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘ "๊ทผ๋ฐ ์ด๊ฑธ๋กœ ๋ญ˜ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ?" ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ณ„์‹ ๋‹ค๋ฉด, ์ง€๊ธˆ๋ถ€ํ„ฐ ๊ทธ ํ•ด๋‹ต์„ ๋“œ๋ฆด๊ฒŒ์š”. ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ ์•ฑ ๊ฐœ๋ฐœ์—์„œ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๋“ค์ด ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ ์ˆ˜๋“ค์˜ ๊ฟ€ํŒ์„ ์–ป๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์—ฌ๋Ÿฌ๋ถ„๋„ ์ด ์„น์…˜์„ ํ†ตํ•ด ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ณ ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Ž

1. ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ ๐Ÿ“ฆ

์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ํ™”๋ฉด ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•  ๋•Œ๊ฐ€ ๋งŽ์ฃ . ์ด๋Ÿด ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก์—์„œ ํŠน์ • ๊ฒŒ์‹œ๊ธ€์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ ๊ฒŒ์‹œ๊ธ€ ID๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜์ž–์•„์š”?

์ฝ”๋“œ๋กœ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ๋ผ์š”:

// ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ
navigation.navigate('Details', { id: 86, title: '๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๊ฟ€ํŒ!' });

// ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ›๊ธฐ
function DetailsScreen({ route }) {
  const { id, title } = route.params;
  return (
    <view>
      <text>์ƒ์„ธ ํŽ˜์ด์ง€ {id}</text>
      <text>{title}</text>
    </view>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Details ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋ฉด์„œ id์™€ title ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ๊ฟ€ํŒ์ด์ฃ ? ใ…‹ใ…‹ใ…‹

๐Ÿ’ก Tip: ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋„ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

2. ๋„ค๋น„๊ฒŒ์ด์…˜ ์˜ต์…˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๐ŸŽจ

๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์˜ ์Šคํƒ€์ผ์„ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๊ตฌ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! React Navigation์€ ๋‹ค์–‘ํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์˜ต์…˜์„ ์ œ๊ณตํ•ด์š”.

import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

function MyStack() {
  return (
    <stack.navigator screenoptions="{{" headerstyle: backgroundcolor: headertintcolor: headertitlestyle: fontweight:>
      <stack.screen name="Home" component="{HomeScreen}" options="{{" title:></stack.screen>
    </stack.navigator>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”์˜ ์ƒ‰์ƒ, ๊ธ€๊ผด ๋“ฑ์„ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”. ์•ฑ์˜ ๋ถ„์œ„๊ธฐ์— ๋งž๊ฒŒ ์˜ˆ์˜๊ฒŒ ๊พธ๋ฉฐ๋ณด์„ธ์š”! ๐Ÿ˜‰

3. ๋„ค๋น„๊ฒŒ์ด์…˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๐ŸŽญ

ํ™”๋ฉด์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์•˜์„ ๋•Œ, ํ˜น์€ ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌ๋์„ ๋•Œ ํŠน์ • ๋™์ž‘์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? React Navigation์€ ์ด๋Ÿฐ ์ด๋ฒคํŠธ๋“ค์„ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ›…์„ ์ œ๊ณตํ•ด์š”.

import { useFocusEffect } from '@react-navigation/native';

function ProfileScreen() {
  useFocusEffect(
    React.useCallback(() => {
      // ํ™”๋ฉด์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ
      console.log('ํ”„๋กœํ•„ ํ™”๋ฉด์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์•˜์–ด์š”!');

      return () => {
        // ํ™”๋ฉด์ด ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌ๋์„ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ
        console.log('ํ”„๋กœํ•„ ํ™”๋ฉด์ด ๋ธ”๋Ÿฌ ์ฒ˜๋ฆฌ๋์–ด์š”!');
      };
    }, [])
  );

  return <text>ํ”„๋กœํ•„ ํ™”๋ฉด</text>;
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™”๋ฉด์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›๊ฑฐ๋‚˜ ์žƒ์„ ๋•Œ๋งˆ๋‹ค ์›ํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•œ๋‹ค๊ฑฐ๋‚˜ ๋ถ„์„ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์ฃ .

๐Ÿง  ์ƒ๊ฐํ•ด๋ณด๊ธฐ: ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์—์„œ๋Š” ์–ด๋–ค ํ™”๋ฉด์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”? ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ณด์„ธ์š”!

4. ๋”ฅ ๋งํ‚น ๊ตฌํ˜„ํ•˜๊ธฐ ๐Ÿ”—

๋”ฅ ๋งํ‚น์ด ๋ญ๋ƒ๊ตฌ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์•ฑ ์™ธ๋ถ€์—์„œ ์•ฑ ๋‚ด๋ถ€์˜ ํŠน์ • ํ™”๋ฉด์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ํ†ตํ•ด ํŠน์ • ๊ฒŒ์‹œ๊ธ€๋กœ ๋ฐ”๋กœ ์ด๋™ํ•œ๋‹ค๊ฑฐ๋‚˜, ์›น ๋งํฌ๋ฅผ ํ†ตํ•ด ์•ฑ์˜ ํŠน์ • ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ์ฃ .

React Navigation์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”:

import { LinkingOptions } from '@react-navigation/native';

const linking = {
  prefixes: ['https://myapp.com', 'myapp://'],
  config: {
    screens: {
      Home: 'home',
      Profile: 'user/:id',
      Settings: 'settings',
    },
  },
};

function App() {
  return (
    <navigationcontainer linking="{linking}">
      {/* ... */}
    </navigationcontainer>
  );
}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด 'https://myapp.com/user/123' ๊ฐ™์€ URL๋กœ ์•ฑ์˜ Profile ํ™”๋ฉด์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์‹ ๊ธฐํ•˜์ฃ ? ใ…‹ใ…‹ใ…‹

5. ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ ๐Ÿ—ƒ๏ธ

๋ณต์žกํ•œ ์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ๋ฅผ ์ „์—ญ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”. ์ด๋Ÿด ๋•Œ Redux๋‚˜ MobX ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ React Navigation์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

import { NavigationContainer } from '@react-navigation/native';
import { useSelector } from 'react-redux';

function App() {
  const navigationState = useSelector(state => state.navigationState);

  return (
    <navigationcontainer initialstate="{navigationState}" onstatechange="{(state)"> {
        // ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค Redux store์— ์ €์žฅ
        dispatch(updateNavigationState(state));
      }}
    >
      {/* ... */}
    </navigationcontainer>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฑ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ๋ฅผ Redux store์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ์•ฑ์„ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์—ด์–ด๋„ ์ด์ „ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์ฃ !

๐Ÿ’ก Tip: ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ณต์žกํ•œ ์•ฑ์—์„œ ํŠนํžˆ ์œ ์šฉํ•ด์š”. ํ•˜์ง€๋งŒ ๊ฐ„๋‹จํ•œ ์•ฑ์—์„œ๋Š” ์˜คํžˆ๋ ค ๋ณต์žก์„ฑ๋งŒ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”!

6. ์ œ์Šค์ฒ˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ ๐Ÿ‘†

์š”์ฆ˜ ์•ฑ๋“ค ๋ณด๋ฉด ํ™”๋ฉด์„ ์Šค์™€์ดํ”„ํ•ด์„œ ๋’ค๋กœ ๊ฐ€๊ฑฐ๋‚˜ ๋‹ค์Œ ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฑฐ ๋งŽ์ด ๋ณด์…จ์ฃ ? ์ด๋Ÿฐ ์ œ์Šค์ฒ˜ ๊ธฐ๋ฐ˜ ๋„ค๋น„๊ฒŒ์ด์…˜๋„ React Navigation์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

function MyStack() {
  return (
    <stack.navigator screenoptions="{{" gestureenabled: true gesturedirection: cardstyleinterpolator: cardstyleinterpolators.forhorizontalios>
      <stack.screen name="Home" component="{HomeScreen}"></stack.screen>
      <stack.screen name="Profile" component="{ProfileScreen}"></stack.screen>
    </stack.navigator>
  );
}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด iOS ์Šคํƒ€์ผ์˜ ์Šค์™€์ดํ”„ ์ œ์Šค์ฒ˜๋กœ ํ™”๋ฉด์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋„ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜Ž

7. ์กฐ๊ฑด๋ถ€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„ํ•˜๊ธฐ ๐Ÿ”€

๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๋‹ค๊ตฌ์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! React Navigation์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ์กฐ๊ฑด๋ถ€ ๋„ค๋น„๊ฒŒ์ด์…˜๋„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  return (
    <navigationcontainer>
      {isLoggedIn ? (
        <stack.navigator>
          <stack.screen name="Home" component="{HomeScreen}"></stack.screen>
          <stack.screen name="Profile" component="{ProfileScreen}"></stack.screen>
        </stack.navigator>
      ) : (
        <stack.navigator>
          <stack.screen name="Login" component="{LoginScreen}"></stack.screen>
          <stack.screen name="Register" component="{RegisterScreen}"></stack.screen>
        </stack.navigator>
      )}
    </navigationcontainer>
  );
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ๋กœ๊ทธ์ธํ•˜๋ฉด ํ™ˆ ํ™”๋ฉด์œผ๋กœ, ๋กœ๊ทธ์•„์›ƒํ•˜๋ฉด ๋กœ๊ทธ์ธ ํ™”๋ฉด์œผ๋กœ ์ž๋™์œผ๋กœ ์ „ํ™˜๋˜๊ฒ ์ฃ ?

๐ŸŽญ ์‹ค์ „ ํŒ: ์ด๋Ÿฐ ์กฐ๊ฑด๋ถ€ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ์•ฑ์˜ ์ธ์ฆ ํ๋ฆ„์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ด์š”. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

8. ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•˜๊ธฐ ๐Ÿš€

์•ฑ์ด ์ปค์ง€๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ๋„ค๋น„๊ฒŒ์ด์…˜์€ ์•ฑ์˜ ํ•ต์‹ฌ์ด๋‹ˆ๊นŒ ์ตœ์ ํ™”๊ฐ€ ์ค‘์š”ํ•˜์ฃ . React Navigation์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ œ๊ณตํ•ด์š”.

import { useCallback } from 'react';
import { useFocusEffect } from '@react-navigation/native';

function MyScreen() {
  useFocusEffect(
    useCallback(() => {
      // ํ™”๋ฉด์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์•˜์„ ๋•Œ๋งŒ ์‹คํ–‰๋˜๋Š” ๋ฌด๊ฑฐ์šด ์ž‘์—…
      const task = heavyTask();
      return () => task.cancel();
    }, [])
  );

  return <view>...</view>;
}

์ด๋ ‡๊ฒŒ useFocusEffect์™€ useCallback์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, ํ™”๋ฉด์ด ํฌ์ปค์Šค๋ฅผ ๋ฐ›์„ ๋•Œ๋งŒ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์•ฑ์ด ๋” ๋น ๋ฅด๊ณ  ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋™์ž‘ํ•˜๊ฒ ์ฃ ?

9. ํ…Œ์ŠคํŒ… ์ „๋žต ๐Ÿงช

๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•ด์š”. React Navigation์€ ํ…Œ์ŠคํŒ…์„ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์š”.

import { render, fireEvent } from '@testing-library/react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';

const Stack = createStackNavigator();

test('navigates to profile screen', () => {
  const { getByText } = render(
    <navigationcontainer>
      <stack.navigator>
        <stack.screen name="Home" component="{HomeScreen}"></stack.screen>
        <stack.screen name="Profile" component="{ProfileScreen}"></stack.screen>
      </stack.navigator>
    </navigationcontainer>
  );

  fireEvent.press(getByText('Go to Profile'));
  expect(getByText('This is the profile screen')).toBeTruthy();
});

์ด๋Ÿฐ ์‹์œผ๋กœ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฒ„๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ๊ณ , ๋ฆฌํŒฉํ† ๋ง๋„ ๋” ์‰ฌ์›Œ์ง„๋‹ต๋‹ˆ๋‹ค!

๐Ÿง  ์ƒ๊ฐํ•ด๋ณด๊ธฐ: ์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์—์„œ๋Š” ์–ด๋–ค ๋„ค๋น„๊ฒŒ์ด์…˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ• ๊นŒ์š”? ์ค‘์š”ํ•œ ์‚ฌ์šฉ์ž ํ๋ฆ„์„ ์ƒ๊ฐํ•ด๋ณด๊ณ , ๊ทธ์— ๋งž๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ ์‹ฌํ™” ๋‚ด์šฉ์„ ์‚ดํŽด๋ดค์–ด์š”. ์–ด๋– ์„ธ์š”? ์ƒ๊ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ๋“ค์„ ํ•  ์ˆ˜ ์žˆ์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ๋„ค๋น„๊ฒŒ์ด์…˜์˜ ์ง„์ •ํ•œ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋œ ๊ฑฐ์˜ˆ์š”! ๐Ÿ†

์ด ๋ชจ๋“  ๊ธฐ๋Šฅ๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ์‚ฌ์šฉ์ž๋“ค์ด "์™€, ์ด ์•ฑ ์ง„์งœ ์ž˜ ๋งŒ๋“ค์—ˆ๋‹ค!" ๋ผ๊ณ  ๋งํ•  ์ •๋„๋กœ ๋ฉ‹์ง„ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์žฌ๋Šฅ์„ ์กฐํ•ฉํ•ด ์ƒˆ๋กœ์šด ๊ฐ€์น˜๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ . ๐Ÿ˜‰

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐจ๋ก€์˜ˆ์š”! ์ด ๋ชจ๋“  ๊ธฐ๋Šฅ๋“ค์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์„ธ์š”. ์–ด๋ ค์›€์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋‹ค์‹œ ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•˜์‹œ๊ณ ์š”. ํ™”์ดํŒ…! ๐Ÿš€๐Ÿš€๐Ÿš€