이번 글에서는 포켓몬 도감 애플리케이션을 개발하면서 직면했던 오류들과 해결 과정을 모아서 설명하겠습니다. 개발 프로젝트에서는 크고 작은 오류들이 자주 발생합니다. 이러한 오류를 해결하는 과정에서 많은 교훈을 얻을 수 있습니다. 각 오류와 해결 방법을 하나씩 살펴보겠습니다.
Card 컴포넌트에서 포켓몬 이미지를 로드할 때, 특정 상황에서 이미지가 제대로 로딩되지 않고 빈 화면이 표시되는 문제가 발생했습니다. 이 문제는 네트워크가 느리거나 이미지 URL이 잘못되었을 때 발생했습니다.
isImageLoaded
)를 추가했습니다.import React, { useState } from 'react';
function Card({ pokemon }) {
const [isImageLoaded, setIsImageLoaded] = useState(false);
const navigate = useNavigate();
return (
<CardContainer onClick={() => navigate(`/detail/${pokemon.id}`)}>
{!isImageLoaded && <div className="loading-placeholder">로딩 중...</div>}
<img
src={pokemon.front}
alt={pokemon.name}
onLoad={() => setIsImageLoaded(true)}
style={{ display: isImageLoaded ? 'block' : 'none' }}
/>
<div className="pokemon-name">{pokemon.name}</div>
<FavoriteButton pokemonId={pokemon.id} />
</CardContainer>
);
}
i18next를 사용하여 다국어 지원을 구현하는 과정에서, 언어 설정이 초기 로드 시 잘못된 언어로 표시되거나 제대로 적용되지 않는 문제가 발생했습니다.
useEffect
활용: 컴포넌트가 로드될 때 언어를 다시 한 번 설정하여 초기 로드 문제를 해결했습니다.useEffect(() => {
const storedLanguage = localStorage.getItem('language') || 'en';
i18n.changeLanguage(storedLanguage);
}, []);
Redux를 통해 포켓몬 데이터를 관리하는 과정에서, 비동기 데이터가 로드되지 않은 상태에서 컴포넌트가 렌더링되는 문제가 있었습니다. 이로 인해 undefined
데이터를 참조하려고 할 때 오류가 발생했습니다.
undefined
인 경우가 발생했습니다.loading
상태를 추가하여 데이터를 가져오는 동안 로딩 중임을 표시했습니다.const pokemonData = useSelector((state) => state.pokemon.data);
const loading = useSelector((state) => state.pokemon.loading);
if (loading) {
return <LoadingSpinner />;
}
return (
<div className="pokemon-list">
{pokemonData.map((pokemon) => (
<Card key={pokemon.id} pokemon={pokemon} />
))}
</div>
);
즐겨찾기 버튼을 클릭할 때, 버튼의 반응이 느려 사용자가 여러 번 클릭하는 문제가 있었습니다.
<button
onClick={(e) => {
e.stopPropagation();
setIsFavorite(!isFavorite); // Optimistic UI 업데이트
dispatch(isFavorite ? removeFromFavorite(pokemonId) : addToFavorite(pokemonId));
}}
className={isFavorite ? 'animate-pulse' : ''}
>
{isFavorite ? '❤️' : '♡'}
</button>
이번 글에서는 포켓몬 도감 애플리케이션을 개발하는 동안 발생했던 주요 오류들과 그 해결 과정을 설명했습니다.각 상황에 맞는 해결 방법을 적용함으로써 더 안정적이고 사용자 친화적인 애플리케이션을 만들 수 있었습니다.