본문 바로가기

반응형

Frontend/Next

(11)
[Next.js] URL에 상태 저장하기 (useSearchParams, URLSearchParams) 개요“URL 링크를 공유했을 때 같은 화면을 볼 수 있도록 해주세요.”검색 폼이 있고 결과가 출력되는 화면에서 위와 같은 요구사항을 받았다. 처음에는 그냥 직접 검색하면 되는 거 아닌가..? 싶었는데 검색 조건이 매우 X2 많은 기획서를 보고 꼭 필요한 기능이라는 것을 깨달았다. 10개가 넘는 필터링 조건들을 보고 바로 납득했다. 😮 요구사항을 다시 보면,URL 링크를 공유했을 때 같은 화면을 볼 수 있어야 한다.= URL에 검색 조건(상태 정보)을 저장해야 한다.= URL의 쿼리 스트링을 조작할 수 있어야 한다.→ URL 쿼리스트링에 상태 정보를 넣고 뺄 수 있어야 한다는 결론이 나온다. 어찌 보면 당연한 기능인데, 왜인지 이전까지 생각해보지 못한 기능이었다. 아마도 리액트에 너무 익숙해져 있기 때문..
[Next.js] pages에서 app 라우터으로 마이그레이션 (feat. fetch, generateStaticParams) 개요 지난 글과 이어지는 포스팅으로, pages 라우터로 구현했던 마크다운 블로그를 app 라우터로 마이그레이션하는 과정을 남겨두려고 한다. 전체 흐름보다는 변화 포인트에 집중해 보자! 레이아웃 컴포넌트 pages에 있던 _app.tsx와 _document.tsx는 app의 layout.tsx으로 대체한다. _document.tsx에서 설정했던 styled-components도 app/layout.tsx로 이동시킨다. (참고. lib/registry 코드 ) 컴포넌트로 만들어 두었던 레이아웃도 가져오고, 글로벌 스타일도 추가한다. app/layout.tsx import Layout from '../components/Layout'; import StyledComponentsRegistry from '....
[Next.js] 마크다운 블로그 만들기 (feat. getStaticProps, getStaticPaths) 개요 이번 달 초, Next.js 원티드 프리온보딩에 참여하며 진행했던 과제를 정리해보고자 한다. 우선 next.js 12기준으로 pages 라우팅으로 마크다운 블로그를 만들어보고, 이를 13버전의 app 라우팅으로 마이그레이션하는 과정을 정리한 글이 될 것이다. 1. 프로젝트 생성 간단하게 CNA를 사용했다. npx create-next-app --typescript 2. styled-components 설정 Next.js에서 styled-components을 사용하려면, 추가 설정이 필요하다. CSS-in-JS 라이브러리는 자바스크립트 런타임 시 적용이 되기 때문에, SSR에서 스타일 적용이 즉시 되지 않기 때문이다. 자바스크립트가 적용되기 전의 HTML 파일이 먼저 렌더링 되면서 스타일이 먹히지 않..
[NextJS] NextJS 시작하기 - 8. URL에 데이터 전달하고 가져오기(Catch All URL) 1. 모든 URL 잡기 pages 하위에 파일명을 [...params].js(원하는 이름 사용)와 같이 설정하면 어떤 URL이라도 잡을 수 있다. 이를 이용해 영화 제목을 URL에 넣고, URL에서 정보를 받아 About 페이지에 뿌려줄 것이다. 1. pages/movies/[id].js를 pages/movies/[...params].js로 수정하고 2. index.js에서 페이지 이동 부분을 수정한다. const onClick = (id, title) => { router.push(`/movies/${title}/${id}`); }; {movie.original_title} 이때, 홈에서 영화 하나를 클릭하면, 디테일 페이지의 URL은 /movies/Sing%202/438695와 같고, router를 ..
[NextJS] NextJS 시작하기 - 7. 다이나믹 라우팅 & 페이지 이동 1. Routes NextJS의 개요를 다루면서, pages 폴더에 대해 살펴본 적이 있지만, 오늘은 더 자세한 기능을 볼 것이다. pages는 페이지 라우팅을 자동으로 설정해주는 폴더로, 정적 라우팅은 물론 동적 라우팅도 가능하다. 아래 표를 통해 사용법을 확인하자. pages 하위 폴더 구조 URL pages/index.js / pages/about.js /about pages/movies/index.js /movies pages/movies/all.js /movies/all pages/movies/[id].js /movies/12 동적 라우팅은 [변수].js 파일을 통해 설정할 수 있다. pages/movies/[id].js 에서는 id를 변수의 이름으로 설정한 것이고, useRouter를 통해 확..
[NextJS] NextJS 시작하기 - 6. Server-Side Rendering 설정하기 (getServerSideProps) 1. Server-Side Rendering 특징 유저에게 보여주기 위한 모든 UI를 서버가 준비하는 것이다. 서버는 필요한 모든 데이터를 받아 HTML 안에 넣어 클라이언트에게 전달한다. 즉, 클라이언트는 온전한 HTML(데이터 포함)을 받아 유저에게 화면을 보여준다. 이렇게 HTML에 모든 정보가 포함되어 있어 SSR은 SEO에 좋다. ex. SSR에서 API fetch를 하는 경우 서버에서 API에 대한 작업(호출->응답)이 완료되었을 때 페이지가 렌더링된다. 이때 유저는 로딩화면을 보지 않고 바로 데이터가 포함된 화면을 볼 수 있다. 단, API 응답이 느린 경우 유저는 아무것도 없는 빈 화면을 보게 된다. 2. getServerSideProps Next가 React와 다른 가장 큰 차이점은 SS..
[NextJS] NextJS 시작하기 - 5. 영화 데이터 가져오기 & API KEY 숨기기 (feat. optional chanining, redirects, rewrites) 1. 영화 데이터 가져오기 (javascript & react 관련) 데이터 가져오기 https://www.themoviedb.org/?language=ko에서 영화 API를 사용한다. 위 아래 코드의 결과는 동일하다. (아직 위 코드처럼 쓰는 게 익숙지 않다..) useEffect(() => { (async () => { const { results } = await ( await fetch( `https://api.themoviedb.org/3/movie/popular?api_key=${API_KEY}` ) ).json(); setMovies(results); })(); }, []); useEffect(() => { const getMovie = async () => { const { results ..
[NextJS] NextJS 시작하기 - 4. 영화 앱 구조 잡기 & SEO 1. Patterns NextJS 프로젝트를 만들 때 주로 따르는 패턴을 알아보자. 사람들은 대체로 너무 큰 _app.js 파일을 원하지 않는다. (왜?? 일단 그렇다고 한다.) 따라서 아래와 같이 Layout 컴포넌트를 만들어 사용한다. (보면 볼수록 gatsby와 비슷하다. 다만, _app.js의 존재로 Layout을 각 페이지마다 직접 넣어주지 않아도 된다는 점이 next의 특징인듯) components/Layout.js import NavBar from './NavBar'; export default function Layout({ children }) { return ( {children} ); } pages/_app.js import Layout from '../components/Layout..

반응형