Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) #1

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

hyerimhan
Copy link

@hyerimhan hyerimhan commented Jan 20, 2023

Youtube Clone Toy Project (Demo)

프로젝트 문서는 여기에서 확인하실 수 있습니다.



🙋 Member

FE. 팀원

FE. 팀원
FE. 팀원
FE. 팀원



🔧 기술 스택



Tools

  • Deploy
  • 버전관리
  • Docs



📃 설치된 라이브러리



📌 기능 구현 목록

1. Header

  • 로고
    • 클릭 시, 홈으로 이동
  • 검색창
    • 해당 제목으로 영상 검색
  • 로그인
    • 구글 연동


2. HOME

  • 영상 목록

    • public -> videos -> popular.json 목업데이터 우선 사용

    2-1. VideoCard

    • 영상 클릭 시, 해당 영상 VideoDetail 페이지로 넘어감.
    • 썸네일
    • 영상 제목
    • 채널명
    • 조회수 · 업로드날짜

3. VideoDetail

  • 영상
  • 영상 제목
  • 채널명
  • 영상 상세 설명
  • 관련 영상 목록
  • 댓글

4. 기타

  • 화면 렌더링 중일땐 Loading... 출력
  • 페이지에 에러 발생 시, NotFound 페이지로 넘어감.
  • 반응형



😱 이슈

발생 이슈 해결 방법
230117-adblock
디테일 페이지에서 영상 가져올 떄 발생하는 에러
크롬에 adblock이 설치되어 있어서 뜨는 에러. 무시해도 잘 작동함.
230117-adblock
npm run start 터미널에서 발생하는 경고 메세지
root경로에 있는 파일에 GENERATE_SOURCEMAP=false 추가
2023-01-19-160931image
netlify 배포 에러
2023-01-19-221714
사용하지 않는 코드나 import 정리하기
image 상세 페이지에 동영상을 제외한 정보들은 youtube api 의 일일할당량 때문에 localStorage 로 저장하여 구현하고 있어서 첫번째로 들어간 상세페이지의 동영상 정보들이 출력됩니다

@hyerimhan hyerimhan changed the title 7조 과제제출 7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) Jan 20, 2023
@hyerimhan hyerimhan changed the title 7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) <진행중> 7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) Jan 21, 2023
@hyerimhan hyerimhan changed the title <진행중> 7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) 7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) <진행중> Jan 21, 2023
@hyerimhan hyerimhan changed the title 7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) <진행중> 7조 과제제출 (김혜인, 조효림, 한수산, 한혜림) Jan 23, 2023
Comment on lines +24 to +60
useEffect(() => {
if (!JSON.parse(localStorage.getItem('VideoDetail'))) {
getVideoDetail(videoId).then((data) => {
localStorage.setItem('VideoDetail', JSON.stringify(data));
setVideoLoading(false);
});
} else {
setVideoLoading(false);
}

if (!JSON.parse(localStorage.getItem('ChannelInfo'))) {
getChannelInfo(channelId).then((data) => {
localStorage.setItem('ChannelInfo', JSON.stringify(data));
setChannelLoading(false);
});
} else {
setChannelLoading(false);
}

if (!JSON.parse(localStorage.getItem('Comment'))) {
getComment(videoId).then((data) => {
localStorage.setItem('Comment', JSON.stringify(data));
setCommentLoading(false);
});
} else {
setCommentLoading(false);
}

if (!JSON.parse(localStorage.getItem('RelationVideo'))) {
getRelationVideo(videoId).then((data) => {
localStorage.setItem('RelationVideo', JSON.stringify(data));
setRelatedLoading(false);
});
} else {
setRelatedLoading(false);
}
}, [channelId, videoId]);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 동작으로 인해 모든 영상에 댓글과 관련 영상이 동일하게 표기되고 있습니다.
videoId와 같은 유니크한 id값을 사용해 스토리지에 분리하여 저장하면 이를 피할수 있을것으로 보입니다.

Comment on lines +14 to +15
const { state } = useLocation();
const channelId: string = state.channelId;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

state로 chnnelId가 전달되지 않는 경우 발생되는 에러가 핸들링되지 않습니다.
해당 에러는 /videos/watch/:videoId로 url을 직접 입력하거나
해당 페이지 내 채널명을 클릭할 경우 발생됩니다.

getVideoDetail을 통해 들어온 데이터를 살펴보면 channelId를 살펴볼 수 있습니다.
이를 통해 데이터를 가져올 수 있도록 수정하는 방법이 보다 안정적으로 페이지를 렌더링 시킬수 있을것으로 보입니다.

@KDT-sihyeon
Copy link

코드 전체를 살펴보았는데 크게 코멘트를 남길 영역이 없어
추가적으로 아래 3가지 개선 하면 보다 좋을것 같은 점을 끝으로 리뷰를 마치겠습니다.

1. youtube api에서 제공해주는 데이터를 직관적으로 네이밍 된 변수를 사용해서 가독성 높이기
현재 모든 코드가 snippet.xxx.xxxx 와 같이 원본 데이터 그대로의 형태로 사용하고 있는것으로 확인했습니다.
이와 같은 형태로 상용하면 가독성이 낮아져 후에 직관적으로 해당 데이터의 의미를 파악하기 어려워집니다.
따라서 requests.tsx 파일 또는 해당 요청을 진행하는 파일 내부에서 변수를 별도로 지정하여 해체하는것을 추천합니다.
다른 방법으로는 같은 요청이라도 사용해야하는 응답 데이터를 기준으로 여러 함수로 분리하는것도 좋습니다.

2. localStorage 대신 firebase사용해보기
현재 localStorage를 통해 중복된 데이터 호출을 줄이는 시도를 했는데 이는 개별로만 동작하며 쉽게 휘발되므로
firebase를 현재 사용중이므로 firebase의 스토리지를 캐시로 사용해보면 어떨까 생각이 듭니다.

3. scss로 반응형 구현할때는 너비값을 변수로 선언해서 사용하기
현재 1300, 768, 500 등으로 나누어 구현된것을 확인했는데 모두 직접 선언되어있습니다.
이러한 형태보다 index.scss와 같은 루트에서 변수를 선언해 한 곳에서 값을 참조하도록 하면 후에 수정하기 편하고
구현할때도 헷갈리지 않고 쉽게 구현할 수 있습니다.

@KDT-sihyeon
Copy link

추가로 제대로 이해하지 못한 부분에 대한 코멘트 입니다.

  1. index.tsx에 index:true index:/videos index:/videos/:keyword 차이점
    왜 3개로 나눠서 같은 컴포넌트를 렌더링하고 있는지 파악하지 못했습니다.

해당 부분에 대한 설명을 해주시면 추가로 리뷰 진행해드리겠습니다.

@KDT-sihyeon
Copy link

목표하신 기능 내에서는 코멘트 남길게 없을 정도로 정말 잘 만드신것 같습니다.

수고 많으셨습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants