천진난만 코딩 스토리

2023.03.02) 항해 25일차 본문

TIL(Today I Learned)

2023.03.02) 항해 25일차

Wisdom_1104 2023. 3. 2. 22:45

오늘은 버츄얼돔과 렌더링에 대해 다시 짚어보았다.

다시 짚어보다가 렌더링 최적화에 대해 알게 되었다..

 

최적화를 하기 위해서 무엇을 해야하는지 알아고보, 시도도 해보았지만

아쉽게도 실패했다..ㅠ

 

렌더링 최적화를 하기 위해서는 어느 한 부분에 리렌더링이 일어날 때,

하위의 컴포넌트도 렌더링이 되지 않도록 연결고리를 끊어야 한다는 것은 알았다.

하지만 어떻게 해야할지 몰라서 이 부분은 더 찾아보고 시도해야할 듯하다.

못하니까 괜히 오기가 생기는.......

 

렌더링 최적화 외에 흥미가 생기는 주제가 또 있었다.

바로, '컴파운드 컴포넌트 패턴'이다.

개발자의 입장에서 컴포넌트의 구조를 한 눈에 보기 좋고,

좀 더 수정 등의 유지보수가 간단하게 짤 수 있는 컴포넌트 형태에 대한 방법이다.

* 컴포넌트 하나에 props를 전달하는 방식
	* 이 컴포넌트가 어떤 역할을 하는지를 한 눈에 보았을때 추측하기 어렵다.
	* 수정사항이 생길 경우 전달해야 할 props가 늘어날 수 있고, 불필요한 props까지 전달하게 되는 상황이 생길 수 있다. + props가 늘면 코드도 더욱 복잡해진다.
	=> 유지보수 측면에서 어려울 수 있다.

<Modal
  buttonName={"열어주세요."}
  contents={"안녕하세요"}
  fontColor="white"
  bc="red"
  buttonSize="large"
  margin="10px"
  position="right"
/>

-------

const Modal = ({ buttonName, contents, bc, fontColor, buttonSize, margin }) => {
  const [open, setOpen] = useState(false);
  return (
    <>
      <button
        style={{
          backgroundColor: bc,
          color: fontColor,
          width: buttonSize === "large" ? "120px" : "50px",
          margin: margin ? margin : "none"
        }}
        onClick={() => setOpen((pre) => !pre)}
      >
        {buttonName}
      </button>
      {open ? <div>{contents}</div> : null}
    </>
  );
};

한눈에 보기 어려운 이 코드를 컴파운드 컴포넌트 패턴으로 다시 작성하면,

* 컴파운드 패턴
	* 대부분의 인자를 children으로 전달하고, 수정이 간단하다.
	* 굳이 타고 들어가지 않아도 어떤 인자가 어디로 어떻게 전달되는지 추측하기 쉽다.
	* props를 늘려서 코드가 복잡해질 일도 없고, props driling도 상대적으로 줄일 수 있다.
	=> 유지보수 측면에서 좋은 방법

<ComModal.Root>
  <ComModal.Trigger>
    <Button fontColor="white" bc="red" buttonSize="large">
      열기
    </Button>
  </ComModal.Trigger>
	<ComModal.Content>안녕하세요</ComModal.Content>
</ComModal.Root>

------

const Context = createContext();

export const ComModalRoot = ({ children }) => {
  const [open, setOpen] = useState(false);
  return (
    <Context.Provider
      value={{
        open,
        setOpen
      }}
    >
      {children}
    </Context.Provider>
  );
};

const ComModalTrigger = ({ children }) => {
  const { setOpen } = useContext(Context);
  return <div onClick={() => setOpen((pre) => !pre)}>{children}</div>;
};

const ComModalContent = ({ children }) => {
  const { open } = useContext(Context);
  return <div>{open ? children : null}</div>;
};

이렇게 한 눈에 보기 편한 코드가 된다.

아직은 완벽하게 이해한 것은 아니지만 이 방법에 대해 좀 더 깊게 알아볼 필요성을 느꼈다.