프론트엔드/Next.js

[최종 프로젝트] React 함수, 매개변수: 가독성을 높이는 작은 습관

장쫑이이 2024. 11. 2. 00:34

 

 

내 개인적으로 이번 프로젝트에서 중요시 생각하며 진행하고 있는 부분은 컴포넌트화였다.

재사용성에 있어서 중요하기도 했지만 이번 기회에 컴포넌트에 대해서 더 진하게 공부하며 진행해 보고 싶었기 때문이다.

 

그러다보니 기능을 구현을 해놓고도 리팩토링을 해야하는 경우가 자주 생겼다.

이번 작업에도 통계를 보여주는 페이지를 `ResultComponent`로 컴포넌트화 시킨 후 `ResultHistory` 페이지에서 보여지게 작업을 리팩토링 하는 과정에서 문제가 생겼었다.

 

파일 및 함수 정리

`ResultComponent` : 통계를 보여주는 컴포넌트

`ResultHistory` : 통계 히스토리 페이지

`loadUserAndRetchData` : 유저의 통계 데이터를 받아오는 함수

 

 

처음에 작업한 방법

// ResultHistory.tsx
const ResultHistory = () => {
  return (
    <>
      <div>이전 탄소 배출량 히스토리</div>
      <div className="w-[1200px] border border-[#5bca11] mt-[12px] mb-[20px]"></div>
      <div>
        <div>{여기에 현재 달을 보여주고 싶어}월 탄소 배출량 결과표</div>
        <ResultComponent/>
      </div>
    </>
  );
};


// ResultComponent.tsx
const currentYear = new Date().getFullYear();
const currentMonth = new Date().getMonth() + 1;

const ResultComponent: React.FC<ResultComponentProps> = ({ year, month }) => {
  const [user, setUser] = useState<string | null>(null);
  const [thisYear, setThisYear] = useState<number | null>(currentYear);
  const [thisMonth, setThisMonth] = useState<number | null>(currentMonth);
  
  ...

 

처음에는 위와 같이 컴포넌트 안에서 현재 연도와 달을 불러왔었는데 이러다 보니

`{여기에 현재 달을 보여주고 싶어}` 에 현재 달을 보여주기 위해선 어쩔 수 없이 `ResultComponent`에서 만든 `currentYear`, `currentMonth`를 다시 써줘야했다.

 

이를 방지하기 위해 해당 변수를 `ResultHistory`에서 관리 후 `props`에 넘겨주기로 변경을 하게 되었다.

(추후 여기서 연도와 달을 변경하면 바로 데이터가 보여지게 진행 예정이다.)

 

 

변경된 부분

// ResultHistory.tsx
const ResultHistory = () => {
  const today = new Date();
  const currentYear = today.getFullYear();
  const currentMonth = today.getMonth() + 1;

  return (
    <>
      <div>이전 탄소 배출량 히스토리</div>
      <div className="w-[1200px] border border-[#5bca11] mt-[12px] mb-[20px]"></div>
      <div>
        <div>{currentMonth}월 탄소 배출량 결과표</div>
        <ResultComponent year={currentYear} month={currentMonth} />
      </div>
    </>
  );
};


// ResultComponent.tsx
const ResultComponent: React.FC<ResultComponentProps> = ({ year, month }) => {
  const [user, setUser] = useState<string | null>(null);
  // const [thisYear, setThisYear] = useState<number | null>(currentYear);
  // const [thisMonth, setThisMonth] = useState<number | null>(currentMonth);
  
  ...

 

그런데 이렇게 작성을 하고 보니 이상한 점을 발견하게 되었다.

분명 기능이 잘 작동은 하는데 분명 `thisYear`, `thisMonth`에 대한 `state`가 삭제가 되었는데 작동이 잘 하는 것이지..?

 

 

문제의 코드

// ResultComponent.tsx

useEffect(() => {
    loadUserAndFetchData(setUser, thisYear, thisMonth, setCurrentData);
    loadTotalUsersData(year, month, setTotalAvgData);
    ...

위의 `useEffect` 함수를 보면 아직도 사용되지 않는 `thisYear`, `thisMonth`가 사용되고 있었다..

 

 

loadUserAndRetchData 함수

// loadUserAndFetchData 함수

export const loadUserAndFetchData = async (
  setUser: SetUserType,
  thisYear: number | null,  // <------ 여기
  thisMonth: number | null,  // <------ 여기
  setCurrentData: React.Dispatch<React.SetStateAction<MonthlyData | null>>
) => {
  const fetchedUser = await getUser();
  if (fetchedUser) {
    setUser(fetchedUser.id);

    const { data, error } = await browserClient
      .from("carbon_records")
      .select("*")
      .eq("user_id", fetchedUser.id)
      .eq("year", thisYear)  // <------ 여기
      .eq("month", thisMonth)  // <------ 여기
      .gte(
        "created_at",
        new Date(
          new Date().getFullYear(),
          new Date().getMonth(),
          1
        ).toISOString()
      )
      .order("created_at", { ascending: false })
      .limit(1);

...

 

분명 함수에서도 thisYear이랑 thisMonth로 받아주고 있다..

 

폭풍검색을 하고 보니..

매개변수로 선언이 된 변수명은 함수 호출 시에 다른 이름의 매개변수로 전달이 가능했었다.

즉 `year`와 `month`는 호출 시의 인자로 사용되고, `thisYear` `thisMonth`는 함수 내부에서 이름을 바꿔서 사용하게 되는 것!!

 

// ResultComponent에서 호출할 때 year와 month를 인자로 전달
loadUserAndFetchData(setUser, year, month, setCurrentData);

export const loadUserAndFetchData = async (
  setUser: SetUserType,
  thisYear: number | null,
  thisMonth: number | null,
  setCurrentData: React.Dispatch<React.SetStateAction<MonthlyData | null>>
) => {
  // thisYear와 thisMonth는 함수 호출 시 year와 month의 값을 받음.
  // 내부에서는 thisYear와 thisMonth로 사용

 

호출 시 사용하는 이름과 함수 내에서 참조하는 이름이 일치해서 어떤 값이 전달되고 사용되는지 쉽게 알 수 있게 되었다

 

이번에 경험해보니.. 최대한 이름을 통일 시키는 것이 코드 가독성 측면에서 좋을 것 같다는 생각이 들었다.

다음부터는 매개변수와 인자의 이름을 일치 시켜서 코드의 일관성을 높여보기로!!