Frontend ๐Ÿ“š/React

[React] ๋ฉด์ ‘ ์˜ˆ์ƒ ์งˆ๋ฌธ & ๋‹ต๋ณ€

leejaejae 2025. 2. 25. 14:47

1. ๋ฆฌ์•กํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์—์„œ โ€œ์ปดํฌ๋„ŒํŠธโ€์™€ โ€œํ”„๋กœํผํ‹ฐ(props)โ€ ์— ๋Œ€ํ•ด ์„ค๋ช…

๋”๋ณด๊ธฐ

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

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์—์„œ โ€œ์ƒํƒœ(state)โ€์™€ ์†์„ฑ(props)โ€์˜ ์ฐจ์ด์ 

๋”๋ณด๊ธฐ

์ƒํƒœ(state)๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋™์ ์ธ ๋ฐ์ดํ„ฐ์ด๊ณ , ์†์„ฑ(props)์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋˜๋Š” ์ •์ ์ธ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ์ž์ฃผ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์— ์‚ฌ์šฉ๋˜๋ฉฐ, props๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด, ๊ฐ ๋ผ์ดํ”„ ์‚ฌ์ดํด ๋ฉ”์†Œ๋“œ์˜ ์—ญํ• 

๋”๋ณด๊ธฐ

๋ฆฌ์•กํŠธ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์—…๋ฐ์ดํŠธ๋˜๊ณ , ์ œ๊ฑฐ๋˜๋Š” ๊ณผ์ •์—์„œ ํ˜ธ์ถœ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋“ค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
๋จผ์ €, ๋งˆ์šดํŠธ ๋‹จ๊ณ„์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ DOM์— ๋ Œ๋”๋ง๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. constructor()๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๊ณ , render()๋Š” UI๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. componentDidMount()๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ ํ›„ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉฐ, API ํ˜ธ์ถœ์ด๋‚˜ ์ดˆ๊ธฐ ์„ค์ •์„ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.โ€จ
๋‹ค์Œ์€ ์—…๋ฐ์ดํŠธ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋‚˜ ์†์„ฑ(props)์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. shouldComponentUpdate()๋Š” ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ, ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. render()๋Š” UI๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ณ , componentDidUpdate()๋Š” ์—…๋ฐ์ดํŠธ ํ›„์— ํ˜ธ์ถœ๋˜์–ด DOM ์—…๋ฐ์ดํŠธ ์ดํ›„ ์ฒ˜๋ฆฌํ•  ์ž‘์—…์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โ€จ
๋งˆ์ง€๋ง‰์œผ๋กœ ์–ธ๋งˆ์šดํŠธ ๋‹จ๊ณ„์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” componentWillUnmount()๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜, ํƒ€์ด๋จธ๋ฅผ ์ •์ง€ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€จํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธ, ์–ธ๋งˆ์šดํŠธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ๋ฆฌ์•กํŠธ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

๋”๋ณด๊ธฐ

์ฒซ ๋ฒˆ์งธ๋Š” shouldComponentUpdate ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋‚˜ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ๋Š” React.memo๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ˆ˜ ์ปดํฌ๋„ŒํŠธ(props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ)์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ธ ๋ฒˆ์งธ๋กœ, useMemo๋‚˜ useCallback์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋“ค์€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ shouldComponentUpdate์™€ React.memo๋Š” ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ? ๊ทธ ์ฐจ์ด์ ์€ ?

๋”๋ณด๊ธฐ

shouldComponentUpdate๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฆฌ๋ Œ๋”๋ง ์—ฌ๋ถ€๋ฅผ ์ง์ ‘ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
React.memo๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. React.memo๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ shouldComponentUpdate์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ useMemo์™€ useCallback์„ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…

๋”๋ณด๊ธฐ

useMemo๋Š” ๊ฐ’์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜๊ณ , ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊ณ„์‚ฐ ๋น„์šฉ์ด ํฐ ๊ฐ’์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
useCallback์€ ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ, ํ•จ์ˆ˜๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค์‹œ ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ํ•จ์ˆ˜๊ฐ€ props๋กœ ์ „๋‹ฌ๋  ๋•Œ, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. 
๋‘ ํ›… ๋ชจ๋‘ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์ด๋‚˜ ํ•จ์ˆ˜ ์ƒ์„ฑ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โ€จ(useMemo: ๊ฐ’ ๊ณ„์‚ฐ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉ / useCallback: ํ•จ์ˆ˜ ์žฌ์ƒ์„ฑ ์ตœ์ ํ™”ํ•  ๋•Œ ์‚ฌ์šฉ)

 

3. ์ƒํƒœ ๊ด€๋ฆฌ

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง? useState ์™ธ์— ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋„๊ตฌ๋Š”?

๋”๋ณด๊ธฐ

๋ฆฌ์•กํŠธ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. useState๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋”ฐ๋ผ ํ™”๋ฉด์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ useState๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง€๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๋ฆฌ๋•์Šค(Redux)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋•์Šค๋Š” ์ค‘์•™ ์ง‘์ค‘์‹ ์Šคํ† ์–ด์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์•ก์…˜๊ณผ ๋ฆฌ๋“€์„œ๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ™•์žฅํ•˜๊ณ , ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ useReducer์™€ useState์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…

