๊ณ ๊ธ React ref ์ ๋ฌ ๊ธฐ์ ์ ํ์ํ์ฌ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ API๋ฅผ ๋ง๋์ธ์. ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์์ ์ปค์คํ ์ ๋ ฅ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ์ค์ฉ์ ์ธ ํจํด์ ๋ฐฐ์๋ณด์ธ์.
React Ref ์ ๋ฌ ํจํด: ์ปดํฌ๋ํธ API ๋์์ธ ๋ง์คํฐํ๊ธฐ
Ref ์ ๋ฌ์ React์ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก, ์ปดํฌ๋ํธ๋ฅผ ํตํด ์์ ์ปดํฌ๋ํธ ์ค ํ๋์ ref๋ฅผ ์๋์ผ๋ก ์ ๋ฌํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ๊ฐ ๊น๊ฒ ์ค์ฒฉ๋์ด ์๋๋ผ๋ ๊ทธ ์์ ์๋ ํน์ DOM ์์๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค์ ์ง์ ์ํธ์์ฉํ ์ ์์ต๋๋ค. Ref ์ ๋ฌ์ ํจ๊ณผ์ ์ผ๋ก ์ดํดํ๊ณ ํ์ฉํ๋ ๊ฒ์ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ API๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ปดํฌ๋ํธ API ๋์์ธ์์ Ref ์ ๋ฌ์ด ์ค์ํ ์ด์
React ์ปดํฌ๋ํธ๋ฅผ ๋์์ธํ ๋, ํนํ ์ฌ์ฌ์ฉ์ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ด๋ป๊ฒ ์ํธ์์ฉํ ์ง๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ๋์์ธ๋ ์ปดํฌ๋ํธ API๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ง๊ด์ : ์ดํดํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค.
- ์ ์ฐํจ: ํฐ ์์ ์์ด ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ํ ์ ์์ต๋๋ค.
- ์ ์ง๋ณด์ ์ฉ์ด์ฑ: ์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌํ ๋ณ๊ฒฝ์ด ์ธ๋ถ ์ฌ์ฉ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์์์ผ ํฉ๋๋ค.
Ref ์ ๋ฌ์ ์ด๋ฌํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌํ์ ๋ํ ์ ์ด๊ถ์ ์ ์งํ๋ฉด์๋ ์ปดํฌ๋ํธ ๋ด๋ถ ๊ตฌ์กฐ์ ํน์ ๋ถ๋ถ์ ์ธ๋ถ์ ๋ ธ์ถํ ์ ์์ต๋๋ค.
`React.forwardRef`์ ๊ธฐ๋ณธ
React์์ ref ์ ๋ฌ์ ํต์ฌ์ `React.forwardRef` ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์ ๋๋ค. ์ด ํจ์๋ ๋ ๋๋ง ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ `ref` prop์ ๋ฐ์ ์ ์๋ ์๋ก์ด React ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํฉ๋๋ค.
๊ฐ๋จํ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
import React, { forwardRef } from 'react';
const MyInput = forwardRef((props, ref) => {
return ;
});
export default MyInput;
์ด ์์์์ `MyInput`์ `forwardRef`๋ฅผ ์ฌ์ฉํ๋ ํจ์ํ ์ปดํฌ๋ํธ์ ๋๋ค. `MyInput`์ ์ ๋ฌ๋ `ref` prop์ `input` ์์์ ์ง์ ํ ๋น๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์ ๋ ฅ ํ๋์ ์ค์ DOM ๋ ธ๋์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ ๋ฌ๋ Ref ์ฌ์ฉํ๊ธฐ
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ `MyInput` ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
import React, { useRef, useEffect } from 'react';
import MyInput from './MyInput';
const ParentComponent = () => {
const inputRef = useRef(null);
useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return (
);
};
export default ParentComponent;
์ด ์์์์ `ParentComponent`๋ `useRef`๋ฅผ ์ฌ์ฉํ์ฌ ref๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ `MyInput` ์ปดํฌ๋ํธ์ ์ ๋ฌํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ `useEffect` ํ ์ ref๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ์ ๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ์ค๋๋ค. ์ด๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ref ์ ๋ฌ์ ์ฌ์ฉํ์ฌ ์์ ์ปดํฌ๋ํธ ๋ด์ DOM ์์๋ฅผ ์ง์ ์กฐ์ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ปดํฌ๋ํธ API ๋์์ธ์ ์ํ ์ผ๋ฐ์ ์ธ Ref ์ ๋ฌ ํจํด
์ด์ ์ปดํฌ๋ํธ API ๋์์ธ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ด๊ณ ์ ์ฉํ ref ์ ๋ฌ ํจํด์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. DOM ์์๋ก Ref ์ ๋ฌํ๊ธฐ
์์ ๊ธฐ๋ณธ ์์์์ ๋ณด์๋ฏ์ด DOM ์์๋ก ref๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ธ ํจํด์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ ๋ด์ ํน์ DOM ๋ ธ๋์ ์ ๊ทผํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค:
- ํฌ์ปค์ค ๊ด๋ฆฌ: ์ ๋ ฅ ํ๋๋ ๋ค๋ฅธ ์ํธ์์ฉ ์์์ ํฌ์ปค์ค๋ฅผ ์ค์ ํฉ๋๋ค.
- ์์ ํฌ๊ธฐ ์ธก์ : ์์์ ๋๋น๋ ๋์ด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ์์ ์์ฑ ์ ๊ทผ: ์์ ์์ฑ์ ์ฝ๊ฑฐ๋ ์์ ํฉ๋๋ค.
์์: ์ปค์คํ ๊ฐ๋ฅํ ๋ฒํผ ์ปดํฌ๋ํธ
์ฌ์ฉ์๊ฐ ์ธํ์ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ ๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํด ๋ณด์ธ์.
import React, { forwardRef } from 'react';
const CustomButton = forwardRef((props, ref) => {
const { children, ...rest } = props;
return (
);
});
export default CustomButton;
์ด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ๋ฒํผ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป์ด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ํด๋ฆญํ๊ฑฐ๋ ์คํ์ผ์ ๋ณ๊ฒฝํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
2. ์์ ์ปดํฌ๋ํธ๋ก Ref ์ ๋ฌํ๊ธฐ
Ref ์ ๋ฌ์ DOM ์์์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๋ค๋ฅธ React ์ปดํฌ๋ํธ๋ก๋ ref๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค ๋ฉ์๋๋ ์์ฑ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์: ์ ์ด๋๋ ์ ๋ ฅ ์ปดํฌ๋ํธ
์์ฒด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ปค์คํ ์ ๋ ฅ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ ๋ ฅ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ง์ฐ๋ ๋ฉ์๋๋ฅผ ๋ ธ์ถํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
import React, { useState, forwardRef, useImperativeHandle } from 'react';
const ControlledInput = forwardRef((props, ref) => {
const [value, setValue] = useState('');
const clearInput = () => {
setValue('');
};
useImperativeHandle(ref, () => ({
clear: clearInput,
}));
return (
setValue(e.target.value)}
/>
);
});
export default ControlledInput;
์ด ์์์์๋ `useImperativeHandle`์ ์ฌ์ฉํ์ฌ `clear` ๋ฉ์๋๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ ธ์ถํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ถ๋ชจ๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ ๋ ฅ ๊ฐ์ ์ง์ธ ์ ์์ต๋๋ค.
import React, { useRef } from 'react';
import ControlledInput from './ControlledInput';
const ParentComponent = () => {
const inputRef = useRef(null);
const handleClearClick = () => {
if (inputRef.current) {
inputRef.current.clear();
}
};
return (
);
};
export default ParentComponent;
์ด ํจํด์ ์์ ์ปดํฌ๋ํธ์ ๋ด๋ถ ์ํ์ ๋ํ ์ ์ด๊ถ์ ์ ์งํ๋ฉด์ ํน์ ๊ธฐ๋ฅ์ ๋ถ๋ชจ์๊ฒ ๋ ธ์ถํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
3. ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ์ํ Ref ๊ฒฐํฉ
๋ ๋ณต์กํ ์ปดํฌ๋ํธ์์๋ ์ปดํฌ๋ํธ ๋ด์ ์ฌ๋ฌ ๋ค๋ฅธ ์์๋ ์ปดํฌ๋ํธ๋ก ์ฌ๋ฌ ref๋ฅผ ์ ๋ฌํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ ์ปค์คํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ref๋ฅผ ๊ฒฐํฉํจ์ผ๋ก์จ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์์: ์ฌ๋ฌ ํฌ์ปค์ค ๊ฐ๋ฅํ ์์๋ฅผ ๊ฐ์ง ๋ณตํฉ ์ปดํฌ๋ํธ
์ ๋ ฅ ํ๋์ ๋ฒํผ์ ๋ชจ๋ ํฌํจํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ ๋ ฅ ํ๋๋ ๋ฒํผ ์ค ํ๋์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ ์ ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค.
import React, { useRef, forwardRef, useEffect } from 'react';
const CompositeComponent = forwardRef((props, ref) => {
const inputRef = useRef(null);
const buttonRef = useRef(null);
useEffect(() => {
if (typeof ref === 'function') {
ref({
input: inputRef.current,
button: buttonRef.current,
});
} else if (ref && typeof ref === 'object') {
ref.current = {
input: inputRef.current,
button: buttonRef.current,
};
}
}, [ref]);
return (
);
});
export default CompositeComponent;
์ด ์์์์ `CompositeComponent`๋ `inputRef`์ `buttonRef`๋ผ๋ ๋ ๊ฐ์ ๋ด๋ถ ref๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ `useEffect` ํ ์ ์ด๋ฌํ ref๋ค์ ๋จ์ผ ๊ฐ์ฒด๋ก ๊ฒฐํฉํ์ฌ ์ ๋ฌ๋ ref์ ํ ๋นํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ ์ ๋ ฅ ํ๋์ ๋ฒํผ ๋ชจ๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
import React, { useRef } from 'react';
import CompositeComponent from './CompositeComponent';
const ParentComponent = () => {
const compositeRef = useRef(null);
const handleFocusInput = () => {
if (compositeRef.current && compositeRef.current.input) {
compositeRef.current.input.focus();
}
};
const handleFocusButton = () => {
if (compositeRef.current && compositeRef.current.button) {
compositeRef.current.button.focus();
}
};
return (
);
};
export default ParentComponent;
์ด ํจํด์ ๋ณต์กํ ์ปดํฌ๋ํธ ๋ด์ ์ฌ๋ฌ ์์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋ ธ์ถํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
4. ์กฐ๊ฑด๋ถ Ref ์ ๋ฌ
๋๋ก๋ ํน์ ์กฐ๊ฑด์์๋ง ref๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์ด๋ ๊ธฐ๋ณธ ๋์์ ์ ๊ณตํ๋ฉด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ด๋ฅผ ์ฌ์ ์ํ ์ ์๋๋ก ํ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
์์: ์ ํ์ ์ ๋ ฅ ํ๋๋ฅผ ๊ฐ์ง ์ปดํฌ๋ํธ
ํน์ prop์ด ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ์ ๋ ฅ ํ๋๋ฅผ ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ์ ๋ ฅ ํ๋๊ฐ ์ค์ ๋ก ๋ ๋๋ง๋๋ ๊ฒฝ์ฐ์๋ง ref๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ต๋๋ค.
import React, { forwardRef } from 'react';
const ConditionalInput = forwardRef((props, ref) => {
const { showInput, ...rest } = props;
if (showInput) {
return ;
} else {
return No input field;
}
});
export default ConditionalInput;
์ด ์์์์๋ `showInput` prop์ด true์ธ ๊ฒฝ์ฐ์๋ง ref๊ฐ `input` ์์๋ก ์ ๋ฌ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ref๋ ๋ฌด์๋ฉ๋๋ค.
5. ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์ ํจ๊ป Ref ์ ๋ฌํ๊ธฐ
๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)๋ฅผ ์ฌ์ฉํ ๋, ref๊ฐ ๋ํ๋ ์ปดํฌ๋ํธ๋ก ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋๋ก ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ref๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ์ ์ ๊ทผํ์ง ๋ชปํ ์ ์์ต๋๋ค.
์์: ํ ๋๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ๊ฐ๋จํ HOC
import React, { forwardRef } from 'react';
const withBorder = (WrappedComponent) => {
const WithBorder = forwardRef((props, ref) => {
return (
);
});
WithBorder.displayName = `withBorder(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`;
return WithBorder;
};
export default withBorder;
์ด ์์์์ `withBorder` HOC๋ `forwardRef`๋ฅผ ์ฌ์ฉํ์ฌ ref๊ฐ ๋ํ๋ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋๋๋ก ํฉ๋๋ค. ๋๋ฒ๊น ์ ๋ ์ฝ๊ฒ ํ๊ธฐ ์ํด `displayName` ์์ฑ๋ ์ค์ ๋์์ต๋๋ค.
์ค์ ์ฐธ๊ณ : ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ HOC ๋ฐ ref ์ ๋ฌ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋, ref๋ ์ผ๋ฐ์ ์ธ prop์ผ๋ก ํด๋์ค ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ฉ๋๋ค. `this.props.ref`๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํด์ผ ํฉ๋๋ค.
Ref ์ ๋ฌ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
ref ์ ๋ฌ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ref๋ฅผ ์ ๋ฌํด์ผ ํ๋ ์ปดํฌ๋ํธ์๋ `React.forwardRef`๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๊ฒ์ด React์์ ref ์ ๋ฌ์ ํ์ฑํํ๋ ํ์ค ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ปดํฌ๋ํธ API๋ฅผ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ธ์. ref๋ฅผ ํตํด ์ด๋ค ์์๋ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ค๋ช ํ์ธ์.
- ์ฑ๋ฅ์ ์ ์ํ์ธ์. ๋ถํ์ํ ref ์ ๋ฌ์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ ์ ์์ผ๋ฏ๋ก ํผํ์ธ์.
- `useImperativeHandle`์ ์ฌ์ฉํ์ฌ ์ ํ๋ ๋ฉ์๋๋ ์์ฑ ์งํฉ์ ๋ ธ์ถํ์ธ์. ์ด๋ฅผ ํตํด ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ์ ์ดํ ์ ์์ต๋๋ค.
- ref ์ ๋ฌ์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ์ง ๋ง์ธ์. ๋ง์ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ ๊ฐ ํต์ ์๋ props๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค.
์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ
ref ์ ๋ฌ์ ์ฌ์ฉํ ๋ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ref๋ฅผ ์ฌ์ฉํ์ฌ DOM ์์๋ฅผ ์กฐ์ํ ๋์๋ ์ปดํฌ๋ํธ๊ฐ ์ฅ์ ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ ์ฌ์ ํ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ํ์ ๋๋ค:
- ARIA ์์ฑ์ ์ฌ์ฉํ์ฌ ์๋ฏธ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ธ์. ์ด๋ ๋ณด์กฐ ๊ธฐ์ ์ด ์ปดํฌ๋ํธ์ ๋ชฉ์ ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํฌ์ปค์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ด๋ฆฌํ์ธ์. ํฌ์ปค์ค๊ฐ ํญ์ ๋ณด์ด๊ณ ์์ธก ๊ฐ๋ฅํ๋๋ก ํ์ธ์.
- ๋ณด์กฐ ๊ธฐ์ ๋ก ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ์ธ์. ์ด๊ฒ์ด ์ ๊ทผ์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ตญ์ ํ ๋ฐ ํ์งํ
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ปดํฌ๋ํธ API๋ฅผ ๋์์ธํ ๋๋ ๊ตญ์ ํ(i18n)์ ํ์งํ(l10n)๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ์ธ์ด๋ก ์ฝ๊ฒ ๋ฒ์ญ๋๊ณ ๋ค๋ฅธ ๋ฌธํ์ ๋งฅ๋ฝ์ ๋ง๊ฒ ์กฐ์ ๋ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ํ์ ๋๋ค:
- i18n ๋ฐ l10n์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์. `react-intl` ๋ฐ `i18next`์ ๊ฐ์ ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ด ์์ต๋๋ค.
- ๋ชจ๋ ํ ์คํธ๋ฅผ ์ธ๋ถํํ์ธ์. ์ปดํฌ๋ํธ์ ํ ์คํธ ๋ฌธ์์ด์ ํ๋์ฝ๋ฉํ์ง ๋ง์ธ์.
- ๋ค์ํ ๋ ์ง ๋ฐ ์ซ์ ํ์์ ์ง์ํ์ธ์. ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ง๊ฒ ์ปดํฌ๋ํธ๋ฅผ ์กฐ์ ํ์ธ์.
- ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ๋ ์ด์์์ ๊ณ ๋ คํ์ธ์. ์๋์ด์ ํ๋ธ๋ฆฌ์ด์ ๊ฐ์ ์ผ๋ถ ์ธ์ด๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์๋๋ค.
์ ์ธ๊ณ์ ์์
์ ์ธ๊ณ ์ฌ๋ฌ ์ํฉ์์ ref ์ ๋ฌ์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ์ ์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์: ์ฌ์ฉ์๊ฐ ๊ฒ์ ํ์ด์ง๋ก ์ด๋ํ ๋ ๊ฒ์ ์ ๋ ฅ ํ๋์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ๊ธฐ ์ํด ref ์ ๋ฌ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ ์ธ๊ณ ์ผํ๊ฐ์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํต๋๋ค.
- ๋ฐ์ดํฐ ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์: ์ฐจํธ์ ๊ทธ๋ํ์ ๊ธฐ๋ณธ DOM ์์์ ์ ๊ทผํ๊ธฐ ์ํด ref ์ ๋ฌ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ ์ง์ญ ๋ฐ์ดํฐ ํ์ค์ ๋ฐ๋ผ ๋ชจ์๊ณผ ๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
- ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์: ์ ๋ ฅ ํ๋๋ฅผ ์ง์ฐ๊ฑฐ๋ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋ฑ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ ์ด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ref ์ ๋ฌ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ๋ฌ ๊ตญ๊ฐ์ ๋ค์ํ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ ์ ์ค์ํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํนํ ์ ์ฉํฉ๋๋ค.
๊ฒฐ๋ก
Ref ์ ๋ฌ์ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด React ์ปดํฌ๋ํธ API๋ฅผ ์ค๊ณํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด ๊ธ์์ ๋ ผ์๋ ํจํด์ ์ดํดํ๊ณ ํ์ฉํจ์ผ๋ก์จ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ์ ์ํ ์ ์์ผ๋ฉฐ, ๋ณ๊ฒฝ์ ๊ฐํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ค๊ณํ ๋ ์ ๊ทผ์ฑ๊ณผ ๊ตญ์ ํ๋ฅผ ๊ณ ๋ คํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
ref ์ ๋ฌ ๋ฐ ๊ธฐํ ๊ณ ๊ธ React ๊ธฐ์ ์ ๋ง์คํฐํจ์ผ๋ก์จ ๋ ํจ๊ณผ์ ์ด๊ณ ๊ฐ์น ์๋ React ๊ฐ๋ฐ์๊ฐ ๋ ์ ์์ต๋๋ค. ๊ณ์ํด์ ํ์ํ๊ณ , ์คํํ๋ฉฐ, ๊ธฐ์ ์ ์ฐ๋งํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ฆ๊ฒ๊ฒ ํ๋ ๋๋ผ์ด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ์ธ์.