리액트 공식문서를 학습하면서 나는 너무나 잘못된 Effect를 사용하고 있음을 알게 되었다.
렌더링 후 이미 존재하는 데이터가 있다면 값으로 불러오기 위해 Effect를 사용하고 있었다.
const { postObject, setPostObject } = useContext(postSalesItemContext);
const [inputComment, setInputComment] = useState<string | null>(null);
useEffect(() => {
if (postObject.content) {
const storedContent = postObject.content;
setInputComment(storedContent);
}
}, []);
잘못된 Effect 사용으로 불필요한 렌더링이 한 번 더 일어나고 있다.
// 페이지 이동 후 localStorage 값이 존재한다면 가져온다.
const [postObject, setPostObject] = useState<PostObjectType>(
storedPostObject ? JSON.parse(storedPostObject) : initialPostObject,
);
const [inputComment, setInputComment] = useState<string | null>(
postObject.content ? postObject.content : null,
);
부모 컴포넌트에서 localStorage에 값을 보존하기 위한 Effect 하나를 제외하고 모든 Effect를 제거 할 수 있었다.
두 번씩 일어나던 렌더링도 해결되었다.
수정 내용을 간단한 측정이지만 테스트해보니 사용자가 체감하기에는 미비한 수치지만 개선되었음을 확인할 수 있다.
불필요한 useEffect의 사용은 성능 문제, 유지 보수의 어려움, 가독성 저하 등 웹 프로그래밍에 치명적임을 알게 되었다. 특히 스스로가 너무 무지성으로 Effect를 사용하고 있었음에 충격을 받았다. 리액트 공식문서의 Effect 파트를 반복해서 읽고, 불필요한 Effect를 사용하고 있는 것은 아닐까? 라는 고민을 항상 하도록 하자.
좋은 글 감사합니다.