๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒณ React

[React] ๋ฆฌ์•กํŠธ์˜ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ, ๊ทผ๋ฐ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hook์€ ๋˜ ๋ญ”๋ฐ?

by ._.sori 2025. 12. 30.

 

 

๋ฆฌ์•กํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ Hook์— ๋Œ€ํ•ด ๋ชจ๋ฅด๋‹ˆ
ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์–ด๋ ค์›Œ์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.
์ด ๋‘˜์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

 

 

 

1. ์ƒ๋ช…์ฃผ๊ธฐ

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

 

 

- ๋ฆฌ์•กํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด

 

[React] ๋ฆฌ์•กํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด

๋ผ์ดํ”„ ์‚ฌ์ดํด = ์ƒ๋ช… ์ฃผ๊ธฐ

velog.io

 

 

 

 


 

 

 

 

2.  ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ 

Q. ๋จผ์ €! ๊ฒ€์ƒ‰ํ•˜๋‹ค๋ณด๋ฉด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์žˆ๊ณ  ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ์žˆ๋‹ค. ์ด ๋‘˜์˜ ์ฐจ์ด๊ฐ€ ๋ญ˜๊นŒ?

A. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” React.Component๋ฅผ ์ƒ์†๋ฐ›์•„ render( )์™€ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ์ธ componentDidMount ๋“ฑ์œผ๋กœ ๋งˆ์šดํŠธ/์—…๋ฐ์ดํŠธ/์–ธ๋งˆ์šดํŠธ ์‹œ์ ์˜ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•œ๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜๋Š”๋ฐ useState, useReducer๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  useEffect๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋ง ์ดํ›„ ์‹คํ–‰๋˜์–ด์•ผํ•˜๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ์™€ cleanup์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์š”์ƒˆ๋Š” ํ•จ์ˆ˜ํ˜• + ํ›…์„ ๋„๋ฆฌ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌ์•กํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด ํ˜น์€ ๋ฆฌ์•กํŠธ ์ƒ๋ช…์ฃผ๊ธฐ๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์ธ useEffect์— ๋Œ€ํ•œ ์‚ฌ์ดํด ์„ค๋ช…์ด ๋งŽ์ด ๋‚˜์˜ค๋Š” ๋“ฏ ํ•˜๋‹ค. 

 

  • ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ

 

[์ƒ์„ฑ]
a) ์ƒ์„ฑ๋  ๋•Œ๋Š” constructor - static getDerivedStateFromProps - render - React updates DOM and refs - componentDidMount ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„๋‹ค. 
b) ์ด ๊ณผ์ • ์ค‘ static getDerivedStateFromProps๋Š” ์ง€๊ธˆ์€ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 
c) static getDerivedStateFromProps๋Š” props ๋ณ€ํ™”์— ๋”ฐ๋ผ state๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ๋™๊ธฐํ™” ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ,  props์™€ state๊ฐ€ ๊ฐ™์€ ์˜๋ฏธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ๋“ค๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ์‹ฑํฌ๊ฐ€ ๊ผฌ์ด๋Š” ๋“ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

[์—…๋ฐ์ดํŠธ]
a) ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ๋Š” static getDerivedStateFromProps - shouldComponentUpdate - render - getSnapshotBeforeUpdate - React updates DOM and refs - componentDidUpdate ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„๋‹ค.
b) ์ด ๊ณผ์ • ์ค‘  static getDerivedStateFromProps, shouldComponentUpdate(nextProps, nextState), getSnapshotBeforeUpdate(prevProps, prevState) ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

c) shouldComponentUpdate(nextProps, nextState)๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ์—…๋ฐ์ดํŠธ๋ฅผ ๋ง‰์„์ง€ ๋ง์ง€์— ๋Œ€ํ•œ ํŒ๋‹จ ์‹ค์ˆ˜๋กœ ์ธํ•ด ์ง€๊ธˆ์€ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 
d) getSnapshotBeforeUpdate(prevProps, prevState)๋Š” DOM์ด ๋ฐ”๊พธ๊ธฐ ์ „์— ํ˜„์žฌ DOM ์ƒํƒœ๋ฅผ ์ฝ์–ด ์Šค๋ƒ…์ƒท ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.

