Book-Study-For-Developer / Functional-coding-that-fits-easily

쏙쏙 들어오는 함수형 코딩 : 심플한 코드로 복잡한 소프트웨어 길들이기
8 stars 0 forks source link

4장 - React의 전역 context를 사용하는 일은 함수형 프로그래밍의 개념과 상반되는 게 아닐까? #14

Open jangsumin opened 3 months ago

jangsumin commented 3 months ago

의문이 드는 점

4장을 정리하면서 위 의문이 들었습니다. 같이 고민해보면 좋을 것 같습니다!

haryan248 commented 3 months ago

의문을 항상 가져주셔서 스터디를 의미있게 해주시는게 정말 좋은 것 같아요.

아까 말로만 짧게 말씀드렸는데, 전역을 사용한다는 것 자체가 props drilling을 피하기 위해 만들어졌으니까 이를 사용하는 쪽에서는 결국 props drilling으로 받아와서 사용하는 것과 동일하게 쓰는것이라고 생각이 들었습니다.

// context로 받아왔을 때
function MyComponent() {
  // useContext를 사용하여 각 provier 컨텍스트에서 state를 가져온다.
  const { user, setUser } = useContext(UserContext);
  const { theme, setTheme } = useContext(ThemeContext);

  const handleLogin = () => {
    setUser({ name: 'John', age: 30 });
  };

  const handleLogout = () => {
    setUser(null);
  };

  const toggleTheme = () => {
    setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');
  };

  return (
    <div>
      <button onClick={handleLogin}>Login</button>
      <button onClick={handleLogout}>Logout</button>
      <button onClick={toggleTheme}>Toggle theme</button>
      <p>User: {user ? user.name : 'Not logged in'}</p>
      <p>Theme: {theme}</p>
    </div>
  );
}
// props로 받아왔을 때
function MyComponent({ user, setUser, theme, setTheme }) {
  const handleLogin = () => {
    setUser({ name: 'John', age: 30 });
  };

  const handleLogout = () => {
    setUser(null);
  };

  const toggleTheme = () => {
    setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');
  };

  //...
  생략
}

결국 어디서 가져오냐의 차이만 있을 뿐 사용하는 것 자체는 동일하다고 느껴서 어떻게 setUser나, setTheme 과 같은 액션을 계산으로 더 잘게 쪼개냐의 차이라고 생각했습니다.

참고: https://velog.io/@hoonnn/React-Context-API%EC%99%80-useContext

jangsumin commented 3 months ago

사실, 저도 가벼운 의구심에 시작해서 적어보는 질문들인데 같이 고민해주셔서 제가 오히려 더 도움이 되는 것 같습니다. 감사합니다...!

적어주신 답변을 보고 생각이 드는 건 다음과 같습니다.

이러한 생각에 도달했는데 현준님이 생각하신 것과 동일한가 싶습니다!