๐Ÿ“š NextJS ํ™˜๊ฒฝ์—์„œ, ์ฝ”๋“œ์—” createContext๊ฐ€ ์—†๋Š”๋ฐ, createContext only works in Client Components.๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ด์œ  ๋ฐ ํ•ด๊ฒฐ ๊ณผ์ • - codesquad-masters2025-team01/issue-tracker GitHub Wiki

๐Ÿค” ๊ณ ๋ฏผ ์ƒํ™ฉ

  • ์ดˆ๊ธฐ ์„ธํŒ…์„ ์–ผ์ถ” ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ์•ฑ์„ ๋Œ๋ ค๋ดค๋Š”๋ฐ, createContext only works in Client Components.๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

  • "use client" ๋ช…์‹œ์ž๋ฅผ ๋‹ฌ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๊ทผ๋ฐ ๋‚ด ์ฝ”๋“œ์—” createContext๊ฐ€ ์—†๋Š”๋ฐ..?


๐Ÿ“Œ ๋ฌธ์ œ ์›์ธ ๋ถ„์„

์—๋Ÿฌ๋ฉ”์„ธ์ง€

TypeError: createContext only works in Client Components. Add the "use client" directive at the top of the file to use it. Read more: 
https://nextjs.org/docs/messages/context-in-server-component
    at eval (webpack-internal:///(rsc)/./node_modules/@emotion/react/dist/emotion-element-782f682d.development.esm.js:36:77)
    at <unknown> (rsc)/./node_modules/@emotion/react/dist/emotion-element-782f682d.development.esm.js 
(/Users/sangyoonlee1231/Desktop/codeSquad/groupProject/issueTracker/issue-tracker-main/frontend/.next/server/vendor-chunks/@emotion.js:70:1)
    at ... (์ดํ•˜ ์ƒ๋žต)
  • @emotion/react ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ(์˜ˆ: <Global>, <ThemeProvider>)๋Š” React.createContext๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
    ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฅผ app/layout.tsx(Server Component) ์•ˆ์—์„œ ๋ฐ”๋กœ importํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„ ๋ Œ๋”๋ง ๋‹จ๊ณ„์—์„œ createContext๊ฐ€ ์‹คํ–‰๋ผ ๋ฒ„๋ฆฌ๊ณ ,
    Next JS๊ฐ€ โ€œcreateContext๋Š” ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ๋ฉ๋‹ˆ๋‹คโ€๋ผ๋ฉฐ ์—๋Ÿฌ๋ฅผ ํ„ฐ๋œจ๋ฆฐ๋‹ค.

  • โ€œ์ฝ”๋“œ์— createContext๊ฐ€ ์—†๋Š”๋ฐ?โ€ โ†’ ์ง์ ‘ ํ˜ธ์ถœํ•œ ์ ์ด ์—†์–ด๋„
    import { Global } from '@emotion/react' ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด
    โ†’ @emotion/react ๋‚ด๋ถ€์—์„œ createContext๋ฅผ ์“ด๋‹ค๊ณ  ํ•œ๋‹ค.

  • ์ฆ‰, NextJS์™€ Emotion์„ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์—๋Ÿฌ



๐Ÿ“ฆ ์—๋Ÿฌ ํ•ด๊ฒฐ๊ณผ ๊ด€๋ จ๋œ ์œ ์šฉํ•œ ๊ฐœ๋…

๐Ÿชถ Emotion์ด ์Šคํƒ€์ผ์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •, ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

โ€œ์™œ 'use client' ๋ฅผ ๋ถ™์—ฌ์•ผ ํ• ๊นŒ?โ€
์•„๋ž˜ 4๋‹จ๊ณ„๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ์˜ค๋ฅ˜์˜ ์›์ธ์„ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ์–ด์š”!


1๋‹จ๊ณ„. ์Šคํƒ€์ผ ์ž‘์„ฑ ๐Ÿ“

const Box = styled.div`
  color: red;
  padding: 8px;
`;
  • ์ด ์ฝ”๋“œ๋Š” JS ๊ฐ์ฒด โ†’ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ ์ค€๋น„๋ฅผ ํ•ด๋‘ก๋‹ˆ๋‹ค.
  • (์„ ํƒ) Babel ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์“ฐ๋ฉด ์ •์ ์ธ ๋ถ€๋ถ„์€ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด ์†๋„๊ฐ€ ๋นจ๋ผ์ ธ์š”.

2๋‹จ๊ณ„. ์ง๋ ฌํ™” & ํ•ด์‹œ๐Ÿ”‘

๋ Œ๋”๋ง์ด ์‹œ์ž‘๋˜๋ฉด Emotion์ด:

  1. ์Šคํƒ€์ผ์„ ํ•œ ์ค„์งœ๋ฆฌ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (color:red;padding:8px;)
  2. ๊ฐ™์€ ๋ฌธ์ž์—ด์ด ๋˜ ๋‚˜์˜ค๋ฉด ์žฌํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์‹œ(css-1a2b3c)๋ฅผ ๋ถ™์—ฌ์š”.

๊ฐ™์€ ์Šคํƒ€์ผ = ๊ฐ™์€ ํ•ด์‹œ โ†’ DOM์— ํ•œ ๋ฒˆ๋งŒ ๋„ฃ์Šต๋‹ˆ๋‹ค.


3๋‹จ๊ณ„. ์Šคํƒ€์ผ ์ฃผ์ž… ๐Ÿ’‰

โ–ถ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)

  • ๊ฐœ๋ฐœ ๋ชจ๋“œ: <style> ํƒœ๊ทธ์— ๊ทธ๋Œ€๋กœ ๋ฌธ์ž์—ด ์‚ฝ์ž…
  • ๋ฐฐํฌ ๋ชจ๋“œ: ๋” ๋น ๋ฅธ insertRule() API ์‚ฌ์šฉ

