참고 : https://ko.reactjs.org/docs/hooks-effect.html (공식문서)
: 컴포넌트가 렌더링 될 때마다, 특정 작업을 수행하도록 설정할 수 있는 Hook.
: React 컴포넌트에는 일반적으로 두 종류의 side effects가 있다.
기능1 - 정리(clean-up)을 이용하는 않는 Effects
: 정리(clean-up)가 필요없는 경우에는 콜백함수에서 어떤 것도 반환하지 않음.
기능2 - 정리(clean-up)을 이용하는 Effects
: effect에 정리(clean-up)가 필요한 경우에는 콜백함수에서 함수를 반환함.
 useEffect(callback, []) 
- 첫번째 인자는 콜백함수 : 실행하려는 코드
- 두번째 인자는 배열 : 지켜보려는 값을 배열에 넣음.
useEffect를 쓰면 코드의 실행 시점을 조절할 수 있기 때문에
조금이라도 html 렌더링이 빠른 사이트를 원하면
쓸데없는 것들은 useEffect 안에 넣어 처리할 수 있음.
컴포넌트의 핵심 기능은 html 렌더링이라
그거 외의 쓸데없는 기능들은 useEffect 안에 적으면 됨.
: 정리(clean-up)가 필요없는 경우에는 콜백함수에서 어떤 것도 반환하지 않습니다.
: 원래 state가 변경되면, 컴포넌트는 리렌더링 됨.
: 그러나 state 값이 바뀔때마다 계속 모든 컴포넌트 전체가 리렌더 되는게 아니고,
어떤 "특정 값"이 바뀌었을 때만 리렌더 되도록 선택권을 줄 수 있게됨.
  useEffect(() => {
    console.log("only once");
    fetch(...)
  }, []);function App() {
  const [value, setValue] = useState(0);
  const setValueFn = () => setValue((prev) => prev + 1);
  const [keyword, setKeyword] = useState("");
  const setKeyFn = (e) => setKeyword(e.target.value);
  // 1. 항상실행 : 어떤 값이 바뀌든 항상 실행됨.
  console.log("always");
  /* 2. 빈배열 - 처음 컴포넌트가 렌더될 떄, 한번만 실행됨
       빈배열을 주면, react가 지켜볼게 아무것도 없어서 처음 렌더시 한번만 실행됨.
       (api호출같이 계속 실행하면 안되는 코드 활용) */
  useEffect( () => {console.log("only once")}, []);
  // 3. 시작할때랑, value값이 바뀔때만 실행됨.
  useEffect(() => console.log("only value"), [value]);
  // 4. 시작할때랑, keyword가 바뀌는데 + 글자가 5이상 일때만 실행됨
  useEffect(() => {
    if ((keyword === "") || (keyword.length >= 5)) {
      console.log("only keyword");
    }
  }, [keyword]);
  // 5. 시작할때랑, value 또는 keyword 둘 중 하나가 바뀔때 실행됨.
  useEffect(() => console.log("value or keyword"), [value, keyword]);
  return (
    <div>
		//
    </div>
  );
}: effect에 정리(clean-up)가 필요한 경우에는 콜백함수에서 함수를 반환함.
useEffect의 첫번째 인자인 콜백함수에서 함수를 반환하면 cleanup함수로 이용됨.
반환된 cleanup함수는 useEffect를 사용한 해당 컴포넌트가 사라질 때 즉,언마운트 될 때 실행됨.
Other컴포넌트가 렌더될 때 return 이전의 코드만 실행되고,
Other컴포넌트가 사라지고 나면 return 된 cleanup 함수가 실행되는 것임.
import { useState, useEffect } from "react";
function App() {
  const [show, setShow] = useState(true);
  return (
    <>
      <button type="button" onClick={() => setShow(!show)}>
        토글버튼
      </button>
      {show ? <Other /> : null}
    </>
  );
}
function Other({ data }) {
  useEffect(() => {
    console.log("추가된당");
    return () => {
      console.log("제거된당");
    };
  }, []);
  return <h1>Other</h1>;
}
export default App;