[Deprecated]
a)
Deprecated๋กœ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค๋„ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•ž์— unsafe๋ฅผ ๋ถ™์—ฌ์•ผํ•œ๋‹ค.
b)
Deprecated๋œ ๋ฉ”์„œ๋“œ๋Š” componentWillMount, componentWillReceiveProps,componentWillUpdate๊ฐ€ ์žˆ๋‹ค.
c) will-์€ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ์™€ ๊ด€๋ จ๋œ ์šฉ์–ด์ด๋ฉฐ ๋ Œ๋”๋ง ๋‹จ๊ณ„ ์ชฝ์— ๋ถ™์–ด์žˆ๋‹ค.
d) ๋”์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์œ„์˜ ๋ฉ”์„œ๋“œ๋“ค์— ๋ถ€์ˆ˜ํšจ๊ณผ(๋„คํŠธ์›Œํฌ ์š”์ฒญ, ์ด๋ฒคํŠธ ๋“ฑ๋ก, ๋กœ๊ทธ/ํŠธ๋ž˜ํ‚น, ํƒ€์ด๋จธ ์‹œ์ž‘)๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ€์ˆ˜ํšจ๊ณผ๋กœ ์ธํ•ด ์ค‘๋ณต์ด ์ผ์–ด๋‚˜๋ฉด์„œ ๋ฒ„๊ทธ๊ฐ€ ํ„ฐ์ง€๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
e) ์•„์˜ˆ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  UNSAFE_ ์ ‘๋‘์–ด๋ฅผ ๋ถ™์ด๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 


 

 

 

 

3.  ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ



[Mounting - ์ƒ์„ฑ]

  • ๋งˆ์šดํŒ… ๊ด€๋ จ ํ•จ์ˆ˜๋“ค์€ ์ฒ˜์Œ render๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„, component๊ฐ€ ์ƒ์„ฑ(instanceํ™”)๋˜๊ณ , ์‹ค์ œ DOM์œผ๋กœ ์ ์šฉ๋  ๋•Œ ๊นŒ์ง€๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. render๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ•œ๋ฒˆ์”ฉ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

  • constructor(props)
    a)
    React component๊ฐ€ mount ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ๋จผ์ € ํ˜ธ์ถœ๋œ๋‹ค. →  DOM์œผ๋กœ mount๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋œ๋‹ค.
    b) ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ๋กœ๋“œ๊ฐ€ ๋œ ์ดํ›„ ๋ Œ๋”๋ง๋˜๊ธฐ ์ด์ „์— '๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ', '์ดˆ๊ธฐํ™”'๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    c) ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์€ ํ™”๋ฉด์ƒ์— ๋ณด์—ฌ์ง€๋Š” ๋ฐ์ดํ„ฐ(View)์™€ ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ(Model)์„ ๋ฌถ์–ด์„œ(Binding) ์„œ๋กœ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ณ€๊ฒฝ๋œ ๊ฐ’์— ๋”ฐ๋ผ์„œ HTML ์ƒ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋งž์ถ”์–ด ์ฃผ๋Š” ๋™์ž‘์„ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค. (์•ฝ๊ฐ„ ๊ณ„์‚ฐ๊ธฐ ๊ฐ™์€ ๊ฒƒ?)
    d) ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ, component์˜ state์˜ ์ €์žฅ๊ณต๊ฐ„์— ๋ณ€์ˆ˜๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. state๋ฅผ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด, constructor์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
    e) ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ๋ผ์ธ์€ ๋ฐ˜๋“œ์‹œ super(props)์„ ํ˜ธ์ถœํ•œ๋‹ค. ๋ฏธํ˜ธ์ถœ์‹œ props๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•„ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    f) constructor์€ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•ด์„  ์•ˆ๋˜๋ฉฐ, ์ด๊ณณ์—์„œ side effect๋‚˜ subscription์„ ์‹คํ–‰ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์•„๋ž˜ side effect์™€ subscription์ด ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ–ˆ๋‹ค. ์ด๊ฒƒ๋“ค์„ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ ๋Š” ์ •๋ฆฌ(clean up)๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. constructor์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋ถ™๊ธฐ ์ „์ธ๋ฐ, constructor์—์„œ side effect๋‚˜ subscription์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ ํ๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ •๋ฆฌ ํƒ€์ด๋ฐ์ด ๊ผฌ์ผ ์ˆ˜ ์žˆ๋‹ค.
  constructor(props) {
    super(props);
    this.state = { counter: 0 };
    this.handleClick = this.handleClick.bind(this);
  }

 

