-
Notifications
You must be signed in to change notification settings - Fork 11
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
base: master
Are you sure you want to change the base?
Conversation
refactor: removing non-using props
Feature/genre list
Feature/landing page
Feature/header
Feature/control panel
feat: api_connection wwith img datas
merge for publishing
Fix/main content
[refactor]: index.js에 ISR적용 (24시간)
…-netflix-17th into feature/search
Feature/search
Test/ssr test
Feature/search
There was a problem hiding this 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 |
There was a problem hiding this comment.
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"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
uuid를 이용해서 주소 중복을 없앴군요,,! 디테일,,👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
코드리뷰를 맡은 신유진입니다!
SSR도 적용하시고 무한스크롤도 구현하시고... 디테일도 너무 좋아서 배워가는 부분이 많았습니다👍👍
과제 하시느라 수고 많으셨어요~!!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
혹시 api폴더를 pages폴더 안에 넣으신 이유가 있나요? api폴더와 pages폴더를 따로 분리하는 게 좋을 것 같아요!
.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; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
우와 이런 것도 할 수 있군요,,, 배워갑니다~!
import { useState } from "react"; | ||
|
||
export const useInput = (defaultValue) => { | ||
const [value, setValue] = useState(defaultValue); | ||
|
||
const onChange = (e) => { | ||
setValue(e.target.value); | ||
}; | ||
|
||
return { value, setValue, onChange }; | ||
}; |
There was a problem hiding this comment.
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: " 🔞"; }' : "")} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
디테일 대박.....👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 파일의 코드에 대한 코멘트는 아닌데,, components폴더와 hooks폴더를 src폴더 안에 넣지 않고 밖으로 따로 빼신 이유가 있으신가요??
// 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; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 부분들은 movieAxios를 쓰지 않은 이유가 따로 있으신가요??
6주차 미션: Next-Netflix
서론
🪝 Who King? Hooking!
미션
미션 목표
기한
필수 요건
선택 사항
Key Question
정적 라우팅(Static Routing)/동적 라우팅(Dynamic Routing)이란?
src/pages/
하위의 폴더에 폴더명이 라우팅 경로가 됩니다./foo/1
,/foo/2
...의 주소가 파일으로 매핑됨/foo/1
,/foo/name/1
,/foo/name/test/1
...의 주소가 파일으로 매핑됨/foo/1
,/foo/name/1
,/foo/name/test/1
, ... ,/foo
까지 해당 파일으로 매핑됨.성능 최적화를 위해 사용한 방법
search.js
에서 페이지에 처음 접속했을 때 react-query 함수를 페이지가 렌더링 되기 전에 미리 만들고, 필요한 데이터를 fetch 해오기 위해 사용하였습니다./search
에 접속할 때 마다 실행됩니다.index.js
에서 렌더링할 데이터들을 빌드 시 미리 받아놓기 위해 사용하였습니다.getStaticProps
를 사용하였으며, return 안에revalidate
값을 24시간으로 넣어주었습니다. 처음 빌드 시 api로부터 미리 데이터들을 fetch하여 json파일을 만들어 놓은 후, 24시간 안의 요청들은 해당 json으로 대체합니다. 24시간 이후의 요청이 들어오면 다시 api를 호출하여 데이터를 fetch하여 json을 update합니다.[id].js
에서 동적 라우팅을 할 때 필요한 경로들을getStaticPaths
를 통해 fetch한 후, 이를getStaticProps
에 props로 넘겨줍니다.getStaticProps
에서는 해당 주소들에 요청을 한 후, 필요한 data들을 미리 fetch하여 빌드시에 json으로 생성 후, 해당 페이지에 props로 넘겨줍니다.getStaticPaths
의 return에서fallback
값을true
로 넣어주어서 paths에 없는 요청이 들어오면fallback
컴포넌트를 먼저 렌더링 한 후, SSR방식으로 데이터 fetching이 완료되면 데이터가 포함된 컴포넌트를 렌더링 해줍니다.search.js
와movieData.js
에서 Data의 fetching상태에 따라 Skeleton UI를 렌더링하거나, 데이터가 포함된 컴포넌트를 렌더링하도록 하였습니다.배포링크
Hooking_Netflix