πͺ λ€μ΄κ°λ©°
Next.jsμμλ μλ²μ¬μ΄λ λ λλ§(SSR)μ ν΅ν΄ μ¬μ©μκ° νμ΄μ§μ μ κ·ΌνκΈ° μ μ μλ²μμ λ°μ΄ν°λ₯Ό 미리 κ°μ Έμ νμ΄μ§λ₯Ό λ λλ§ν μ μμ΅λλ€. μ΄ κ³Όμ μλ λ κ°μ§ μ€μν μμκ° μλν©λλ€
- API νΈλ€λ¬ (@api/article.ts)
- νμ΄μ§ μ»΄ν¬λνΈ (@pages/community/index.tsx)
μ΄ λ μμκ° μ΄λ»κ² μνΈμμ©νμ¬ λμ μ½ν μΈ λ₯Ό ν¨μ¨μ μΌλ‘ μ 곡νλμ§ μ΄ν΄λ³΄μ βοΈ
1. @api/article.ts
μν : API νΈλ€λ¬
κΈ°λ₯: ν΄λΌμ΄μΈνΈμ GET, POST, DELETE μμ²μ μ²λ¦¬νκ³ , μΈλΆ APIλ λ°μ΄ν°λ² μ΄μ€μ μνΈμμ©νμ¬ νμν λ°μ΄ν°λ₯Ό κ°μ Έμ€κ±°λ μμ ν©λλ€.
μ΄λ λ°±μλμμ λ°μ΄ν° μ²λ¦¬λ₯Ό λ΄λΉν©λλ€.
- μμ: getArticles() ν¨μλ κ²μκΈ λͺ©λ‘μ κ°μ Έμ JSON νμμΌλ‘ λ°νν©λλ€.
export const getArticles = async (
page: number,
res: NextApiResponse
): Promise<void> => {
try {
const response = await axiosInstance.get<ArticleListResponse>('/articles', {
params: { page, pageSize: 10, orderBy: 'recent' },
});
res.status(200).json(response.data); // κ²μκΈ λͺ©λ‘κ³Ό totalCountλ₯Ό λ°ν
} catch (error) {
console.error('κ²μκΈμ κ°μ Έμ€λλ° μ€ν¨νμ΅λλ€:', error);
res.status(500).json({ message: 'κ²μκΈμ κ°μ Έμ€λλ° μ€ν¨νμ΅λλ€' });
}
};
2. @pages/community/index.tsx
μν : Next.js νμ΄μ§ μ»΄ν¬λνΈ
κΈ°λ₯: getServerSideProps ν¨μλ₯Ό μ¬μ©νμ¬ νμ΄μ§κ° μμ²λ λλ§λ€ μλ²μμ API νΈλ€λ¬(@api/article.ts)λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€.
κ°μ Έμ¨ λ°μ΄ν°λ propsλ‘ λ³νλμ΄ νμ΄μ§ μ»΄ν¬λνΈμ μ λ¬λκ³ λ λλ§λ©λλ€.
- getServerSideProps ν¨μμμ API νΈλ€λ¬λ‘λΆν° λ°μ΄ν°λ₯Ό μμ²νλ λ°©μμ λ€μκ³Ό κ°μ΅λλ€
export const getServerSideProps: GetServerSideProps = async (context) => {
const page = parseInt(context.query.page as string) || 1;
try {
const response = await axiosInstance.get<ArticleListResponse>('/articles', {
params: { page, pageSize: 10, orderBy: 'recent' },
});
return {
props: {
articles: response.data.list,
totalCount: response.data.totalCount,
page,
},
};
} catch (error) {
return { props: { articles: [], totalCount: 0, page } };
}
};
μλ²μ¬μ΄λ λ λλ§ κ³Όμ μμ½
- ν΄λΌμ΄μΈνΈ μμ²: μ¬μ©μκ° /community νμ΄μ§μ μ κ·Όν©λλ€.
- μλ² μ¬μ΄λ λ°μ΄ν° ν¨μΉ
- getServerSideProps ν¨μκ° νΈμΆλμ΄ μλ²μμ λ°μ΄ν°λ₯Ό μμ²ν©λλ€.
- μ΄ κ³Όμ μμ @api/article.tsμ μ μλ API νΈλ€λ¬κ° μ€νλμ΄ νμν λ°μ΄ν°λ₯Ό κ°μ Έμ΅λλ€.
- λ°μ΄ν° λ°ν: API νΈλ€λ¬κ° λ°μ΄ν°λ₯Ό JSON νμμΌλ‘ λ°νν©λλ€.
- λ λλ§: getServerSidePropsκ° λ°νν λ°μ΄ν°λ₯Ό propsλ‘ νμ΄μ§ μ»΄ν¬λνΈμ μ λ¬νμ¬ UIλ₯Ό λ λλ§ν©λλ€.
- ν΄λΌμ΄μΈνΈμ μλ΅: μμ±λ HTMLμ΄ ν΄λΌμ΄μΈνΈμ μ μ‘λμ΄ μ¬μ©μλ μ¦μ μ½ν μΈ λ₯Ό νμΈν μ μμ΅λλ€.
π¬ λλμ - Next.jsμμ λ°μ΄ν° μ²λ¦¬μ UI λ λλ§μ λΆλ¦¬
μ΄λ² μμ
μ λμ΄ λ²μ© λ¨μ΄λ
κ²½νμ΄μλ€. μ²μμλ @api/article.tsμ @pages/community/index.tsxκ° λ λ€ APIλ₯Ό νΈμΆνκ³ μμ΄μ, λ체 λκ° λ€λ₯΄μ§?
νλ μκ°μ΄ λ¨Έλ¦Ώμμ κ°λνλ€.
νμ§λ§ κ·Έ μ°¨μ΄λ₯Ό μ΄ν΄νκ³ λλ, λ νμΌμ λΆμ κ΅¬μ‘°κ° μΌλ§λ μ€μνμ§ κΉ¨λ«κ² λμλ€.
@api/article.tsλ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ μ£Όλ°©μ μ리μ¬
κ°μ μν μ΄μλ€. μ΄ νμΌμ΄ λͺ¨λ μ¬λ£(λ°μ΄ν°)λ₯Ό λ€λ¬κ³ , 쑰리ν΄μ μ€λΉλ μ리λ₯Ό λ§λ€μ΄λΈλ€.
API μμ²μ΄ λ€μ΄μ€λ©΄ κ·Έλκ·Έλ νμν λ°μ΄ν°λ€μ κ°μ Έμ€κ±°λ μμ νκ³ , ν΄λΌμ΄μΈνΈμκ² μ μ ν μλ΅μ μ 곡νλ€. μ΄ νμΌμ΄ μμλ€λ©΄, λ΄ νμ΄μ§λ λ°μ΄ν°λ₯Ό μ΄λ»κ² μ²λ¦¬ν μ§ λͺ°λΌ μ°μμ’μνμ κ±°λ€.
λ°λ©΄μ @pages/community/index.tsxλ μ΄μ μ리λ₯Ό ν
μ΄λΈμ μ¬λ¦¬λ μλΉ λ΄λΉ
μ²λΌ, μ¬μ©μκ° νμ΄μ§μ μ μνλ©΄ κ·Έ μ¦μ κΉλνκ² μ€λΉλ μ 보λ₯Ό 보μ¬μ€λ€. getServerSideProps ν¨μκ° μλ²μμ λ°μ΄ν°λ₯Ό ν¨μΉν΄μ€κ³ , κ·Έ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ νμ΄μ§κ° λ λλ§λλ€.
μ¦, μ¬μ©μλ νμ΄μ§λ₯Ό λ‘λνλ μκ° μ€λΉλ μ리λ₯Ό λ°λ‘ λ§λ³Ό μ μλ
μ
μ΄λ€. λλΆμ νμ΄μ§ λ‘λ© μλλ λΉ¨λΌμ§κ³ , μ¬μ©μ κ²½νμ λ 맀λλ¬μμ‘λ€. μ²μμ μ΄λ° κ΅¬μ‘°κ° μ‘°κΈ λν΄νκ² λκ»΄μ‘μ§λ§, μ μ°¨ μμ
νλ©΄μ μ΄ λ°©μμ κ°μ μ λͺΈμ 체ννκ² λλ€.
λ°μ΄ν° μ²λ¦¬μ UI λ λλ§μ λΆλ¦¬
λ μ½λμ 볡μ‘μ±μ μ€μ΄κ³ , μ μ§ λ³΄μλ λ μ©μ΄νκ² λ§λ€μλ€. λ§μΉ, λ°© μμ΄ μ΄μ§λ¬μΈ λ λͺ¨λ 물건μ μ μ리μ λμΌλ 곡κ°μ΄ μ λλλ λλμ΄λκΉ.
μ΄λ² μμ
μ ν΅ν΄ SSR(μλ²μ¬μ΄λ λ λλ§)
μ μ§μ ν κ°μΉλ₯Ό λ€μ ν λ² κΉ¨λ«κ² λλ€. μ΄μ λ 볡μ‘ν μμ
λ μ΄μ κ°μ ν¨ν΄μ μ μ©ν΄ λκ° μ μμ κ² κ°λ€.
μ΄λ° κ²½νμ ν λλ‘ μμΌλ‘λ λ κΉλνκ³ ν¨μ¨μ μΈ μ½λ μμ±μ λͺ©νλ‘ μΌμμΌκ² λ€λ κ²°μ¬μ νκ² λλ€.
λλμ보면, μ²μμ μ‘°κΈ νΌλμ€λ¬μ λ κ΅¬μ‘°κ° μ΄μ λ λͺ νν΄μ‘κ³ , μμΌλ‘ λ 볡μ‘ν μμ λ μ΄μ κ°μ λ°©μμΌλ‘ ν΄κ²°ν μ μμ κ² κ°λ€.
μ΄λ² μμ μ ν΅ν΄ μ»μ μ΄ κΉ¨λ¬μμ μμΌλ‘ λ λμ μ½λ μμ±μ νμ©ν΄μΌκ² λ€.
'π©π»βπ» νλ‘κ·Έλλ° μΈμ΄ > Next.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Next.js] - CSRκ³Ό SSR λΉκ΅ λ° CSRμ λ¨μ 보μ λ°©λ² (0) | 2024.09.25 |
---|---|
[Next.js] public ν΄λμ _app.js νμΌ (0) | 2024.09.25 |