Q. side effect์™€ subscription์„ ๋ฒˆ์—ญํ•˜๋ฉด ๋ถ€์ˆ˜ํšจ๊ณผ์™€ ๊ตฌ๋…์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๊ฒŒ ์ •ํ™•ํžˆ ์–ด๋–ค ๊ธฐ๋Šฅ์ผ๊นŒ?

A. React์—์„œ side effect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ UI๋ฅผ ๋ Œ๋”ํ•˜๋Š” ๊ฒƒ ๋ง๊ณ  ์ปดํฌ๋„ŒํŠธ ๋ฐ–์— ์˜ํ–ฅ์„ ์ฃผ๊ฑฐ๋‚˜, ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๊ฑด๋“œ๋ฆฌ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ๋งํ•œ๋‹ค. ๋ถ€์ˆ˜ํšจ๊ณผ ์˜ˆ์‹œ๋กœ ๋„คํŠธ์›Œํฌ ์š”์ฒญ(fectch), DOM ์ง์ ‘ ์กฐ์ž‘, ํƒ€์ด๋จธ(setInterval, setTimeout), ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก ๋“ฑ์ด ์žˆ๋‹ค.

subscription์€ ์ด๋Ÿฐ ๋ถ€์ˆ˜ํšจ๊ณผ ์ค‘ ๊ณ„์†ํ•ด์„œ ๋“ค์–ด์˜ค๋Š” ์ด๋ฒคํŠธ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค์–ด์•ผํ•˜๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งํ•˜๋ฉด subscription์ด ์–ด๋–ค ๊ฒƒ๋“ค์ธ์ง€ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๊ฐ„๋‹ค. ์นด์นด์˜คํ†ก๊ณผ ๊ฐ™์€ ๋ฉ”์‹ ์ €๋“ค์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€๋งŒํžˆ ์žˆ์–ด๋„ ์ฑ„ํŒ…์ด๋‚˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋žŒ์ด ์˜ค๋ฉด ์„œ๋ฒ„๊ฐ€ ์ƒˆ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹œ๋กœ ๋ณด๋‚ด์ค€๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€๋งŒํžˆ ์žˆ์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜จ ๊ฒƒ์ด๋‹ค. subscription์€ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€ ์ด๋ฒคํŠธ๋ฅผ ๊ณ„์† ๋“ค์—ˆ๋‹ค๊ฐ€ ์ƒˆ ๋ฉ”์‹œ์ง€๊ฐ€ ์˜ค๋ฉด ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์•„์ฃผ ๋Œ€ํ‘œ์ ์ธ subscription์˜ ์˜ˆ์‹œ์ด๋‹ค. ์ด๋ ‡๋“ฏ ๊ตฌ๋…์€ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ๋์ด ์•„๋‹Œ ๋“ฑ๋กํ•ด๋‘๋ฉด ๊ณ„์† ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๊ทธ๋ž˜์„œ subscription์€ ๊ณ„์† ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ๋‚˜์ค‘์— ํ•ด์ œ(unsubscribe/cleanup)๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

 

