[Next.js] ๐Ÿšจ ์ด๋ฒคํŠธ๊ฐ€ ํ•จ์ˆ˜๊ฐ€ prop๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ์ด์œ 

๐Ÿšจ ๋ฌธ์ œ ๋ฐœ์ƒ

Next.js๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-11-10 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11 04 49

ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Next.js (app routing)
  • TS

์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ props๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.

โ”๋ฌธ์ œ ์›์ธ

  1. Server Component์—์„œ Client Component๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ํ•  ์ˆ˜ ์—†๋‹ค.
  2. ๊ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ props๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜๋Š” ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ๋•Œ ๊ถ๊ธˆํ•œ์ .

  1. ๋‚œ Client Component๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€ํ™˜ํ•œ ์ ์ด ์—†๋Š”๋ฐ?
  2. ํ•จ์ˆ˜ ์ง๋ ฌํ™”๊ฐ€ ๋ฌด์—‡์ด์ง€?

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์— ํŠนํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฌธ์ œ๋ฅผ ์ •๋ฆฌํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ props๋กœ ์ „๋‹ฌ๋ฐ›์•„ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ž๋™ ์ „ํ™˜๋˜์—ˆ๋‹ค.
  2. ์ปดํฌ๋„ŒํŠธ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” ์ง๋ ฌํ™” ๊ณผ์ •์ด ํ•„์š”ํ•œ๋ฐ, ์ด๋•Œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ props๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋Š” ์ง๋ ฌํ™” ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค.
  3. ์ด ๋ฐ์ดํ„ฐ๋Š” 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