24.3.15
๐ซง ๋ฐฐ์ด Next.js์ ๊ฐ๋ ์ ํ ๋๋ก ๊ฐ๋จํ ๋ง๋ To Do List ํ๋ก์ ํธ
๊ธฐ๊ฐ: 3.12 ~ 3.15 ์ธ๋ฐ, ์ฌ์ค ๊ตฌํ์์ฒด๋ ๋นจ๋ฆฌ ๋๋๋ ๊ฑฐ ๊ฐ๋ค.
(๊ทผ๋ฐ ๊ทธ ๋ค์ json-server - vercel ๋ฐฐํฌ๋ฅผ ์๋ํ๋ค๊ฐ ์ค๋ฅ๊ฐ ๋๊ณ ... localhost๋ฅผ 127.0.0.1๋ก ๋ฐ๊ฟ๋ณด๋ค๊ฐ CORS ์๋ฌ๋ฅผ ์ ํด์ ใ ใ ์ด๋ฅผ ํด๊ฒฐํด๋ณด๊ณ ์๋ ์ค์ด๋ค.. )
0) ํ ๋ฉ์ธ ํ์ด์ง
1) About ํ์ด์ง
SSG๋ก, (fetch ์ต์ - force-cache, ํน์ ์ค์ ์ํด๋ ๋จ) ๋ง๋ค์ด build ์์ ๋ฐ์ดํฐ๋ก ๊ณ ์ ๋์ด ๋ ๋๋ง.
ํ์ฌ์ ๋ณด์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ณด์ฌ์ค๋ค. (companyInfo - image, name, description)
* ์๋ฒ ์ปดํฌ๋ํธ์ด๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก json-server์ ์ฐ๊ฒฐ์์ผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ค. (route handler ๋ฅผ ํตํ์ง์์)
2) Report ํ์ด์ง
ISR๋ก, revalidate : 10 ์ต์ ์ ์ฃผ์ด 10์ด๋ง๋ค ๋ฐ์ดํฐ ๊ฐฑ์ ๋๋๋ก ํ๋ค.
todos ๋ฐ์ดํฐ์ ๋ฐฐ์ด ๊ธธ์ด๋ฅผ ํตํด ํ ์ผ ๋ชฉ๋ก์ด ๋ช ๊ฐ๊ฐ ์๋ ์ง ๋ฑ์ ๋ํ๋๋ค.
* ์๋ฒ ์ปดํฌ๋ํธ์ด๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก json-server์ ์ฐ๊ฒฐ์์ผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ค. (route handler ๋ฅผ ํตํ์ง์์)
3) To-Dos-CSR ํ์ด์ง
CSR (ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง)๋ก ๊ตฌํํ ํฌ๋๋ฆฌ์คํธ ํ์ด์ง๋ก, CRUD๊ฐ ๊ฐ๋ฅํ๋ค.
(์ฌ๊ธฐ์ update๋ ์๋ฃ์ํ ํ ๊ธ๋ง ๊ตฌํ)
* CSR์ด๊ธฐ๋๋ฌธ์ ๊ธฐ์กด์ React์์ ํ ๊ฒ๊ณผ ๋์ผํ๋ค. React-Query๋ฅผ ์ฌ์ฉ.
๊ทธ๋ฐ๋ฐ ๋ค๋ฅธ ์๋ฒ์ปดํฌ๋ํธ์ ๋ฌ๋ฆฌ, ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ธ ์ฌ๊ธฐ์๋ route handler (app/api/.../route.ts)๋ฅผ ๋ฐฑ์๋์ผ์ ์ฐ๊ฒฐํด์ฃผ๊ธฐ๋กํจ.
๋ฆฌ์ฟผ๋ฅผ ํตํด route handler (๋ฐฑ์๋ ์ญํ ) ์ ์ฐ๊ฒฐํ๊ณ , route handler์์ json-server (์๋ BaaS์ง๋ง) ๋ฅผ DB๋ก ์ผ์ ์ฐ๊ฒฐ์์ผ์คฌ๋ค.
์ฆ CSR (ํ๋ก ํธ) <-> route handler (๋ฐฑ) <-> DB ์ด๋ ๊ฒ ์ฐ๊ฒฐ๋๋ค
* ์ฒ์์ route handler์ ์ฐ๊ฒฐ ์, ๋ฐ์ดํฐ์์ฒญ ์ ํน์ id๊ฐ ํ์ํ delete๋ toggle(์์ patch) ํจ์์ ๊ฒฝ์ฐ ๊ทธ๋ฅ fetch - request ๋ก id ๋ ๊ฐ์ด ๋๊ฒจ์คฌ์๋๋ฐ, ์๋๋ route handler - dynamic routing ๋์ ๋ผ์ฐํ ์ ์จ์ผ ํ๋ค๊ณ ํ๋ค.?!
๊ทธ๋์ api ํด๋ / todos / [id] ํด๋ >> ์์ route.ts ๋ฅผ ๋ง๋ค์ด ๊ทธ๊ณณ์ DELETE, PATCH ํจ์๋ฅผ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
๊ทธ๋ฌ๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ด, request ๋ฟ๋ง ์๋๋ผ { param } ๊ฐ์ฒด๋ ์ธ์๋ก ๋ฐ์์์ param์ธ id๋ฅผ ๊บผ๋ด์ ์ฐ๋ฉด ๋๋ค.
์ด route handler ์์๋ ์ฌ๊ธฐ์ db์ญํ ์ ๋งก์ json-server๋ก parameter id๋ฅผ ํตํด patch ์์ฒญ์ ๋ณด๋ธ๋ค.
// app/api/todos/[id]/route.ts - route handler
export async function PATCH(request: Request, { params }: { params: { id: string } }) {
try {
// const { id, isDone } = await request.json(); ์ด์ ์ด๋ ๊ฒ ํ ํ์ X
const id = params.id;
const { isDone } = await request.json();
await fetch(`${process.env.NEXT_PUBLIC_DB_URL}/todos/${id}`, { // json-server ์ฃผ์
method: 'PATCH',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ isDone: !isDone })
});
return new Response(null, { status: 204 });
} catch (error) {
throw new Error('Internal Server Error !');
}
}
4) To-Dos-SSR ํ์ด์ง
SSR (์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง)๋ก ๊ตฌํํ ํฌ๋๋ฆฌ์คํธ ํ์ด์ง๋ก, Read ์กฐํ๋ง ๊ฐ๋ฅํ ์ํ์ด๋ค.
์ ์ ์์ฒญ๋ง๋ค ๋ฐ์ดํฐ๊ฐ ๊ฐฑ์ ๋๊ธฐ ๋๋ฌธ์ CSR ๊ณผ ์ ์ฌํ์ง๋ง, ์๋ฒ ์ฌ์ด๋์์ ๋ ๋๋งํ๋ค๋ ์ !
* ์๋ฒ ์ปดํฌ๋ํธ์ด๊ธฐ ๋๋ฌธ์, ๋ฐ๋ก json-server์ ์ฐ๊ฒฐ์์ผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ค. (route handler ๋ฅผ ํตํ์ง์์)
next.js ์ ๋ ๋๋ง ํจํด ๊ธฐ์ด๊ฐ๋ ์ ์์งํ์ง๋ง .. ์์ธํ ํ๊ณ ๋ค์ด๊ฐ๋ฉด ํท๊ฐ๋ฆฌ๋ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค.
์๋ฅผ ๋ค๋ฉด SSR ํ์ด์ง๋ ์๋ฒ์ปดํฌ๋ํธ์ด์ง๋ง ๊ทธ ์์, ์ ์ ์ ์ํธ์์ฉํ๋ '๋ฒํผ'๊ณผ ๊ฐ์ ์ปดํฌ๋ํธ๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ด๋ค. ํ์ง๋ง, SSR ํ์ด์ง์ ์๋ TodoList ์ปดํฌ๋ํธ๋ ์๋ฒ์ปดํฌ๋ํธ์ด๊ณ , ๋ ๊ทธ ์์ ์ํ๋ TodoItem ์ปดํฌ๋ํธ๋ ๋ฐ๋์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์ฌ์ผ๋ง ๋์ํ๋ค. (์ฌ๊ธฐ์ react query usemutation์ ํ์ฉํ๋ hook์ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ??)
๊ทธ๋ฆฌ๊ณ [parameter] ํด๋๋ฅผ ๋ง๋ค์ด ๋์ ๋ผ์ฐํ ํด์ route handler ํ์ฉํ๊ธฐ๋ ์ฐ์ตํด๋ณด๋ ์ข์์ง๋ง ๋ค์ ๊ณต๋ถํด๋ด์ผ ํ ๊ฑฐ ๊ฐ๋ค.
(ํนํ ์ผ๋จ์ .. ์๋ง route handler ๋๋ฌธ์ ์๊ธด ๋ฐฐํฌ ์๋ฌ๋ถํฐ ํด๊ฒฐํ๊ณ ....ใ ใ ใ ใ ใ
json-server ๋ฐฐํฌ๋ ํด๋ณด๊ณ ์ถ์๋๋ฐ ์ด๋ ต๋ค..!)