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

[6주차] Hooking 미션 제출합니다. #13

Open
wants to merge 109 commits into
base: master
Choose a base branch
from

Conversation

moong23
Copy link
Member

@moong23 moong23 commented May 19, 2023

6주차 미션: Next-Netflix

서론

🪝 Who King? Hooking!

미션

미션 목표

  • Next.js 사용법을 공부해봅니다.
  • Figma로 주어지는 디자인으로 스타일링 하는 방식에 익숙해집니다.
  • Git을 이용한 협업 방식에 익숙해집니다.

기한

  • 2023년 5월 19일 (기한 엄수)

필수 요건

  • 결과화면의 상세 페이지와 검색 페이지를 구현합니다.
    • 상세 페이지는 동적 라우팅을 이용해 구현합니다.
    • 검색 페이지는 실시간 키워드 검색으로 구현합니다.
  • Figma의 디자인을 그대로 구현합니다.
  • SSR을 적용해서 구현합니다.
  • Open api를 사용해서 데이터 패칭을 진행합니다. (ex. themoviedb API)

선택 사항

  • 검색 페이지 무한스크롤을 구현합니다.
  • 검색 페이지 스켈레톤 컴포넌트를 구현합니다.
  • 성능 최적화를 위한 방법을 적용해봅니다.

Key Question

  • 정적 라우팅(Static Routing)/동적 라우팅(Dynamic Routing)이란?

    • 정적 라우팅 : src/pages/하위의 폴더에 폴더명이 라우팅 경로가 됩니다.
    • 동적 라우팅 : [대괄호]를 이용하여 동적 라우팅을 할 수 있습니다.
      • pages/foo/[name].js -> /foo/1, /foo/2...의 주소가 파일으로 매핑됨
      • pages/foo/[...name].js -> /foo/1, /foo/name/1, /foo/name/test/1...의 주소가 파일으로 매핑됨
      • pages/foo/[[...name]].js -> /foo/1, /foo/name/1, /foo/name/test/1, ... , /foo 까지 해당 파일으로 매핑됨.
  • 성능 최적화를 위해 사용한 방법

    • getServerSideProps : search.js에서 페이지에 처음 접속했을 때 react-query 함수를 페이지가 렌더링 되기 전에 미리 만들고, 필요한 데이터를 fetch 해오기 위해 사용하였습니다. /search에 접속할 때 마다 실행됩니다.
    • ISR(Incremental Static Regeneration) : index.js에서 렌더링할 데이터들을 빌드 시 미리 받아놓기 위해 사용하였습니다. getStaticProps를 사용하였으며, return 안에 revalidate값을 24시간으로 넣어주었습니다. 처음 빌드 시 api로부터 미리 데이터들을 fetch하여 json파일을 만들어 놓은 후, 24시간 안의 요청들은 해당 json으로 대체합니다. 24시간 이후의 요청이 들어오면 다시 api를 호출하여 데이터를 fetch하여 json을 update합니다.
    • getStaticPaths & getStaticProps : [id].js에서 동적 라우팅을 할 때 필요한 경로들을 getStaticPaths를 통해 fetch한 후, 이를 getStaticProps에 props로 넘겨줍니다. getStaticProps에서는 해당 주소들에 요청을 한 후, 필요한 data들을 미리 fetch하여 빌드시에 json으로 생성 후, 해당 페이지에 props로 넘겨줍니다. getStaticPaths의 return에서 fallback값을 true로 넣어주어서 paths에 없는 요청이 들어오면 fallback컴포넌트를 먼저 렌더링 한 후, SSR방식으로 데이터 fetching이 완료되면 데이터가 포함된 컴포넌트를 렌더링 해줍니다.
    • Skeleton UI : search.jsmovieData.js에서 Data의 fetching상태에 따라 Skeleton UI를 렌더링하거나, 데이터가 포함된 컴포넌트를 렌더링하도록 하였습니다.

배포링크

Hooking_Netflix

moong23 and others added 30 commits May 10, 2023 13:04
refactor: removing non-using props
moong23 and others added 27 commits May 19, 2023 14:07
[refactor]: index.js에 ISR적용 (24시간)
Copy link

