๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Mobile
React Native
05-reusable-component์™€ hooks

1. ์ปดํฌ๋„ŒํŠธ

1.1 ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ

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

1.2 Atomic Design Pattern

  • ์ž‘์€๋‹จ์œ„๋ถ€ํ„ฐ ํฐ ๋‹จ์œ„๊นŒ์ง€์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•ด ๋งŒ๋“ค์–ด๊ฐ€๋Š”๊ฒƒ
  • Lego์กฐ๋ฆฝํ•˜๋Š”๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐœ๋…

1.3 Dumb component vs Smart component

  • Dumb component : ๋ณด์—ฌ์ฃผ๋Š” ์ผ์—๋งŒ ์ง‘์ค‘
    • e.g. Card ์ปดํฌ๋„ŒํŠธ : ๊ทธ๋ƒฅ ํ…์ŠคํŠธ๋ฅผ ์นด๋“œ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•จ
  • Smart component : ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์Šค์Šค๋กœ ๋ณ€ํ•จ
    • e.g. Dropdown ์ปดํฌ๋„ŒํŠธ : openํ•ด์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ํƒํ•œ ์ƒํƒœ๊ฐ’์„ ๋ณด์—ฌ์คŒ

1.4 ์–ธ์ œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉ ํ•˜๋Š”๊ฐ€

  • ์ œ์ผ ์ž‘์€ ๋‹จ์œ„๋Š” ์šฐ์„ ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉ
  • Molcule์ด์ƒ์˜ ๋‹จ๊ณ„๋“ค์ค‘์—์„œ 3ํšŒ์ด์ƒ ๋ฐ˜๋ณต๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ฆ

2. Hooks

  • react 16.8 ๋ฒ„์ „์—์„œ ์ƒˆ๋กœ ์†Œ๊ฐœ
  • functional component์—์„œ๋„ state์™€ ๊ธฐํƒ€ ๋‹ค๋ฅธ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ํƒ„์ƒ

2.1 functional component

  • hook ํƒ„์ƒ ์ด์ „์—๋Š” state๋ฅผ ๊ฐ€์งˆ ์ˆ˜๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ dumb component๋กœ๋งŒ ํ™œ์šฉ
  • hook์˜ ๋“ฑ์žฅ์œผ๋กœ ์ฃผ๋ชฉ๋ฐ›๊ธฐ ์‹œ์ž‘

2.2 ์™œ hook์„ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€ ?

(1) ์ปดํฌ๋„ŒํŠธ๊ฐ„ ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์›€

  • ๋งค๋ฒˆ ๊ฐ™์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ Copy & Paste
  • ๊ณตํ†ตํ™” ๋˜์ง€ ์•Š๋‹ค๋ณด๋‹ˆ ์ปดํฌ๋„ŒํŠธ ๋งˆ๋‹ค ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์–ด๋ ค์›€

(2) ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง€๋Š” ๋กœ์ง

  • componentDidmount์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ฒŒ ๋จ
  • e.g. ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ์‹œ api ํ˜ธ์ถœ ๋ฐ event listener๋ฅผ subscribe
  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๋Š” ์ผ

(3) ํ˜ผ๋ž€์„ ์ฃผ๋Š” class

  • class this ํ‚ค์›Œ๋“œ์—์„œ ์˜ค๋Š” ์ข‹์ง€ ๋ชปํ•œ ๊ฒฝํ—˜

2.3 hook ์‚ฌ์šฉ์˜ ๊ทœ์น™

(1) ๋ชจ๋“  hook์„ ์‚ฌ์šฉํ• ๋•Œ ์ตœ์ƒ๋‹จ์—์„œ ํ˜ธ์ถœ ํ•˜์—ฌ์•ผ๋งŒ ํ•จ

  • class ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘
    1. component ์ƒ์„ฑ ์‹œ (Class ์ƒ์„ฑํ•˜์—ฌ instance ์ƒ์„ฑ)
    2. component ์ตœ์ดˆ ๋ Œ๋” ์‹œ (Class ๋‚ด๋ถ€ render method ํ˜ธ์ถœ)
    3. component ์—…๋ฐ์ดํŠธ ์‹œ (Class ๋‚ด๋ถ€ render method ํ˜ธ์ถœ)
  • functional ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘ (๋ Œ๋”๋ง = ํ•จ์ˆ˜ํ˜ธ์ถœ)
    • component ์ƒ์„ฑ ์‹œ (function ํ˜ธ์ถœ)
    • component ์ตœ์ดˆ ๋ Œ๋” ์‹œ (function ํ˜ธ์ถœ)
    • component ์—…๋ฐ์ดํŠธ ์‹œ (function ํ˜ธ์ถœ)

