IT의 IT 블로그
사이드 프로젝트 | NBA Game Picker (2) - 홈 화면 구조와 컴포넌트 분리 본문
안녕하세요.
지난 글에서는
NBA Game Picker 프로젝트를 왜 만들었고,
어떤 방향으로 설계했는지에 대해 정리했습니다.
이번 글에서는
홈 화면을 어떻게 구조화하고, 컴포넌트로 분리했는지
그 과정을 정리해보려고 합니다.
1. 왜 컴포넌트 분리를 하게 되었는가
홈 화면을 처음 구현할 때는
모든 코드를 page.tsx 하나에 작성했습니다.
초기에는 문제가 없어 보였지만
기능이 추가되면서 점점 구조가 복잡해졌습니다.
예를 들면 다음과 같은 요소들이 한 파일 안에 모두 들어가 있었습니다.
- 오늘 경기 리스트
- 오늘의 추천 경기
- 팀 순위
- 득점 리더
- 매치업 데이터
- 카드 UI 스타일
- 점수 관련 로직
이 상태에서는
어느 하나를 수정하려고 해도 전체 파일을 같이 봐야 하는 상황이 발생했습니다.
2. 문제의 핵심
문제는 단순히 코드가 길어진 것이 아니라
역할이 섞여 있다는 점이었습니다.
하나의 파일 안에
- UI
- 데이터
- 로직
이 모두 섞여 있다 보니
코드를 이해하고 수정하는 데 부담이 커졌습니다.
3. 구조를 나누는 기준
그래서 구조를 나눌 때
기준을 명확하게 잡았습니다.
기준
- UI → components
- 데이터 → data
- 로직 → lib
- 타입 → types
이 기준을 기반으로
기존 구조를 점진적으로 분리했습니다.
4. 현재 구조
현재는 다음과 같은 구조로 정리했습니다.
features/nba
├─constants
├─data
├─lib
└─types
여기서 핵심은
**“기능이 아니라 역할 기준으로 나눈 것”**입니다.
5. 컴포넌트 분리 대상
홈 화면을 기준으로
다음 컴포넌트들을 분리했습니다.
1) Card
가장 기본이 되는 UI 컴포넌트입니다.
- title
- action
- children
형태로 구성해서
모든 섹션에서 재사용할 수 있도록 만들었습니다.
하나의 레이아웃을 여러 곳에서 공통으로 사용하는 역할입니다.
2) GameRow
경기 리스트에서 사용하는 컴포넌트입니다.
- 경기 시간
- 팀 매치업
- 추천 점수
홈 화면과 /games 페이지에서 모두 재사용할 수 있도록 설계했습니다.
3) RankingList
팀 순위를 보여주는 컴포넌트입니다.
- 순위
- 팀 이름
- 승률
단순 테이블 구조지만
별도 컴포넌트로 분리하면서 재사용성을 확보했습니다.
4) ScoringLeaders
득점 리더를 보여주는 컴포넌트입니다.
- 순위
- 선수 이름
- 팀
- 평균 득점
이후 별도 페이지로 확장하기 쉽게 구조를 잡았습니다.
6. 분리하면서 중요했던 점
1) props 설계
컴포넌트를 나누면서 가장 중요했던 부분은
props를 어떻게 설계할 것인가였습니다.
예를 들어 GameRow는
필드를 하나씩 나누지 않고
interface GameRowProps {
game: HomeGameItem;
}
이처럼 데이터 단위로 전달하는 방식으로 구성했습니다.
이렇게 하면 구조가 단순해지고 유지보수가 쉬워집니다.
2) 재사용성 고려
처음부터 재사용을 고려해서 설계했습니다.
- Card → 모든 섹션 공통
- GameRow → 홈 / games 페이지 공통
- RankingList → 다른 페이지 확장 가능
- ScoringLeaders → 별도 페이지로 확장 가능
단순 분리가 아니라 확장을 고려한 구조로 가져갔습니다.
3) 스타일 일관성
컴포넌트를 나누면서
UI도 자연스럽게 정리되었습니다.
- border 스타일 통일
- radius 통일
- spacing 통일
- 다크모드 대응 일관화
결과적으로 전체 UI의 완성도가 올라갔습니다.
7. 분리 이후 변화
컴포넌트를 분리한 이후 가장 큰 변화는 다음과 같습니다.
before
- page.tsx 하나에 모든 코드 존재
- 수정 시 영향 범위 큼
- 구조 파악이 어려움
after
- 역할별 파일 분리
- 필요한 부분만 수정 가능
- 코드 가독성 개선
유지보수성과 확장성이 크게 개선되었습니다.
8. 현재 단계에서의 의미
지금 단계는 단순히 UI를 만든 것이 아니라
**“서비스 구조를 설계하는 단계”**라고 생각합니다.
이 작업을 통해
- 데이터 흐름
- 컴포넌트 구조
- 재사용성
이 세 가지를 정리할 수 있었습니다.
9. 마무리
이번 작업을 통해 느낀 점은
UI를 만드는 것보다 구조를 만드는 것이 더 중요하다는 것이었습니다.
처음에는 빠르게 화면을 만드는 데 집중했지만,
기능이 늘어날수록
구조를 정리하는 작업이 필수라는 것을 느꼈습니다.
'프로젝트 회고록' 카테고리의 다른 글
| 사이드 프로젝트 | NBA Game Picker (4) - Matchup Score 설명 페이지 구성 (0) | 2026.05.18 |
|---|---|
| 사이드 프로젝트 | NBA Game Picker (1) - 프로젝트 기획과 서비스 방향 (0) | 2026.05.01 |
| 사이드 프로젝트 소개 | 셀프 인테리어 가이드 (0) | 2026.04.06 |
| 사내 공통 로그인 템플릿 개발 (Security Starter) (1) | 2025.12.31 |
| LOD1 건물 시각화: 공공데이터 기반 3D 빌딩 구축 튜토리얼 (0) | 2025.12.16 |