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

2조 과제 제출(방준우, 배현수, 오혜성, 이혜란, 전소윤) #5

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

Conversation

mineclover
Copy link

@mineclover mineclover commented Jan 20, 2023

FastCampusToyStory - 리액트 토이 프로젝트(유튜브 클론)

데모 링크 : https://bejewelled-meringue-fd3712.netlify.app/

팀원들

팀원 팀원 팀원 팀원 팀원
img img img img img%7C
방준우 배현수 오혜성 이혜란 전소윤

📌 과제 목표

  • youtube API 사용해보기
  • react-typescript 적용을 빨리 해보자
  • recoil, custom hooks 사용 등 다양한 기술을 배우면서 적용해보기
  • Redux 대신 러닝커브가 낮은 Recoil 사용해보기
  • scss 모듈 방식과 styled-component 방식 사용해보기

✅ 구현 기능

  • 메인에 영상 출력
  • ui 최대한 비슷하게 구현
  • 검색 기능
  • 동영상 영역에 호버하면 자동 재생
  • 비디오 상세페이지 관련 동영상 출력
  • 비디오 상세페이지 댓글, 대댓글 출력
  • Not Found 페이지 구현
  • dayjs 사용해서 영상 업로드 날짜 변환 후 출력
  • 재생 시간 변환
  • 조회수 포맷 설정
  • side bar 구현
  • 로딩 중 애니메이션
  • 스켈레톤 UI 구현 시도 했으나 로딩 끝난 후 사라지지 않음
  • 무한 스크롤 구현

🛠 사용기술스택

  • recoil

styled

axios

- dayjs

이슈

  • 파일명 소문자로 작성 및 배포 후에 파일명을 대문자로 변경 시, git 상에서 해당 변경 사항을 추적하지 못하여 netlify에서 빌드 오류가 발생함
  • hover 동영상 자동재생 시 이슈 부분에 cookie 관련 문제 발생

스크린샷 2023-01-20 오후 10 05 26

소감

  • 배현수 : 리액트로 컴포넌트 단위의 개발이 바닐라 자바스크립트 보다 얼마나 편한 방법인지 알게 되었음..
  • 이혜란: 타입스크립트 사용이 어려웠고, 상태관리 라이브러리도 유용하게 사용하지 못한것 같아 아쉬움이 많이 남습니다..
  • 전소윤 : 타입스크립트를 제대로 못 써서 아쉽습니당…시간에 쫓겨서 되는 대로 개발한 느낌이라 쓴소리 달게 받겠습니다.
  • 방준우 : 프로젝트에 대한 다양한 짬밥을 얻을 수 있었다, 타입스크립트 제네릭 공부 해야겠다, 깃 플로우 잘 쓰니 유용하더라, 로티 재밌다, 초기 세팅과 회의가 중요함,
  • 오혜성 : 타입스크립트의 타입 지정에 대한 적응 때문에 상당히 오랜 시간이 필요하였으며, 리액트의 컴포넌트를 재사용성을 제대로 이용하지 못하였다… 다음에는 더 제대로 해보겠슴다…

mineclover and others added 29 commits January 20, 2023 16:42
feat: Css styling, modify comments component
Fix error, Update getViewCount
DevelopEdit: Edit WideSideBar
Copy link
Member

@GyoHeon GyoHeon left a comment

Choose a reason for hiding this comment

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

수고하셨습니다!
리액트를 이용해서 아주 멋진 협업을 이루어내셨습니다.

이슈(해결하신건지 모르겠습니다.)

  1. 파일명 소문자로 작성 및 배포 후에 파일명을 대문자로 변경 시, git 상에서 해당 변경 사항을 추적하지 못하여 netlify에서 빌드 오류가 발생함
    이미 소문자로 된 파일 네임이 git에 cache됐기 때문에 생긴 문제입니다.
    아래의 글을 보고 따라하시면 해결이 될것입니다.
    참고: https://daily-dev-tips.com/posts/git-basics-help-my-case-sensitive-filename-changes-dont-commit/
  2. hover 동영상 자동재생 시 이슈 부분에 cookie 관련 문제 발생
    cookie 에 sameSite설정이 걸려있는듯 합니다.(inspector의 application -> cookie 에서도 확인할 수 있습니다.)
    해당 쿠키가 프로젝트안에서 설정하는 것이라면 간단히 false로 바꿔주면 되고, 배포한 곳에서 설정하는 것이라면 사실 해제하지 않는 것이 좋습니다.
    참고: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite

