요즘 "코스메이커" 프로젝트에서 리팩터링을 진행하고 있는데, 이번 챕터에서 나온 기술들을 직접 적용해 보기로 했다.
함수를 옮길지 말지를 정하기란 쉽지 않다. 그럴 땐 대상 함수의 현재 컨텍스트와 후보 컨텍스르틑 둘러보면 도움이 된다.
groupTagsByDescription
함수로 src\components\domains\spotRegister\BadgeLists.tsx
와 src\pages\SearchPage\index.tsx
에서 사용되고 있는 함수이다. const groupTagsByDescription = (tags: tagResponseDto[]) => {
return tags.reduce(
(acc, tag) => {
if (!acc[tag.description]) {
acc[tag.description] = [];
}
acc[tag.description].push(tag);
return acc;
},
{} as Record<string, tagResponseDto[]>,
);
};
groupTagsByDescription
함수는 tagResponseDto[]
타입의 배열을 받아 description
속성을 기준으로 그룹화하여 반환하는 함수임src\utils\groupTags.ts
파일을 만들고 함수를 소스 함수를 복사함import { tagResponseDto } from "@/api/tag/type";
const groupTags = (tags: tagResponseDto[]): Record<string, tagResponseDto[]> => {
return tags.reduce(
(acc, tag) => {
if (!acc[tag.description]) {
acc[tag.description] = [];
}
acc[tag.description].push(tag);
return acc;
},
{} as Record<string, tagResponseDto[]>,
);
};
export default groupTags;
import
해옴import groupTags from "@/utils/groupTags";
//중략
const BadgeLists = ({ selectedBadges, onChange }: BadgeListProps) => {
//중략
useEffect(() => {
const fetchLists = async () => {
try {
const response = await getTag();
setTagsData(response);
// console.log(response.data);
} catch (error) {
console.error("Error fetching data:", error);
}
};
fetchLists();
}, []);
const groupedTags = groupTags(tagsData);
return (
<>
//중략
</>
);
};
export default BadgeLists;
import { getTag } from "@/api/tag";
import { tagResponseDto } from "@/api/tag/type";
import BadgeList from "@/components/commons/BadgeList/BadgeList";
import groupTags from "@/utils/groupTags";
import { useEffect, useState } from "react";
interface BadgeListProps {
selectedBadges: tagResponseDto[];
onChange: (updatedDestinationBadges: tagResponseDto[]) => void;
}
const BadgeLists = ({ selectedBadges, onChange }: BadgeListProps) => {
const [tagsData, setTagsData] = useState<tagResponseDto[]>([]);
const [selectedDestinationBadges, setSelectedDestinationBadges] = useState<tagResponseDto[]>(selectedBadges);
useEffect(() => {
onChange(selectedDestinationBadges);
}, [selectedDestinationBadges, onChange]);
useEffect(() => {
const fetchLists = async () => {
try {
const response = await getTag();
setTagsData(response);
} catch (error) {
console.error("Error fetching data:", error);
}
};
fetchLists();
}, []);
const groupedTags = groupTags(tagsData);
return (
<>
{Object.entries(groupedTags).map(([description, tags]) => (
<BadgeList
key={description}
title={description}
tags={tags}
selectedBadges={selectedDestinationBadges}
setSelectedBadges={setSelectedDestinationBadges}
/>
))}
</>
);
};
export default BadgeLists;