ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react

forwardRef

dev_been94 2024. 12. 16. 11:39
728x90
๋ฐ˜์‘ํ˜•

forwardRef

 

๐ŸŽฏ forwardRef๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

**forwardRef**๋Š” React์—์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.
์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด **"๋ถ€๋ชจ๊ฐ€ ์ž์‹์˜ ํŠน์ • ํƒœ๊ทธ๋‚˜ ์š”์†Œ๋ฅผ ๋ฐ”๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ด์ค€๋‹ค"**๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”.

 

๐Ÿ• ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: ์‹ฌ๋ถ€๋ฆ„๊พผ ์ด์•ผ๊ธฐ

์—ฌ๋Ÿฌ๋ถ„์ด ์นœ๊ตฌํ•œํ…Œ ๋งˆํŠธ์—์„œ ๋ฌผ๊ฑด ์ข€ ์‚ฌ๋‹ค ๋‹ฌ๋ผ๊ณ  ๋ถ€ํƒํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ด์š”.

  • ์—ฌ๋Ÿฌ๋ถ„(๋ถ€๋ชจ)์€ ์นœ๊ตฌ(์ž์‹)ํ•œํ…Œ ์‹ฌ๋ถ€๋ฆ„์„ ์‹œ์ผœ์š”.
  • ๊ทธ๋Ÿฐ๋ฐ ๋ฌผ๊ฑด(์ž…๋ ฅ ์ฐฝ, ๋ฒ„ํŠผ ๋“ฑ DOM ์š”์†Œ)์„ ์‚ฌ ์˜ค๊ฒŒ ํ•  ๋•Œ, ์ง์ ‘ ๊ทธ ๋ฌผ๊ฑด์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ฒ ์ฃ ?
  • ์ด๋•Œ ์นœ๊ตฌ๊ฐ€ ๊ทธ ๋ฌผ๊ฑด์„ "์—ฌ๊ธฐ ์žˆ์–ด!"๋ผ๊ณ  ์ง์ ‘ ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒŒ **forwardRef**์ž…๋‹ˆ๋‹ค.

 

๐Ÿ› ๏ธ forwardRef ์‚ฌ์šฉ๋ฒ•

์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด **forwardRef**๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณผ๊ฒŒ์š”.
๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ input ์š”์†Œ์— ๋ฐ”๋กœ ์ ‘๊ทผํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

 

1. forwardRef๋ฅผ ์‚ฌ์šฉํ•œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

๋จผ์ €, **forwardRef**๋ฅผ ์‚ฌ์šฉํ•ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

import React, { forwardRef } from 'react';

// ์ž์‹ ์ปดํฌ๋„ŒํŠธ
const CustomInput = forwardRef((props, ref) => {
  return <input ref={ref} {...props} placeholder="์—ฌ๊ธฐ์— ์ž…๋ ฅํ•ด๋ณด์„ธ์š”!" />;
});

export default CustomInput;

์„ค๋ช…:

  • forwardRef: ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ **ref**๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
  • ref: ๋ถ€๋ชจ๊ฐ€ ํŠน์ • ์š”์†Œ(์—ฌ๊ธฐ์„œ๋Š” input)๋ฅผ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์ฐธ์กฐ(Reference)์ž…๋‹ˆ๋‹ค.
  • {...props}: ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ์†์„ฑ๋“ค์„ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ด์š”.

 

2. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ref ์‚ฌ์šฉํ•˜๊ธฐ

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ useRef๋ฅผ ์‚ฌ์šฉํ•ด ์ž์‹์˜ input ์š”์†Œ์— ์ ‘๊ทผํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import React, { useRef } from 'react';
import CustomInput from './CustomInput';

function ParentComponent() {
  const inputRef = useRef(null); // ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•  ref ์ƒ์„ฑ

  const focusInput = () => {
    // ์ž์‹์˜ input ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ํฌ์ปค์Šค ์„ค์ •
    inputRef.current.focus();
  };

  return (
    <div>
      <h2>forwardRef ์˜ˆ์ œ</h2>
      <CustomInput ref={inputRef} /> {/* ref ์ „๋‹ฌ */}
      <button onClick={focusInput}>์ž…๋ ฅ์ฐฝ์— ํฌ์ปค์Šคํ•˜๊ธฐ</button>
    </div>
  );
}

export default ParentComponent;

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. ์ž์‹ ์ปดํฌ๋„ŒํŠธ(CustomInput)
    • forwardRef๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ถ€๋ชจ๊ฐ€ ref๋ฅผ ์ž์‹์˜ input์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ(ParentComponent)
    • useRef๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ref๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ **ref.current.focus()**๋ฅผ ํ†ตํ•ด ์ž์‹์˜ input์— ํฌ์ปค์Šค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฒฐ๊ณผ
    • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ž…๋ ฅ์ฐฝ์— ์ž๋™์œผ๋กœ ํฌ์ปค์Šค๊ฐ€ ๋งž์ถฐ์ง‘๋‹ˆ๋‹ค.

 

๐Ÿš€ ์‹คํ–‰ ๊ฒฐ๊ณผ

  1. ํ™”๋ฉด์— ์ž…๋ ฅ์ฐฝ๊ณผ "์ž…๋ ฅ์ฐฝ์— ํฌ์ปค์Šคํ•˜๊ธฐ" ๋ฒ„ํŠผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  2. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ž…๋ ฅ์ฐฝ์— ์ž๋™์œผ๋กœ ํฌ์ปค์Šค๊ฐ€ ๋งž์ถฐ์ ธ์š”.

 

๐ŸŒŸ forwardRef๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  1. DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ
    • ์ž…๋ ฅ์ฐฝ์— ํฌ์ปค์Šค๋ฅผ ์ฃผ๊ฑฐ๋‚˜, ํŠน์ • DOM ์š”์†Œ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ์š”์†Œ๋ฅผ ๋ถ€๋ชจ๊ฐ€ ์ œ์–ดํ•  ๋•Œ
    • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ์š”์†Œ๋ฅผ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•ด์š”.
  3. ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์„ฑ
    • forwardRef๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

๐Ÿšจ ์ฃผ์˜ํ•  ์ 

  • ref๋Š” DOM ์š”์†Œ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
    forwardRef๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€๋ชจ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ DOM ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ง์ ‘ DOM ์กฐ์ž‘์€ ์ตœ์†Œํ™”ํ•˜์„ธ์š”.
    React์˜ ๊ธฐ๋ณธ ์›์น™์€ **"์„ ์–ธํ˜• UI"**์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ์ž์ฃผ DOM์„ ์กฐ์ž‘ํ•˜๋ฉด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

 

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌ

React์˜ **forwardRef**๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ DOM ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.

  • ์ž์‹์ด ๋ถ€๋ชจ์—๊ฒŒ ref๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์š”.
  • ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ž…๋ ฅ์ฐฝ์— ํฌ์ปค์Šค๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ์กฐ์ž‘์ด ํ•„์š”ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ต๋‹ˆ๋‹ค.
728x90
๋ฐ˜์‘ํ˜•

'web > react' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

memo  (2) 2024.12.16
lazy  (0) 2024.12.16
createContext  (0) 2024.12.16
cache  (0) 2024.12.16
act  (2) 2024.12.16
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/08   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250