๐Ÿ“ฆ 69. React Native ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ์ „๋žต โ€” ์œ ์ง€๋ณด์ˆ˜์™€ ํ˜‘์—…์„ ์œ„ํ•œ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

JM_Devยท2025๋…„ 8์›” 5์ผ
0
post-thumbnail

React Native๋กœ ์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์ฒ˜์Œ์—๋Š” components, screens ์ •๋„๋งŒ ์žˆ์–ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ํŒŒ์ผ์ด ๋งŽ์•„์ง€๋‹ˆ๊นŒ, ์ ์  ๊ตฌ์กฐ๊ฐ€ ์—‰์ผœ๊ฐ€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์ฒ˜์Œ์—” ๊ดœ์ฐฎ์•˜๋Š”๋ฐ,

  • ์–ด๋””์— ์–ด๋–ค ํŒŒ์ผ์ด ์žˆ์—ˆ๋Š”์ง€ ๊ธฐ์–ต๋„ ์•ˆ ๋‚˜๊ณ 
  • ๋งŒ๋“  ํ›…์„ ๋˜ ๋งŒ๋“ค๊ฑฐ๋‚˜
  • ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋ ์ˆ˜๋ก ๊ด€๋ฆฌ๊ฐ€ ์ ์  ์–ด๋ ค์›Œ์กŒ๋‹ค.

๊ทธ๋ž˜์„œ ๊ด€์‹ฌ์‚ฌ ๋‹จ์œ„๋กœ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์€ ์‹ค์ œ๋กœ ์ ์šฉํ•˜๋ฉด์„œ ์–ป์€ ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„ ์ „๋žต๊ณผ ๊ทธ ๊ฒฝํ—˜์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.


โœ… ํด๋” ๊ตฌ์กฐ๋ฅผ ์™œ ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋Š”๊ฐ€

ํ•ญ๋ชฉ์„ค๋ช…
์œ ์ง€๋ณด์ˆ˜ํ•„์š”ํ•œ ํŒŒ์ผ์„ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธํ•˜๋‹ค
ํ˜‘์—…๊ตฌ์กฐ๊ฐ€ ์ •๋ฆฌ๋ผ ์žˆ์–ด์•ผ ํŒ€์›์ด ๊ธˆ๋ฐฉ ์ดํ•ดํ•˜๊ณ  ๊ฐ™์ด ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค
ํ™•์žฅ์„ฑ๊ธฐ๋Šฅ์ด ๋งŽ์•„์ ธ๋„ ๊ตฌ์กฐ๊ฐ€ ๋ฌด๋„ˆ์ง€์ง€ ์•Š๋Š”๋‹ค
๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋กœ์ง, UI, ์ƒํƒœ ๋“ฑ์ด ์„ž์ด์ง€ ์•Š๊ณ  ๋ช…ํ™•ํ•ด์ง„๋‹ค

๐Ÿงฑ ์ถ”์ฒœ ํด๋” ๊ตฌ์กฐ ์˜ˆ์‹œ

src/
โ”œโ”€โ”€ assets/         # ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์ •์  ๋ฆฌ์†Œ์Šค
โ”œโ”€โ”€ components/     # ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ screens/        # ํŽ˜์ด์ง€ ๋‹จ์œ„ ์ปดํฌ๋„ŒํŠธ
โ”œโ”€โ”€ hooks/          # ์ปค์Šคํ…€ ํ›…
โ”œโ”€โ”€ navigation/     # ๋ผ์šฐํŒ… ๊ด€๋ จ ์„ค์ •
โ”œโ”€โ”€ services/       # API ํ˜ธ์ถœ, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ฐ๋™
โ”œโ”€โ”€ store/          # ์ƒํƒœ ๊ด€๋ฆฌ (Zustand, Redux ๋“ฑ)
โ”œโ”€โ”€ utils/          # ์œ ํ‹ธ ํ•จ์ˆ˜
โ”œโ”€โ”€ constants/      # ์ƒ‰์ƒ, ์—ฌ๋ฐฑ, ๊ณตํ†ต ์Šคํƒ€์ผ ๊ฐ’
โ””โ”€โ”€ types/          # ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž… ์ •์˜

ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์™€ ํŒ€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์ง€์ง€๋งŒ,
์ค‘์š”ํ•œ ๊ฑด ๊ธฐ๋Šฅ๋ณ„์ด ์•„๋‹ˆ๋ผ ์—ญํ• ๋ณ„๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ธฐ์ค€์ด ๋˜์–ด์•ผ ํ–ˆ๋‹ค.


