forwardRef
- 부모 컴포넌트에서 자녀 컴포넌트로 Ref를 전달할 때 사용하는 기법
- 특히 부모 컴포넌트가 자녀 컴포넌트의 DOM요소를 접근해야 할 때 유용하게 사용됨
버튼을 클릭하면 input에 focus를 주고싶다면?
- 컴포넌트 안에 ref를 만들고 input 태그 안에 ref 속성을 넣어주면 됨
- ref는 input의 DOM node를 참조하게 되니까 버튼이 클릭될 때마다 focus함수를 호출해주면 됨

input이 아닌 input태그를 담은 하나의 컴포넌트로 만들어져있다면 같은 기능을 어떻게 구현할까?
- 자녀 컴포넌트의 input태그에 ref를 넣어줘야 하기 때문에 부모 컴포넌트의 ref를 자녀 컴포넌트로 전달할 필요가 있음
- 이때 사용할 수 있는게 forwardRef임
- forwardRef를 사용하면 부모 컴포넌트는 마치 기본적인 element에 ref를 전달하듯 자녀 컴포넌트에게 ref를 전달할 수 있음
forwardRef 사용방법
- ref를 전달받고자 하는 자녀 컴포넌트를 React에서 제공하는 forwardRef라는 함수로 감싸주기

- forwardRef로 감싸진 자녀 컴포넌트는 새로운 두번째 인자를 전달 받게 됨(부모에게서 받은 ref)

- 자녀 컴포넌트는 전달받은 ref를 input태그의 ref속성으로 넣어주면 됨

실전 코드 실습
부모 컴포넌트
import { useRef } from "react";
import MyInput from "../components/MyInput";
function ForwardRef() {
const inputRef = useRef();
const focus = () => {
inputRef.current.focus();
};
return (
<div>
<MyInput ref={inputRef} />
<button onClick={focus}>집중</button>
</div>
);
}
export default ForwardRef;
자식 컴포넌트
방식 1
import { forwardRef } from "react";
const MyInput = (props, ref) => {
return <input ref={ref}></input>;
};
export default forwardRef(MyInput);
방식 2
import React, { forwardRef } from "react";
const MyInput = forwardRef((props, ref) => {
return <input ref={ref}></input>;
});
export default MyInput;


- 이렇게 하면 집중버튼 클릭시 input이 잘 focus됨
정리
- 부모 컴포넌트에서 자녀 컴포넌트에게 ref를 전달 할 때 forwardRef를 사용하면
기본적인 element에 ref를 전달하듯 전달해 줄 수 있음
- 재사용성이 높은 자녀 컴포넌트라면 forwardRef를 사용해서 더 유연하게 DOM NODE에 접근할 수 있음
주의할점
- 자녀 컴포넌트의 캡슐화에 대한 장점을 없애버리는 행위라고 볼 수도 있음
- 자녀 컴포넌트의 DOM NODE를 외부로 노출시키는 것이기 때문임
- 굳이 필요하지 않을 때는 forwardRef를 사용하지 않는 것이 좋음