๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ReactNative

[ReactNative]ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ vs ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ? ์ฐจ์ด์ ๊ณผ ๋น„๊ต

by IworldT 2021. 8. 24.
๋ฐ˜์‘ํ˜•

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ์ฝ”์–ด ์ปดํฌ๋„ŒํŠธ ์ค‘ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๊ธฐ๋ณธ์ ์ธ ์ฝ”์–ด ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ ์•Œ์•„๋ณด์•˜๋‹ค. View, Text, Image๋“ฑ์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๊ณผ HTML ํƒœ๊ทธ์™€์˜ ๋น„๊ต๋Š” ์ด์ „ ํฌ์ŠคํŒ… (https://iworldt.tistory.com/35)์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ์‚ฌ์šฉ์ž ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ๊ทธ ์ค‘์—์„œ๋„ ์‚ฌ์šฉ์ž ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ๋‘˜์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ, ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ, ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ, ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ

 

์‚ฌ์šฉ์ž ์ปดํฌ๋„ŒํŠธ

๋ฆฌ์•กํŠธ์—๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ(class component)์™€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ(function component) ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ˜•์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์ค‘ ์›์‹œ์ ์ธ ๋ฐฉ๋ฒ•์ด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์ด๊ณ , ๋ฆฌ์•กํŠธ ํ›…์˜ ๋„์ž…์— ๋”ฐ๋ผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋ฐฉ์‹์œผ๋กœ ์ œ์ž‘ํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค. ๋ฆฌ์•กํŠธ ํ›…์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋ฐฉ์‹์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•  ๋•Œ์—๋„ ํ•จ์ˆ˜ํ˜•์ธ์ง€๋ฅผ ์ž˜ ๋ณด๊ณ  ์ฐธ๊ณ ํ•˜์ž.

 

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ๋น„ํ•ด ๋‹จ์ ์ด ๋งŽ๋‹ค.

์šฐ์„  ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด extends Component ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ render() ๋ฉ”์†Œ๋“œ๊ฐ€ ์š”์†Œ๋กœ ๊ผญ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋ฆฌ์•กํŠธ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์ธ ๋ฆฌ์•กํŠธ ํ›…(react hooks)์กฐ์ฐจ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง„ ์•Š๊ฒ ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

import React, {Component} from 'react';

export default classComp extends Component{
	render() { return null }
}

 

์ปดํฌ๋„ŒํŠธ๋ช… : classComp

์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ•  : null์„ ๋ฐ˜ํ™˜

 

Component๋ฅผ 'react'๋ฅผ ํ†ตํ•ด ๊ผญ import ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ณ , ๊ทธ๋ ‡๊ฒŒ importํ•œ ๊ฒƒ์„ ์ปดํฌ๋„ŒํŠธ(classComp)๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ฌด์กฐ๊ฑด extends Component๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

๋˜ํ•œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹ค์ œ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์„ render() ๋ฉ”์†Œ๋“œ ์•ˆ์— ๋‹ด์•„์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ, ํ™”์‚ดํ‘œ ๋ฐฉ์‹ ํ•จ์ˆ˜

๋ฆฌ์•กํŠธ์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๋‹ค๋ณด๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์™€ ๋ชจ์Šต์ด ๋‹ฌ๋ผ ์–ด์ƒ‰ํ–ˆ๋˜ ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋ฅผํ…Œ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

const ArrowComp = ( props ) => {
	console.log("์†์„ฑ๊ฐ’", props);
    return null;
}

export default ArrowComp;

 

์œ„๋Š” ๋ถ„๋ช… ํ•จ์ˆ˜์ด๋‹ค.  function์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š๊ณ  => ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์ œ์ž‘ํ•˜๊ธฐ์— ํ™”์‚ดํ‘œ ๋ฐฉ์‹ ํ•จ์ˆ˜์ด๊ณ , ์ด ๋˜ํ•œ function ํ‚ค์›Œ๋“œ ๋ฐฉ์‹ ํ•จ์ˆ˜๋ณด๋‹ค ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๊ธฐ์— ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค. ์œ„์˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ํ•ด์„ํ•ด๋ณด๊ฒ ๋‹ค.

ํ•จ์ˆ˜(์ปดํฌ๋„ŒํŠธ)๋ช… : ArrowComp

์†์„ฑ : props

์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ•  : console.log๋ฅผ ์ถœ๋ ฅํ•œ ๋’ค null์„ ๋ฐ˜ํ™˜

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์†์„ฑ ์ „๋‹ฌ, props ์ฃผ๊ณ ๋ฐ›๊ธฐ

์—ฌ๊ธฐ์„œ ์†์„ฑ์ธ props๋ฅผ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•˜๊ณ  ์ „๋‹ฌ๋ฐ›๋Š”์ง€ ๊ถ๊ธˆํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•œ ์˜ˆ๋ฅผ ๋ณด์ž.

export default function App(){
	return <ArrowComp msg="hellow Arrow"/>
}

 

App์€ ArrowComp ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์†์„ฑ์œผ๋กœ msg๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด๋•Œ ArrowComp๋Š” props์˜ ํ•œ ์š”์†Œ๋กœ msg๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ๊ทธ msg์˜ ๊ฐ’, "hello Arrow"๋งŒ์„ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

const ArrowComp = ( props ) => {
	console.log("msg : ", props.msg);
    return null;
}

export default ArrowComp;

 

props๋Š” ์†์„ฑ์„ ๋ชจ๋‘ ๋ฌถ์€ ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, props ์ค‘์—์„œ msg๋ฅผ . ์„ ํ†ตํ•ด ๋ช…์‹œํ•ด์ฃผ๋ฉด "hello Arrow"๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์†์„ฑ์˜ ํƒ€์ž…์€ ๊ธฐ๋ณธ์ ์ธ number๋ถ€ํ„ฐ string, Json ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋˜ํ•œ ๋ฆฌ์•กํŠธ ํ›…์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ–ˆ์—ˆ๋Š”๋ฐ, ํ›…์€ ์œ„์— ์„ค๋ช…ํ•œ ์†์„ฑ(props)๋“ค์˜ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ์˜ ๋ฐ˜์‘ ๋“ฑ ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ lifecycle์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. "์†์„ฑ"์ด๋ผ๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ด์•ผ ํ•œ๋‹ค.

์œ„์—์„œ ๋ช…์‹œํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ์„ msg์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜๋„ ์žˆ๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” ์†์„ฑ๋„ ์žˆ๋‹ค. ๊ทธ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์ž.

 

์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋ณธ ์†์„ฑ

key

ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์ž‘ํ•˜๊ณ , App์—์„œ๋Š” ๊ทธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ hellow Arrow ๋ฌธ์žฅ์„ 10๋ฒˆ์ด๊ณ  100๋ฒˆ์ด๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ๋ฆฌ์•กํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ Œ๋”๋ง(์ปดํฌ๋„ŒํŠธ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋Š” ๊ณผ์ •)์„ ์ตœ์ ํ™” ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ์˜ key ๊ฐ’์„ ์ฃผ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

'Each child in a list should have a unique key' ๋ผ๋Š” ๊ฒฝ๊ณ  ๋ฉ”์„ธ์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ์ด๋‹ค. HTML์˜ ํƒœ๊ทธ์—์„œ id๋ฅผ ์ฃผ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋ณด๋ฉด ๋˜๊ฒ ๋‹ค.

 

children

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํฐ ๊ด€๋ จ์ด ์žˆ๋‹ค.

์ด๋ฅผํ…Œ๋ฉด ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ ˆ์ด์•„์›ƒ(ํ…œํ”Œ๋ฆฟ)์ด๊ณ  ๊ทธ ์•ˆ์˜ ์ž์‹ ์š”์†Œ๋“ค๋งŒ ๊ณ„์† ๋ฐ”๋€Œ์–ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ํ•  ๋•Œ, ๋ถ€๋ชจ๋Š” ์ž์‹์„ ๋ฐ›์•„์™€ ๋ ˆ์ด์•„์›ƒ(ํ…œํ”Œ๋ฆฟ)์„ ์ ์šฉํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— props๋กœ {children}์„ ๋ฐ›์•„์™€์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์˜ ๋ ˆ์ด์•„์›ƒ, ์ฆ‰ ๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ์˜ ์ž์‹ ์š”์†Œ๋กœ {children}์„ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

์•„๊นŒ ์ ์—ˆ๋˜ ArrowComp ์˜ˆ์ œ๋ฅผ ๋‹ค์‹œ ํ™œ์šฉํ•ด๋ณด์ž.

const ArrowComp = ( props ) => {
	console.log("msg : ", props.msg);
    return null;
}

export default ArrowComp;

msg๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ArrowComp์ด๋‹ค. ์ด ์นœ๊ตฌ๊ฐ€ ์ž์‹ ์š”์†Œ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

 

const Wrapper=({children})=>{
	
    return (
    	<Text>{children}</Text>
	);
    
}

export default function App(){

	return (
    	<Wrapper>
        	<ArrowComp msg="hi"/>
            <ArrowComp msg="hellow"/>
        </Wrapper>
    );
    
}

 

Wrapper๋Š” ์ž์‹์š”์†Œ๋ฅผ ๋ฐ›์•„์„œ Text๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

App์—์„œ Wrapper๊ฐ€ ์ž์‹์š”์†Œ hi, hellow ๋‘๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.  ์ž์„ธํ•˜๊ฒŒ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•˜์ง„ ์•Š์•˜์œผ๋‚˜ ์ž์‹์š”์†Œ์— ๋Œ€ํ•œ ์†์„ฑ๊ฐ’ ๋ณ€๊ฒฝ, ์Šคํƒ€์ผ ์ ์šฉ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋„ Wrapper ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

ref

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ forwardRef, useImperativeHandle ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ref๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ref๋Š” ์‰ฝ๊ฒŒ๋งํ•ด js์˜ getElementBy***์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์˜ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์—ฌ๊ธฐ๊นŒ์ง€ ๋งˆ์น˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์€ ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฒ•, ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฒคํŠธ ์†์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€