๐Ÿ’ก ํด๋”๋ณ„ ์—ญํ•  ์ •๋ฆฌ

ํด๋”์šฉ๋„
components/์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” UI ์กฐ๊ฐ๋“ค
screens/ํŽ˜์ด์ง€ ๋‹จ์œ„ ์ปดํฌ๋„ŒํŠธ (ํ™ˆ, ๋กœ๊ทธ์ธ ๋“ฑ)
hooks/์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปค์Šคํ…€ ํ›…
services/axios, Firebase ๋“ฑ ์™ธ๋ถ€ API ํ˜ธ์ถœ ๊ด€๋ จ
store/์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง
constants/์ƒ‰์ƒ, ํฐํŠธ, ๊ฐ„๊ฒฉ ๋“ฑ ์ „์—ญ ์Šคํƒ€์ผ ์ƒ์ˆ˜
types/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํƒ€์ž… ์ •์˜ (interface, enum ๋“ฑ)

๐Ÿงฉ ๊ธฐ๋Šฅ ํด๋” vs ๊ด€์‹ฌ์‚ฌ ํด๋”

๋ถ„๋ฅ˜ ๋ฐฉ์‹์„ค๋ช…์˜ˆ์‹œ
๊ด€์‹ฌ์‚ฌ ๊ธฐ์ค€์—ญํ• ์— ๋”ฐ๋ผ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹components, hooks, store, services ๋“ฑ
๊ธฐ๋Šฅ ๊ธฐ์ค€๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ชจ๋“ˆํ™”Home, Login, Search ๋“ฑ

๋ณดํ†ต์€ ๋‘˜์„ ํ˜ผํ•ฉํ•ด์„œ ์ผ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด screens/Home ํด๋” ์•ˆ์— ํ•ด๋‹น ํ™”๋ฉด์—์„œ๋งŒ ์“ฐ๋Š” ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ›…์„ ๊ฐ™์ด ๋„ฃ๋Š” ๋ฐฉ์‹์ด ์ž์—ฐ์Šค๋Ÿฌ์› ๋‹ค.


๐Ÿง  ์‹ค์ „ ์ ์šฉ ํŒ

  1. ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค
components/
โ””โ”€โ”€ Button/
    โ”œโ”€โ”€ index.tsx
    โ”œโ”€โ”€ styles.ts
    โ””โ”€โ”€ test.tsx

์Šคํƒ€์ผ, ํ…Œ์ŠคํŠธ, ๊ตฌํ˜„์„ ํ•œ ํด๋” ์•ˆ์— ๋ชจ์•„๋‘๋ฉด ๊ตฌ์กฐ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

  1. API ์š”์ฒญ์€ services/๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค

์ปดํฌ๋„ŒํŠธ ์•ˆ์— fetch ๊ฐ™์€ API ํ˜ธ์ถœ์„ ๋„ฃ์œผ๋ฉด ํ…Œ์ŠคํŠธ๋„ ์–ด๋ ค์›Œ์ง€๊ณ  ์žฌ์‚ฌ์šฉ๋„ ํž˜๋“ค์–ด์กŒ๋‹ค.
์„œ๋น„์Šค ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋‹ˆ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์กŒ๋‹ค.

  1. ์ƒํƒœ ๊ด€๋ฆฌ๋Š” store/์— ์ •๋ฆฌํ•œ๋‹ค

