- ์์ด๋ฝ ์๋ ์ ๊ฐ์์์ฐ ๋ฆฌ์๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ฑ์ผ๋ก, Ionic 5 ๊ธฐ๋ฐ ์ฑ์ React Native๋ก ๊ฐ์ ํ๋ ํ๋ก์ ํธ์ ์ฐธ์ฌํ์์ต๋๋ค.
- ์ค์ ์ฑ ๊ฐ๋ฐ ํ๋ก์ ํธ๋ ์์ง ์งํ ์ค์ด๋ฉฐ, ๋ณธ repository๋ ์ธํด 3๋ช ์ด 4์ฃผ๊ฐ ์์ ํ ๋ด์ฉ์ ๊ฒฐํฉํ lite ๋ฒ์ ์ ๋๋ค.
- ๊ธฐ๊ฐ : 2021.11.15 ~ 2021.12.09
- ์ธ์ : 3๋ช
- ์ํ ์์
๋ถ๋ฅ | ์ฌ์ฉ ์ธ์ด ํน์ ๊ธฐ์ |
---|---|
์ธ์ด | TypeScript |
ํ๋ก ํธ์๋ | React Native, React Navigation, React Hooks, Styled Components |
๋ฐํ์ ํ๊ฒฝ | Node.js |
๋ฒ์ ๊ด๋ฆฌ ํด | Git, GitHub |
IDE | Visual Studio Code |
์ปค๋ฎค๋์ผ์ด์ | Slack, Notion |
๊ทธ ์ธ | ESLint, Prettier, Babel |
- ์ด์ฑ์ฐฝ : Splash(์คํ๋์) & Inquiry(1:1 ๋ฌธ์ ๋ฑ๋ก) ์คํฌ๋ฆฐ ๊ตฌํ
- ๊น์งํ : Menu(๋ฉ๋ด) & QrRead(QR ์ฝ๋ ์ค์บ) ์คํฌ๋ฆฐ ๊ตฌํ
- ์ด์ฑ์ฌ : Onboarding(์จ๋ณด๋ฉ), AppVersionInfo(์ฑ ๋ฒ์ ์ ๋ณด) & InquiryConfirmation(1:1 ๋ฌธ์ ๋ฑ๋ก ์๋ฃ) ์คํฌ๋ฆฐ ๋ฐ OnboardingItem ์ปดํฌ๋ํธ ๊ตฌํ
react-native-splash-screen
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ios, android ๋ค์ดํฐ๋ธ๋ก ์ฒ์ ๋ฑ์ฅํ๋ ๋ฐฐ๊ฒฝ์ ๋ง๋ค์ด ๊ตฌํ- animated๋ฅผ ์ด์ฉํด 3๋จ๊ณ๋ก ์ ๋๋ฉ์ด์ ์ ๊ตฌ์ฑ
- UX๋ฅผ ๊ณ ๋ คํ์ฌ ref๋ฅผ ์ด์ฉํด ์๋ focusing ๊ธฐ๋ฅ ๊ตฌํ
- react-native-modal ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ์ ๋ ฅํ ๋ด์ฉ์ด ๋ง๋์ง ํ๋ฒ ๋ ํ์ธ
- react native๋ก ์ ๋๋ฉ์ด์ ์ด ๋ค์ด๊ฐ ์คํ๋์ฌ๋ ๊ตฌํ์ด ์ด๋ ค์, ์คํ๋์ฌ์ธ ์ฒ ํ๋ ์คํฌ๋ฆฐ์ ๋ง๋๋๊ฒ์ผ๋ก ๊ฒฐ์
- ios, android ๋ ๋ค ๋ค์ดํฐ๋ธ๋ก ์ต์ด์ ์ด๋ฏธ์ง ๋ง๋ค์ด์ค.
- animated์ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์ฐ๊ณ (parallel๋ฑ ), ์ฝ๋ฐฑ์ ํ์ฉํด ์ ๋๋ฉ์ด์ ์ ์์ ์ ํจ
-
์ค์ ๊ธฐ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ์๋ placeholder๊ฐ ๋์ค์ง ์๋ ๋ฒ๊ทธ:
placeholderTextColor="#adb5bd"
์ค์ -
๋ฆฌ์กํธ ํ๋กญ์ค ๊ฐ ์์ ๋ฌธ์ :
TextInputProps
์ ํ๋กํผํฐ๋ก ๋๊ธด style ๋๋ฌธ์, ๊ทธ ์ ์ ์ ์ธํด๋ ผ ํ๋กญ์คincludeFontPadding
์ด ์ ์ฉ๋ ์ง ์์์, ์์๋ฅผ ๋ฐ๊ฟ์ฃผ์๋ค. (์๋๋ก์ด๋์ text๋ ๊ธฐ๋ณธ ํจ๋ฉ์ด ์ ์ฉ๋์ด ํด๋น ํ๋กญ์ค ํ์) -
scrollTo ์์ฑ์ด ์์ด์ ์๋ฌ๋๋ ref:
ref๋ฅผ innerRef์๋ ๋ด์๋ณด๊ณ , forwardRef๋ฅผ ์จ์ ๋๊ฒผ๋๋ฐ ์๊พธ ๋์ค๋Ref.current.scrollTo is not a function
โ scrollView์ ref ๋ถ์ด๊ณ ref๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์๋ง ๋๊ฒจ์ ํด๊ฒฐ โ ref.current๊ฐ ์คํฌ๋กค๋ทฐ, ๋ทฐ, ํ ์คํธ์ธํ์์ ๋ค๋ฅด๊ฒ ๋ํ๋จ -
ํค๋ณด๋ ์ฌ์ด์ฆ์ ๋ฐ๋ผ ๋ฐฑ๊ทธ๋ผ์ด๋์ ์์ด ๋ณด์ด๋ ๋ฌธ์ ๋ฐ์:
Android-Splash-Screen-๊ตฌํ์ ๋ณด์์๋ MainActivity์์ Theme์ ๋ณต๊ตฌ๋ฅผ ์ํด์ฃผ์ด์ ๋ํ๋ฌ๋ ๋ฌธ์ .@Override public void onCreate(Bundle savedInstanceState){ setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); }
-
onEndEditing vs onSubmitEditing ํท๊ฐ๋ฆฌ๋ ํจ์:
๊ณต์๋ฌธ์์์ , ์์ ์ด ๋๋ฌ์๋์ ์ ์ถ์ด ๋์์๋๋ผ๊ณ ๋์ด์๋๋ฐ, ๋๊ฐ์๋ณด์ฌ์ ์คํํด๋ด
(ํค๋ณด๋๊ฐ ๋ซํ์ง ์์์๋) ํค๋ณด๋์ done(์ํฐ) ๋ฒํผ์ ๋๋ฅด๋ฉด onSubmitEditing์ด ๋ฐ์ ์ธํ์ฐฝ์ด ๋ธ๋ฌ๋์์๋. ์ฆ ์์ ์ด ๋๋ฌ์๋ ์จ ์๋ฐ์๋ํ ๋ฐ์ -
์ธํ๊ฐ ์๋ focusing์ ์ํด ๋ง์ด ์ผ๋ fowardRef ์ ๋ฆฌ
forwardRef //1 ์ต์คํฌํธ ํ๋๊ณณ์์ ๋ฌถ์ด์ฃผ๊ณ , props์์ forwardedRef๋ก ๋ฐ์์ด! export default React.forwardRef((props: Props, ref: React.Ref<TextInput>) => { return <InputBox {...props} forwardedRef={ref} /> }) const {forwardedRef} = props <์ปดํฌ๋ํธ ref={forwardedRef} /> //2 ์ฒ์๋ถํฐ forwardRef๋ก ๋ฌถ์ด์ค, ๋๋ฒ์งธ ๋ณ์์ ์๋ ์ด๋ฆ์ผ๋ก ref ์ฌ์ฉ const InputBox = React.forwardRef((props: Props, ref: React.Ref<TextInput>) => {
OnboardingItem
- ์จ๋ณด๋ฉ ๋ฐ ๊ฐ "์๋ฃ" ์คํฌ๋ฆฐ์ ์ฌ์ฉ๋๋ ์นด๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๊ตฌํ
- ์๋, ์๋ ์คํฌ๋กค ๊ฐ๋ฅํ ์จ๋ณด๋ฉ ์คํฌ๋ฆฐ ๊ตฌํ
- ์๋ ์คํฌ๋กค ์
react-spring
์ ํ์ฉํ crossfading ์ด๋ฏธ์ง ๊ตฌํ - ์๋ ์คํฌ๋กค ์
Animated
API์ interpolation์ ํ์ฉํ ์ด๋ฏธ์ง ๊ตฌํ AsyncStorage
๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ ์ฒซ launch ์์๋ง ๋ณด์ด๊ฒ ์ค๊ณ
react-navigation
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ ์คํฌ๋ฆฐ ์ด๋ ๊ตฌํreact-native-share
API๋ฅผ ํ์ฉํ ๊ณต์ ๊ธฐ๋ฅ ๊ตฌํ<ScrollView>
๋ฅผ ํ์ฉํ ๋ฐฐ๋ ์บ๋ฌ์ ๊ตฌํ<FlatList>
๋ฅผ ํ์ฉํ dropdown ๋ฉ๋ด ๊ตฌํ- Submenu์ dropdown์ ์ปดํฌ๋ํธํํ์ฌ toggle ๊ธฐ๋ฅ ๊ตฌํ
react-native-qrcode-scanner
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ QR ์ฝ๋ ์ค์บ ํ๋ฉด ๊ตฌํreact-navigation
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ ์คํฌ๋ฆฐ ์ด๋ ๊ตฌํ<ImageBackground>
๋ฅผ ํ์ฉํ์ฌ View ๊ตฌํ
OnboardingItem
์ ํ์ฉํ ๋ฑ๋ก ์๋ฃ ์คํฌ๋ฆฐ ๊ตฌํ
react-native-version-check
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ฌ์ฉ ์ค์ธ ์ฑ ๋ฒ์ ๊ณผ ์ต์ ์ฑ ๋ฒ์ ์ ๋น๊ต- ๋ ๋ฒ์ ์ด ๋ค๋ฅผ ์ OS์ ๋ฐ๋ผ Apple App Store ํน์ Google Play Store๋ก ์ด๋ํ๋ '์ ๋ฐ์ดํธ' ๋ฒํผ์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ผ๋ก ๊ตฌํ
- Device์ Store ์ฑ์ด ์์ ์ ์น ์คํ ์ด๋ก ์ด๋ํ๊ฒ๋ ์์ธ์ฒ๋ฆฌ
- ๋ณธ repository๋ (์ฃผ)์์ด๋ฝ์ ์ฌ์ ํ๊ฐ๋ฅผ ๋ฐ์ ํ์ ๋ง๋ค์์ต๋๋ค. ์ด ์ฝ๋๋ฅผ ํ์ฉํ์ฌ ์์ ์ ์ธ ์ด๋์ ์ทจํ๊ฑฐ๋ ๋ฌด๋จ์ผ๋ก ๋ฐฐํฌํ ๊ฒฝ์ฐ์๋ ๋ฒ์ ์ผ๋ก ๋ฌธ์ ๋ ์ ์์ต๋๋ค.