함수 위치 정하기

Imnottired·2023년 6월 6일
0

나는 코드를 작성할 때 먼저 생각나는대로 작성을 하고,
이후에 살펴보면서 리펙토링을 통해 업그레이드하는 편이다.
이번에도 작성하고나서, 리팩토링을 하였다.





월드컵에서 후보를 추가하거나 삭제할 때
함수를 어디에 만들지 고민이 된다.
두가지 정도가 있겠는데,
하나는 부모 컴포넌트에 만들고 자식으로 내려주는 방법,
하나는 메소드나 변수를 자식에게 내려주고 만들어서 사용하는 방법이다.

먼저 삭제하기 기능을 구현하기 위해서
함수를 작성하였다.
처음에는 자식에다가 먼저 작성하였는데 이유는
부모에게는 너무 많은 이벤트가 할당되어있고,
부모가 아닌 자식 컴포넌트에서 관리한다면,
수정을 할 때 바로 컴포넌트로 들어가면 되니 직관적이고 유지보수에 편할 것이라고 생각하였다.


const handlerDelete = async () => {
    try {
      const res = await delete_worldcup(accessToken || "", id);
      console.log(res);
    } catch (e) {
      console.log(e);
    }
  };

그런데 문제는 삭제를 하고나서 부모에게 알려야하는데 알릴 방법이 없었고,
알리는 state 값을 만들어서 사용하였다.
(swr을 업데이트하는 메소드 mutate를 내려서 하면 되었지만 타입을 찾지 못했다)


const handlerDelete = async () => {
    try {
      const res = await delete_worldcup(accessToken || "", id);
      console.log(res);
      setAlram(true);//추가
    } catch (e) {
      console.log(e);
    }
  };

작성을 하고 생각을 해보니 어차피 props으로 내릴거면, 부모에서 만들고 함수로 내려주는게 낫다고 생각이 들었다.
그리고 부모는 하나인데 자식은 여러명이니 매번 함수를 만들어주면 성능적으로도 떨어진다.(map을 사용하는 경우였다)

  const handlerDelete = async (id: number) => {
    try {
      const res = await delete_worldcup(accessToken || "", id);

      mutate();

      console.log(res);
    } catch (e) {
      console.log(e);
    }
  };

그래서 handlerDelete를 부모에서 만들어주고 내려주는 식으로 해결하였다.
타입을 모르는 메소드(props으로 내려주지 못함)도 바로 사용할 수 있었다.


그외 props으로 내려주어서 함수를 만들었던 것들도 묶어서 자식에게 내려주었다.

변경 전

  const resetEditor = useResetRecoilState(postWorldcup);
  const setEditor = useSetRecoilState(postWorldcup);

       <Card
              key={v.id}
              resetEditor={resetEditor}
              worldcup={v}
              mine={true}
              setEditor={setEditor}
              handlerDelete={handlerDelete}
            />

변경 후


  const handlerWorldCup = (id: number) => {
    resetEditor();
    get_detail(id, accessToken || "").then((res) => {
      console.log(res);
      setEditor(res);
      router.push("/editors");
    });
  };
  
      <Card
              key={v.id}
              worldcup={v}
              mine={true}
              handlerDelete={handlerDelete}
              handlerWorldCup={handlerWorldCup}
            />

props으로 내려주어서 형성할때는 모든 타입을 적고, 찾아야했기때문에
시간 소모가 있었는데,
함수에 묶어서 내려주니 간편하고, 타입 작성시간도 줄일 수 있었다.




마무리

한가지 메소드로 사용되는 것이 아니라면
다음에도 함수로 묶어서 내려주는 방법을 선호할 것 같다.

메소드마다 내려줄 때는 각각의 기능을 기억하고
컨트롤해야해서 번거로웠는데,
함수로 묶어주면 클로저함수여서 모듈화가 가능해서 그룹화하여서 관리하기 수월했다.

그리고 성능적으로 내려서 무언가 만드는 것은 자식이 많을 경우에는 안좋아보였다.
만약 자식에게 만들어서 부모의 렌더링을 막을 수 있는 경우가 아니라면 부모에게 만들어줄 것 같다.

profile
새로운 것을 배우는 것보다 정리하는 것이 중요하다.

6개의 댓글

comment-user-thumbnail
2023년 6월 7일

함수로 묶어서 내려주는 방식 참 좋은 것 같아요! 잘 보고 갑니당:)

답글 달기
comment-user-thumbnail
2023년 6월 8일

훨씬 깔끔해지는 것 같네요 !! 고생하셨습니당 ~

답글 달기
comment-user-thumbnail
2023년 6월 11일

오.. 전에 면접에서 프로젝트에서 클로저를 어떻게 사용해봤냐는 질문에 답변을 못했었는데 이런게 실사용 예시군요 😮

답글 달기
comment-user-thumbnail
2023년 6월 11일

오호 이런 방법이 있네용 고생하셨슴돠!!

답글 달기
comment-user-thumbnail
2023년 6월 11일

글을 보면 낙준님 의식의 흐름이 느껴져서 제가 다 개발하는 거 같네요. 잘보고 갑니당

답글 달기
comment-user-thumbnail
2023년 6월 11일

작업을 하면서 어떤 고민을 했고 어떻게 해결했는지 한눈에 알 수 있었어요! 감사합니다~!

답글 달기