โ–ถ ์„œ๋ฒ„(SSR)

  • Node ํ™˜๊ฒฝ์—์„œ ๋ฏธ๋ฆฌ ๋ฌธ์ž์—ด์„ ๋ฝ‘์•„ <style data-emotion> ํƒœ๊ทธ๋ฅผ HTML์— ๋„ฃ์–ด ์ค๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด ํƒœ๊ทธ๋ฅผ ๋ณด๊ณ  ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์•„๋„ ๋ฐ”๋กœ ์Šคํƒ€์ผ์ด ์ ์šฉ!

4๋‹จ๊ณ„. โ€œcreateContext only works in Client Componentsโ€ ์˜ค๋ฅ˜? ๐Ÿšจ

  • Emotion ๋‚ด๋ถ€๋Š” React Context(=createContext) ๋กœ ํ…Œ๋งˆ ๋“ฑ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • Server Component(๊ธฐ๋ณธ) ์•ˆ์—์„œ Emotion ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ”๋กœ ์“ฐ๋ฉด
    โ†’ ์„œ๋ฒ„์—์„œ createContext()๊ฐ€ ํ˜ธ์ถœ๋˜์–ด ์œ„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์š”.

ํ•ด๊ฒฐ ๋น„๋ฒ•

  1. Provider ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“  ํ›„
    ๊ทธ ํŒŒ์ผ ๋งจ ์œ„์— 'use client'๋ฅผ ๋ถ™์ธ๋‹ค.
  2. app/layout.tsx ๊ฐ™์€ Server Component์—์„œ
    <EmotionProvider> โ€ฆ </EmotionProvider>
    ๋กœ ๊ฐ์‹ธ๋ฉด ๋!

์ฆ‰ Server ์ชฝ์€ HTML๋งŒ, Client ์ชฝ์€ ์Šคํƒ€์ผ & ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ.


ํ•ต์‹ฌ ์š”์•ฝ

์ˆœ์„œ ํ•œ ์ค„ ์š”์•ฝ
โ‘  ์ž‘์„ฑ styled / css ๋กœ ์Šคํƒ€์ผ ์„ ์–ธ
โ‘ก ์ง๋ ฌํ™” ๋ฌธ์ž์—ด + ํ•ด์‹œ ์ƒ์„ฑ (์ค‘๋ณต ๋ฐฉ์ง€)
โ‘ข ์ฃผ์ž… ํด๋ผ: <style> or insertRule / ์„œ๋ฒ„: <style data-emotion>
โ‘ฃ ์˜ค๋ฅ˜? Server์—์„œ Emotion์„ ๋ฐ”๋กœ ์“ฐ๋ฉด Context ์—๋Ÿฌ โ†’ Provider + 'use client'

๋” ๋น ๋ฅด๊ฒŒ ์“ฐ๋Š” ํŒ โœจ

  • ์ •์  ์Šคํƒ€์ผ์€ ์ปดํฌ๋„ŒํŠธ ๋ฐ– ๋ณ€์ˆ˜๋กœ ์„ ์–ธ โ†’ ๋ Œ๋”๋งˆ๋‹ค ํ•ด์‹œ ์žฌ๊ณ„์‚ฐ โŒ
  • Babel ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ โ†’ ์ •์  CSS๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฒ˜๋ฆฌ
  • ์ „์—ญ Provider ํ•˜๋‚˜๋งŒ 'use client' โ†’ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์†Œํ™”

2025โ€‘05โ€‘14 ๊ธฐ์ค€ ยท Emotion v11 ยท Next.js 14



โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

@emotion/style๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— 'use client'๋ฅผ ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ•˜์—ฌ Client Component๋กœ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

โ€œstyled๋ฅผ importํ•œ๋‹ค = ๊ทธ ํŒŒ์ผ์—์„œ React Context๊ฐ€ ์ฆ‰์‹œ ํ•„์š”ํ•˜๋‹คโ€
๋”ฐ๋ผ์„œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ํŒŒ์ผ์ด๋ผ๋ฉด 'use client' ์—†์ด @emotion/styled๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.
Client ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„๊ณ  ํ•„์š”ํ•œ ๊ณณ์—๋งŒ 'use client'๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋ฒ ์ŠคํŠธ

  • ๊ฐœ์ธ ์†Œ๊ฐ: NextJS์™€ Emotion์€ ์„œ๋กœ ๊ทธ๋ฆฌ ์–ด์šธ๋ฆฌ์ง„ ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค..

โš ๏ธ **GitHub.com Fallback** โš ๏ธ