๊ด€๋ฆฌ ๋ฉ”๋‰ด

Daehyunii's Dev-blog

ref: DOM์— ์ด๋ฆ„ ๋‹ฌ๊ธฐ ๋ณธ๋ฌธ

๐Ÿ“š Language & CS knowledge/React

ref: DOM์— ์ด๋ฆ„ ๋‹ฌ๊ธฐ

Daehyunii 2022. 12. 22. 03:27
ref : DOM์— ์ด๋ฆ„ ๋‹ฌ๊ธฐ

1. ref๋Š” ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

  ref๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ํ•œ ๋ฌธ์žฅ์œผ๋กœ 'DOM์„ ๊ผญ ์ง์ ‘์ ์œผ๋กœ ๊ฑด๋“œ๋ ค์•ผ ํ•  ๋•Œ'์ด๋‹ค. ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ DOM ์š”์†Œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š”๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” DOM์„ ์ง์ ‘ ๊ฑด๋“œ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ต‰์žฅํžˆ ๋งŽ์•˜์ง€๋งŒ, ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๊ตณ์ด DOM์— ์ ‘๊ทผํ•˜์ง€ ์•Š์•„๋„ state๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. 

2. DOM์„ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ์–ธ์ œ์ผ๊นŒ?

  • ํŠน์ • input์— ํฌ์ปค์Šค ์ฃผ๊ธฐ
  • ์Šคํฌ๋กค ๋ฐ•์Šค ์กฐ์ž‘ํ•˜๊ธฐ
  • canvas ์š”์†Œ์— ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ 

๋“ฑ ๋งŽ์€ ์ƒํ™ฉ์ด ์žˆ๊ณ  ์–ด์ฉ” ์ˆ˜ ์—†์ด DOM์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ref๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

3. ref ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

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

 

1. callbackํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ref ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

  ref๋ฅผ ๋‹ฌ๊ณ ์ž ํ•˜๋Š” ์š”์†Œ์— ref๋ผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ props๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ref ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›๊ณ , ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ref๋ฅผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•ด ์ค€๋‹ค.

<input ref={(ref) => {this.input=ref}} />

 

2. createRef๋ฅผ ํ†ตํ•œ ref ์„ค์ •

  ์ด ๋ฐฉ๋ฒ•์€ ๋ฆฌ์•กํŠธ์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” createRef ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. createRef๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ref๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์šฐ์„  ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ React.createRef( )๋ฅผ ๋‹ด์•„ ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ref๋ฅผ ๋‹ฌ๊ณ ์ž ํ•˜๋Š” ์š”์†Œ์— ref props๋กœ ๋„ฃ์–ด ์ฃผ๋ฉด ref ์„ค์ •์ด ์™„๋ฃŒ๋œ๋‹ค.

import { Component } from 'react';

class Practice extends Component {
  input = React.createRef();

  handleFocus = () => {
    this.input.current.focus();
  }

  render() {
    return (
      <div>
        <input ref={this.input} />
      </div>
    )
  }
}

export default Practice;

  ์ฐธ๊ณ ๋กœ ref๋ฅผ ์„ค์ •ํ•ด ์ค€ DOM์— ์ ‘๊ทผํ•˜๋ ค๋ฉด this.input.current๋กœ ์กฐํšŒํ•ด์•ผ ํ•œ๋‹ค.

 

3. ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ref ๋‹ฌ๊ธฐ

 

  ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ref๋ฅผ ๋‹ฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” useRef Hook์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ createRef์™€ ์œ ์‚ฌํ•˜๋‹ค.

 

4. ์ฃผ์˜์‚ฌํ•ญ

  ์œ„์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ DOM์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ ref๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋จผ์ € ref๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ฌ์ „์— ๊ณ ๋ คํ•œ ํ›„์— ํ™œ์šฉํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด๋ฉด ์ข‹๋‹ค. ์ฐธ๊ณ ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต๋ฅ˜ํ•  ๋•Œ ref๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋Š” ์ž˜๋ชป๋œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฌผ๋ก  ๊ฐ€๋Šฅ์€ ํ•˜์ง€๋งŒ ์•ฑ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ŠคํŒŒ๊ฒŒํ‹ฐ์ฝ”๋“œ๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด ์งˆ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต๋ฅ˜ํ•  ๋•Œ๋Š” ์–ธ์ œ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ -> ์ž์‹ ํ๋ฆ„์œผ๋กœ ๊ต๋ฅ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์„ค๊ณ„์ด๋‹ค.