react
-
- [Next.js] Console Error Attempting to parse an unsupported color function "lab" ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ (html2canvas)Console Error Attempting to parse an unsupported color function "lab" ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ (html2canvas)๋ค์ด๊ฐ๋ฉฐNext.js์ TailwindCSS๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋ฐํ ๋, @html2canvas@ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์นํผ์ด์ง๋ฅผ ์ด๋ฏธ์ง ํ์ผ๋ก ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ค๊ณ ํ ๋, ๋ค์๊ณผ ๊ฐ์ด @lab()@ ๊ด๋ จ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.Console Error Attempting to parse an unsupported color function "lab" Call Stack 10 Show 10 ignore-listed frame(s)์ด๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ฌธ์ ๋ TailwindCSS / PostCSS..
2025.09.22 -
- [Zustand] ZustandZustand๋ค์ด๊ฐ๋ฉฐ์ ์ญ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ธ Zustand์ ๋ํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. Zustand๊ฐ๋ ๋ ์ผ์ด๋ก ์ํ(Status)๋ผ๋ ๋ป๋ฆฌ์กํธ ์ฑ์์ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๋ ์์ฃผ ๊ฐ๋ณ๊ณ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌRedux์ ๋ณต์กํ ๊ตฌ์กฐ(Action, Reducer, Dispatch)๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , Hooks ๊ธฐ๋ฐ์ ๊ฐ๋จํ API ์ ๊ณต"minimal, fast, scalable"์ ๋ชฉํ๋ก ๋ง๋ค์ด์ก๋ค. ๋น๊ตRedux์ ๋น๊ตRedux๋ boilerplateํ ์ฝ๋๊ฐ ๋ง๋ค.@action@, @reducer@, @slice@๋ฅผ ์์ฑํด์ผ ํ๋ค.// Redux Toolkitconst slice = createSlice({ name: "counter", initialState: { count: 0 }, re..
1 2025.08.18 -
- [React Native] AsyncStorageAsyncStorage๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์์ ๋ก์ปฌ์ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋น๋๊ธฐ ์ ์ฅ์์ธ AsyncStorage์ ๋ํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. AsyncStorage๊ฐ๋ ๋ก์ปฌ์ ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ(Key-Value) ์์ผ๋ก ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๋ ๋น๋๊ธฐ ์ ์ฅ์๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ๊ณต๊ฐ์น์ localStorage์ ๋น์ทํ์ง๋ง, ๋น๋๊ธฐ ๋ฐฉ์์ด๋ฉฐ, ๋ค์ดํฐ๋ธ์ ์ต์ ํ๋์ด ์๋ค.์ฑ ์ฌ์คํ ํ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค.์ฉ๋์ด ํฌ์ง ์์ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ์ ์ ํฉํ๋ค. (์: ํ ํฐ, ์ฌ์ฉ์ ์ค์ , ๊ฐ๋จํ ์บ์ ๋ฑ) ์ค์น๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ 0.60 ์ด์์์๋ ๊ณต์ ํจํค์ง @๏ผ react-native-async-storage/async-storage@๋ฅผ ์ฌ์ฉํ๋ค.$..
1 2025.08.11 -
- [React Native] ๋ก๋ฉ ์คํผ๋(Loading Spinner) ๋ง๋ค๊ธฐ๋ก๋ฉ ์คํผ๋(Loading Spinner) ๋ง๋ค๊ธฐ๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ๊ฐ๋ฐ ์ค, ๊ฐ๋จํ๊ฒ ๋ก๋ฉ ์คํผ๋(Loading Spinner)๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒActivityIndicator ์ด์ฉํ๊ธฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ์์ฒด์ ์ผ๋ก ์ ๊ณตํ๋ @ActivityIndicator@๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋จํ๊ฒ ๋ก๋ฉ ์คํผ๋๋ฅผ ๋ง๋ค ์ ์๋ค. โ ๋ก๋ฉ ์คํผ๋ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ๋ก๋ฉ ์คํผ๋๋ @ActivityIndicator@ ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค ์ ์๋ค.import { View, ActivityIndicator, StyleSheet } from 'react-native';function LoadingOverlay() { return ( );}export default..
2025.06.06 -
- [React Native] BlurViewBlurView๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ์์คํฌ(Expo) ํ๋ก์ ํธ์์ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์ฃผ๋ BlurView ์ปดํฌ๋ํธ์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด๋ณธ๋ค. BlurView๊ฐ๋ Expo์์ ์ ๊ณตํ๋ ํ๋ฉด์ ์ผ๋ถ๋ถ์ ๋ธ๋ฌ(Blur, ํ๋ฆผ ํจ๊ณผ)๋ฅผ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์๊ฐ์ ์ปดํฌ๋ํธReact Native์์๋ iOS์ Android์ ๋ค์ดํฐ๋ธ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์ง์ ๊ตฌํํ๋ ๊ฒ์ด ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์, Expo๋ ์ด๋ฌํ ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋๋ก @expo-blur@ ํจํค์ง๋ฅผ ์ ๊ณตํ๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ@BlurView@๋ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง๋ ๋น๋์ค ์์ ์ฌ๋ ค์ผ ํจ๊ณผ๊ฐ ๋ช ํํ๊ฒ ๋ณด์ธ๋ค.iOS์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ง์๋๋ฉฐ, Android๋ ์ผ๋ถ ๊ธฐ๊ธฐ์์ ์ ํ๋ ์ ์์์ ์ฃผ์ํ๋ค.React Navigation ๋ผ์ด..
2025.05.15 -
- [React.js] useLayoutEffect ํuseLayoutEffect ํ ๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ(React.js)์ @useLayoutEffect@ ํ ์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด๋ณธ๋ค. useLayoutEffect ํ ๊ฐ๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๊ธฐ ์ง์ , ์ฆ ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ์คํ๋๋ ํ ํ๋ฉด์ ๋ณํ๊ฐ ๋ํ๋๊ธฐ ์ ์ ์ด๋ ํ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒimport { useLayoutEffect } from 'react';useLayoutEffect(() => { // ๋ ์ด์์ ๊ด๋ จ ๋ณ๊ฒฝ, ๋๊ธฐ์ DOM ์กฐ์ ๋ฑ์ ์ฌ์ฉํ๋ค.}, [dependencies]); useEffect ํ ๊ณผ ๋น๊ตํ๊ธฐํญ๋ชฉuseEffect ํ useLayoutEffect ํ ์คํ ์์ ์ปดํฌ๋ํธ ๋ ๋๋ง ํ, ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฐ ๋ค์ปดํฌ๋ํธ ๋ ๋๋ง ์งํ, ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ..
2025.05.10 -
- [React Native] ํ๋ฉด ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ (React Navigation)ํ๋ฉด ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ (React Navigation)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ํ๋ก์ ํธ์์ React Navigation ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด ๊ฐ ์ด๋(Navigation) ๊ธฐ๋ฅ์ ๊ตฌํํ ๋, ํ๋ฉด ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒ๋ฐ์ดํฐ ์ ๋ฌํ๊ธฐ@navigate()@ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋, ๋ ๋ฒ์งธ ์ธ์๋ก ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ค์ ํ๋ฉด์ ๋ณด๋ผ ์ ์๋ค.navigation.navigate('MealsOverview', { categoryId: itemData.item.id,}); ⇒ ์ฒซ ๋ฒ์งธ ์ธ์: ์ด๋ํ ํ๋ฉด ์ด๋ฆ⇒ ๋ ๋ฒ์งธ ์ธ์ : @params@ ๊ฐ์ฒด (์ํ๋ ๋ฐ์ดํฐ ํฌํจ) ๋ฐ์ดํฐ ์ถ์ถํ๊ธฐ๋ฐฉ๋ฒ โ : route prop ์ฌ์ฉํ๊ธฐ@Meal..
2 2025.05.10 -
- [React Native] React Navigation ๋ผ์ด๋ธ๋ฌ๋ฆฌReact Navigation ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ์ฑ์์ ํ๋ฉด ๊ฐ์ ์ ํ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React Navigation์ ๋ํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. React Navigation๊ฐ๋ React Native ์ฑ์์ ํ๋ฉด ๊ฐ์ ์ ํ(๋ค๋น๊ฒ์ด์ )์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์์ฃผ๋ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌReact Native ์ฑ์ ๋ค์ํ ๋ค๋น๊ฒ์ด์ ํจํด(์คํ, ํญ, ๋๋ก์ด ๋ฑ)์ ์ถ๊ฐํ ์ ์๊ฒ ํด์ค๋ค.์น์ ๋ผ์ฐํ (@react-router@)๊ณผ ๋น์ทํ์ง๋ง, ๋ชจ๋ฐ์ผ ํ๊ฒฝ์ ๋ง์ถ ๊ธฐ๋ฅ(์ค์์ดํ, ์ ์ค์ฒ, ํค๋ ์ ๋๋ฉ์ด์ ๋ฑ)์ ์ ๊ณตํ๋ค. ์ฃผ์ ๊ธฐ๋ฅ๊ธฐ๋ฅ์ค๋ช ์คํ ๋ค๋น๊ฒ์ด์ (Stack Navigation)- A ํ๋ฉด → B ํ๋ฉด ์ด๋ ๋ฐ ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ํ ์ ์..
2025.05.06 -
- [React Native] ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ ๋ง๋ ๋ฐฉ๋ฒ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ ๋ง๋ ๋ฐฉ๋ฒ๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ ์ฑ์์ ํน์ ์คํฌ๋ฆฐ์์ ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ์ ๋ง๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒ๋ฐฉ๋ฒ โ : BackHandler API ์ด์ฉํ๊ธฐ (Android)@react-native@ ํจํค์ง์ @BackHandler@ API๋ฅผ ์ฌ์ฉํด์ ๋ค๋ก๊ฐ๊ธฐ ์ด๋ฒคํธ๋ฅผ ๋ฌด์ํ๋๋ก ์ค์ ํ ์ ์๋ค.์ด ๋ฐฉ๋ฒ์ ์๋๋ก์ด๋(Android)์์ ๋ฌผ๋ฆฌ์ ์ธ ๋ค๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ์ ๋ง์์ค๋ค.iOS์์๋ ๋ฌผ๋ฆฌ์ ์ธ ๋ค๋ก๊ฐ๊ธฐ ๋ฒํผ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก ์ฒ๋ฆฌํด์ฃผ์ง ์์๋ ๋๋ค.import { useEffect } from 'react';import { BackHandler } from 'react-native';function myApp() { useEffect(() => ..
2025.04.17 -
- [React Native] .jsx ํ์ผ ์ฌ์ฉ ํ๋ ๋ฐฉ๋ฒ.jsx ํ์ผ ์ฌ์ฉ ํ๋ ๋ฐฉ๋ฒ๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ํ๋ก์ ํธ์์ @.jsx@ ํ์ผ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค.์ผ๋ฐ์ ์ผ๋ก ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์๋ @.js@ ํ์ผ๋ง ์ธ์ํ๋ฉฐ, @.jsx@ ํ์ผ์ ์ฌ์ฉํ๋ ค๊ณ ํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋ฐฉ๋ฒํ์ฌ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ํ๋ก์ ํธ์ @expo-cli@ ๋ฒ์ ์ ๋ฐ๋ผ ๋ฐฉ๋ฒ โ ๋๋ ๋ฐฉ๋ฒ โก์ ๋ฐฉ๋ฒ์ ๋ฐ๋ผํ๋ค. ๋ฐฉ๋ฒ โ : metro.config.js ํ์ผ์ ํ์ฅ์ ์ถ๊ฐํ๊ธฐํ๋ก์ ํธ ์ต์๋จ ๊ฒฝ๋ก(@/@)์ ๋ฉํธ๋ก ์ค์ ํ์ผ(@metro.config.js@)์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.๋ง์ฝ ํด๋น ํ์ผ์ด ์์ ๊ฒฝ์ฐ ์๋ก ์์ฑํด์ค๋ค. /metro.config.jsmodule.exports = { resolver: { sourceExts: [..
1 2025.04.11 -
- [React Native] StatusBar (react-native, expo-status-bar)StatusBar (react-native, expo-status-bar)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์ @StatusBar@์ ์์คํฌ(Expo)์ @expo-status-bar@์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด๋ณธ๋ค. StatusBar (React Native)๊ฐ๋ ์๋จ ์ํ ํ์์ค(์๊ฐ, ๋ฐฐํฐ๋ฆฌ, ์ ํธ ๋ฑ)์ ์คํ์ผ, ๋ฐฐ๊ฒฝ์, ํ์ ์ฌ๋ถ ๋ฑ์ ์ ์ดํ ์ ์๋ React Native ๋ด์ฅ ์ปดํฌ๋ํธ ์ฌ์ฉ ๋ฐฉ๋ฒimport { StatusBar } from 'react-native';export default function App() { return ( );} ์ฃผ์ ์์ฑ์์ฑ์ค๋ช ํ๋ซํผ@barStyle@- ํ ์คํธ ์์ ์ค์ โถ @default@ : ํ๋ซํผ๋ณ ๊ธฐ๋ณธ ์์ (iOS ..
2025.04.11 -
- [React Native] Platform APIPlatform API๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์ Platform API์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด ๋ณธ๋ค. Platform API๊ฐ๋ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์์ ์ฑ์ด ์คํ๋๊ณ ์๋ ํ๋ซํผ(iOS, Android, Web ๋ฑ)์ ๊ฐ์งํ๊ณ , ํ๋ซํผ๋ณ๋ก ๋ค๋ฅธ ๋์์ด๋ ์คํ์ผ์ ๊ตฌํํ ์ ์๊ฒ ํด์ฃผ๋ ์ ํธ๋ฆฌํฐ ์ฌ์ฉ ๋ฐฉ๋ฒ๋ถ๋ฌ์ค๊ธฐimport { Platform } from 'react-native'; โ Platform.OSํ์ฌ ์คํ ์ค์ธ ํ๋ซํผ์ ๋ฌธ์์ด๋ก ๋ฐํํด ์ค๋ค.@android@, @ios@, @web@, @windows@, @macos@const platform = Platform.OS;if (platform === 'android') { console.log('Running on Android'..
2025.04.11 -
- [React Native] ScrollViewScrollView๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์ @ScrollView@ ์ปดํฌ๋ํธ์ ๋ํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ScrollView๊ฐ๋ ์คํฌ๋กค ๊ฐ๋ฅํ ์ปจํ ์ด๋๋ก, ์์ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ํฌ๊ธฐ๋ฅผ ๋์ด์ค ๋ ์คํฌ๋กค(Scroll)์ ํตํด ๋ณผ ์ ์๊ฒ ํด์ฃผ๋ ์ปดํฌ๋ํธ์์ ์์๋ค์ด ๋ง๊ฑฐ๋ ํ๋ฉด๋ณด๋ค ์ปค์ง ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํด์ ๋ณผ ์ ์๋๋ก ๋ง๋ค์ด์ค๋ค. ์ฃผ์ ์์ฑ์์ฑํ์ ์ค๋ช @horizontal@@boolean@@true@๋ก ์ค์ ์, ๊ฐ๋ก ์คํฌ๋กค ๊ฐ๋ฅ (๊ธฐ๋ณธ : ์ธ๋ก)@contentContainerStyle@@style@๋ด๋ถ ์ฝํ ์ธ ์ ์ฒด์ ์ ์ฉํ ์คํ์ผ@showsVerticalScrollIndicator@@boolean@์ธ๋ก ์คํฌ๋กค๋ฐ ํ์ ์ฌ๋ถ@showsHorizontalScrollIndicato..
2025.04.11 -
- [React Native] KeyboardAvoidingViewKeyboardAvoidingView๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์ @KeyboardAvoidingView@ ์ปดํฌ๋ํธ์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด ๋ณธ๋ค. KeyboardAvoidingView๊ฐ๋ ํค๋ณด๋๊ฐ ํ๋ฉด์ ๋ํ๋ ๋ ์ ๋ ฅ ํ๋ ๋ฑ์ UI๊ฐ ๊ฐ๋ ค์ง๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธํค๋ณด๋ ๋ ์ด์์์ด ํ์๋ ๋, ์์ ์์๋ฅผ ์๋ก ์ฌ๋ ค์ ์ ๋ ฅ์ฐฝ์ ๊ฐ๋ฆฌ์ง ์๋๋ก ํด์ค๋ค.Android์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒ๋ฆฌ๋๋, iOS์์๋ ๊ทธ๋ ์ง ์์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ๋ฉด ์ ์ฉํ๋ค. ์ฃผ์ ์์ฑbehaviorํค๋ณด๋๊ฐ ๋ํ๋ ๋์ ๋์ ๋ฐฉ์์ ์กฐ์ ํ ์ ์๋ค.ํ๋ซํผ์ ๋ฐ๋ผ ๋์์ด ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ @Platform.OS@๋ฅผ ํตํด ์กฐ๊ฑด ๋ถ๊ธฐํด์ ์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.์ต์ ์ค๋ช @padding@ํค๋ณด๋์ ๋์ด๋ง..
2025.04.10 -
- [React Native] ์๋ฎฌ๋ ์ดํฐ ๋๋ฐ์ด์ค ์๋ ํ์ ๊ธฐ๋ฅ ์ผ๋ ๋ฐฉ๋ฒ (Expo)์๋ฎฌ๋ ์ดํฐ ๋๋ฐ์ด์ค ์๋ ํ์ ๊ธฐ๋ฅ ์ผ๋ ๋ฐฉ๋ฒ (Expo)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ์์คํฌ(Expo) ํ๋ก์ ํธ๋ฅผ ์๋ฎฌ๋ ์ดํฐ๋ก ์คํํ ๋, ๋๋ฐ์ด์ค ์๋ ํ์ ๊ธฐ๋ฅ์ ์ผ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒ(1) ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ํ์ผ(app.json) orientation ํค ๊ฐ ๋ณ๊ฒฝํ๊ธฐํ๋ก์ ํธ ์ต์๋จ ๊ฒฝ๋ก์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ํ์ผ(@app.json@)์ @orientation@ ํค์ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด @default@๋ก ์ค์ ํด์ค๋ค. /app.json{ "expo": { "name": "section-02", "slug": "section-02", "version": "1.0.0", "orientation": "default", "icon": "./as..
2025.04.10 -
- [React Native] Dimensions APIDimensions API๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์ ๋ด์ฅ API ์ค ํ๋์ธ Dimensions API์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด๋ณธ๋คDimensions API๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ ๋๋ฐ์ด์ค์ ํ๋ฉด ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. Dimensions API๊ฐ๋ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๋ด์ฅ API๋๋ฐ์ด์ค์ ํ๋ฉด ํฌ๊ธฐ(๋๋น(Width)์ ๋์ด(Height)) ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ๋๋ค.๋ฐ์ํ UI ๊ตฌ์ฑ์ ํ์ฉํ ์ ์๋ค.์ด๋ฌํ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ํฐํธ ํฌ๊ธฐ(Font Size), ํจ๋ฉ(Padding), ๋ง์ง(Margin) ๋ฑ์ ๋๋ฐ์ด์ค ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ์กฐ์ ํ ์ ์๋ค. ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒฝ์ฐ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋ง์ถฐ ํฐํธ, ๊ฐ๊ฒฉ, ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋๋ฏธ๋์ด ์ฟผ๋ฆฌ(Media Que..
2025.04.10 -
- [React Native] ํ๋ซํผ ๋ณ๋ก ์์์ ๊ทธ๋ฆผ์ ํจ๊ณผ ๋ฃ๊ธฐ (Android, iOS, Web)ํ๋ซํผ ๋ณ๋ก ์์์ ๊ทธ๋ฆผ์ ํจ๊ณผ ๋ฃ๊ธฐ (Android, iOS, Web)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์์ ํ๋ซํผ ๋ณ(Android, iOS, Web)๋ก ์์์ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒโ AndroidAndroid์์๋ @elevation@ ์์ฑ์ ์ฌ์ฉํด์ ์์์ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ๋ฃ์ด์ค ์ ์๋ค.style={{ elevation: 5, // ์ซ์๊ฐ ํด์๋ก ๊ทธ๋ฆผ์๊ฐ ์งํด์ง๋ค. backgroundColor: 'white', // ๋ฐฐ๊ฒฝ์ ์์ด์ผ ๊ทธ๋ฆผ์๊ฐ ๋ณด์ด๋ฏ๋ก ๋ฃ์ด์ค๋ค. borderRadius: 10,}} โก iOSiOS๋ @elevation@ ์์ฑ์ด ์ธ์๋์ง ์๋๋ค.๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง ์์ฑ์ ์ฌ์ฉํ์ฌ ์์์ ๊ทธ๋ฆผ์ ํจ๊ณผ๋ฅผ ๋ฃ์ด์ค..
2025.04.06 -
- [React Native] ์์ด์ฝ ์ฌ์ฉํ๊ธฐ (๏ผ expo/vector-icons)์์ด์ฝ ์ฌ์ฉํ๊ธฐ (๏ผ expo/vector-icons)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ์์คํฌ(Expo) ํ๋ก์ ํธ์์ ์์ด์ฝ(Icon)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค.๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ์ ์์คํฌ ํ๋ก์ ํธ์์๋ ๋ณ๋ค๋ฅธ ํจํค์ง๋ฅผ ์ค์นํ์ง ์๊ณ ๋ ์์ด์ฝ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ฐฉ๋ฒ1๏ธโฃ ํจํค์ง ์ค์นํ๊ธฐ (๏ผ expo/vector-icons)Expo ํ๋ก์ ํธ์์๋ ์ด๋ฏธ ๊ธฐ๋ณธ์ ์ผ๋ก @๏ผ expo/vector-icons@ ํจํค์ง๊ฐ ํฌํจ๋์ด ์์ด์ ๋ฐ๋ก ์ค์นํ ํ์๋ ์๋ค.ํ์ง๋ง, ํด๋น ํจํค์ง๊ฐ ์ค์น๋์ด ์์ง ์์ ๊ฒฝ์ฐ, ์๋ ๋ช ๋ น์ ์คํํ์ฌ ์ค์นํด์ค๋ค.$ expo install @expo/vector-icons 2๏ธโฃ ์์ด์ฝ ์ธํธ ๋ถ๋ฌ์ค๊ธฐ์ฐ์ , ์์ด์ฝ ์ธํธ(Icon Set)๋ฅผ ๋ถ๋ฌ์์ ํด๋น ์์ด์ฝ ์ธ..
2025.04.06 -
- [React Native] ์ปค์คํ ํฐํธ ์ฌ์ฉํ๊ธฐ (expo-font)์ปค์คํ ํฐํธ ์ฌ์ฉํ๊ธฐ (expo-font)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ์์คํฌ(Expo) ํ๋ก์ ํธ์์ ์ปค์คํ ํฐํธ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒ 1๏ธโฃ ํจํค์ง ์ค์นํ๊ธฐํฐํธ ์ฌ์ฉ์ ์ํด @expo-font@ ํจํค์ง๋ฅผ ์ค์นํ๋ค.$ expo install expo-font@expo install@ ๋ช ๋ น์ ํ์ฌ Expo ํ๋ก์ ํธ์ ๋ฒ์ ๊ณผ ํธํ๋๋ ํจํค์ง๋ฅผ ์๋์ผ๋ก ์ค์นํด์ค๋ค. 2๏ธโฃ ํฐํธ ํ์ผ ์ค๋นํ๊ธฐํ๋ก์ ํธ์ @/assets/fonts@ ํด๋ ์์, ์ถ๊ฐํ ์ปค์คํ ํฐํธ ํ์ผ์ ๋ฃ์ด์ค๋ค.ํด๋น ํด๋๊ฐ ์์ ๊ฒฝ์ฐ, ์๋ก ์์ฑํด์ค๋ค. 4๏ธโฃ ํฐํธ ๋ถ๋ฌ์ค๊ธฐ (useFonts ํ )ํ๋ก์ ํธ ์ต์๋จ์ ์๋ @App.js@ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ์ปค์คํ ํฐํธ๋ฅผ ๋ถ๋ฌ์ค๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค.@use..
2025.04.06 -
- [React Native] SafeAreaViewSafeAreaView๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์ SafeAreaView ์ปดํฌ๋ํธ์ ๋ํด ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด ๋ณธ๋ค. SafeAreaView๊ฐ๋ React Native์์ ํ๋ฉด ์๋จ์ ์ํ๋ฐ๋ ๋ ธ์น์ ๊ฐ์ UI ์์๋ก๋ถํฐ ์ฝํ ์ธ ๊ฐ ๊ฒน์น์ง ์๋๋ก ์๋์ผ๋ก ์์ ํ ์์ญ์ ์ค์ ํด ์ฃผ๋ ์ปดํฌ๋ํธ@SafeAreaView@ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ๊ธฐ๊ธฐ์์ ์ฝํ ์ธ ๊ฐ ์ ์ ํ๊ฒ ๋ฐฐ์น๋๊ณ , ํ๋ฉด ๊ฐ์ฅ์๋ฆฌ๋ ์๋จ์ ์ค์ํ UI ์์์ ๊ฐ๋ ค์ง์ง ์๊ฒ ๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ๋ ธ์น, ์ํ ๋ฐ, ํ๋จ์ ํ ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ํ๋ฉด ์์๊ฐ ์๋ ๋๋ฐ์ด์ค์์ ์ฝํ ์ธ ๊ฐ ๊ฒน์น์ง ์๋๋ก ์๋์ผ๋ก ์ฌ๋ฐฑ์ ์ถ๊ฐํด ์ค๋ค.๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ํด์๋์ ๋ฐ๋ผ ์์ ์์ญ์ ์๋์ผ๋ก ์ธ์ํ๊ณ , ์ด์ ๋ง๊ฒ ์ฌ๋ฐฑ์ ์ ์ฉํด ์ค๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒReact N..
2025.04.03 -
- [React Native] Alert APIAlert API๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ Alert API์ ๋ํด ์ ๋ฆฌํด๋ณธ๋ค. Alert API๊ฐ๋ ์ฌ์ฉ์๊ฐ ์๋ฆผ์ ๋์ธ ์ ์๋๋ก ๋์์ฃผ๋ API๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ดํฐ๋ธ(iOS์ Android) ์๋ฆผ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.์ฌ์ฉ์๊ฐ ์๋ฆผ์ ํ์ธํ๊ฑฐ๋ ์ทจ์ํ ์ ์๋๋ก ๋ฒํผ์ ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, ๋ค์ํ ์ค์ ๋ฐฉ๋ฒ์ ์ง์ํ๋ค. ์ฌ์ฉ๋ฒ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ@Alert@๋ React Native์์ ๋ด์ฅ๋ ๊ฐ์ฒด๋ก, @alert()@ ๋ฉ์๋๋ฅผ ํตํด ์๋ฆผ์ ๋์ธ ์ ์๋ค.import { Alert } from 'react-native';Alert.alert('์๋ฆผ ์ ๋ชฉ', '์๋ฆผ ๋ฉ์์ง'); ๋ฒํผ ์ถ๊ฐํ๊ธฐ@Alert@๋ ๊ธฐ๋ณธ์ ์ผ๋ก @[ํ์ธ]@ ๋ฒํผ๋ง ์ ๊ณตํ์ง๋ง, ์ฌ๋ฌ ๋ฒํผ์..
2025.04.03 -
- [React Native] npm install vs. expo installnpm install vs. expo install๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) Expo ํ๋ก์ ํธ์์ ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ผ๋ก @npm install@๊ณผ @expo install@ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.์ด 2๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐจ์ด์ ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ํจํค์ง ์ค์น ๋ช ๋ น์ด1๏ธโฃ npm install$ npm install ํจํค์ง๋ช Node.js ํจํค์ง ๊ด๋ฆฌ ๋ช ๋ น์ดnpm(Node Package Manager)์ ์ฌ์ฉํ์ฌ, ํ๋ก์ ํธ์ package.json ํ์ผ์ ์ ์๋ ํจํค์ง๋ค์ ์ค์นํ๋ค.Expo ํ๋ก์ ํธ์์ @npm install@์ ์ฌ์ฉํ๋ฉด, Expo์ ๊ด๋ จ๋ ๋ฒ์ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ง์ ํด๊ฒฐํด์ผ ํ ์ ์๋ค.Expo๊ฐ ์๊ตฌํ๋ ํน์ ๋ฒ์ ์ ํจํค์ง์ ํธํ๋์ง ์์ ์ ์์ผ๋ฏ๋ก ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ผ..
2025.04.03 -
- [React Native] ํ๊ฒฝ ๋ณ์ ํ์ผ ์ฌ์ฉํ๊ธฐ (react-native-dotenv)ํ๊ฒฝ ๋ณ์ ํ์ผ ์ฌ์ฉํ๊ธฐ (react-native-dotenv)๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)์์ ํ๊ฒฝ ๋ณ์ ํ์ผ(@env@)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค.@react-native-dotenv@ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐฉ๋ฒ1๏ธโฃ react-native-dotenv ํจํค์ง ์ค์นํ๊ธฐํฐ๋ฏธ๋์ ์๋ ๋ช ๋ น์ ์คํํ์ฌ ํ๋ก์ ํธ์ @react-native-dotenv@ ํจํค์ง๋ฅผ ์ค์นํ๋ค.$ npm install react-native-dotenv # yarn add react-native-dotenv 2๏ธโฃ @.env@ ํ์ผ ์์ฑํ๊ธฐํ๋ก์ ํธ ์ต์๋จ ๊ฒฝ๋ก์ @.env@ ํ์ผ์ ์์ฑํ๊ณ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๋ค.API_URL=https://api.example.comAPP..
2025.04.03 -
- [React Native] ์นด๋ฉ๋ผ ๊ถํ ์์ฒญ ๋ฉ์์ง ํ์ ๋ฐฉ๋ฒ (Expo)์นด๋ฉ๋ผ ๊ถํ ์์ฒญ ๋ฉ์์ง ํ์ ๋ฐฉ๋ฒ (Expo)๋ค์ด๊ฐ๋ฉฐ์์คํฌ(Expo)๋ฅผ ์ด์ฉํ์ฌ ์์ฑํ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ํ๋ก์ ํธ์์ ์นด๋ฉ๋ผ ๊ถํ ์์ฒญ ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒํจํค์ง ์ค์นํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ ์คํํ์ฌ @expo-camera@ ํจํค์ง๋ฅผ ์ค์นํด์ค๋ค.$ npx expo install expo-camera ์ฑ ์ค์ ํ์ผ ๊ตฌ์ฑํ๊ธฐ (@app.json@)ํ๋ก์ ํธ์ ์ต์๋จ์ ์๋ ์ฑ ์ค์ ํ์ผ(@app.json@)์ ์๋์ ๋ด์ฉ์ ์ถ๊ฐํด์ค๋ค. /app.json{ "expo": { "plugins": [ [ "expo-camera", { "cameraPermission": "Allow $(PRODUCT_NAME) t..
2025.02.24 -
- [React Native] TailwindCSS IntelliSense ํ์ฑํํ๊ธฐ (VS Code)TailwindCSS IntelliSense ํ์ฑํํ๊ธฐ (VS Code)๋ค์ด๊ฐ๋ฉฐVS Code์์ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native)๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋, TailwindCSS IntelliSense๋ฅผ ํ์ฑํ ์ํค๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒ(1) Tailwind CSS IntelliSense ํ์ฅ ์ค์นํ๊ธฐVS Code์์ Tailwind CSS IntelliSense ํ์ฅ์ ์ค์นํ๋ค. Tailwind CSS IntelliSense - Visual Studio MarketplaceExtension for Visual Studio Code - Intelligent Tailwind CSS tooling for VS Codemarketplace.visualstudio.com (2) Tailwi..
2025.02.19 -
- [Testing] ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ (Vite, TypeScript, React)๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ (Vite, TypeScript, React)๋ค์ด๊ฐ๋ฉฐVite, TypeScript, React๋ฅผ ์ด์ฉํ์ฌ ํ๋ก์ ํธ ํ ํ๋ฆฟ์ ์์ฑํ๊ณ , ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ํ ์คํธ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒ1๏ธโฃ ํ๋ก์ ํธ ์์ฑํ๊ธฐVite ํ๋ก์ ํธ ์ค์ ํ๊ธฐํ๋ก์ ํธ ์ด๋ฆ์ ์ค์ ํ๋ค.@React@์ @TypeScript@๋ฅผ ์ ํํ๋ค.$ npm create vite@latest ์์กด์ฑ ์ค์นํ๊ธฐ์๋์ ๋ช ๋ น์ ์คํํ์ฌ ํจํค์ง๋ฅผ ์ค์นํ ํ, ์คํํด๋ณธ๋ค.$ npm install$ npm run dev 2๏ธโฃ Vite ํ๊ฒฝ์์ ํ ์คํธ ์ค์ ํ๊ธฐVitest ์ค์นํ๊ธฐ์๋์ ๋ช ๋ น์ ์คํํ์ฌ Vitest๋ฅผ ์ค์นํ๋ค.$ npm install -D vitest VitestVite ๊ธฐ๋ฐ์ ๋น ๋ฅด๊ณ ๊ฐ..
1 2025.02.15 -
- [React.js] ํผ(Form) ์ฒ๋ฆฌ ๋ฐฉ๋ฒ (React 19)ํผ(Form) ์ฒ๋ฆฌ ๋ฐฉ๋ฒ (React 19)๋ค์ด๊ฐ๋ฉฐ์์ ์ฝ๋์ ํจ๊ป React 19์์ ์ ๋ฐ์ดํธ ๋ ํผ(Form) ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์๋์ ์ฝ๋๋ React 19์์ ์๋ก ์ถ๊ฐ๋ Form ๊ด๋ จ ๊ธฐ๋ฅ๋ค์ ์ ์ฉํ ์ฝ๋์ด๋ค. Signup.jsximport { useActionState } from 'react';import { isEmail, isNotEmpty, isEqualToOtherValue, hasMinLength,} from '../util/validation';export default function Signup() { // React 19 ์ด์์์๋ ํผ ์ ์ถ ์, formData ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ํจ์์ ์ธ์๋ก ๊ฐ์ ธ์ ํน์ ํ๋์ ์ ๋ ฅ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค..
2025.01.21 -
- [Next.js] <Link> ์ปดํฌ๋ํธ ํด๋ฆญ ์, ์ต์๋จ์ผ๋ก ์คํฌ๋กค ๋๋ ํ์ ๋ง๋ ๋ฐฉ๋ฒ์ปดํฌ๋ํธ ํด๋ฆญ ์, ์ต์๋จ์ผ๋ก ์คํฌ๋กค ๋๋ ํ์ ๋ง๋ ๋ฐฉ๋ฒ๋ค์ด๊ฐ๋ฉฐNext.js์ @@ ์ปดํฌ๋ํธ๋ฅผ ํด๋ฆญํ๋ฉด, ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ฉด์ ์ต์๋จ์ผ๋ก ์คํฌ๋กค์ด ๋๋ค.์ด๋ฌํ ํ์์ ๋ง๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณธ๋ค. ๋ฐฉ๋ฒ๊ฐ๋จํ๋ค. ๋ค์๊ณผ ๊ฐ์ด @@ ์ปดํฌ๋ํธ์ @scroll@ ์์ฑ์ ๊ฐ์ @false@๋ก ์ง์ ํด์ฃผ๋ฉด ๋๋ค.import Link from 'next/link'; Move ์ฐธ๊ณ ์ฌ์ดํธ | Next.js" data-og-description="Enable fast client-side navigation with the built-in `next/link` component." data-og-host="nextjs.org" data-og-source-url="https://nextjs.org/docs/app/api-refe..
2024.12.20 -
- [Service] ContentfulContentful๋ค์ด๊ฐ๋ฉฐHeadless CMS ์ค ํ๋์ธ Contentful ์๋น์ค์ ๋ํ์ฌ ์ ๋ฆฌํด๋ณธ๋ค. Contentful๊ฐ๋ 2013๋ ๋ ์ผ ๋ฒ ๋ฅผ๋ฆฐ์์ ๋ง๋ค์ด์ง Headless CMS(Content Management System, ์ปจํ ์ธ ๊ด๋ฆฌ ์์คํ ) ์๋น์คํ์ฌ Spotify, Red Bull, IKEA ๋ฑ ๊ตต์งํ ๊ธ๋ก๋ฒ ๊ธฐ์ ๋ค์ด ์ด ์๋น์ค๋ฅผ ์ด์ฉํ๊ณ ์๋ค.ํ๋ก ํธ์๋์ ๋ฐฑ์๋(์ปจํ ์ธ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ)๊ฐ ๊ฒฐํฉ๋ ๊ตฌ์กฐ์ ๋ฌ๋ฆฌ, ํ๋ก ํธ์๋์ ๋ฐฑ์๋๊ฐ ๋ถ๋ฆฌ๋ ํํ์ ์ปจํ ์ธ ๊ด๋ฆฌ ์์คํ ์ด๋ค. Content that takes you everywhereBusiness moves faster when teams producing content have a platform that empowers them to ..
1 2024.11.28 -
- [React Native] Expo CLI vs. React Native CLIExpo CLI vs. React Native CLI๋ค์ด๊ฐ๋ฉฐ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ(React Native) ํ๋ก์ ํธ ์์ฑ ๋ฐฉ๋ฒ์ผ๋ก Expo CLI ์ React Native CLI ๋ฐฉ๋ฒ 2๊ฐ์ง๊ฐ ์๋ค.์ด ๋ ๋ฐฉ๋ฒ์ ์ฐจ์ด์ ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณธ๋ค. Expo CLI๊ฐ๋ ๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ก ์ฑ์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉ๋๋ ๋๊ตฌํ๋ก์ ํธ ์์ฑ, ๊ด๋ฆฌ, ์คํ์ ๊ฐ๋จํ๊ฒ ํด์ฃผ๋ ๋ช ๋ น์ค ์ธํฐํ์ด์ค(Command Line Interface)๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์ ์ ํ๋ก์ ํธ ์์ฑํ๊ธฐ$ npx create-expo-app@latest # ์ ํ๋ก์ ํธ ์์ฑ ์ฃผ์ ํน์ง๊ธฐ๋ณธ ํ ํ๋ฆฟ์ ์ ๊ณตํ์ฌ ์ด๊ธฐ ์ค์ ์์ด ๋ฐ๋ก ์ฑ ๊ฐ๋ฐ ์์ ๊ฐ๋ฅ์นด๋ฉ๋ผ, ์์น ์ ๋ณด, ํธ์ ์๋ฆผ ๋ฑ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฌ์ฉํ ..
2024.11.25