Post

๐Ÿฅœ [React] Frontend ๊ธฐ์ˆ ๋ฉด์ ‘ (React)

ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” ํ”„๋ก ํŠธ์•ค๋“œ์˜ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์ค‘ ๋ฆฌ์•กํŠธ์— ๋Œ€ํ•ด ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃจ๋Š” ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹ค.

React

React ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Q.

React๋Š” Facebook์—์„œ ๊ฐœ๋ฐœํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

React๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉ,

์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ

React์˜ ์›๋ฆฌ, ํŠน์ง•, ์žฅ๋‹จ์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

Q.

React ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

1) Virtual-DOM

ํŽ˜์ด์ง€๋ฅผ ๋žœ๋”๋ง ํ•  ๋•Œ ์‹ค์ œ DOM tree ์˜ ๋ณ€๋™์ด ์ผ์–ด๋‚  ์‹œ ๋ชจ๋“  ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ React ๋Š” ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒ DOM ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜์—ฌ

๋ณ€๊ฒฝ ๋œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM ์— ์ ์šฉ์‹œ์ผœ ๋ถˆํ•„์š”ํ•œ Rerendering ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

2) JSX ๋ฌธ๋ฒ•

JavaScript ์•ˆ์— HTML ๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ๊ตฌ๋ฌธ์„ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ์–ด

์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๊ณ  ์žฌ์ƒ์‚ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•จ

๋ผ์ดํ”„์‚ฌ์ดํด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Q.

๋ฆฌ์•กํŠธ์—์„œ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์ฃผ๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€๋ฅผ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1) ๋งˆ์šดํŒ… (Mounting) : ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM ์— ์‚ฝ์ž… ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋‹จ๊ณ„

ex) constructor(), render(), componentDidMount()

2) ์—…๋ฐ์ดํŒ… (Updating) : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ณ  DOM ์— Re-rendering ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋‹จ๊ณ„

ex) render(), componentDidMount()

3) ์–ธ๋งˆ์šดํŒ… (Unmounting) : ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM ์—์„œ ์ œ๊ฑฐ ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋‹จ๊ณ„

ex) componentWillUnmount()

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ์žฅ์ ์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Q.

1) ๊ฐ„๊ฒฐ์„ฑ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•„์š”ํ•œ boilerplate ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค์–ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ฝ”๋“œ ์–‘์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

2) ์žฌ์‚ฌ์šฉ์„ฑ

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

3) ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ์ž…๋ ฅ๊ฐ’(props)์„ ๋ฐ›์•„ ์ถœ๋ ฅ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜ ์ด๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉฐ ์ž…๋ ฅ๊ฐ’์„ ์ฃผ๊ณ  ์˜ˆ์ƒ ์ถœ๋ ฅ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.

React-Hook ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์„ธ์š”.

Q.

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ(state) ๊ด€๋ฆฌ์™€ React์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋˜ํ•œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™” ์‹œ์ผœ์ค๋‹ˆ๋‹ค.

1) useState : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

2) useEffect : ๋žœ๋”๋ง ์‹œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ DOM ์กฐ์ž‘, ์ƒ๋ช…์ฃผ๊ธฐํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•จ

3) useCallback : ํ•จ์ˆ˜๋ฅผ ์บ์‹ฑํ•˜์—ฌ ๋žœ๋”๋ง ์‹œ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•˜์ง€ ์•Š์Œ

4) useMemo : ๊ณ„์‚ฐ๋น„์šฉ์ด ํฐ ๊ฐ’์„ ์บ์‹ฑํ•˜์—ฌ ๋žœ๋”๋ง ์‹œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก ํ•จ

5) useRef : DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•  ๋•Œ ์‚ฌ์šฉ

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š”?

Q.

1) componentDidMount

1
2
3
4
5
6
7
8
9
10
11
12
// ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ
class ExampleComponent extends React.Component {
  componentDidMount() {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ ํ›„์— ์‹คํ–‰๋˜๋Š” ์ž‘์—…
  }
}
// ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ
function ExampleComponent() {
  useEffect(() => {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋œ ํ›„์— ์‹คํ–‰๋˜๋Š” ์ž‘์—…
  }, []);
}

2) componentDidUpdate

1
2
3
4
5
6
7
8
9
10
11
12
13
// ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ
class ExampleComponent extends React.Component {
  componentDidUpdate(prevProps, prevState) {
    // ์ปดํฌ๋„ŒํŠธ์˜ props ๋˜๋Š” state๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…
  }
}

// ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ
function ExampleComponent({ prop }) {
  useEffect(() => {
    // ์ปดํฌ๋„ŒํŠธ์˜ props๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…
  }, [prop]);
}

3) componentWillUnmount

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ
class ExampleComponent extends React.Component {
  componentWillUnmount() {
    // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…
  }
}

// ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ
function ExampleComponent() {
  useEffect(() => {
    return () => {
      // ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…
    };
  }, []);
}

Props Drilling ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Q. Props Drilling ์€ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ props ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•จ

์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•ด ์‚ฌ์šฉ

์žฅ์ 

๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ๋ช…ํ™•ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋‚ฎ์•„์ง€๋ฏ€๋กœ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

์ค‘๊ฐ„์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ฐ์ดํ„ฐ์— ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€

๊ณ„์†ํ•ด์„œ ์ „๋‹ฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์งˆ์ˆ˜๋ก Props Drilling์ด ๋” ๊นŠ์–ด์งˆ ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React ์—์„œ Key Props ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Q.

ํ•ด๋‹น ์ด์œ ๋Š” React ์˜ Virtual DOM ์— ๊ทธ ์ด์œ ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ DOM ์— ๋ฐ˜์˜ํ•˜๊ธฐ ์ „์— ์ด์ „ Virtual DOM ๊ณผ ๋น„๊ต๋ฅผ ํ•˜๋Š”๋ฐ,

key ๊ฐ’์„ list ์— ์ œ๊ณตํ•˜๋ฉด ํšจ์œจ์ ์œผ๋กœ ๋น„๊ตํ•˜์—ฌ ๊ด€๋ฆฌ ๋ฐ ๋žœ๋”๋ง์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.