useEffect는 렌더링 후에, 컴포넌트가 뭘 해야 하는지를 알려주는 부분 입니다. 렌더링이 되고 난 후에, 이 부분에 작성한 함수들이 실행이 되게 됩니다.

주로 이 영역을 통해서 API 콜을 하여 데이터를 받아오거나, 이벤트 리스너 같은 것들을 등록합니다.

아래처럼 말이죠.

const App = () => {
	const [someState, setSomeState] = useState("");
	useEffect(() => {
		axios.get('/user/12345')
	  .then(response => {
			//do something here such as setState
			setSomeState(response) //for instance,
		})
	}, [])

	const handleUserKeyPress = (evt) => {
		//do something here
	}

	useEffect(() => {
    window.addEventListener('keydown', handleUserKeyPress);
	}, [])

	return <>
		<span>hello</span>
		<span>{someState}</span>
	</>
}

이렇게 하면

const handleUserKeyPress = (evt) => {
	//do something here
}

useEffect(() => {
  window.addEventListener('keydown', handleUserKeyPress);

	return () => {
    window.removeEventListener('keydown', handleUserKeyPress);
  };
}, [])

잘 확인해보시면, useEffect내에 등록과 해제가 둘다 작성 되어 있는 것을 볼 수 있습니다. return 부분에 함수형태

() => {something here}

이부분이 해당 페이지가 unmount될 때에 실행이 됩니다.

"또" 다른 예를 한 번 볼까요?

useEffect(() => {
  function handleStatusChange(status) {
    setIsOnline(status.isOnline);
  }

  ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
  // Specify how to clean up after this effect:
  return function cleanup() {
    ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
  };
}, []);