๐ŸŒ— 56. React Native ํ…Œ๋งˆ ์‹œ์Šคํ…œ ์™„์ „ ์ •๋ฆฌ โ€” ๋‹คํฌ ๋ชจ๋“œ, ์‹œ์Šคํ…œ ์—ฐ๋™, ์ „์—ญ ๊ด€๋ฆฌ๊นŒ์ง€

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

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

์ด๋ฒˆ ๊ธ€์€ React Native์—์„œ ํ…Œ๋งˆ(๋ผ์ดํŠธ/๋‹คํฌ)๋ฅผ ์ ์šฉํ•˜๊ณ  ์ „์—ญ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ „๋žต์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


โœ… 1. ์‹œ์Šคํ…œ ํ…Œ๋งˆ ๊ฐ์ง€ โ€” useColorScheme

import { useColorScheme } from 'react-native';

const scheme = useColorScheme(); // 'light' | 'dark'
  • iOS/Android ๋ชจ๋‘ ์‹œ์Šคํ…œ ์„ค์ •์— ๋”ฐ๋ผ light or dark ๋ฐ˜ํ™˜
  • ์•ฑ ์ดˆ๊ธฐ ์ง„์ž… ์‹œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅ

๐Ÿงฑ 2. ์ „์—ญ ํ…Œ๋งˆ ์ƒํƒœ ๊ด€๋ฆฌ (Zustand)

npm install zustand
const useThemeStore = create((set) => ({
  theme: 'system', // 'light' | 'dark' | 'system'
  setTheme: (theme) => set({ theme }),
}));
  • ์œ ์ €๊ฐ€ ์ˆ˜๋™์œผ๋กœ ํ…Œ๋งˆ ์„ค์ • ๊ฐ€๋Šฅ
  • system ํ…Œ๋งˆ๋Š” useColorScheme()๋กœ ์—ฐ๋™

๐ŸŽจ 3. ํ…Œ๋งˆ ๊ฐ์ฒด ์„ค์ •

export const LightTheme = {
  background: '#ffffff',
  text: '#000000',
};

export const DarkTheme = {
  background: '#000000',
  text: '#ffffff',
};
  • ๊ตฌ์กฐํ™”ํ•ด์„œ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹๊ฒŒ
  • ๋ฒ„ํŠผ, border ๋“ฑ ๋‹ค์–‘ํ•œ ํ‚ค ํฌํ•จ ๊ฐ€๋Šฅ

๐Ÿ’… 4. styled-components ์ „์—ญ ThemeProvider ์ ์šฉ

npm install styled-components
<ThemeProvider theme={currentTheme}>
  <App />
</ThemeProvider>
const currentTheme = userTheme === 'system'
  ? scheme === 'dark' ? DarkTheme : LightTheme
  : userTheme === 'dark' ? DarkTheme : LightTheme;

โœ… Text, View ๋“ฑ์˜ ์ƒ‰์ƒ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง


๐Ÿงฉ 5. tailwind-rn์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

npm install tailwind-rn
  • tailwind.config.js์—์„œ darkMode: 'class' ์„ค์ •
  • useColorScheme()๋กœ ํด๋ž˜์Šค ์กฐ๊ฑด ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • styled-components๋ณด๋‹ค ๋ฐ˜์‘ํ˜• ๊ตฌ์„ฑ์— ์œ ๋ฆฌ

๐Ÿง  ํ…Œ๋งˆ ์ „ํ™˜ ๋ฒ„ํŠผ ์˜ˆ์‹œ

const toggleTheme = () => {
  const current = useThemeStore.getState().theme;
  useThemeStore.setState({
    theme: current === 'dark' ? 'light' : 'dark',
  });
};

โœ… ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ๋•Œ ๋ผ์ดํŠธ โ†” ๋‹คํฌ ์ „ํ™˜ UX ๊ตฌํ˜„
โœ… ํ…Œ๋งˆ ์„ ํƒ ์ƒํƒœ๋Š” AsyncStorage์— ์ €์žฅํ•ด์„œ ์œ ์ง€


๐Ÿ“ฑ ํ…Œ๋งˆ ํ…Œ์ŠคํŠธ ํŒ

ํ”Œ๋žซํผ๋‹คํฌ๋ชจ๋“œ ์„ค์ •
iOS ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐSettings > Developer > Appearance
Android ์—๋ฎฌ๋ ˆ์ดํ„ฐSettings > Display > Dark Theme
Expo Go์ž๋™ ๊ฐ์ง€ or manual switch ๊ฐ€๋Šฅ

๐Ÿ“ ๋‚ด๊ฐ€ ๋А๋‚€ ์ 

์ดˆ๊ธฐ์—๋Š” ๊ทธ๋ƒฅ useColorScheme()๋งŒ ์จ๋„ ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ,
์œ ์ €๊ฐ€ ์ง์ ‘ ํ…Œ๋งˆ๋ฅผ ์„ค์ •ํ•˜๊ณ 
๊ทธ ์ƒํƒœ๊ฐ€ ์•ฑ ์ „์ฒด์—์„œ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
์ƒํƒœ๊ด€๋ฆฌ + ํ…Œ๋งˆ ๊ฐ์ฒด + UI ํ”„๋ ˆ์ž„์›Œํฌ ์—ฐ๋™์ด ๋ชจ๋‘ ํ•„์š”ํ–ˆ๋‹ค.

์ง€๊ธˆ์€ Zustand๋กœ ํ…Œ๋งˆ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ ,
styled-components๋กœ ํ…Œ๋งˆ ๊ฐ์ฒด๋ฅผ ์ ์šฉํ•ด์„œ
์•ฑ ์ „์—ญ์—์„œ ์ผ๊ด€๋œ ํ…Œ๋งˆ UI๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.


๐ŸŒ™ โ€œ์ข‹์€ ํ…Œ๋งˆ๋Š” ์ƒ‰์ƒ์ด ์•„๋‹ˆ๋ผ ๊ตฌ์กฐ์—์„œ ์‹œ์ž‘๋œ๋‹ค.โ€


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

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