์žฌ๋ฐŒ๊ฒŒ ํ•ฉ์‹œ๋‹ค

๊ธฐ๋กํ•˜๊ธฐ, ๊ฐ€์‹œํ™”ํ•˜๊ธฐ

Vanilla JS/์‡ผํ•‘๋ชฐ SPA

Vanilla Javascript๋กœ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

์€๋˜๋”” 2022. 10. 24. 01:15
๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์‡ผํ•‘๋ชฐ SPA๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด, ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ–ˆ๋‹ค. ํ™ฉ์ค€์ผ๋‹˜์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•ด ์ดˆ์•ˆ์„ ์งœ๊ณ , ์ˆ˜์ •์„ ๊ฑฐ์ณค๋‹ค.

๊ธฐ์กด ์ฝ”๋“œ

Component ํด๋ž˜์Šค

  • constructor: ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ฆ‰ ์ดˆ๊ธฐ state/props๋ฅผ ์„ค์ •ํ•˜๊ณ , template ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฌผ์ธ ๋งˆํฌ์—…์„ ๋ Œ๋”๋งํ•˜๊ณ , ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.
  • setup: ์ดˆ๊ธฐ state๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • mounted: ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 
  • template: ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ๋ฐ˜์˜ํ•œ ๋งˆํฌ์—…์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • render: $target๋‚ด์— ๋งˆํฌ์—…์„ ๋ Œ๋”๋งํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ mounted ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • setState: ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , render ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

mounted ๋ฉ”์„œ๋“œ๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

์œ„ Component ํด๋ž˜์Šค๋กœ ์ƒ์„ฑํ•œ ์ธ์Šคํ„ด์Šค ์˜ˆ์‹œ

์˜ˆ์‹œ๋กœ ํ™ฉ์ค€์ผ๋‹˜์˜ ๊ธ€ ์˜ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ฐœ์ทŒํ•ด์™”๋‹ค.  mounted๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ธ์ž๋กœ $target๊ณผ props๋ฅผ ๋„˜๊ธด๋‹ค.

 

template ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋  ๋งˆํฌ์—…๋“ค์ด ์žˆ๋‹ค. ๊ฐ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋งž๋Š” ๋งˆํฌ์—…์„ $target์œผ๋กœ ๋„˜๊ธด๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ render-mounted ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ ์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์„ ํ•  ๋งˆํฌ์—…์ด DOM์— ์กด์žฌํ•ด์•ผ(render) ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ํ•ด๋‹น DOM์˜ innerHTML๋กœ ์ž์‹ ์˜ ๋งˆํฌ์—…์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

 


ํ•œํŽธ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋‹ค์Œ์˜ ๊ณผ์ •์ด ๋ฐœ์ƒํ•œ๋‹ค.

setState โžก๏ธ render() ์‹คํ–‰ โžก๏ธ mounted() ์‹คํ–‰

mounted()์—์„œ๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์ƒˆ๋กœ์šด props๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

API ์š”์ฒญ ์‹œ์  ๊ฒฐ์ •ํ•˜๊ธฐ

์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ ์ƒํ’ˆ ๋ชฉ๋ก์„ ๋ Œ๋”๋งํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด ์ •์˜ํ•œ ์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด์—์„œ API ์š”์ฒญ์€ ์–ธ์ œ ์ด๋ค„์ ธ์•ผ ํ• ๊นŒ? ํ•ด๋‹น ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์ฐธ๊ณ ํ•ด๋ณด์•˜๋‹ค.

 

React Component Lifecycle

 

  1. ๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœํ–ˆ์„ ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด API ํ˜ธ์ถœ์€ useEffect์—์„œ ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์ดํด ์ƒ useEffect์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.
  2. ๊ทธ๋ ‡๋‹ค๋ฉด useEffect๋Š” ์–ธ์ œ ์‹คํ–‰๋˜๋Š”๊ฐ€? useEffect๋Š” render ์ดํ›„์— ์‹คํ–‰๋œ๋‹ค. componentDidMount, componentDidUpdate, componentWillUnmount๋ฅผ ํ•ฉ์นœ ๊ฒŒ useEffect๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. (๊ฒฐ๋ก ) ๊ธฐ์กด ์ฝ”๋“œ์—์„œ useEffect์— ํ•ด๋‹นํ•˜๋Š” mounted ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ API๋ฅผ ํ˜ธ์ถœํ•˜์ž.
  4. ๋‹ค๋งŒ ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค mounted๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. mounted ๋ฉ”์„œ๋“œ๊ฐ€ componentDidMount์™€ componentDidUpdate๋ฅผ ํฌ๊ด„ํ•˜๊ณ  ์žˆ๋Š” ๋Š๋‚Œ. ๋”ฐ๋ผ์„œ updated๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด๋กœ์จ mounted๋Š” ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ์‹œ์— ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ mounted ๋Œ€์‹  updated๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

 

์ˆ˜์ •ํ•œ ์ฝ”๋“œ

์ˆ˜์ •๋œ Component ํด๋ž˜์Šค

componentDidMount์™€ componentDidUpdate๊ฐ€ ํ˜ผ์žฌ๋˜์–ด ์žˆ๋˜ mounted๋ฉ”์„œ๋“œ๋กœ๋ถ€ํ„ฐ, componentDidUpdate์— ํ•ด๋‹นํ•˜๋Š” updated๋ฉ”์„œ๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.

 

API ์š”์ฒญ์€ ๋‹ค์Œ์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

1. mountedํ•จ์ˆ˜ ๋‚ด์—์„œ API ์š”์ฒญ
2. ์‘๋‹ต ๊ฒฐ๊ณผ๋กœ setStateํ•จ์ˆ˜ ํ˜ธ์ถœ
3. setStateํ•จ์ˆ˜๋Š” renderํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
4. renderํ•จ์ˆ˜๋Š” updatedํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ, ๋ณ€๊ฒฝ๋œ state๊ฐ’์ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๋„ ๋ฐ˜์˜๋œ๋‹ค.