useEffect()를 사용할 때 스테이트가 언마운트 될 때 cleanup 함수를 사용한다는 것은 알겠는데 이게 왜 필요한지는 모르는 상태였다.
useEffect(() => {
const identifier = setTimeout(() => {
console.log("유효성 검사 중");
setFormIsValid(
enteredEmail.includes("@") && enteredPassword.trim().length > 6
);
}, 500);
return () => {
clearTimeout(identifier);
};
}, [enteredEmail, enteredPassword]);
위의 예시에서 클린업 함수가 없다면, 셋타임아웃을 쓰더라도 함수 실행이 0.5초에 한번 씩 될 뿐이지, 결국 키를 누르는 만큼 함수가 실행된다.
이런 상황에서 cleanup함수 영역에 타이머를 종료시키는 함수인 clearTimeout을 사용해서 identifier라는 비동기 함수를 종료시키면, 언마운트 되는 순간 함수를 지워버리기 때문에 클린업 함수가 실행되기 전에 예약된 타이머들은 실행되지 않는다.
즉 새로운 타이머를 설정하기 전에 마지막 타이머를 지워버린다.


인풋에 빠르게 타이핑을 해도(언마운트 되는 횟수는 콘솔에 찍힌 클린업 횟수를 보면 알 수 있다.) 유효성검사를 하는 identifier 함수는 0.5초에 한 번씩만 실행된 것을 알 수 있다!
useEffect(() => {
const identifier = setTimeout(() => {
console.log("유효성 체크");
setFormIsValid(emailIsValid && passwordIsValid);
}, 500);
return () => {
console.log("클린업!");
clearTimeout(identifier);
};
}, [emailState.isValid, passwordState.isValid]);
이렇게 점 찍어서 가져오는 것도 가능 하지만
const { isValid: emailIsValid } = emailState;
const { isValid: passwordIsValid } = passwordState;
useEffect(() => {
const identifier = setTimeout(() => {
console.log("유효성 체크");
setFormIsValid(emailIsValid && passwordIsValid);
}, 500);
return () => {
console.log("클린업!");
clearTimeout(identifier);
};
}, [emailIsValid, passwordIsValid]);
이런 식으로 객체 디스트럭처링을 이용해서 특정 키 값의 이름을 변수로 지정하는 경우가 일반적이라고 한다.(일단 인강의 강사님은 그렇게 말씀하신다)