(2) React ํ•จ์ˆ˜์—์„œ๋งŒ hook์„ ์‚ฌ์šฉ ํ•ด์•ผ ํ•จ


3. ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” hook

3.1 useWindowDimension

1
export const ComponentA = props => {
2
const { window, height } = useWindowDimensions()
3
// {...etc code}
4
}

3.2 useBackHandler

1
npm install @react-native-community/hooks
1
export const ComponentA = props => {
2
useBackHandler(() => {
3
return true
4
})
5
// {...etc code}
6
}

3.3 useAppState

1
npm install @react-native-community/hooks
1
export const ComponentA = props => {
2
const currentAppState = useAppState() // active, background, inactive(only ios)
3
// {...etc code}
4
}

3.4 useNavigation, useRoute

1
export const ComponentA = props => {
2
const navigation = useNavigation()
3
const routes = useRoute()
4
// {...etc code}
5
}

3.5 useIsFocused, useFocusEffect

1
export const ComponentA = props => {
2
const isFocused = useIseFocused()
3
useFocusEffect(
4
useCallback(() => {
5
// focus ๊ฐ€ ๋˜์—ˆ์„๋•Œ์˜ ์ฒ˜๋ฆฌ
6
}, [userId]),
7
)
8
// {...etc code}
9
}

3.6 useScrollToTop

  • useScrollToTop : ScrollView๋ฅผ ์ตœ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ฆด๋•Œ ์‚ฌ์šฉ
1
export const ComponentA = props => {
2
const scrollViewRef = useRef()
3
useScrollToTop(scrollViewRef)
4
// {...etc code}
5
}

3.7 useMount

  • useMount : component๊ฐ€ mount๋œ ์‹œ์ ์— callback ํ˜ธ์ถœ
1
export const ComponentA = props => {
2
useMount(() => {
3
// on mount ์ฒ˜๋ฆฌ
4
})
5
// {...etc code}
6
}

3.8 usePrevious

  • usePrevious : state์˜ ์ด์ „ ๊ฐ’์„ ์•Œ์•„๋‚ด๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉ
1
export const ComponentA = props => {
2
const [count, setCount] = useState(0)
3
const prevCount = usePrevious(count)
4
// {...etc code}
5
}

4. ์ตœ์ ํ™” Memoization

4.1 Functional component

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ํ•˜๋ฉฐ ์ƒ๊ธด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜, ํ•จ์ˆ˜๋“ฑ์€ ๋ชจ๋‘ ํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ํ• ๋‹นํ•˜๊ฒŒ ๋จ

4.2 Memoization

  • ์ˆ˜ํ–‰ํ–ˆ๋˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋“ค์„ ์–ด๋”˜๊ฐ€ ์ €์žฅํ•œ๋’ค ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’ ์ธ ๊ฒฝ์šฐ ์žฌํ™œ์šฉํ•˜๋Š”๊ฒƒ

4.3 useMemo

1
export const ComponentA = props => {
2
const variableA = useMemo(() => {}, [])
3
}
  • ์ฒซ๋ฒˆ์งธ ์ธ์ž : ๊ธฐ์–ตํ•  ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
  • ๋‘๋ฒˆ์งธ ์ธ์ž : dependency array
1
export const ComponentA = props => {
2
//props.a = 1, props.b = 1
3
const variableA = useMemo(() => {
4
return props.a + props.b
5
}, [props.a, props.b])
6
}

4.4 useCallback

1
export const ComponentA = props => {
2
const variableA = useCallback(() => {}, [])
3
}
  • ์ฒซ๋ฒˆ์งธ ์ธ์ž : ๊ธฐ์–ตํ•  ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” ํ•จ์ˆ˜
  • ๋‘๋ฒˆ์งธ ์ธ์ž : dependency array