최근 프로젝트에서 날씨 정보를 사용자들에게 제공하기 위해 행정 구역 데이터와 오늘, 이번 주 날씨 데이터를 가져와 화면에 표시하는 기능을 구현했습니다. 이 과정에서 UI와 데이터 관련 로직을 효과적으로 분리하기 위해 커스텀 훅을 도입했습니다.
구조 변경 이유 ✨
데이터 요청, 포맷팅, 상태 관리 등의 로직이 컴포넌트 내부에 존재해서 UI와 데이터 로직이 혼합되어 가독성이 떨어지고, 유지보수가 어려운 상황이 발생했습니다.
분리했을 때 이점
`가독성 향상` : 컴포넌트가 UI에만 집중할 수 있어 코드의 가독성이 높아졌습니다.
`유지보수 용이` : 데이터 로직을 커스텀 훅으로 분리하여, 각 기능을 독립적으로 수정하거나 확장할 수 있습니다.
`재사용성` : 커스텀 훅을 다른 컴포넌트에서도 재사용할 수 있어 코드 중복을 줄였습니다.
구현 방식 📖
커스텀 훅 작성
`useWeather` 훅을 작성해 행정구역 데이터와 날씨 데이터를 가져오는 로직을 처리했습니다. 이 훅은 API 요청, 데이터 포맷팅, 상태 관리 등을 담당해 컴포넌트에서는 훅을 호출해 필요한 데이터만 가져옵니다.
export const useWeather = () => {
const { center } = useLocationStore((state) => state.location);
const { data: regionCodeData, isPending, refetch: refetchRegionCode } = useQuerys.useGetCoordRegionCodeQuery(center);
const { data: todayWeatherData } = useQuerys.useGetTodayWeatherQuery(center);
const { data: weeklyWeatherData } = useQuerys.useGetWeeklyWeatherQuery(center);
const regionCode = useMemo(() => weatherFormatter.formattedRegionCode(regionCodeData), [regionCodeData]);
const currentWeather = useMemo(() => weatherFormatter.formattedTodayWeatherData(todayWeatherData), [todayWeatherData]);
const weeklyWeather = useMemo(() => weatherFormatter.formattedWeeklyWeatherData(weeklyWeatherData), [weeklyWeatherData]);
useEffect(() => {
if (center) {
refetchRegionCode();
refetchTodayWeather();
refetchWeeklyWeather();
}
}, [center]);
return {
regionCode,
isPending,
currentWeather,
weeklyWeather
}
};
UI 컴포넌트
`WeatherDisplay` 컴포넌트는 `useWeather`훅을 호출해 필요한 데이터만 가져와 사용합니다.
const WeatherDisplay = () => {
const { regionCode, isPending, currentWeather, weeklyWeather } = useWeather();
if (isPending) return <h2>데이터가 없습니다.</h2>;
return (
<div>
{/* UI 구성 */}
</div>
);
};
어려웠던 점 ❓
상태 관리 복잡
API 요청과 데이터 상태를 관리하는 과정에서, 여러 상태가 동시에 업데이트되는 상황이 발생했는데 특히 `center`값이 변경될 때마다 여러 데이터를 refetch 해야 돼서 상태의 일관성을 유지하는 것이 어려웠습니다. 그래서 `useEffect`를 활용했습니다. (아직 까지도 어려움)
깨달은 점 ❕
가독성
데이터 로직을 분리함으로써 가독성이 크게 향상된 것을 체감했습니다. 그래서 코드를 이해하고 수정하는 데 드는 시간이 줄어들었습니다.
재사용성
같은 로직을 여러 컴포넌트에서 재사용할 수 있어, 중복 코드를 줄이고 일관성을 유지하는데 큰 도움이 됐습니다.
회고 🧐
커스텀 훅을 통해 관련 로직을 분리함으로써 가독성 및 유지보수성을 크게 향상시킬 수 있었고, 이런 구조를 활용해 다른 프로젝트에서 활용해 유용하게 적용할 수 있을 것 같습니다.
아직 많이 부족하기 때문에 지금 작성한 코드도 잘 작성된 코드가 아닐 수 있습니다. 조언은 언제나 환영입니다~!!
'공부 > 프로젝트' 카테고리의 다른 글
[모아 프로젝트] 버전 관리와 사용자 피드백을 통한 꾸준한 개선 (0) | 2024.11.19 |
---|---|
[팀 프로젝트] issue daily (2) | 2024.10.17 |
[팀 프로젝트] Go 캠핑! (1) | 2024.09.23 |
[개인 프로젝트] MBTI 테스트 (0) | 2024.09.14 |
[개인 프로젝트] MBTI 테스트 - useQuery, useMutation 커스텀 훅 리팩토링 (0) | 2024.09.09 |
[팀 프로젝트] 방콕 스타일 회고 (0) | 2024.09.04 |
[팀 프로젝트] 방콕 스타일 (2) | 2024.09.04 |
[팀 프로젝트] 방콕스타일 - 검색 기능 구현 (Debounce) (3) | 2024.09.02 |