프론트엔드 개발을 시작하면서, React와 TypeScript를 사용하여 나만의 스코어보드 앱을 개발한 경험담을 공유하고자 합니다. 이 프로젝트는 프론트엔드 기술을 다지는 좋은 기회가 되었고, 여러 가지 유용한 기술들을 익히는 계기가 되었습니다.
프로젝트 개요
스코어보드 앱은 간단한 점수 기록 및 관리 기능을 제공하는 웹 애플리케이션입니다. 사용자들은 팀 이름과 점수를 입력하고, 이를 기반으로 점수를 업데이트할 수 있습니다. 이 앱을 통해 React의 상태 관리와 TypeScript의 타입 안정성을 체험할 수 있었습니다.
개발 환경 설정
먼저, 프로젝트의 기본 환경을 설정합니다. Create React App을 사용하여 TypeScript 지원으로 프로젝트를 초기화했습니다.
npx create-react-app scoreboard-app --template typescript
이 명령어를 통해 TypeScript가 설정된 React 앱이 생성됩니다.
앱 구조 설계
앱의 기본 구조는 다음과 같이 설정했습니다.
App.tsx: 메인 컴포넌트Scoreboard.tsx: 스코어보드 컴포넌트Team.tsx: 각 팀의 점수를 표시하는 컴포넌트
App.tsx
메인 컴포넌트인 App.tsx에서 스코어보드의 상태를 관리합니다.
import React, { useState } from 'react';
import Scoreboard from './Scoreboard';
interface Team {
name: string;
score: number;
}
const App: React.FC = () => {
const [teams, setTeams] = useState<Team[]>([
{ name: '팀 A', score: 0 },
{ name: '팀 B', score: 0 },
]);
const updateScore = (teamIndex: number, newScore: number) => {
const updatedTeams = [...teams];
updatedTeams[teamIndex].score = newScore;
setTeams(updatedTeams);
};
return (
<div>
<h1>스코어보드</h1>
<Scoreboard teams={teams} updateScore={updateScore} />
</div>
);
};
export default App;
Scoreboard.tsx
Scoreboard 컴포넌트는 팀 목록을 표시하고, 점수를 업데이트하는 기능을 제공합니다.
import React from 'react';
import Team from './Team';
interface TeamProps {
teams: { name: string; score: number }[];
updateScore: (teamIndex: number, newScore: number) => void;
}
const Scoreboard: React.FC<TeamProps> = ({ teams, updateScore }) => {
return (
<div>
{teams.map((team, index) => (
<Team key={index} team={team} index={index} updateScore={updateScore} />
))}
</div>
);
};
export default Scoreboard;
Team.tsx
각 팀의 점수를 표시하고 업데이트할 수 있는 컴포넌트입니다.
import React, { useState } from 'react';
interface TeamProps {
team: { name: string; score: number };
index: number;
updateScore: (teamIndex: number, newScore: number) => void;
}
const Team: React.FC<TeamProps> = ({ team, index, updateScore }) => {
const [inputScore, setInputScore] = useState<number>(team.score);
const handleScoreChange = () => {
updateScore(index, inputScore);
};
return (
<div>
<h2>{team.name}</h2>
<p>점수: {team.score}</p>
<input
type="number"
value={inputScore}
onChange={(e) => setInputScore(Number(e.target.value))}
/>
<button onClick={handleScoreChange}>점수 업데이트</button>
</div>
);
};
export default Team;
TypeScript의 장점
TypeScript를 사용함으로써 얻은 주요 이점은 코드의 안정성과 유지보수 용이성입니다. 컴포넌트의 props에 대한 타입을 명시적으로 정의함으로써, 잘못된 데이터 처리로 인한 오류를 사전에 방지할 수 있었습니다. 예를 들어, Team.tsx에서 팀의 데이터 타입을 명확히 정의하여, 예상치 못한 데이터가 전달되는 것을 방지했습니다.
마무리
React와 TypeScript로 개발한 스코어보드 앱은 프론트엔드 기술을 배우는 데 유익한 경험이었습니다. 이 프로젝트를 통해 상태 관리, 컴포넌트 구조 설계, 그리고 타입스크립트의 이점을 실감할 수 있었습니다. 앞으로도 이러한 경험을 바탕으로 더 많은 프로젝트에 도전하고, 다양한 기술을 익혀 나가고 싶습니다.