getServerSideProps 를 이용한다. getServerSideProps에서 요청받은 data fetch를 수행하면서 결과 data props를 컴포넌트에 전달한다. 이후 이 데이터로 server에서 html 파일을 만들어서 브라우저로 보내주게 된다.
export const getServerSideProps = async () => {
const response = await fetch('http://localhost:4000/news')
const data = await response.json()
return {
props: {
newsData: data,
},
}
}
export const getServerSideProps = async (context: any) => {
const {
params: { categoryId },
} = context
const response = await fetch(`http://localhost:4000/news?category=${categoryId}`)
const data = await response.json()
return {
props: {
categoryId,
categoryData: data,
},
}
}
getServerSideProps 에서 받아오는 context 객체를 통해 req, res를 가져올 수 있는데 req.headers.cookie를 통해 cookie를 가져올 수 있으며, res.setHeader를 통해 cookie를 설정할 수가 있다. 이를 통해 사용자별(user Id) incoming request data fetching이 가능해진다.
export const getServerSideProps = async (context) => {
const {
req,
res,
query,
} = context
console.log(req.headers.cookie)
res.setHeader('Set-Cookie', ['sally'])
console.log(query)
return {
props: {
```
},
}
}
개인적인 정보를 담고있는 페이지 등 seo가 굳이 필요하지 않다면 CSR을 사용해준다.
const Dashboard = () => {
return <div>dashboard</div>
}
잊지 말아야할 것이 CSR이라고 하더라도 Next.js 는 항상 pre-rendering 을 해준다.
const Dashboard = () => {
const fetching = async () => {
const response = await fetch('http://localhost:4000/dashboard')
const data = await response.json()
return data
}
const { data, error } = useSWR('dashboard', fetching)
if (error) return <p>error occured</p>
if (!data) return <p>no data</p>
return (
<>
<div>dashboard</div>
<div>{data.posts}</div>
<div>{data.likes}</div>
<div>{data.followers}</div>
<div>{data.following}</div>
</>
)
}
export default Dashboard
위와 같이 swr 라이브러리를 이용해서 data fetch를 할 수도 있고, 이 때는 데이터를 서버에서 미리 불러와 html를 구성하는 것이 아니기 때문에 no data를 불러오게 된다.
참고
https://www.youtube.com/watch?v=3eUZeuGXo_U&list=PLC3y8-rFHvwgC9mj0qv972IO5DmD-H0ZH&index=31