프론트엔드/Next.js

[최종 프로젝트 - 리팩토링] props 구조분해할당

장쫑이이 2024. 12. 2. 01:31

 

 

 

이번 팀 프로젝트를 진행하면서 가장 아쉬웠던 부분 중 하나는 컴포넌트를 제대로 나누지 못한 부분이다.

그래서 한 페이지의 코드가 300줄이나 되는 대참사가 생겨버렸다.. 가독성이 조금 아쉽다는 생각??

(애초에 코드 한 줄의 길이를 80으로 제한하고 작업을 하긴 했지만..ㅎㅎ )

 

그래서 전체적으로 일단 내가 담당한 탄소 계산기 부분을 컴포넌트화 시키는 작업을 진행 중이고

이번에 적은 내용은 props와 관련된 내용이다.

 

 

처음 코드

//calculator > result > [year] > [month] > Page.tsx > ResultPage

<div className="flex flex-wrap w-full md:w-[1200px] gap-[12px] md:gap-[30px]">
  <CarbonEmissionCard
    logo={"/calculate/electricity_color.svg"}
    title={"전기"}
    usageValue={currentData?.electricity_usage}
    co2Value={currentData?.electricity_co2}
    isHighest={currentData?.electricity_co2 === highestCo2Value}
    isLowest={currentData?.electricity_co2 === lowestCo2Value}
    unit="kwh"
  />
  <CarbonEmissionCard
    logo={"/calculate/gas_color.svg"}
    title={"가스"}
    usageValue={currentData?.gas_usage}
    co2Value={currentData?.gas_co2}
    isHighest={currentData?.gas_co2 === highestCo2Value}
    isLowest={currentData?.gas_co2 === lowestCo2Value}
    unit="m³"
  />
  <CarbonEmissionCard
    logo={"/calculate/water_color.svg"}
    title={"수도"}
    usageValue={currentData?.water_usage}
    co2Value={currentData?.water_co2}
    isHighest={currentData?.water_co2 === highestCo2Value}
    isLowest={currentData?.water_co2 === lowestCo2Value}
    unit="m³"
  />

  ...

</div>

 

 

ResultPage에서 CarbonEmissionCard 라는 컴포넌트를 하나하나 작성을 했었다.

총 5개의 카드가 있었는데 props로 넘겨주는 내용들이 좀 있어서 그런지 생각보다 줄이 길어졌었다.

 

그래서 CarbonEmissionCard를 CarbonEmissionCardList라는 컴포넌트 안에서 작성하여

최상단 페이지에서 조금은 더 간결하게 작성되게 바꾸고 싶어졌다.

 

 

 

처음 작성한 방법  (실패 - 데이터가 다 0 으로 나옴)

// ResultPage
<CarbonEmissionCardList currentData={currentData} />


// CarbonEmissionCardList.tsx
const CarbonEmissionCardList = (currentData) => {
...
  return (
    <div className="flex flex-wrap w-full md:w-[1200px] gap-[12px] md:gap-[30px]">
      <CarbonEmissionCard
        logo={"/calculate/electricity_color.svg"}
        title={"전기"}
        usageValue={currentData?.electricity_usage}
        co2Value={currentData?.electricity_co2}
        isHighest={currentData?.electricity_co2 === highestCo2Value}
        isLowest={currentData?.electricity_co2 === lowestCo2Value}
        unit="kwh"
      />
    ...
}

 

위에와 같이 작성을 했지만 모든 데이터가 0으로 나오더라

 

그 이유는 아래와 같이 미리 작성을 해놨기 때문..

currentData?.electricity_co2 ?? 0

 

 

그래서 currentData를 console.log로 찍어보니까

값이 너무나도 잘 나온다?

{
    "currentData": {
        "record_id": "29edeabc-33b1-438d-9c6c-ed448dde4fc7",
        "user_id": "0c4f85dc-42d3-456f-9233-0fd70ac58f77",
        "water_usage": 20,
        "water_co2": 4.74,
        "gas_usage": 20,
        "gas_co2": 43.52,
        "electricity_usage": 20,
        "electricity_co2": 9.56,
        "waste_volume": 20,
        "waste_co2": 11.15,
        "carbon_emissions": 71.58,
        "record_date": "2024-12-01T22:47:13.049575+00:00",
        "created_at": "2024-12-01T22:47:13.049575+00:00",
        "updated_at": "2024-12-01T22:47:13.049575+00:00",
        "car_usage": 20,
        "car_co2": 2.61,
        "year": 2024,
        "month": 12
    }
}

 

그리고 여기서 아차... 싶었다

지금은 currentData를 Props 객체 전체로 받고 있었던 것!!

한마디로 props 안에 currentData라는 속성에 접근을 해야하는데 그러지 못하고 있었다.

 

 

해결방법 : 구조 분해 할당

props 객체로 전달된 값을 컴포넌트 안에서 쉽게 사용하기 위해 구조 분해를 통해 currentData를 추출하기!

const CarbonEmissionCardList = ({ currentData }) => {
  // 이제 currentData에 바로 접근 가능
};

 

 

그리고 추가로 type 지정까지 완료해주기

const CarbonEmissionCardList: React.FC<{ currentData: MonthlyData | null }> = ({
  currentData
}) => {
};

 

 

정말 자주 사용하던 구조분해할당..

컴포넌트화를 시키다보니 까먹고 적용을 못시키는 경우가 종종 생기더라

 

조금 더 집중해서 코드를 확인해보자!!