- constructor

 

Component – React

The library for web and native user interfaces

react.dev

 

 

  • render( )
    a) ๋ฏธ๋ฆฌ ๊ตฌํ˜„๋œ HTML์„ ํ™”๋ฉด์ƒ์— ๊ทธ๋ ค์ง€๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    b) React๋Š” render๋ฅผ ์–ธ์ œ๋“ ์ง€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํŠน์ • ์‹œ๊ฐ„์— ์‹คํ–‰๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
    c) render( )์•ˆ์—์„œ state ๋ณ€๊ฒฝ(setState)์„ ๊ธˆ์ง€ํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฌดํ•œ ๋ฃจํ”„์˜ ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    d) render ๋ฉ”์„œ๋“œ๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, props, state ๋ฐ context๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.
    e) side effect ํ˜น์€ subscription์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ € API์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
    f) ์—…๋ฐ์ดํŠธ์˜ render์™€ ๋™์ผํ•œ ํ•จ์ˆ˜์ด๋‹ค.
import { Component } from 'react';

class Greeting extends Component {
  render() {
    return <h1>Hello, {this.props.name}!</h1>;
  }
}

 

 

- render

 

Component – React

The library for web and native user interfaces

ko.react.dev

 

 

  • componentDidMount( )
    a) ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋œ ์ดํ›„์— ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ DOM ํŠธ๋ฆฌ์— ์‚ฝ์ž…(๋งˆ์šดํŠธ)์ด ๋˜๋ฉด ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    b) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ๋“ฑ๋ก์— ์‚ฌ์šฉ๋œ๋‹ค.
    c) setTimeout, setInterval, ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๊ฐ™์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
    d) ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๊ตฌ๋…์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ DOM ๋…ธ๋“œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
    e) componentDidMount๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
    f) componentDidMount๊ฐ€ ์ผ๋ถ€ state๋‚˜ props๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด componentDidUpdate๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  componentDidMount๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋˜ ์ž‘์—…์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด componentWillUnmount๋„ ๊ตฌํ˜„ํ•œ๋‹ค.
    g) componentDidMount๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
    h) setState๋ฅผ ์ฆ‰์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ข…์ข… ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ์ฃผ์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

class ChatRoom extends Component {
  state = {
    serverUrl: 'https://localhost:1234'
  };

  componentDidMount() {
    this.setupConnection();
  }

  // ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  componentDidUpdate(prevProps, prevState) {
    if (
      this.props.roomId !== prevProps.roomId ||
      this.state.serverUrl !== prevState.serverUrl
    ) {
      this.destroyConnection();
      this.setupConnection();
    }
  }


  // ํ™”๋ฉด์—์„œ ์ œ๊ฑฐ(๋งˆ์šดํŠธ ํ•ด์ œ)๋˜๊ธฐ ์ „์— ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  componentWillUnmount() {
    this.destroyConnection();
  }

}

 


โ˜… ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์‚ฌ์‹ค 

  • ์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด componentDidMount, componentDidupdate, componentWillUnmount ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๊ฑฐ์˜ ๋ณธ ์ ์ด ์—†์—ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ useEffect, cleanup ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.
  • componentDidMount, componentDidUpdate ๋ฐ componentWillUnmount๋ฅผ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์— ํ•จ๊ป˜ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ useEffect๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์š”์ƒˆ ๋Œ€๋ถ€๋ถ„์€ useEffect๋กœ ์ž‘์„ฑํ•˜์—ฌ ์œ„์˜ ์ฝ”๋“œ๋“ค์€ ๋ณด๊ธฐ ์–ด๋ ค์› ๋‹ค. ์ด ๋ง์€ ์•„๊นŒ ๋งจ ์œ„์— ์ž‘์„ฑํ–ˆ๋˜, 'ํ•จ์ˆ˜ํ˜• + ํ›…์„ ๋„๋ฆฌ ์‚ฌ์šฉํ•œ๋‹ค.'์™€ ๊ฐ™์€ ๋ง์ด๋‹ค.

 

