[Next.js] ๐จ ์ด๋ฒคํธ๊ฐ ํจ์๊ฐ prop๋ก ์ ๋ฌ๋์ง ์๋ ์ด์
๐จ ๋ฌธ์ ๋ฐ์
Next.js๋ฅผ ์ฌ์ฉํด ํ๋ก์ ํธ๋ฅผ ์งํํ๋๋ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
ํ๋ก์ ํธ ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ๋ค.
- Next.js (app routing)
- TS
์ด๋ฒคํธ ํจ์๋ฅผ ์ปดํฌ๋ํธ ๊ฐ props๋ก ์ ๋ฌํ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ค.
โ๋ฌธ์ ์์ธ
- Server Component์์ Client Component๋ก ํจ์๋ฅผ ์ ๋ฌ ํ ์ ์๋ค.
- ๊ฐ ์ปดํฌ๋ํธ ๊ฐ props๋ก ์ ๋ฌ๋๋ ํจ์๋ ์ง๋ ฌํ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ ๊ถ๊ธํ์ .
- ๋ Client Component๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ณํํ ์ ์ด ์๋๋ฐ?
- ํจ์ ์ง๋ ฌํ๊ฐ ๋ฌด์์ด์ง?
1. ๋ Client Component๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ณํํ ์ ์ด ์๋๋ฐ? | Client Component๋ก ์คํ๋๋ ์กฐ๊ฑด
next.js๋ ๋ฐ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ๋ก ์คํ๋๋ค. ํ์ง๋ง ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์ด์ ๋ฅผ ์ฐพ์๋ณด์๋ค.
ํ์ ์ปดํฌ๋ํธ์ธ Modal.tsx
๋ onClick ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๊ณ ์๋ค. onClick ์ด๋ฒคํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์น ๋ธ๋ผ์ฐ์ ์์์ ์ฌ์ฉ์์ ์ํด ์ปจํธ๋กค๋๋ค.
์ฌ์ฉ์์ ์ํธ์์ฉํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์คํ๋๋ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋์์ ์ฌ์ฉ๋์ด์ผ ํ๋ค
โญ๏ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๋ ํจ์๋ ์๋์ผ๋ก ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ณํ๋๋ค!
const MyModal = (props: IModal) => {
const { isOpen, onRequestClose, contentLabel } = props; // ๐
return (
<div>
<h2>{contentLabel}</h2>
<p>...๋ชจ๋ฌ๋ด์ฉ...</p>
<button onClick={onRequestClose}>๋ซ๊ธฐ</button> // ๐
</div>
);
};
์๋ฌ๊ฐ ๋ฐ์ํ ํฌ์ธํธ๋ props์ ๋ฌ ๊ณผ์ ์ ์๋ค. props์ ๋ฌ ๊ณผ์ ์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๊ธธ๋ ์๋ฒ โ๏ธ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๊ฐ props๋ฅผ ์ ๋ฌ ํ ์ ์๋ ๊ฒ์ผ๊น?
2. ํจ์ ์ง๋ ฌํ๊ฐ ๋ฌด์์ด์ง? | ์๋ฒ โ๏ธ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๊ฐ props๋ฅผ ์ ๋ฌํ ๋ ๋ฐ์ํ๋ ์ผ
If you fetch data in a Server Component, you may want to pass data down as props to Client Components. Props passed from the Server to Client Components need to be serializable by React. by. NEXT JS ๊ณต์๋ฌธ์
๊ณต์๋ฌธ์์์๋ ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ propsํํ๋ก ์ ๋ฌํ ๋ ๋ฆฌ์กํธ์ ์ํด ์ง๋ ฌํ(serializable)๋์ด์ผ ํ๋ค๊ณ ๋งํ๋ค.
๐ก ํจ์ ์ง๋ ฌํ๋?
ํจ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๋ ๊ณผ์ ์ ๋ปํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ฐ์ดํฐ๋ฅผ JSONํํ๋ก ๋ณํํ๋ ๊ฒ์ ์ง๋ ฌํํ๋ค๊ณ ํ๋ค.
ํ์ง๋ง NEXT JS์์ ์๋ฒ ์ปดํฌ๋ํธ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ JSON์ผ๋ก ์ง๋ ฌํ๋์ง ์๊ณ React.Element๋ก ์ ๋ฌํ๋ค.
์ ๋ฌ๋ React.Elements๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ํํํ๋ ๊ฐ์ฒด๋ก, JS ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ด์ธ์๋ React์ ํนํ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์๋ค.
๋ค์ ํ๋ฒ ๋ฌธ์ ๋ฅผ ์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ํ์ ์ปดํฌ๋ํธ๊ฐ ์ด๋ฒคํธ ํจ์๋ฅผ props๋ก ์ ๋ฌ๋ฐ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์๋ ์ ํ๋์๋ค.
- ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋๋ ์ง๋ ฌํ ๊ณผ์ ์ด ํ์ํ๋ฐ, ์ด๋ ์๋ฒ ์ปดํฌ๋ํธ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก props๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ ์ง๋ ฌํ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๋๋ค.
- ์ด ๋ฐ์ดํฐ๋ JSON์ผ๋ก ์ง๋ ฌํ ๋์ง ์๊ณ , React.Elements๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ์ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๋ค.
๐จ ๋ฌธ์ ํด๊ฒฐ
1. ํด๋ผ์ด์ธํธ โ๏ธ ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
์๋ฒ ์ปดํฌ๋ํธ โ๏ธ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๊ฐ ๋ฌธ์ ๋ผ๋ฉด, ใ ๊ตฌ์กฐ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ด๋จ๊น?
์ด ๋ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
"use client";
์์ ์ปดํฌ๋ํธ ํ์ผ ์๋จ์ ์ด ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ ์ธ๋๋ค. ์ฌ๊ธฐ์ ๊ตฌ๋ถ์ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ํ์ผ ์ด๋ฆ๋ ๋ฐ๊พธ์ด ์ฃผ๋ฉด ์ข๋ค.
MyModal.tsx
-> MyModal.client.tsx
์ฌ๊ธฐ์ ๋ ๊ถ๊ธ์ ์ด ์๊ฒผ๋ค.
NEXT JS์์ ์์ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ผ๋ฉด ํ์ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ก ์ค์ ๋๋ค. ์ด ํ๋ก์ ํธ์ ๊ฐ์ฅ ์์ ์ปดํฌ๋ํธ์ธ Page.tsx
์ use client
๋ฅผ ์ถ๊ฐํ๋๋ฐ, ์ด๋ฌ๋ฉด NEXT JS ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ฏธ๊ฐ ์์๊น?
๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด react-query ๊ฐ์ third-party ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค. ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์๊ณ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ตณ์ด ํ์ํ์ง ์๋ค๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ props๋ก ์ ๋ฌํ๋ ๊ฒฝ์ฐ๋ฅผ ์ต๋ํ ์ง์ํ๋ ํธ์ด ์ข๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
Leave a comment