- 유튜브 인터페이스를 React와 YouTube Data API로 제작한 프로젝트입니다.
- 검색, 동영상 시청, 관련 동영상 탐색, 댓글과 답글, 다크 모드 등 다양한 기능이 포함되어 있으며 반응형 UI로 구현되었습니다.
- API 버전: YouTube Data API v3
- 인증 방식: API Key
- 사용 API:
videos?key={개인 API키}&part=snippet&maxResults=25&order=date&chart=mostPopular - 설명: 인기 동영상을 최신순으로 25개만 불러와 홈 화면에 표시합니다.
- 사용 API:
search?key={개인 API키}&part=snippet&maxResults=25&order=date&type=video&q=rose - 설명: 키워드로 검색한 동영상을 최신순으로 25개만 불러와 홈 화면에 표시합니다.
- 사용 API:
videos, search API에서 불러온 데이터 사용 - 설명: 동영상에 대한 자세한 정보(동영상 제목, 채널 썸네일, 채널명, 게시일)를 제공 받아 비디오 상세 화면에 표시합니다.
- 사용 API:
channels?key={개인 API키}&part=snippet&id={channelId} - 설명: 채널 운영자의 프로필 이미지 주소를 가져와 비디오 상세 화면에서 이미지로 보여줍니다.
- 사용 API:
commentThreads?key={개인 API키}&part=snippet&videoId={videoId}&maxResults=50&order=relevance - 설명: 댓글에 대한 자세한 정보(총 댓글수, 총 답글수, 작성자 프로필 이미지, 작성자 이름, 댓글 내용, 게시일)를 50개만 불러와 관련성 높은순으로 댓글 화면에 표시합니다.
- 사용 API:
comments?key={개인 API키}&part=snippet&parentId={commentId} - 설명: 답글에 대한 자세한 정보(작성자 프로필 이미지, 작성자 이름, 댓글 내용, 게시일)를 50개만 불러와 답글 화면에 표시합니다.
| 페이지 | 경로 | 설명 |
|---|---|---|
| 홈 | / | 비디오 목록 표시 |
| 검색 결과 | /:keyword | 검색 결과과 일치하는 비디오 목록 표시 |
| 비디오 상세 | /watch/:videoId | 선택한 비디오의 상세 정보, 댓글, 답글, 관련 영상 표시 |
| 에러 | /test-error | 에러 발생 시 표시 |
| 로딩 | /test-loading | API 요청 중 딜레이 되는 경우 표시 |
📦src
┣ 📂app
┃ ┣ 📂context
┃ ┃ ┗ 📜YoutubeApiContext.jsx // 전역 상태 공유를 위한 Context 생성
┃ ┣ 📂provider
┃ ┃ ┗ 📜YoutubeApiProvider.jsx // Context Provider 및 API 로직 관리
┃ ┗ 📜App.jsx
┣ 📂entities
┃ ┣ 📂comment
┃ ┃ ┗ 📂ui
┃ ┃ ┃ ┣ 📂CommentItem // 개별 댓글 컴포넌트
┃ ┃ ┃ ┃ ┣ 📜CommentItem.jsx
┃ ┃ ┃ ┃ ┗ 📜CommentItem.module.css
┃ ┃ ┃ ┗ 📂ReplyItem // 개별 답글 컴포넌트
┃ ┃ ┃ ┃ ┣ 📜ReplyItem.jsx
┃ ┃ ┃ ┃ ┗ 📜ReplyItem.module.css
┃ ┗ 📂video
┃ ┃ ┗ 📂ui
┃ ┃ ┃ ┣ 📂ChannelInfo // 채널 운영자 정보 표시(프로필 이미지, 이름)
┃ ┃ ┃ ┃ ┣ 📜ChannelInfo.jsx
┃ ┃ ┃ ┃ ┗ 📜ChannelInfo.module.css
┃ ┃ ┃ ┣ 📂Comments // 댓글, 답글 리스트 컴포넌트
┃ ┃ ┃ ┃ ┣ 📜Comments.jsx
┃ ┃ ┃ ┃ ┗ 📜Comments.module.css
┃ ┃ ┃ ┣ 📂RelatedVideos // 관련 비디오 리스트 컴포넌트
┃ ┃ ┃ ┃ ┣ 📜RelatedVideos.jsx
┃ ┃ ┃ ┃ ┗ 📜RelatedVideos.module.css
┃ ┃ ┃ ┗ 📂VideoCard // 동영상 썸네일 카드 컴포넌트
┃ ┃ ┃ ┃ ┣ 📜VideoCard.jsx
┃ ┃ ┃ ┃ ┗ 📜VideoCard.module.css
┣ 📂features
┃ ┗ 📂api
┃ ┃ ┣ 📜fakeYoutubeClient.js // 테스트용 Mock Data 정의
┃ ┃ ┣ 📜youtube.js // API 명세 및 파라미터 정의
┃ ┃ ┗ 📜youtubeClient.js // 실제 API 호출 로직 정의
┣ 📂pages
┃ ┣ 📂Error // 에러 페이지
┃ ┃ ┣ 📂styles
┃ ┃ ┃ ┗ 📜index.module.css
┃ ┃ ┗ 📜index.jsx
┃ ┣ 📂Loading // 로딩 페이지
┃ ┃ ┣ 📂styles
┃ ┃ ┃ ┗ 📜index.module.css
┃ ┃ ┗ 📜index.jsx
┃ ┣ 📂Root // 공통 레이아웃(헤더, 메인 컨테이너)
┃ ┃ ┗ 📜index.jsx
┃ ┣ 📂VideoDetail // 비디오 상세 페이지(영상, 채널, 댓글, 답글)
┃ ┃ ┣ 📂styles
┃ ┃ ┃ ┗ 📜index.module.css
┃ ┃ ┗ 📜index.jsx
┃ ┗ 📂Videos // 비디오 목록 페이지
┃ ┃ ┣ 📂styles
┃ ┃ ┃ ┗ 📜index.module.css
┃ ┃ ┗ 📜index.jsx
┣ 📂shared
┃ ┣ 📂lib
┃ ┃ ┗ 📂timeago // 시간 포맷 변환 유틸 함수
┃ ┃ ┃ ┗ 📜index.js
┃ ┗ 📂ui
┃ ┃ ┣ 📂header // 헤더 컴포넌트
┃ ┃ ┃ ┣ 📜Header.jsx
┃ ┃ ┃ ┗ 📜Header.module.css
┃ ┃ ┣ 📂popup // 팝업창 컴포넌트
┃ ┃ ┃ ┣ 📜Popup.jsx
┃ ┃ ┃ ┗ 📜Popup.module.css
┃ ┃ ┣ 📂theme // 테마 토글 버튼 컴포넌트
┃ ┃ ┃ ┣ 📜Theme.jsx
┃ ┃ ┃ ┗ 📜Theme.module.css
┃ ┃ ┗ 📜index.js // 공용 UI 컴포넌트 인덱스
┣ 📜index.css // 전역 스타일 정의
┗ 📜main.jsx
- Node.js 18 이상 권장
- YouTube Data API v3 개인 키 필요
- Google Cloud Console에서 YouTube Data API v3를 활성화하고 키를 발급받습니다.
- 프로젝트 루트에
.env파일을 만들고 아래와 같이 설정하세요.
VITE_YOUTUBE_API_KEY=발급 받은 키
# 패키지 설치
npm install # 또는 npm i
# 개발 서버 실행
npm run devhttps://young-tube.netlify.app/
{}는 기호가 아니라 설명을 의미합니다.
- feat/{기능 설명}: 새로운 기능을 개발하는 브랜치 → feat/error, fet/video-card
- style/{기능 설명}: 스타일 관련 수정하는 브랜치 → style/popup
- feat: {작업 내용 요약}: 새로운 기능 추가 → feat: 에러 컴포넌트 추가
- style: {작업 내용 요약}: 스타일 관련 수정 → style: 에러 컴포넌트 스타일링
- fix: {작업 내용 요약}: 버그 수정 → fix: search 파라미터 수정
- chore: {작업 내용 요약}: 빌드 설정 수정 → chore: api key 추가