- componentdidmount

 

Component – React

The library for web and native user interfaces

ko.react.dev

 

 

 

 

[Updating - ์—…๋ฐ์ดํŠธ]

  • componentDidUpdate( )
    a) ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒ๋œ ์ดํ›„ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    b) ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ props ๋˜๋Š” state๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ ์งํ›„ React๊ฐ€ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    c) ํ˜„์žฌ props๋ฅผ ์ด์ „ props์™€ ๋น„๊ตํ•˜๋Š” ํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
    d) ์—…๋ฐ์ดํŠธ ํ›„ DOM์„ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    e) ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ prevProps(์—…๋ฐ์ดํŠธ ์ด์ „์˜ props), prevState(์—…๋ฐ์ดํŠธ ์ „ state), snapshot(getSnapshotBeforeUpdate๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ, snapshot์—๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’์„ ํฌํ•จํ•จ)์„ ๊ฐ€์ง„๋‹ค.
    f) ์ด ๋ฉ”์„œ๋“œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    g) setState๋ฅผ ์ฆ‰์‹œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ข…์ข… ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฏ€๋กœ ์ฃผ์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

  componentDidUpdate(prevProps, prevState) {
    if (
      this.props.roomId !== prevProps.roomId ||
      this.state.serverUrl !== prevState.serverUrl
    ) {
      this.destroyConnection();
      this.setupConnection();
    }
  }

 

 

- componentdidupdate

 

Component – React

The library for web and native user interfaces

ko.react.dev

 

 

 

[Unmounting - ์ œ๊ฑฐ]

  • componentWillUnmount( )
    a) ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.
    b) ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰๋œ๋‹ค.
    c) ํƒ€์ด๋จธ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰๋˜๊ณ  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ทจ์†Œํ•˜๋Š” ๋“ฑ์˜ ํด๋ฆฐ์—… ์ž‘์—…์„ ํ•˜๋Š” ๊ฒจ์šฐ ์ˆ˜ํ–‰๋œ๋‹ค.
    d) componentDidMount๊ฐ€ ๊ตฌ๋…์„ ์„ค์ •ํ•˜๋ฉด componentWillUnmount๋Š” ํ•ด๋‹น ๊ตฌ๋…์„ ์ •๋ฆฌํ•ด์•ผํ•œ๋‹ค.
    e) componentWillUnmount์˜ ์ •๋ฆฌ ๋กœ์ง์ด ์ผ๋ถ€ props๋‚˜ state๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์ „ props๋‚˜ state์— ํ•ด๋‹นํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด componentDidUpdate๋„ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.
    f) ์–ด๋–ค ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ, ์–ด๋–ค ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  componentWillUnmount() {
    this.destroyConnection();
  }

 

 

- componentwillunmount

 

Component – React

The library for web and native user interfaces

ko.react.dev




 


 




4. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hook

 

  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • Hook์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ƒํƒœ/๋ถ€์ˆ˜ํšจ๊ณผ ๊ฐ™์€ React ๊ธฐ๋Šฅ์„ ์“ฐ๊ฒŒ ํ•ด์ฃผ๋Š” ํŠน์ˆ˜ํ•œ ํ•จ์ˆ˜์ด๋‹ค.
  • ๋Œ€ํ‘œ์ ์ธ Hook์˜ ์ข…๋ฅ˜
    a) useState : ์ƒํƒœ
    b) useEffect : ๋ถ€์ˆ˜ํšจ๊ณผ/๊ตฌ๋…/์ •๋ฆฌ
    c) useRef : DOM ์ฐธ์กฐ/๊ฐ’ ๋ณด๊ด€
    d) useMemo, useCallback : ์„ฑ๋Šฅ์ตœ์ ํ™”
    e) useContext : ์ „์—ญ์ฒ˜๋Ÿผ ๊ณต์œ ๋˜๋Š” ๊ฐ’ ์ฝ๊ธฐ
    f) useReducer : ๋ณต์žกํ•œ ์ƒํƒœ ๋กœ์ง