๋”๋ณด๊ธฐ

useState์™€ useReducer๋Š” ๋ฆฌ์•กํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ํ›…์ž…๋‹ˆ๋‹ค. useState๋Š” ๊ฐ„๋‹จํ•œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ , ์ƒํƒœ ๊ฐ’์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉฐ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. 
๋ฐ˜๋ฉด, useReducer๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ ๋ณ€์ˆ˜๋‚˜ ๋ณต์žกํ•œ ์ƒํƒœ ๋ณ€ํ™” ๋กœ์ง์„ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. useReducer๋Š” ๋ฆฌ๋“€์„œ ํ•จ์ˆ˜์™€ dispatch๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉฐ, ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
๋”ฐ๋ผ์„œ useState๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ„๋‹จํ•  ๋•Œ, useReducer๋Š” ๋ณต์žกํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ์ด๋‚˜ ์—ฌ๋Ÿฌ ์•ก์…˜์„ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

4. ๋ฐ์ดํ„ฐ์ฒ˜๋ฆฌ์™€ ๋น„๋™๊ธฐ ์ž‘์—…

๐Ÿ“Œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ฆฌ์•กํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ? 

๋”๋ณด๊ธฐ

๋ฆฌ์•กํŠธ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” useEffect ํ›…์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋œ ํ›„ ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฅผ API์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ, useEffect ์•ˆ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ , async/await์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ API ํ˜ธ์ถœ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์™€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…

๋”๋ณด๊ธฐ

API ํ˜ธ์ถœ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋จผ์ €, CORS ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์„œ๋ฒ„์—์„œ CORS ํ—ค๋”๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ์ž˜๋ชป๋œ API ์‘๋‹ต ํ˜•์‹์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ๋Š” ์‘๋‹ต์„ ์ฒดํฌํ•˜๊ณ  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰์œผ๋กœ ์ธ์ฆ ๋ฌธ์ œ๋Š” ํ† ํฐ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์š”์ฒญ ํ—ค๋”์— ์ ์ ˆํ•œ ์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จ์‹œ์ผœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์—์„œ ์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)๊ณผ ํด๋ผ์ด์–ธํŠธ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)์˜ ์ฐจ์ด์ 

๋”๋ณด๊ธฐ

์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)๊ณผ ํด๋ผ์ด์–ธํŠธ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)์€ ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง€๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
SSR์€ ์„œ๋ฒ„์—์„œ HTML์„ ๋ Œ๋”๋งํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  SEO(๊ฒ€์ƒ‰์—”์ง„ ์ตœ์ ํ™”)์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง์„ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, CSR์€ ํด๋ผ์ด์–ธํŠธ์—์„œ JavaScript๋กœ ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ดˆ๊ธฐ ๋กœ๋”ฉ์€ ๋Š๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ ๊ณ , ํŽ˜์ด์ง€ ์ „ํ™˜์ด ๋น ๋ฅด๋ฉฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

5. ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ๋ฐ UI ๊ตฌํ˜„

๐Ÿ“Œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ค‘์š”ํ•œ ์ ์€ ๋ฌด์—‡

๋”๋ณด๊ธฐ

UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ์žฌ์‚ฌ์šฉ์„ฑ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘์€ ๋‹จ์œ„๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ, ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single Responsibility Principle)์„ ๋”ฐ๋ฅด๋„๋ก ์„ค๊ณ„ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์˜ ๊ตฌ์กฐ, ์Šคํƒ€์ผ๋ง, ๋™์ž‘ ๋“ฑ์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹ , ํ”„๋ ˆ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ(UI๋ฅผ ๊ทธ๋ฆฌ๋Š” ์—ญํ• )์™€ ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌ)๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋” ์ง๊ด€์ ์ด๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์—์„œ ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ์™€ ํ”„๋ ˆ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…

๋”๋ณด๊ธฐ

์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ๋Š” ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์ฃผ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํฌํ•จํ•˜๊ณ , ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ props๋กœ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, API ํ˜ธ์ถœ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋ ˆ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ๋Š” ์ฃผ๋กœ UI๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ๋‚˜ ๋ฐ์ดํ„ฐ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ์ „๋‹ฌ๋ฐ›์€ props๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ์ฆ‰, ์ด ์ปดํฌ๋„ŒํŠธ๋Š” UI๋งŒ ์‹ ๊ฒฝ ์“ฐ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€์— ๋Œ€ํ•œ ๋กœ์ง์€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํžˆ ๋งํ•ด, ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ๋Š” "๊ธฐ๋Šฅ์ "์ด๊ณ , ํ”„๋ ˆ์  ํ…Œ์ด์…”๋„ ์ปดํฌ๋„ŒํŠธ๋Š” "ํ‘œํ˜„์ "์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฆฌ์•กํŠธ์—์„œ ์ƒํƒœ๊ฐ€ ๊ด€๋ฆฌ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ์ˆœ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๋Š”์ง€ ์„ค๋ช…

๋”๋ณด๊ธฐ

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