아쉬운 점

  1. 사용하지 않는 import는 지워주세요.
  2. 파일네이밍을 통일시켜주세요. 특히 리액트는 커스텀 훅과 컴포넌트 등에서 이름을 강제하고 있습니다.
  3. 불필요한 let의 사용이 많습니다. 특별한 이유가 없다면 전부 const로 선언해주세요.

Comment on lines +1 to +3
import { useState } from 'react';
import reactLogo from './assets/react.svg';
// import './App.scss';
Copy link
Member

Choose a reason for hiding this comment

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

사용하지 않는 import도 전부 지워주세요.

></path>
</g>
</svg>
<span id="title">보관함</span>
Copy link
Member

Choose a reason for hiding this comment

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

title은 적절하지 않아보이네요.
실제로 title이라면 h태그를 사용하는게 더 좋겠습니다.

Comment on lines +8 to +10
<div id="contentContainer">
<div id="wrapper">
<div id="inner-content">
Copy link
Member

Choose a reason for hiding this comment

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

  1. 어디서는 카멜 케이스, 어디서는 케밥케이스가 사용됩니다. 통일하는게 좋겠습니다.


return (
<div>
{Array.from(commentList).map((comment, index) => (
Copy link
Member

Choose a reason for hiding this comment

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

commentList가 Array가 아닌가요? Array.from없이 commentList에 바로 map을 사용하는게 더 좋아보입니다.

return (
<div>
{Array.from(commentList).map((comment, index) => (
<Comment key={index} comment={comment} />
Copy link
Member

Choose a reason for hiding this comment

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

데이터를 확인해보니 데이터에 id값이 있네요.
유니크한 id값이 있다면 인덱스 대신 id값을 사용하는 것이 좋습니다.

Comment on lines +2 to +4
let h = '';
let m = '00:';
let s = '00';
Copy link
Member

Choose a reason for hiding this comment

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

명시적인 변수명을 사용하면 더 좋을 것 같습니다.

Comment on lines +12 to +14
let items = props.dataSetAry.map((item, idx) => {
return <Item key={idx} d={item.d} text={item.text} />;
});
Copy link
Member

Choose a reason for hiding this comment

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

재할당이 없으므로 const로 선언하는게 좋아보입니다.

Copy link
Member

Choose a reason for hiding this comment

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

items의 원본 데이터가 props로 부터 오고있으므로 지금처럼 일반 변수로 선언해도 잘 작동합니다.
아주 좋은 예시입니다!

Comment on lines +15 to +18
const data = props.data;

const [channel, setChannel] = useState({});
const ChannelId = data.snippet.channelId;
Copy link
Member

Choose a reason for hiding this comment

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

다른 컴포넌트에서처럼 destructing 할당을 이용하여 일관성을 유지 시키는게 좋겠습니다.

Suggested change
const data = props.data;
const [channel, setChannel] = useState({});
const ChannelId = data.snippet.channelId;
const { data } = props;
const {channelId} = data.snippet.channelId;

Copy link
Member

Choose a reason for hiding this comment

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

변수명의 첫 글자는 소문자를 사용해주세요.

Comment on lines +15 to +22
const [videoId, setVideoId] = useState('');
const [videoData, setVideoData] = useState({
duration: '',
views: 0,
});
const [date, setDate] = useState<Dayjs | null>(null);
const [channelId, setChannelId] = useState('');
const [channelData, setChannelData] = useState('');
Copy link
Member

Choose a reason for hiding this comment

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

videoId, date, channelId 모두 props에 종속적인 데이터기 때문에 useState가 아닌 일반 변수로 선언하면 됩니다.

Comment on lines +48 to +50
setVideoId(data.id.videoId);
setChannelId(data.snippet.channelId);
setDate(data.snippet.publishedAt);
Copy link
Member

Choose a reason for hiding this comment

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

어차피 data가 바뀌면 현재 컴포넌트가 리렌더링 됩니다.(props가 바뀌기 때문입니다.)
따라서 위 세줄은 videoId, channelId, date를 일반 변수로 선언하면 필요가 없습니다.

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.

6 participants