import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      {count}
    </button>
  );
}
์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•ด๋ณด์ž. ์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” Counter๊ฐ€ ๋œ๋‹ค. ํ›…์€ useState๊ฐ€ ๋œ๋‹ค. ํ•ด๋‹น ์ฝ”๋“œ์˜ ์›€์ง์ž„์€ ๋ฒ„ํŠผ์„ ํด๋ฆญ์‹œ, ์ƒํƒœ๊ฐ€ ๋ฐ”๋€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด React๊ฐ€ Counter()๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•ด์„œ UI๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฐ๋‹ค.

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ์žฅ(Mount) → ๋ณ€๊ฒฝ(Update) → ์ œ๊ฑฐ(Unmount)์˜ ํ๋ฆ„์„ ๊ฐ–๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ›…์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์€ ์–ด๋–จ๊นŒ? ํ›…์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์†์—์„œ ํ›…์ด ์–ธ์ œ ์‹คํ–‰๋˜๊ณ  ์–ธ์ œ ์ •๋ฆฌ(cleanup)๋˜๋Š”์ง€๊ฐ€ ์ค‘์š”ํ•ด์„œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์™€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์ฒ˜๋Ÿผ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋ณด๊ธด ์–ด๋ ค์šธ ๋“ฏ ํ•˜๋‹ค. ๊ทธ ์ค‘ ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ์žˆ๋‹ค๊ณ  ๋ณด๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ํ›…์€ useEffect์ด๋‹ค. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋” ์ค‘์‹ฌ์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด useEffect๋Š” ๋ Œ๋”๊ฐ€ ํ™”๋ฉด์— ๋ฐ˜์˜๋œ ๋’ค์— ๋ถ™๋Š”๋ฐ ํ›„์ฒ˜๋ฆฌ ์žฅ์น˜๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

Q. Counter๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์ธ ์ด์œ ๋Š”?

A. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” UI๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ผ์„œ return์— <div>...</div>์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” <button>...</button>์„ ์ ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ƒ๊ธด ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„์ด ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผํ•œ๋‹ค. ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•  ๊ฒฝ์šฐ JSX๊ฐ€ HTML ํƒœ๊ทธ์ฒ˜๋Ÿผ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ JSX๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ ๊ฑฐ์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 


 

 

 

 

5. ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ VS ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hook

  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ
import React from "react";

// ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅธ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
// ํ•จ์ˆ˜ํ˜•์€ function Counter๋กœ ์ผ๋‹ค.
// ๋ฆฌ์•กํŠธ๊ฐ€ Counter์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ณ„์† ๋“ค๊ณ ์žˆ๋‹ค.
class Counter extends React.Component {
  state = {
    count: 0,
  };

  handleClick = () => {
    this.setState((prevState) => ({
      count: prevState.count + 1,
    }));
  };

  // ํด๋ž˜์Šคํ˜•์€ ๋ฐ˜๋“œ์‹œ render() ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ return์„ ์จ์•ผํ•œ๋‹ค.
  // ํ•จ์ˆ˜ํ˜•์€ return์ด ๊ณง ๋ Œ๋” ๊ฒฐ๊ณผ์ด๋‹ค.
  render() {
    return (
      <button onClick={this.handleClick}
        // ์ ‘๊ทผํ•  ๋•Œ this.state.count๋กœ ํ•ด์•ผํ•œ๋‹ค.
        // ํ•จ์ˆ˜ํ˜•์€ this ์—†์ด ๊ทธ๋ƒฅ count, setCount ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
        {this.state.count}
      </button>
    );
  }
}

export default Counter;

 

 

  • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ + ํ›…
import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      {count}
    </button>
  );
}