useUserStore, useThemeStore์ฒ˜๋Ÿผ ๋„ค์ด๋ฐ์„ ํ†ต์ผํ•˜๊ณ  ์—ญํ• ๋ณ„๋กœ ์ž˜ ๋‚˜๋ˆ ๋‘๋ฉด ์ฐพ๊ธฐ๋„ ์‰ฝ๊ณ  ํ™•์žฅ๋„ ํŽธํ•˜๋‹ค.

  1. ๊ณตํ†ต ์Šคํƒ€์ผ ๊ฐ’์€ constants/๋กœ ๋บ€๋‹ค

์ƒ‰์ƒ, ์—ฌ๋ฐฑ, ํฐํŠธ ํฌ๊ธฐ ๊ฐ™์€ ๊ฐ’๋“ค์ด ์—ฌ๊ธฐ์ €๊ธฐ ํผ์ ธ ์žˆ์œผ๋ฉด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
์ƒ์ˆ˜ํ™”ํ•ด๋‘๋ฉด ๋‹คํฌ๋ชจ๋“œ ์ ์šฉ์ด๋‚˜ ๋ฆฌ๋””์ž์ธ ์‹œ์—๋„ ์†์ด ๋งŽ์ด ์•ˆ ๊ฐ„๋‹ค.


โš™๏ธ ๊ตฌ์กฐ ์„ธํŒ… ์˜ˆ์‹œ

// src/constants/colors.ts
export const COLORS = {
  primary: '#007bff',
  background: '#ffffff',
  text: '#333333',
};

// src/hooks/useKeyboard.ts
import { useEffect, useState } from 'react';
import { Keyboard } from 'react-native';

export function useKeyboardVisible() {
  const [isVisible, setVisible] = useState(false);

  useEffect(() => {
    const show = Keyboard.addListener('keyboardDidShow', () => setVisible(true));
    const hide = Keyboard.addListener('keyboardDidHide', () => setVisible(false));
    return () => {
      show.remove();
      hide.remove();
    };
  }, []);

  return isVisible;
}

๐Ÿง  ์‹ค์ œ ๊ฒช์—ˆ๋˜ ์ผ

์ดˆ๋ฐ˜์—๋Š” ๊ทธ๋ƒฅ components, pages, utils ์ด๋ ‡๊ฒŒ๋งŒ ๋‚˜๋ˆด๋‹ค.
๊ทธ๋ ‡๊ฒŒ ๋ช‡ ์ฃผ ๊ฐœ๋ฐœํ•˜๊ณ  ๋‚˜๋‹ˆ ์ ์  ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์กŒ๊ณ ,
API ํ˜ธ์ถœ ๋กœ์ง์ด UI ์•ˆ์— ์„ž์—ฌ ์žˆ์–ด์„œ ์žฌ์‚ฌ์šฉ๋„ ์•ˆ ๋˜๊ณ , ํ…Œ์ŠคํŠธ๋„ ์–ด๋ ค์›Œ์กŒ๋‹ค.

๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๋ฉด์„œ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ ,

  • ๊ณตํ†ต UI
  • API ์„œ๋น„์Šค
  • ์ปค์Šคํ…€ ํ›…
  • ์ƒํƒœ ๊ด€๋ฆฌ
    ๋ฅผ ๊ฐ๊ฐ์˜ ํด๋”๋กœ ๋‚˜๋ˆ„๊ณ  ๊ด€์‹ฌ์‚ฌ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋ฐ”๊พธ๊ณ  ๋‚˜๋‹ˆ ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์›Œ์กŒ๊ณ ,
ํ˜‘์—…ํ•  ๋•Œ๋„ ์–ด๋””์„œ ์ž‘์—…ํ•ด์•ผ ํ• ์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์–ด์„œ ํšจ์œจ์ด ํ™• ์˜ฌ๋ผ๊ฐ”๋‹ค.


๐Ÿ“ฆ ํด๋” ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํžˆ ์ •๋ฆฌ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ๊ป˜ ์ดํ•ดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€