@sujinRo sujinRo left a comment

Choose a reason for hiding this comment

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

안녕하세요, 이번 주 과제 리뷰를 맡은 댄서포트, 노수진입니다.

많은 기능을 추가로 구현하셔서 Hooking의 과제를 보면서 많이 배울 수 있었습니다.
항상 깔끔하게 코드를 작성하시는 것 같고, 추가로 주석처리로 코드 설명이 있어
코드 이해에 도움이 되었습니다.

이번 주 과제도 정말 수고하셨습니다!😊

{visible && (
<>
{/* Image보다 LazyLoadImage가 체감 속도가 빨라서 일단 이걸로 썼음 */}
<LazyLoadImage
Copy link

Choose a reason for hiding this comment

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

옹,,, next/Image를 사용했는데, LazyLoadImage도 있군요,, 배워갑니다!!

@@ -1,6 +1,7 @@
import { atom } from "recoil";
import { v1 } from "uuid";
Copy link

Choose a reason for hiding this comment

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

uuid를 이용해서 주소 중복을 없앴군요,,! 디테일,,👍

sujinRo

This comment was marked as spam.

Copy link

@paya17 paya17 left a comment

Choose a reason for hiding this comment

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

코드리뷰를 맡은 신유진입니다!
SSR도 적용하시고 무한스크롤도 구현하시고... 디테일도 너무 좋아서 배워가는 부분이 많았습니다👍👍
과제 하시느라 수고 많으셨어요~!!!

Copy link

Choose a reason for hiding this comment

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

혹시 api폴더를 pages폴더 안에 넣으신 이유가 있나요? api폴더와 pages폴더를 따로 분리하는 게 좋을 것 같아요!

Comment on lines +39 to +56
.pc-tablet-only {
display: block;
${media.mobile} {
display: none;
}
}
.tablet-mobile-only{
display: none;
${media.tablet}{
display:block;
}
}
.mobile-only {
display: none;
${media.mobile} {
display: block;
}
}
Copy link

Choose a reason for hiding this comment

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

우와 이런 것도 할 수 있군요,,, 배워갑니다~!

Comment on lines +1 to +11
import { useState } from "react";

export const useInput = (defaultValue) => {
const [value, setValue] = useState(defaultValue);

const onChange = (e) => {
setValue(e.target.value);
};

return { value, setValue, onChange };
};
Copy link

Choose a reason for hiding this comment

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

저도 useInput hook 따로 만들어서 사용해봐야겠어요👍

export const MovieDataTitle = styled.div`
font-size: 1.5rem;
font-weight: 700;
${(props) => (props.adult ? '&:after { content: " 🔞"; }' : "")}
Copy link

Choose a reason for hiding this comment

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

디테일 대박.....👍

Copy link

Choose a reason for hiding this comment

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

이 파일의 코드에 대한 코멘트는 아닌데,, components폴더와 hooks폴더를 src폴더 안에 넣지 않고 밖으로 따로 빼신 이유가 있으신가요??

Comment on lines +12 to +33
// getServerSideProps) 외부 api 주소로 요청
export const getPrefetchNowPlaying = async ({ pageParam = 1 }) => {
const { data } = await axios.get(
// `http://api.themoviedb.org/3/movie/now_playing?page=${pageParam}&api_key=${process.env.NEXT_PUBLIC_MOVIE_API}`
`/api/movie/now_playing/${pageParam}`
);
return data;
};

// getServerSideProps) 외부 api 주소로 요청
export const getPrefetchSearchMovie = async (query = "test") => {
const { data } = await axios.get(
`http://api.themoviedb.org/3/search/movie?api_key=${process.env.NEXT_PUBLIC_MOVIE_API}&query=${query}`
);
return data;
};

export const getNowPlayingWithPage = async (page = { pageParam: 1 }) => {
const { data } = await fetch(`api/movie/now_playing/:${page}`);
//const { data } = await movieAxios.get(`now_playing?page=${page.pageParam}`);
return data;
};
Copy link

Choose a reason for hiding this comment

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

이 부분들은 movieAxios를 쓰지 않은 이유가 따로 있으신가요??

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.

4 participants