React forwardRef์ ๋ชฉ์ , ๊ตฌํ, ์ฌ์ฉ ์ฌ๋ก, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
React forwardRef: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ์ํ Ref ์ ๋ฌ ๋ง์คํฐํ๊ธฐ
React์ ์ธ๊ณ์์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์กฐํฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ํ์ง๋ง ๋๋ก๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ DOM ๋
ธ๋์ ์ ๊ทผํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ก ์ด๋ React.forwardRef
๊ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ forwardRef
์ ๋ณต์กํ ๋ด์ฉ์ ๊น์ด ํ๊ณ ๋ค์ด ๊ทธ ๋ชฉ์ , ๊ตฌํ, ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค๋ช
ํฉ๋๋ค.
Ref ์ ๋ฌ์ด๋ ๋ฌด์์ธ๊ฐ์?
Ref ์ ๋ฌ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ DOM ๋ ธ๋๋ React ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ React ๊ธฐ์ ์ ๋๋ค. ๋ณธ์ง์ ์ผ๋ก, ์ด๋ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ ref๋ฅผ ๊ทธ ์์ ์ค ํ๋์๊ฒ "์ ๋ฌ"ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ ๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ๊ฑฐ๋ ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๋ ๋ฑ ์์ ์ปดํฌ๋ํธ์ DOM์ ์ง์ ์กฐ์ํด์ผ ํ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
forwardRef
์์ด๋ ref๋ฅผ DOM ์๋ฆฌ๋จผํธ๋ ํด๋์ค ์ปดํฌ๋ํธ์๋ง ์ง์ ๋ถ์ผ ์ ์์ต๋๋ค. ํจ์ํ ์ปดํฌ๋ํธ๋ ์ง์ ref๋ฅผ ๋ฐ๊ฑฐ๋ ๋
ธ์ถํ ์ ์์ต๋๋ค.
forwardRef
๋ฅผ ์ฌ์ฉํ๋ ์ด์
๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ์๋๋ฆฌ์ค์์ forwardRef
์ฌ์ฉ์ด ํ์ํฉ๋๋ค:
- DOM ์กฐ์: ์์ ์ปดํฌ๋ํธ์ DOM๊ณผ ์ง์ ์ํธ์์ฉํด์ผ ํ ๋. ์๋ฅผ ๋ค์ด, ์ ๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ์ค์ ํ๊ฑฐ๋, ์ ๋๋ฉ์ด์ ์ ํธ๋ฆฌ๊ฑฐํ๊ฑฐ๋, ์๋ฆฌ๋จผํธ๋ฅผ ์ธก์ ํ ๋์ ๋๋ค.
- ์ถ์ํ: ์ปค์คํฐ๋ง์ด์ง์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ์ ํตํฉ์ ์ํด ํน์ DOM ์๋ฆฌ๋จผํธ๋ฅผ ๋ ธ์ถํด์ผ ํ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋์ ๋๋ค.
- ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOCs): ์ปดํฌ๋ํธ๋ฅผ HOC๋ก ๊ฐ์ธ๊ณ ref๊ฐ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋๋ก ํด์ผ ํ ๋์ ๋๋ค.
- ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ ๋, ref ์ ๋ฌ์ ํตํด ๊ฐ๋ฐ์๋ค์ด ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ DOM ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ๊ณ ์ปค์คํฐ๋ง์ด์งํ ์ ์๊ฒ ํ์ฌ ๋ ํฐ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
forwardRef
์ ์๋ ๋ฐฉ์
React.forwardRef
๋ ๋ ๋๋ง ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์
๋๋ค. ์ด ๋ ๋๋ง ํจ์๋ props
์ ref
๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ ๋๋ง ํจ์๋ React ์๋ฆฌ๋จผํธ๋ฅผ ๋ฐํํฉ๋๋ค. ref
์ธ์๋ ๋ถ๋ชจ๋ก๋ถํฐ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ ref์
๋๋ค. ์ด ref๋ฅผ ๋ ๋๋ง ํจ์ ๋ด์ ์์ ์ปดํฌ๋ํธ์ ๋ถ์ผ ์ ์์ต๋๋ค.
๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ๋๋๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ
useRef
๋ฅผ ์ฌ์ฉํ์ฌ ref๋ฅผ ์์ฑํฉ๋๋ค. - ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ref๋ฅผ ์์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ์ ๋ฌํฉ๋๋ค.
- ์์ ์ปดํฌ๋ํธ๋
React.forwardRef
๋ก ๊ฐ์ธ์ง๋๋ค. forwardRef
์ ๋ ๋๋ง ํจ์ ๋ด๋ถ์์ ref๊ฐ DOM ์๋ฆฌ๋จผํธ๋ ๋ค๋ฅธ React ์ปดํฌ๋ํธ์ ๋ถ์ฌ์ง๋๋ค.- ์ด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ref๋ฅผ ํตํด DOM ๋ ธ๋๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
forwardRef
๊ตฌํํ๊ธฐ: ์ค์ฉ์ ์ธ ์์
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์
๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ ์ ์๋๋ก ํ๋ ์ปค์คํ
์
๋ ฅ ์ปดํฌ๋ํธ๋ผ๋ ๊ฐ๋จํ ์์ ๋ก forwardRef
๋ฅผ ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
์์ : Ref ์ ๋ฌ์ ์ฌ์ฉํ๋ ์ปค์คํ ์ ๋ ฅ ์ปดํฌ๋ํธ
๋จผ์ , ์ปค์คํ ์ ๋ ฅ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค:
import React, { forwardRef } from 'react';
const CustomInput = forwardRef((props, ref) => {
return (
<div>
<label htmlFor={props.id}>{props.label}</label>
<input type="text" id={props.id} ref={ref} {...props} />
</div>
);
});
CustomInput.displayName = "CustomInput"; // ๋ ๋์ ๋๋ฒ๊น
์ ์ํด ๊ถ์ฅ๋ฉ๋๋ค
export default CustomInput;
์ด ์์ ์์๋:
- 'react'์์
forwardRef
๋ฅผ ๊ฐ์ ธ์ต๋๋ค. - ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ
forwardRef
๋ก ๊ฐ์๋๋ค. forwardRef
ํจ์๋props
์ref
๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.ref
๋ฅผ<input>
์๋ฆฌ๋จผํธ์ ๋ถ์ ๋๋ค.- React ๊ฐ๋ฐ์ ๋๊ตฌ์์ ๋ ๋์ ๋๋ฒ๊น
์ ์ํด
displayName
์ ์ค์ ํฉ๋๋ค.
์ด์ ์ด ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ๋ณด๊ฒ ์ต๋๋ค:
import React, { useRef, useEffect } from 'react';
import CustomInput from './CustomInput';
const ParentComponent = () => {
const inputRef = useRef(null);
useEffect(() => {
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ์
๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ์ค๋๋ค
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return (
<div>
<CustomInput label="์ด๋ฆ:" id="name" ref={inputRef} placeholder="์ด๋ฆ์ ์
๋ ฅํ์ธ์" />
</div>
);
};
export default ParentComponent;
์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ์์๋:
useRef
๋ฅผ ์ฌ์ฉํ์ฌ ref๋ฅผ ์์ฑํฉ๋๋ค.inputRef
๋ฅผCustomInput
์ปดํฌ๋ํธ์ref
prop์ผ๋ก ์ ๋ฌํฉ๋๋ค.useEffect
ํ ๋ด๋ถ์์inputRef.current
๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ DOM ๋ ธ๋์ ์ ๊ทผํ๊ณfocus()
๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
ParentComponent
๊ฐ ๋ง์ดํธ๋๋ฉด, CustomInput
์ปดํฌ๋ํธ์ ์
๋ ฅ ํ๋์ ์๋์ผ๋ก ํฌ์ปค์ค๊ฐ ๋ง์ถฐ์ง๋๋ค.
forwardRef
์ ์ฌ์ฉ ์ฌ๋ก
๋ค์์ forwardRef
๊ฐ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ ์ผ๋ฐ์ ์ธ ์ฌ๋ก๋ค์
๋๋ค:
1. ์ ๋ ฅ ํ๋์ ํฌ์ปค์ค ์ฃผ๊ธฐ
์์ ์์ ์์ ๋ณด์ฌ์ค ๊ฒ์ฒ๋ผ, forwardRef
๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์
๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ์ค ์ ์์ด ์์ ์ ํจ์ฑ ๊ฒ์ฌ, ์ ๊ทผ์ฑ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ ํฅ์์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ค๋ฅ๊ฐ ์๋ ์์์ ์ ์ถํ ํ, ์ค๋ฅ๊ฐ ์๋ ์ฒซ ๋ฒ์งธ ์
๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ์ฃผ์ด ์ฌ์ฉ์๋ฅผ ์๋ดํ ์ ์์ต๋๋ค.
2. ์๋ฆฌ๋จผํธ ํฌ๊ธฐ ์ธก์
forwardRef
๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ปดํฌ๋ํธ์ DOM ๋
ธ๋์ ์ ๊ทผํ๊ณ ๊ทธ ํฌ๊ธฐ(๋๋น, ๋์ด ๋ฑ)๋ฅผ ์ธก์ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ์ํ ๋ ์ด์์, ๋์ ํฌ๊ธฐ ์กฐ์ ๋ฐ ์ปค์คํ
์ ๋๋ฉ์ด์
์ ๋ง๋๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ํ์ด์ง์ ๋ค๋ฅธ ์๋ฆฌ๋จผํธ ๋ ์ด์์์ ์กฐ์ ํ๊ธฐ ์ํด ๋์ ์ฝํ
์ธ ์์ญ์ ๋์ด๋ฅผ ์ธก์ ํด์ผ ํ ์ ์์ต๋๋ค.
3. ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํตํฉ
๋ง์ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๊ธฐํ๋ ๊ตฌ์ฑ์ ์ํด DOM ๋
ธ๋์ ์ง์ ์ ๊ทผํด์ผ ํฉ๋๋ค. forwardRef
๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ React ์ปดํฌ๋ํธ์ ์ํํ๊ฒ ํตํฉํ ์ ์์ต๋๋ค. ์ฐจํธ๋ฅผ ๋ ๋๋งํ ๋์์ผ๋ก DOM ์๋ฆฌ๋จผํธ๊ฐ ํ์ํ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์์ํด ๋ณด์ธ์. forwardRef
๋ ๊ทธ DOM ์๋ฆฌ๋จผํธ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ณตํ ์ ์๊ฒ ํด์ค๋๋ค.
4. ์ ๊ทผ์ฑ ์๋ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
์ ๊ทผ์ฑ์ ์ข
์ข
DOM ์์ฑ์ ์ง์ ์ ์ธ ์กฐ์์ด๋ ํฌ์ปค์ค ๊ด๋ฆฌ๋ฅผ ํ์๋ก ํฉ๋๋ค. forwardRef
๋ ์ ๊ทผ์ฑ ํ์ค์ ์ค์ํ๋ ์ ๊ทผ์ฑ ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์
๋ ฅ ํ๋๋ฅผ ์ค๋ฅ ๋ฉ์์ง์ ์ฐ๊ฒฐํ๊ธฐ ์ํด aria-describedby
์์ฑ์ ์ค์ ํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ์
๋ ฅ ํ๋์ DOM ๋
ธ๋์ ์ง์ ์ ๊ทผํด์ผ ํฉ๋๋ค.
5. ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOCs)
HOC๋ฅผ ๋ง๋ค ๋, ref๊ฐ ๋ํ๋ ์ปดํฌ๋ํธ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋๋ก ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. forwardRef
๋ ์ด๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์ถ๊ฐํ๋ HOC๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. forwardRef
๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ์ผ์ด ์ ์ฉ๋ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ ๋ชจ๋ ref๊ฐ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋ฉ๋๋ค.
forwardRef
์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
forwardRef
๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ธ์:
1. ๋๋ฒ๊น
์ ์ํด displayName
์ฌ์ฉ
forwardRef
์ปดํฌ๋ํธ์๋ ํญ์ displayName
์์ฑ์ ์ค์ ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด React ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ์ฝ๊ฒ ์๋ณํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
CustomInput.displayName = "CustomInput";
2. ์ฑ๋ฅ์ ์ ์
forwardRef
๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ถํ์ํ DOM ์กฐ์์ ํผํ๊ณ ๋ ๋๋ง ๋ก์ง์ ์ต์ ํํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋กํ์ผ๋งํ์ฌ ref ์ ๋ฌ๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ธ์.
3. ์ ์คํ๊ฒ Ref ์ฌ์ฉ
Ref๋ฅผ React์ ๋ฐ์ดํฐ ํ๋ฆ์ ๋์ฒดํ๋ ์๋จ์ผ๋ก ์ฌ์ฉํ์ง ๋ง์ธ์. Ref๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง, ์ฆ DOM ์กฐ์์ด๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํตํฉ์ ์ํด ๋๋ฌผ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ปดํฌ๋ํธ ๋ฐ์ดํฐ ๋ฐ ๋์ ๊ด๋ฆฌ๋ props์ state์ ์์กดํ์ธ์.
4. ์ปดํฌ๋ํธ ๋ฌธ์ํ
์ปดํฌ๋ํธ์์ forwardRef
๋ฅผ ์ธ์ , ์ ์ฌ์ฉํ๋์ง ๋ช
ํํ๊ฒ ๋ฌธ์ํํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ปดํฌ๋ํธ ์ฌ์ฉ ๋ฐฉ๋ฒ ์์ ์ ์ ๋ฌ๋ ref์ ๋ชฉ์ ์ ํฌํจํ์ธ์.
5. ๋์ ๊ณ ๋ ค
forwardRef
๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์, ๋ ์ ์ ํ ์ ์๋ ๋์์ ์ธ ํด๊ฒฐ์ฑ
์ด ์๋์ง ๊ณ ๋ คํด ๋ณด์ธ์. ์๋ฅผ ๋ค์ด, DOM์ ์ง์ ์กฐ์ํ๋ ๋์ props์ state๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๋์์ ๋ฌ์ฑํ ์ ์์์ง๋ ๋ชจ๋ฆ
๋๋ค. forwardRef
์ ์์กดํ๊ธฐ ์ ์ ๋ค๋ฅธ ์ต์
์ ํ์ํด ๋ณด์ธ์.
forwardRef
์ ๋์
forwardRef
๊ฐ ref ์ ๋ฌ์ ์ํ ์ต์์ ํด๊ฒฐ์ฑ
์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, ํน์ ์ํฉ์์๋ ๊ณ ๋ คํด ๋ณผ ๋งํ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค:
1. ์ฝ๋ฐฑ Ref
์ฝ๋ฐฑ ref๋ DOM ๋
ธ๋์ ์ ๊ทผํ๋ ๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ref
prop์ ์ ๋ฌํ๋ ๋์ , DOM ๋
ธ๋๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด๋ฅผ ํตํด DOM ๋
ธ๋๊ฐ ๋ถ๊ฑฐ๋ ๋จ์ด์ง ๋ ์ปค์คํ
๋ก์ง์ ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋ฐฑ ref๋ forwardRef
๋ณด๋ค ๋ ์ฅํฉํ๊ณ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
const MyComponent = () => {
let inputElement = null;
const setInputElement = (element) => {
inputElement = element;
};
useEffect(() => {
if (inputElement) {
inputElement.focus();
}
}, []);
return <input type="text" ref={setInputElement} />;
};
2. ์ปดํฌ์ง์ (Composition)
๊ฒฝ์ฐ์ ๋ฐ๋ผ, forwardRef
๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํ์ฌ ์ํ๋ ๋์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ๋ก ๋๋๊ณ , props๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋์์ ์ ๋ฌํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ปดํฌ์ง์
์ ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ ํ
์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ก ์ด์ด์ง ์ ์์ง๋ง, ๋ชจ๋ ์๋๋ฆฌ์ค์ ์ ํฉํ์ง๋ ์์ ์ ์์ต๋๋ค.
3. ๋ ๋ ํ๋กญ์ค(Render Props)
๋ ๋ ํ๋กญ์ค๋ ๊ฐ์ด ํจ์์ธ prop์ ์ฌ์ฉํ์ฌ React ์ปดํฌ๋ํธ ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ ๋ ํ๋กญ์ค๋ฅผ ์ฌ์ฉํ์ฌ DOM ๋ ธ๋๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ ธ์ถํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ ํ๋กญ์ค๋ ์ฝ๋๋ฅผ ๋ ๋ณต์กํ๊ณ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ผ๋ฉฐ, ํนํ ์ฌ๋ฌ ๋ ๋ ํ๋กญ์ค๋ฅผ ๋ค๋ฃฐ ๋ ๊ทธ๋ ์ต๋๋ค.
ํผํด์ผ ํ ์ผ๋ฐ์ ์ธ ์ค์
forwardRef
๋ก ์์
ํ ๋, ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ค์๋ฅผ ํผํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
1. displayName
์ค์ ์๊ธฐ
์์ ์ธ๊ธํ๋ฏ์ด, displayName
์์ฑ ์ค์ ์ ์์ผ๋ฉด ๋๋ฒ๊น
์ด ์ด๋ ค์์ง ์ ์์ต๋๋ค. ํญ์ forwardRef
์ปดํฌ๋ํธ์ displayName
์ ์ค์ ํ์ธ์.
2. Ref ๋จ์ฉ
๋ชจ๋ ๊ฒ์ ref๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ ํน์ ๋ฌผ๋ฆฌ์น์ธ์. Ref๋ ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง, ์ฆ DOM ์กฐ์์ด๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํตํฉ์ ์ํด ๋๋ฌผ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ปดํฌ๋ํธ ๋ฐ์ดํฐ ๋ฐ ๋์ ๊ด๋ฆฌ๋ props์ state์ ์์กดํ์ธ์.
3. ํ๋นํ ์ด์ ์์ด DOM ์ง์ ์กฐ์
์ง์ ์ ์ธ DOM ์กฐ์์ ์ฝ๋๋ฅผ ์ ์ง๋ณด์ํ๊ณ ํ ์คํธํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง DOM์ ์กฐ์ํ๊ณ ๋ถํ์ํ DOM ์ ๋ฐ์ดํธ๋ฅผ ํผํ์ธ์.
4. Null Ref ์ฒ๋ฆฌํ์ง ์๊ธฐ
๊ธฐ๋ณธ DOM ๋ ธ๋๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์ ๊ทผํ๊ธฐ ์ ์ ํญ์ ref๊ฐ null์ธ์ง ํ์ธํ์ธ์. ์ด๋ ์ปดํฌ๋ํธ๊ฐ ์์ง ๋ง์ดํธ๋์ง ์์๊ฑฐ๋ ๋ง์ดํธ ํด์ ๋์์ ๋ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
if (inputRef.current) {
inputRef.current.focus();
}
5. ์ํ ์์กด์ฑ ์์ฑ
forwardRef
๋ฅผ HOC๋ ๋ ๋ ํ๋กญ์ค์ ๊ฐ์ ๋ค๋ฅธ ๊ธฐ์ ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋๋ ์ฃผ์ํ์ธ์. ์ปดํฌ๋ํธ ๊ฐ์ ์ํ ์์กด์ฑ์ ๋ง๋ค์ง ์๋๋ก ํ์ธ์. ์ด๋ ์ฑ๋ฅ ๋ฌธ์ ๋ ์๊ธฐ์น ์์ ๋์์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ ์ธ๊ณ์ ์์
React์ forwardRef
์ ์์น์ ๋ณดํธ์ ์ด์ง๋ง, ๋ค๋ฅธ ์ง์ญ์ ๊ฐ๋ฐ์๋ค์ด ๊ทธ ์ฌ์ฉ๋ฒ์ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์๋์ง ์๊ฐํด ๋ณด์ธ์:
- ํ์งํ ๋ฐ ๊ตญ์ ํ(i18n): ์ ๋ฝ์ด๋ ์์์์์ ๋ค๊ตญ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ๊ฐ๋ฐ์๋ค์
forwardRef
๋ฅผ ์ฌ์ฉํ์ฌ ํ์งํ๋ ํ ์คํธ ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๊ณ ๋ค๋ฅธ ์ธ์ด์ ๋ง๊ฒ ๋ ์ด์์์ ๋์ ์ผ๋ก ์กฐ์ ํ์ฌ ํ ์คํธ๊ฐ ์ปจํ ์ด๋๋ฅผ ๋์น์ง ์๋๋ก ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ์ผ์ด ๋จ์ด๋ ์์ด ๋จ์ด๋ณด๋ค ๊ธด ๊ฒฝํฅ์ด ์์ด ์กฐ์ ์ด ํ์ํฉ๋๋ค. - ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ๋ ์ด์์: ์ค๋ ๋ฐ ์์์ ์ผ๋ถ ์ง์ญ์์๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ข
์ข
RTL ๋ ์ด์์์ ์ง์ํด์ผ ํฉ๋๋ค.
forwardRef
๋ ํ์ฌ ๋ ์ด์์ ๋ฐฉํฅ์ ๋ฐ๋ผ ์๋ฆฌ๋จผํธ์ ์์น๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. - ๋ค์ํ ์ฌ์ฉ์๋ฅผ ์ํ ์ ๊ทผ์ฑ: ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ์ฑ์ ์ ์ ๋ ์ค์ํ ๊ด์ฌ์ฌ๊ฐ ๋๊ณ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ค์
forwardRef
๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ฅผ ์ํ ์ ๊ทผ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ํด ์๋ฆฌ๋จผํธ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํฌ์ปค์ค๋ฅผ ์ฃผ๊ฑฐ๋ ์์ ํ๋์ ํญ ์์๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ ๋๋ค. - ์ง์ญ๋ณ API์์ ํตํฉ: ์ง์ญ API(์: ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด, ์ง๋ ์๋น์ค)์ ํตํฉํ๋ ๊ฐ๋ฐ์๋ค์ ํด๋น API์์ ์๊ตฌํ๋ DOM ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ๊ธฐ ์ํด
forwardRef
๋ฅผ ์ฌ์ฉํ์ฌ ํธํ์ฑ๊ณผ ์ํํ ํตํฉ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React.forwardRef
๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์กฐํฉ ๊ฐ๋ฅํ React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์์ DOM ๋
ธ๋๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๊ฒ ํจ์ผ๋ก์จ, forwardRef
๋ DOM ์กฐ์์์๋ถํฐ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํตํฉ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ด๋ฒ์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช
ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, forwardRef
๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ์ผ๋ฐ์ ์ธ ์ค์๋ฅผ ํผํ ์ ์์ต๋๋ค. Ref๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ , ์ปดํฌ๋ํธ๋ฅผ ๋ช
ํํ๊ฒ ๋ฌธ์ํํ๋ฉฐ, ์ ์ ํ ๊ฒฝ์ฐ ๋์์ ์ธ ํด๊ฒฐ์ฑ
์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. forwardRef
์ ๋ํ ํ์คํ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ฐํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.