nhcodingstudio
@nhcodingstudio
Students
2,424
Reviews
142
Course Rating
4.8
Posts
Q&A
stopPropagation()์ ๋ํด์ ์ง๋ฌธ ์์ต๋๋ค.
์๋ ํ์ธ์ Eddie๋! ๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ ๋ณด๋ DOM ์ด๋ฒคํธ ์ ํ ํ๋ฆ์ ํต์ฌ์ ์์ฃผ ๊น์ด ์๊ฒ ํ๊ณ ๋ค๊ณ ๊ณ์๋ค์. ์ง๋ฌธํด์ฃผ์ ๋ด์ฉ ์ค ์ฉ์ด์ ๋ํ ์ฝ๊ฐ์ ์คํด๊ฐ ์์ผ์ จ๋ ๊ฒ ๊ฐ์ ์ด ๋ถ๋ถ๋ถํฐ ๋ช ํํ ์ง์ด๋๋ฆฌ๊ณ , ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ธํ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.๊ฐ์์์ ๋ง์๋๋ฆฐ ์์๋ก ์ ํ ์ฐจ๋จ์ด๋ผ๋ ํํ์ ์บก์ฒ๋ง์ด ์๋๋ผ ๋ฒ๋ธ๋ง์ ์๋ฏธํ๋ ๊ฒ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์ด๋ฒคํธ ํ๋ฆ์ ์ต์๋จ ๋ถ๋ชจ์์ ์ค์ ํด๋ฆญ๋ ํ๊ฒ ์์๋ก ํ๊ณ ๋ด๋ ค๊ฐ๋ ์บก์ฒ๋ง ๋จ๊ณ์, ํ๊ฒ์์ ๋ค์ ๋ถ๋ชจ ์์๋ค์ ํ๊ณ ์๋ก ์ฌ๋ผ๊ฐ๋ ๋ฒ๋ธ๋ง ๋จ๊ณ๋ก ๋๋ฉ๋๋ค. ์ฆ, ๋ถ๋ชจ ์์๋ผ๋ ์์๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ค๋ ๊ฒ์ ๊ณง ๋ฒ๋ธ๋ง์ ๋ปํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฅ๋ค์ด๋ธ๋ฅผ ์ข์ํ์๋ Eddie๋์ ์ํด ์์ฃผ ์ฌ์ํ ํ์ ํ๋ ๋ ์น์ด๋๋ฆฌ์๋ฉด, DOM ์ด๋ฒคํธ ํ๋ฆ์ ์๋ฐํ ๋งํด ์ต์์์์ ๋ด๋ ค์ค๋ ์บก์ฒ๋ง ๋จ๊ณ, ์ค์ ํด๋ฆญํ ์์์ ๋๋ฌํ๋ ํ๊ฒ ๋จ๊ณ, ๊ทธ๋ฆฌ๊ณ ๋ค์ ์๋ก ์ฌ๋ผ๊ฐ๋ ๋ฒ๋ธ๋ง ๋จ๊ณ๋ผ๋ ์ธ ๊ฐ์ง ๊ณผ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ๋น๋ก ํ๋ฆ์ ๋ฐฉํฅ์ฑ์ ์ค๋ช ํ๊ธฐ ์ํด ํ๊ฒ ๋จ๊ณ๋ฅผ ์๋ตํ๊ณ ๋ง์๋๋ ธ์ง๋ง, ์ด ์ธ ๋จ๊ณ๋ฅผ ๋ชจ๋ ์์๋์๋ฉด ์ดํด๊ฐ ํจ์ฌ ๊น์ด์ง์ค ๊ฒ๋๋ค.Eddie๋์ด ๊ฐ์๋ฅผ ๋ชจ๋ ๋ค์ผ์ ํ ์ดํดํ์ ๋ด์ฉ์ด ์์ฃผ ์ ํํฉ๋๋ค. stopPropagation ํจ์๋ ๋จ์ํ ๋ฒ๋ธ๋ง๋ง ๋ง๋ ๊ฒ๋ ์๋๊ณ ์บก์ฒ๋ง๋ง ๋ง๋ ๊ฒ๋ ์๋๋๋ค. ์ด ํจ์์ ์ ํํ ๋์ ์๋ฆฌ๋, ํ์ฌ ์ด๋ฒคํธ๊ฐ ์บก์ฒ๋ง ๋จ๊ณ์ ์๋ ๋ฒ๋ธ๋ง ๋จ๊ณ์ ์๋ ์๊ด์์ด ์ด ํจ์๊ฐ ํธ์ถ๋ ๋ฐ๋ก ๊ทธ ์์ ๋ถํฐ ๋ ์ด์์ ์ด๋ฒคํธ ์ ํ๋ฅผ ์์ ํ ๋์ด๋ฒ๋ฆฌ๋ ๊ฒ์ ๋๋ค.๋ง์ฝ ์บก์ฒ๋ง ๋จ๊ณ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋ ์ง ์๋ ์ฝ๋๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.// ๋ถ๋ชจ ์์์ ์บก์ฒ๋ง ๋จ๊ณ์์ ์ ํ๋ฅผ ๋ง๋ ์์์ ๋๋ค. parentElement.addEventListener('click', (e) => { e.stopPropagation(); console.log('๋ถ๋ชจ ์บก์ฒ๋ง ๋จ๊ณ'); }, { capture: true }); // ์์ ์์์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋๋ค. childElement.addEventListener('click', (e) => { console.log('์์ ํด๋ฆญ ์ด๋ฒคํธ'); }); ์์ ์์์ฒ๋ผ ์บก์ฒ๋ง ์ต์ ์ ์ผ ๋ถ๋ชจ ์์์์ stopPropagation์ ํธ์ถํ๊ฒ ๋๋ฉด, ์ด๋ฒคํธ๊ฐ ํ๊ฒ์ธ ์์ ์์๊น์ง ์ฑ ๋ด๋ ค๊ฐ๊ธฐ๋ ์ ์ ํ๋ฆ์ด ๋ฉ์ถฐ๋ฒ๋ฆฌ๊ฒ ๋์ด ์์ ์์์ ํด๋ฆญ ์ด๋ฒคํธ๋ ์ ๋ ์คํ๋์ง ์์ต๋๋ค. ๋ฐ๋๋ก ์ฐ๋ฆฌ๊ฐ ํํ ์์ฑํ๋ ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ๋ฒ๋ธ๋ง ๋จ๊ณ์์ ๋์ํ๋ฏ๋ก, ์์ ์์์์ ํธ์ถํ๊ฒ ๋๋ฉด ๋ถ๋ชจ ์์๋ก ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์ฌ๋ผ๊ฐ๋ ์์ ์ ํ๋ฅผ ๋ง์์ฃผ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.๋ฐ๋ผ์ ๊ฐ์์์ ์์๋ก ์ ํ ์ฐจ๋จ์ด๋ผ๊ณ ์ค๋ช ํด ๋๋ฆฐ ๊ฒ์, ์ค๋ฌด์์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ๋๋ถ๋ถ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฒ๋ธ๋ง ๋จ๊ณ์์ ๋์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ํํ๊ฒ ๋ง์ฃผํ๋ ๋งฅ๋ฝ์ ๊ฐ์กฐํด์ ๋ง์๋๋ฆฐ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ์ค๋ฌด์์๋ ๋ชจ๋ฌ ์ฐฝ์ด๋ ํ์ ๋ฉ๋ด๋ฅผ ๊ตฌํํ ๋ ์ด ๋ฐฉ์์ ์์ฃผ ์ ์ฉํ๊ฒ ํ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋์ด ๋ฐฐ๊ฒฝ ์์ญ์ ํด๋ฆญํ๋ฉด ๋ชจ๋ฌ์ด ๋ซํ๋๋ก ๊ตฌํํด ๋์๋๋ฐ ์ฌ์ฉ์๊ฐ ๋ชจ๋ฌ ๋ด๋ถ์ ๋ฒํผ์ด๋ ํผ์ ํด๋ฆญํ์ ๋๋ ์ด๋ฒคํธ๊ฐ ๋ฐฐ๊ฒฝ์ผ๋ก ๋ฒ๋ธ๋ง๋์ด ๋ชจ๋ฌ์ด ์๋์น ์๊ฒ ๋ซํ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ฌ ๋ด๋ถ ์์์ stopPropagation์ ๊ฑธ์ด์ฃผ๋ฉด, ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐฐ๊ฒฝ์ผ๋ก ์ ํ๋๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ๋ง์์ฃผ์ด ์ด๋ฌํ ์ด์๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.ํ์ง๋ง Eddie๋์ด ํ์ ํ์ ๊ฒ์ฒ๋ผ ์ด๋ฒคํธ์ ์์๋ ๋ฐฉํฅ์ ๊ตญํ๋์ง ์๊ณ , ์ด๋ฒคํธ ํ๋ฆ ์์ฒด๋ฅผ ๊ทธ ์๋ฆฌ์์ ์ ์ง์ํจ๋ค๋ ๊ฒ์ด ์ด ๋ฉ์๋์ ๋ํ ๊ฐ์ฅ ์๋ฒฝํ ์ดํด์ ๋๋ค. ์ด๋ ๊ฒ ๊ผผ๊ผผํ๊ฒ ๊ฐ์๋ฅผ ์๊ฐํ์๊ณ ํต์ฌ์ ๊ฟฐ๋ซ๋ ์ข์ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ถ๊ฐ๋ก ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ์คํ๋์ค์์ ๊ด์ฌ ์๋ ๊ฐ์๊ฐ ์์ผ์๋ค๋ฉด jeony0535@naver.com ์ด๋ฉ์ผ๋ก ์ฐ๋ฝํด ์ฃผ์๋ฉด ํ ์ธ ์ฟ ํฐ์ ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค!
- Likes
- 0
- Comments
- 2
- Viewcount
- 37
Q&A
27๊ฐ Context๋ด RSC ์ฌ์ฉ ๊ด๋ จ ๋ฌธ์
์๋ ํ์ธ์ Eden๋! ๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ ๋ณด๋ React Server Component, ์ฆ RSC์ ์ํคํ ์ฒ์ Composition ํจํด์ ๋ํด ๊น์ด ์๊ฒ ์ดํดํ๊ณ ๊ณ์๋ค์. ๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด Eden๋์ด ์๊ณ ๊ณ์ ๋ด์ฉ์ด ๋ง์ต๋๋ค. Client Component์ธ Provider๋ก ๊ฐ์ธ๋๋ผ๋ children prop์ ํตํด Composition ํํ๋ก ๋๊ธฐ๋ฉด, ํด๋น children์ผ๋ก ์ ๋ฌ๋ ์ปดํฌ๋ํธ๋ค์ Server Component์ ์์ฑ์ ๊ทธ๋๋ก ์ ์งํ๋ฉฐ ๋ ๋๋ง ์ต์ ํ ๊ธฐํ๋ฅผ ์์ง ์์ต๋๋ค.์ง๋ฌธํด์ฃผ์ ๊ฒ์ฒ๋ผ ์ค์ต ์๋ฃ์ "์ ๋ฐ ์ํคํ ์ฒ ๋ถ์"์ ์ ํ "App.tsx๋ฅผ 10๊ฐ์ Provider๋ก ๊ฐ์ธ๋ ์๊ฐ ๊ทธ ์๋์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ ์๋ฒ ์ปดํฌ๋ํธ๋ก์์ ์ต์ ํ ๊ธฐํ๋ฅผ ์๊ฒ ๋ฉ๋๋ค"๋ผ๋ ์ค๋ช ์, Eden๋์ ์์๋๋ก Composition Pattern์ ์ ์ฉํ์ง ์๊ณ ๋ด๋ถ์์ ์ง์ importํ๋ ์ผ๋ฐ์ ์ด๊ณ ์๋ชป๋ ์ํฐ ํจํด์ ์ ์ ๋ก ์ค๋ช ํ ๊ฒ์ด ๋ง์ต๋๋ค. ๋๋ถ์ด ํจํด์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋๋ผ๋ ํผํ ์ ์๋ Context API์ ๊ทผ๋ณธ์ ์ธ ํ๊ณ์ Client Boundary์ ์ฐ์์ ์ธ ์ค์ผ์ ํจ๊ป ๊ฒฝ๊ณ ํ๊ธฐ ์ํ ๋งฅ๋ฝ์ด์์ต๋๋ค. ์ด ๋ถ๋ถ์ด ์ค๋ฌด์์๋ ์์ฃผ ๋ฐ์ํ๋ ์ํคํ ์ฒ์ ์ค์์ด๋ฏ๋ก ์ ๊ทธ๋ฐ ํํ์ด ๋์๋์ง ์ด๋ฉด์ ๋์ ์๋ฆฌ์ ์ค๋ฌด ์์ , ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ธ ์์ฉ ๋ฐฉ์๊น์ง ์์ธํ ํ์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.RSC ์ํคํ ์ฒ์์ Server Component๋ฅผ Client Component๋ก ๋ง๋๋ ์กฐ๊ฑด์ ๋จ์ํ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ด๋ถ์ ์์นํ๋๊ฐ์ ๋ฌ๋ ค์๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ป๊ฒ import ๋๊ณ ๋ ๋๋ง ๋๋๊ฐ์ ๋ฌ๋ ค ์์ต๋๋ค. ์ด ๊ณผ์ ์์ ๊ฐ์ฅ ํํ ํ๋ ์ค์๋ Client Component ๋ด๋ถ์์ Server Component๋ฅผ ์ง์ importํ์ฌ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ์ ๋๋ค.'use client'; import { ThemeContext } from './context'; import Header from './Header'; // Server Component๋ก ์๋ํ์ผ๋ Client๋ก ๊ฐ์ ๋ณํ๋จ import MainContent from './MainContent'; // ๋ง์ฐฌ๊ฐ์ง๋ก Client ์์ญ์ผ๋ก ํธ์ ๋จ export default function GlobalProvider() { return ( ); } ์์ ์์ ์ฝ๋์ฒ๋ผ 'use client'๊ฐ ์ ์ธ๋ ํ์ผ ๋ด๋ถ์์ ์ง์ import๋ ์ปดํฌ๋ํธ๋ค์ ํธ๋ฆฌ ๊ตฌ์กฐ์ Client Boundary ์์ผ๋ก ๋๋ ค ๋ค์ด๊ฐ๊ฒ ๋์ด, ์๋ฒ์์ ๋ ๋๋ง๋ ๊ธฐํ๋ฅผ ์๊ณ ์ ๋ถ ํด๋ผ์ด์ธํธ ๋ฒ๋ค์ ํฌํจ๋ฉ๋๋ค. ์์ ๋ง์๋๋ฆฐ ๊ฐ์์์ ๊ฒฝ๊ณํ๋, Composition Pattern์ ์ ์ฉํ์ง ์์ ๊ฐ์ฅ ์ํํ ํจํด์ด ๋ฐ๋ก ์ด๊ฒ์ ๋๋ค. ๋ฐ๋ฉด์ Eden๋์ด ๋ง์ํ์ ๋๋ก Next.js์ Root Layout์์ ํํ ์ฌ์ฉํ๋ children ํจํด์ ์ฐ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ฐํํ ์ ์์ต๋๋ค.// Providers.tsx 'use client'; export default function Providers({ children }: { children: React.ReactNode }) { return {children}; } // layout.tsx (Server Component) import Providers from './Providers'; import Header from './Header'; // Server Component ์ ์ง export default function RootLayout({ children }) { return ( {children} {/* Server Component ์ ์ง */} ); } ์ด ์ฌ๋ฐ๋ฅธ ํจํด์ด ๋์ํ๋ ํต์ฌ ์๋ฆฌ๋ ํ๊ฐ, ์ฆ Evaluation ์์ ์ ์ฐจ์ด์ ์์ต๋๋ค. Header์ children์ Server Component์ธ layout.tsx์์ ๋ฏธ๋ฆฌ ํ๊ฐ๋์ด ์ง๋ ฌํ๋ React ๊ฐ์ฒด(RSC Payload) ํํ๋ก Providers์ prop์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ ์ฅ์์๋ ์ปดํฌ๋ํธ ํจ์๋ฅผ ์ง์ ์คํํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ฒ๊ฐ ์ ๋ฌํด ์ค ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ๊ทธ๋๋ก ํ๋ฉด์ ์น๊ธฐ๋ง ํ๋ฏ๋ก RSC์ ์ด์ ์ ์ ์งํ ์ ์๋ ๊ฒ์ ๋๋ค.์ด๋ ๊ฒ Composition ํจํด์ ์ฐ๋ฉด RSC๊ฐ ์ ์ง๋จ์๋ ๋ถ๊ตฌํ๊ณ Root ๋ ๋ฒจ์ Provider๋ก ๊ฐ์ธ๋ ๊ฒ์ ์ง์ํ๋ผ๊ณ ๊ฐ์กฐํ๋ ๋ ๊น์ ์ด์ ๊ฐ ์๋๋ฐ, ์ด๋ ๋ฐ๋ก ๋ฐ์ดํฐ ์๋น์ ๋ฌธ์ ๋๋ฌธ์ ๋๋ค. RSC๋ ์๋ฒ์์ ์คํ๋๋ฏ๋ก ๋ธ๋ผ์ฐ์ ์ API๋ ์ํ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ํธ๋ฆฌ ํ๋จ ๊น์ํ ๊ณณ์ ์๋ Server Component๊ฐ Root์ ์ ์๋ Context ๊ฐ์ ์ฝ๊ธฐ ์ํด useContext๋ฅผ ํธ์ถํ๋ ์๊ฐ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ฒฐ๊ตญ ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ๋ถ๊ฐํผํ๊ฒ 'use client'๋ก ์ ํํด์ผ ํ๋๋ฐ, Root์ ๊ฑฐ๋ํ Provider๋ฅผ ๋๋ฉด ๊ทธ ํ์์ ์๋ ์๋ง์ ์ปดํฌ๋ํธ๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํด ์ฐ์์ ์ผ๋ก Client Component๋ก ๋ณ์ง๋ ์ํ์ฑ, ์ฆ Client Boundary๊ฐ ํ์ฅ๋ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋๋ค.๋ฌผ๋ก ๋คํฌ๋ชจ๋๋ ๋ก๊ทธ์ธ ์ํ์ฒ๋ผ ๋ถ๊ฐํผํ๊ฒ Root Layout์ ๊ฐ์ธ์ผ ํ๋ ์ ์ญ Provider๋ ์กด์ฌํ์ง๋ง, ๊ฐ์์์ ๊ฒฝ๊ณํ ๊ฒ์ ์ต๊ด์ ์ธ Root Provider ๋ํ์ ์ง์ํ์๋ ์๋ฏธ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ Server Component์ ์ด์ ์ ๊ทน๋ํํ๊ธฐ ์ํด ์ค๋ฌด์์๋ ํฌ๊ฒ ๋ ๊ฐ์ง ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.์ฒซ ๋ฒ์งธ ์ ๋ต์ Provider๋ฅผ ์ํ๊ฐ ํ์ํ ํธ๋ฆฌ ์ตํ๋จ์ผ๋ก ๋ฐ์ด๋ด๋ ๊ฒ์ ๋๋ค. ์ ์ญ ์ํ๊ฐ ์๋๋ผ ํน์ ๋๋ฉ์ธ์ด๋ UI ์์ญ์์๋ง ํ์ํ ์ํ๋ผ๋ฉด, ํ์ ์๋ ํ์ด์ง๊น์ง ์ํ์ ๋ ธ์ถ๋๋๋ก ์ต์๋จ Layout์ ๊ฐ์ธ๋ ๊ฒ์ด ์๋๋ผ ํด๋น ์ํ๋ฅผ ์๋นํ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋์์ Provider๋ฅผ ๊ฐ์ธ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ด ํ์ํ ํน์ ํ์ด์ง๋ ๋ ์ด์์์์๋ง CartProvider๋ก ๋ฉํํ๋ ์์ ๋๋ค.๋ ๋ฒ์งธ ์ ๋ต์ Server Component์์ Client Component๋ก ์ํ๋ฅผ ์ฃผ์ ํ๋ Hydration ํจํด์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. RSC์ ๊ฐ์ ์ ์ด๋ฆฌ๋ฉด์ ํด๋ผ์ด์ธํธ ์ํ ๊ด๋ฆฌ๋ฅผ ๋งค๋๋ฝ๊ฒ ํ๋ ค๋ฉด, ๋ฐ์ดํฐ ํ์นญ์ ์๋ฒ์์ ์ฒ๋ฆฌํ๊ณ ๊ทธ ์ด๊ธฐ๊ฐ์ Zustand๋ Jotai ๊ฐ์ ํด๋ผ์ด์ธํธ ์คํ ์ด์ ์ฃผ์ ํ๋ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.// Server Component import { fetchUserSession } from '@/lib/api'; import ClientStoreProvider from './ClientStoreProvider'; export default async function UserDashboard() { const sessionData = await fetchUserSession(); return ( ); } ์ด ์์์ฒ๋ผ ์๋ฒ์์ ๋ฐ์ดํฐ ํจ์นญ์ ์งํํ์ฌ ์ด๊ธฐ ์ํ๋ฅผ Client Provider์ Prop์ผ๋ก ์ ๋ฌํ๊ฒ ๋๋ฉด, ๋ณด์์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๋ฌด๊ฑฐ์ด ํ์นญ ๋ก์ง์ ์๋ฒ์ ๋จ๊ฒจ๋๊ณ ํด๋ผ์ด์ธํธ์์๋ ๊ฐ๋ฒผ์ด ์ธํฐ๋์ ์ํ๋ง ๊ด๋ฆฌํ๋ ์ด์์ ์ธ ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.์ด์ ๊ด๋ จํ์ฌ ์ค๋ฌด์์ RSC ์ํคํ ์ฒ์ ์ฅ์ ์ ๊ทน๋ํํ๊ธฐ ์ํด ์ ๊ทน์ ์ผ๋ก ๊ถ์ฅํ๋ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ช ๊ฐ์ง ๋ง๋ถ์ฌ ๋๋ฆฝ๋๋ค. ์ฐ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ํ ๋๊ธฐํ๋ฅผ ์ํด ๋ณต์กํ ๋ฐ์ดํฐ ํจ์นญ๊ณผ ์บ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ์๋ TanStack Query(๊ตฌ React Query)์ HydrationBoundary ํจํด์ ์ถ์ฒํฉ๋๋ค. ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฆฌํจ์นํ์ฌ ํด๋ผ์ด์ธํธ๋ก ์ง๋ ฌํํด ๋๊ฒจ์ฃผ๋ฉด, RSC์ ์ด๊ธฐ ๋ ๋๋ง ์ด์ ์ ์ฑ๊ธฐ๋ฉด์๋ ํด๋ผ์ด์ธํธ์์์ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ๋งค๋๋ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ค์์ผ๋ก ๊ฒฝ๋ํ๋ ํด๋ผ์ด์ธํธ ์ ์ญ ์ํ๋ฅผ ๋ค๋ฃฐ ๋๋ ์์ ์์๋ก ์ธ๊ธํ Zustand๋ Jotai๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ React Context API ํน์ ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ์ด์๋ฅผ ํผํ ์ ์๊ณ , ํธ๋ฆฌ ์ธ๋ถ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์์ด ์ปดํฌ๋ํธ๋ฅผ ์ต๊ด์ ์ผ๋ก 'use client'๋ก ๋ง๋๋ ์ผ์ ์ค์ฌ์ค๋๋ค. ๋ง์ง๋ง์ผ๋ก ํญ, ํํฐ๋ง, ์ ๋ ฌ, ๊ฒ์์ด ๊ฐ์ ์ํ๋ ์ ์ญ ์คํ ์ด ๋์ URL Search Params๋ฅผ ํ์ฉํ์ฌ URL์ ์ ์ฅํ๋ ๋ฐฉ์์ ๊ถ์ฅํฉ๋๋ค. ์ต๊ทผ nuqs ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด Client Boundary๋ฅผ ๋ํ์ง ์๊ณ ๋ Server Component๊ฐ URL ํ๋ผ๋ฏธํฐ๋ฅผ ์ฝ์ด ๋ ๋๋ง์ ์ ์ดํ๋ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ด ์ํ ๊ด๋ฆฌ์ ๋ณต์ก๋๋ฅผ ํฌ๊ฒ ๋ฎ์ถ ์ ์์ต๋๋ค.๊ฒฐ๋ก ์ ์ผ๋ก Eden๋์ด ์ง์ด์ฃผ์ Composition Pattern์ Next.js App Router ์ํ๊ณ์์ ์ค์ํ๊ฒ ํ์ฉ๋๋ ํจํด์ด๋ฉฐ, ๊ฐ์์ ํด๋น ํํ์ Provider ์ฌ์ฉ ์ ํ์ฐ์ ์ผ๋ก ๋ฐ๋ผ์ค๋ ๋ฐ์ดํฐ ์๋น์ ๋ถ์์ฉ๊ณผ Client Component์ ์ฐ์์ ์ ํ๋ฅผ ๊ฒฝ๊ณํ์๋ ์๋ฏธ๋ก ๋ฐ์๋ค์ฌ ์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.์ข์ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ถ๊ฐ๋ก ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ์คํ๋์ค์์ ๊ด์ฌ ์๋ ๊ฐ์๊ฐ ์์ผ์๋ค๋ฉด jeony0535@naver.com ์ด๋ฉ์ผ๋ก ์ฐ๋ฝํด ์ฃผ์๋ฉด ํ ์ธ ์ฟ ํฐ์ ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค!
- Likes
- 0
- Comments
- 3
- Viewcount
- 63
Q&A
ํน์ ๋ค์ ๊ฐ์ ์ ์ ์์ ๋ ๊ฒ๋ค์ด ์์๊น์?
์๋ ํ์ธ์ ๊ดํ๋, ์ฐ์ ์ด๋ ๊ฒ ์ ์ฑ์ค๋ฌ์ด ์๊ฐ ํ๊ธฐ์ ๋ฌธ์๋ฅผ ๋จ๊ฒจ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌํฉ๋๋ค. AI ์๋์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋์ ๊ฒฝ๊ณ๊ฐ ํ๋ฌผ์ด์ง๊ณ ์๋ค๋ ๊ดํ๋์ ํต์ฐฐ์ ์ ์ญ์ ๊น์ด ๊ณต๊ฐํฉ๋๋ค. ๊ทธ ๋ณํ์ ํ๋ฆ ์์์ ์ ๊ฐ์๊ฐ ๊ดํ๋์ ์ฑ์ฅ์ ์ค์ง์ ์ธ ๋์์ด ๋์๋ค๋, ์ง์์ ๋๋๋ ์ฌ๋์ผ๋ก์ ๊ฐ์ฅ ๋ฟ๋ฏํ๊ณ ๊ฐ์ฌํ ์๊ฐ์ด๋ค์.๋ง์ํด ์ฃผ์ ๊ฒ์ฒ๋ผ Node.js ์๋ฆฌ์ฆ๋ Part 3๊น์ง ์ด์ด์ง ์์ ์ด๋ฉฐ, ์ด์ด์ง๋ ๊ฐ์์ ๋ฐฉํฅ์ฑ์ ๋ํด ์ต๋ํ ์์ธํ๊ฒ ๋ต๋ณํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ค๊ฐ์ฌ Part 3๋ ๊ดํ๋๊ป์ Part 1๊ณผ Part 2๋ฅผ ๊ฑฐ์น๋ฉฐ ๋จ๋จํ๊ฒ ๋ค์ง์ ๋ฒํผ์ ์คํธ๋ฆผ, ๊ทธ๋ฆฌ๊ณ ์ด์์ฒด์ ๋ ๋ฒจ์ ์ดํด๋ฅผ ๋คํธ์ํฌ๋ผ๋ ๋ ๋์ ์์ญ์ผ๋ก ํ์ฅํ๋ ๊ณผ์ ์ ๋๋ค. ๋จ์ํ ํ๋ ์์ํฌ๋ฅผ ๊ฐ์ ธ๋ค ์ฝ๋๋ฅผ ์คํํ๋ฉด ์๋ฒ๊ฐ ์ด๋ฆฌ๊ณ ๋คํธ์ํฌ๊ฐ ์ฐ๊ฒฐ๋๋ค๋ ์์ ๊ฒํฅ๊ธฐ์ ์ ๊ทผ์ด ์๋๋ผ, ์ ๋ง ๋ฐ๋ฐ๋ฅ ๊ทผ๋ณธ๋ถํฐ ํ๋ํ๋ ์ด๋ก ๊ณผ ๊ตฌํ์ ๋ชจ๋ ๋ค๋ฃจ๊ฒ ๋ฉ๋๋ค. ๋จ์ํ ์ ๊ธฐ ์ ํธ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ด๋ป๊ฒ ํ๋ฌ ํ๋ ์, ํจํท, ์ธ๊ทธ๋จผํธ ๋ฑ์ ํํ๋ก ๋ณํ๋๊ณ , ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๋คํธ์ํฌ์ ์ด๋ป๊ฒ ์ ๋ฌ๋๋์ง ๊ทธ ๋ณธ์ง์ ์ธ ๊ณผ์ ์ ํํค์นฉ๋๋ค.์ด ๊ณผ์ ์ ํตํด OSI 7๊ณ์ธต๊ณผ TCP/IP ๋ชจ๋ธ์ ํผ์์ ์ธ ์ด๋ก ์ผ๋ก๋ง ์๊ธฐํ๋ ๊ฒ์ ๋์ด, ์ฐ๋ฆฌ๊ฐ ์์ฑํ๋ ์ฝ๋์ ์ด๋ ๋ถ๋ถ์์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ ์บก์ํ๋๊ณ ์ ์ก๋๋์ง ๋ฐ๋ฅ๋ถํฐ ์ดํดํ๊ฒ ๋ ๊ฒ์ ๋๋ค. ๋ํ, ์ด๋ฏธ ๋ง๋ค์ด์ง HTTP ์๋ฒ์ ์์กดํ๋ ๋์ Node.js์ ๋ด์ฅ net ๋ชจ๋์ ํ์ฉํด TCP์ UDP ๊ธฐ๋ฐ์ ์๋ฒ๋ฅผ ์ฒ์๋ถํฐ ์ง์ ์ฝ๋ฉํ์ฌ ๊ตฌํํด ๋ด ๋๋ค. ์ด๋ ๊ฒ ์ง์ ์๋ฒ๋ฅผ ๋ง๋ค๋ฉด์ 3-way handshake๋ ํ๋ฆ ์ ์ด๋ ๋ฌผ๋ก , ๋ฒํผ์ ๋ฐ์ดํฐ๊ฐ ์ฒญํฌ ๋จ์๋ก ์์ด๊ณ ์ฒ๋ฆฌ๋๋ ๊ณผ์ ์ ์ง์ ๋์ผ๋ก ํ์ธํ์๊ฒ ๋ฉ๋๋ค. ๋์๊ฐ ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ง๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํต์ ํ ๋, ๋คํธ์ํฌ ์ ์ ํ๊ณ ํ๋ฅด๋ ๋ฐ์ดํฐ๋ฅผ Wireshark๋ก ์บก์ฒํ์ฌ ํจํท ๋จ์๋ก ๋ฏ์ด๋ณด๋ ๊ณผ์ ๋ ๊ฑฐ์นฉ๋๋ค. ๋์ ๋ณด์ด์ง ์๋ ๋คํธ์ํฌ ํธ๋ํฝ์ ์๊ฐํํ๊ณ ๋ก๊ทธ๋ฅผ ๋ถ์ํจ์ผ๋ก์จ ์๋ฒฝํ ๋คํธ์ํฌ ์ดํด๋์ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ฒ ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก ๊ธฐ์กด์ HTTP ๊ท๊ฒฉ์๋ง ์์กดํ๋ ๊ฒ์ ๋์ด, ํค๋์ ๋ฐ๋์ ๊ท๊ฒฉ์ ์ง์ ์ ์ํ๊ณ ๋ค์ด์ค๋ ์คํธ๋ฆผ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ ๋ ๋ฒจ์์ ํ์ฑํ์ฌ ์ฒ๋ฆฌํ๋ ์ฐ๋ฆฌ๋ง์ ๋ ์์ ์ธ ์ปค์คํ ํ๋กํ ์ฝ๊น์ง ์ค๊ณํ๊ณ ๋ง๋ค์ด ๋ณผ ๊ฒ์ ๋๋ค.๊ดํ๋๊ป์ ์ ์ํด ์ฃผ์ ์ด์๊ณผ ๋ฐฐํฌ ๋ ธํ์ฐ, ํ์ฅ ๊ฐ๋ฅํ ์ํคํ ์ฒ, npm ํจํค์ง ์ ์, ๋์์ธ ํจํด ๋ฑ์ ์ค๋ฌด์ ์ธ ์ฃผ์ ๋ค ์ญ์ ์ ๋ง ํ๋ฅญํ ํฌ์ธํธ์ ๋๋ค. ์ฌ์ค ํ์ฌ ๋์ธ์ ์ธ ์๊ฐ๋ Part 3๊น์ง๋ง ์งํํ์ง๋ง, ๊ฐ์๋ฅผ ์ ์ํ๋ฉด์ ์ ์ญ์ ์กฐ๊ธ ๋ ์์ฌ์ด ์๊ฒผ๊ณ , ํ์ฌ ๊ตฌ์ ์ค์ธ ๋ด์ฉ๋ค์ ๋ชจ๋ ๊ณ ๋ คํ์ ๋ ํฅํ ์๋ฆฌ์ฆ๋ Part 4์์ Part 5๊น์ง๋ ์ด์ด์ ธ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ํฅํ์๋ Part 1, 2, 3์ ๊ฑธ์ณ ํ์ตํ ๋ชจ๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ์ฐ๋ฆฌ๋ง์ ์๋ฒ ํ๋ ์์ํฌ๋ฅผ ์ง์ ๋ง๋ค์ด๋ณด๋ ๊ณผ์ ๊น์ง ๊ธฐํํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฐ์ดํฐ ์์ถ์ ์๋ฆฌ๋ ๋ฌผ๋ก ์ด๊ณ , ํ๋ ๊ฐ๋ฐ์์ ํ์์ ์ธ ๋ณด์๊ณผ ์ธ์ฆ, ๊ทธ๋ฆฌ๊ณ ์ํธํ ๊ด๋ จ ๋ด์ฉ๊น์ง ๋น ์ง์์ด ๋ชจ๋ ๋ค๋ฃฐ ์์ ์ ๋๋ค. ๋ ๋์๊ฐ Redis ๋ฑ์ ๊ธฐ์ ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ฌ ๋ฐฑ๋ง ๊ฐ์ ์์ฒญ๋ ์์ฒญ์ ๊ฑฐ๋ฌํ ์ฒ๋ฆฌํด ๋ด๋ ๋๊ท๋ชจ ํธ๋ํฝ ์ฒ๋ฆฌ ์์คํ ๊น์ง ๋ชจ๋ ๊ณํ ์ค์ ์์ต๋๋ค.์ด๋ฌํ ํฐ ๊ทธ๋ฆผ์ ๋๊ณ ๋ณด๋ฉด, ๋ง์นจ ๊ดํ๋๊ป์ ๊ด์ฌ ์์ด ํ์๋ ํ์ฅ ๊ฐ๋ฅํ ํ๋ก์ ํธ ๊ตฌ์กฐ ์ค๊ณ์ ์ค๋ฌด ๋ ธํ์ฐ ๊ฐ์ ์ฃผ์ ๋ค์ ํฅํ ์ปค๋ฆฌํ๋ผ์์ ๋ชจ๋ ๊น์ด ์๊ฒ ๋ค๋ฃฐ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. Part 3์์ ๋ค๋ฃจ๊ฒ ๋ ๋ฐ๋ฅ๋ถํฐ์ CS ๋ฐ ๋คํธ์ํฌ ํ์ต์ด ๊ณง ํ์ฅ ๊ฐ๋ฅํ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๋์์ธ ํจํด์ ์๋ฒฝํ๊ฒ ์ดํดํ๊ธฐ ์ํ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ํผํผํ ๊ธฐ์ด ์์ ์ค๋ฌด ๋ ธํ์ฐ๋ฅผ ์์ ๋ ๊ทธ ์๋์ง๊ฐ ํญ๋ฐํ๋ ๋งํผ, ์ ๋ ์ต๋ํ ๋ฐ์ฐจ๋ฅผ ๊ฐํด ๊ดํ๋๊ป์ ๊ธฐ๋ํ์๋ ์ข์ ๊ฐ์๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ณตํ ์ ์๋๋ก ์ต์ ์ ๋คํ๊ฒ ์ต๋๋ค. ์์ผ๋ก ์ด์ด์ง Part 2๋ ์ง๊ธ์ฒ๋ผ ์ฆ๊ฒ๊ณ ์น์ดํ๊ฒ ์๊ฐํด ์ฃผ์๊ธธ ๋ฐ๋ผ๋ฉฐ, ๋ ๊น๊ณ ๋์ ์ง์์ ์ธ๊ณ์์ ๊ดํ๋๊ณผ ํจ๊ป ๋์์ด ์ฑ์ฅํด ๋๊ฐ๊ธธ ์ง์ฌ์ผ๋ก ๊ธฐ๋ํ๊ฒ ์ต๋๋ค. ์ ๋ง ๊ฐ์ฌํฉ๋๋ค.
- Likes
- 0
- Comments
- 1
- Viewcount
- 60
Q&A
useReducer์ ์ปค์คํ ํ
์๋ ํ์ธ์ TAESUN๋. ์ง๋ฌธํด์ฃผ์ ๋ด์ฉ์ ๋ณด๋ ๋ฆฌ์กํธ์ ์ํ ๊ด๋ฆฌ์ ์ํคํ ์ฒ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ธฐ๋ฐ์ด ๋๋ ์๋ฆฌ๊น์ง ๊น์ด ์๊ฒ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด ์ ์ํด์ฃผ์ ์๊ฒฌ์ด ์ ํํ ๋ง์ต๋๋ค. ํ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ํ๊ฒฝ์์ useReducer๊ฐ ์ ๊ณตํ๋ ์ฅ์ ์ค ์๋น ๋ถ๋ถ์ ์ปค์คํ ํ ์ผ๋ก ์ถฉ๋ถํ ๋์ฒด๊ฐ ๊ฐ๋ฅํ๋ฉฐ ๋๋ก๋ ๋ ์ง๊ด์ ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฆฌ์กํธ 18๋ถํฐ ๋์ ๋ ์๋ ๋ฐฐ์นญ(Automatic Batching) ๊ธฐ๋ฅ ๋๋ถ์ ์ฌ๋ฌ ๊ฐ์ setState๋ฅผ ์ฐ๋ฌ์ ํธ์ถํด๋ ์ฑ๋ฅ์์ ๋ถ์ด์ต์ด๋ ๋ถํ์ํ ๋ ๋๋ง ํญํฌ ํ์์ด ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ค๋ฌด์์ useReducer๊ฐ ๊ฐ๋ ๊ณ ์ ํ ์ ์ง๋ฅผ ์ดํดํ๋ ค๋ฉด ๋จผ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์, ์ฆ '์ด๋ป๊ฒ(How)'์ '๋ฌด์์(What)'์ ์ฐจ์ด์ธ ๋ช ๋ น์ ์ ๊ทผ๊ณผ ์ ์ธ์ ์ ๊ทผ์ ์ฐจ์ด๋ฅผ ๋จ๊ณ์ ์ผ๋ก ์ดํด๋ด์ผ ํฉ๋๋ค. ์ปค์คํ ํ ๋ด๋ถ์ ์ฌ๋ฌ setState๋ฅผ ๋ฌถ์ด๋๋ ๋ฐฉ์์ ์ฒ ์ ํ ๋ช ๋ น์ ์ธ ์ ๊ทผ์ ๊ฐ๊น์ต๋๋ค.// ์ปค์คํ ํ ์ ํ์ฉํ ๋ช ๋ น์ ์ ๊ทผ์ ์์ const useDataFetch = () => { const [isLoading, setIsLoading] = useState(false); const [data, setData] = useState(null); const [error, setError] = useState(null); const handleSuccess = (fetchedData) => { setIsLoading(false); // 1. ๋ก๋ฉ ์ํ๋ฅผ false๋ก ๋ณ๊ฒฝํด๋ผ setData(fetchedData); // 2. ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํด๋ผ setError(null); // 3. ์๋ฌ๋ฅผ ์ด๊ธฐํํด๋ผ }; return { isLoading, data, error, handleSuccess }; } ์์ ์ฝ๋์ฒ๋ผ setLoading(true), setData(data), setError(null)๊ณผ ๊ฐ์ด ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊พธ์ด์ผ ํ๋์ง ์ปดํฌ๋ํธ๋จ์์ ๊ตฌ์ฒด์ ์ธ ์ง์๋ฅผ ๋ด๋ฆฌ๋ ๋ฐฉ์์ด ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ํจํด์ ๋๋ค. ๋ฐ๋ฉด useReducer๋ ์ฒ ์ ํ ์ ์ธ์ ์ธ ์ ๊ทผ์ ์งํฅํฉ๋๋ค.// useReducer๋ฅผ ํ์ฉํ ์ ์ธ์ ์ ๊ทผ์ ์์ const [state, dispatch] = useReducer(reducer, initialState); // ์ปดํฌ๋ํธ๋ ๋จ์ง '๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง'๋ง ์๋ฆฝ๋๋ค. dispatch({ type: 'FETCH_SUCCESS', payload: fetchedData }); ๋ฐ์ดํฐ ๋ก๋ฉ ์ฑ๊ณต์ด๋ผ๋ ์ฌ๊ฑด์ด ๋ฐ์ํ๋ค๋ ์๋ฏธ๋ก ์์ ๊ฐ์ด ๋์คํจ์น๋ฅผ ํธ์ถํ๋ฉด, ์ํ๊ฐ ์ด๋ป๊ฒ ๋ณํ ์ง๋ ์ปดํฌ๋ํธ ์ธ๋ถ์ ๋ฆฌ๋์๊ฐ ๊ฒฐ์ ํ๊ฒ ๋ฉ๋๋ค. ์ค๋ฌด์์ ๋น์ฆ๋์ค ๋ก์ง์ด ๊ณ ๋๋ก ๋ณต์กํด์ง๋ฉด ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ ์ด๋ค ์ผ์ด ์ผ์ด๋ฌ๋์ง๋ผ๋ ์ก์ ๋ง ์ ๊ฒฝ ์ฐ๊ณ , ์ค์ ์ํ์ ๋ณํ์ ๋ฆฌ๋์๋ผ๋ ์์ ํจ์์ ์จ์ ํ ์์ํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ํจ์ฌ ์ ๋ฆฌํ ์ ์์ต๋๋ค.์ด์ ๋๋ถ์ด ์ฐธ์กฐ ๋๋ฑ์ฑ๊ณผ ์ฑ๋ฅ ์ต์ ํ ๊ด์ ์์๋ ์ค์ํ ์ฐจ์ด๊ฐ ์กด์ฌํฉ๋๋ค. ์ปค์คํ ํ ์์์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ฌ๋ฌ ํจ์๋ฅผ ๋ง๋ค์ด ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ ๋๋ ๋ ๋๋ง๋ ๋๋ง๋ค ํจ์๊ฐ ์ฌ์์ฑ๋๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๋ง์ useCallback๊ณผ ์์กด์ฑ ๋ฐฐ์ด ๊ด๋ฆฌ๊ฐ ํ์ํด์ง๋๋ค. ๋ฐ๋ฉด useReducer๊ฐ ๋ฐํํ๋ dispatch ํจ์๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ ์ ๋ ๋ณํ์ง ์์์ ๋ฆฌ์กํธ ์์ฒด์ ์ผ๋ก ๋ณด์ฅ๋ฐ์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ dispatch๋ฅผ Context API์ ๋ด์ ๊น์ ํ์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋๋ผ๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด๋ ์์กด์ฑ ๋ฐฐ์ด์ ์ง์ฅ์ ๋น ์ง์ง ์๊ณ ๋งค์ฐ ์์ ์ ์ธ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.ํ์ ํ๋ก์ ํธ์์ useReducer๋ฅผ ๋ง์ด ๋ณด์ง ๋ชปํ์ ๊ฒ์ ํ์ฌ ํ๋ก ํธ์๋ ์ํ๊ณ์ ํ์ค์ ๊ทธ๋๋ก ๋ฐ์ํ๊ณ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์๋ ์ค๋ฌด๋ฅผ ๊ดํตํ๋ ๋ช ํํ๊ณ ํ์ค์ ์ธ ์ด์ ๋ค์ด ์์ต๋๋ค. ํ์ ์์๋ ๋ก์ปฌ ์ํ๊ฐ useReducer๋ฅผ ๋์ ํด์ผ ํ ๋งํผ ๋ณต์กํด์ง๊ธฐ ์ ์ ์ด๋ฏธ ์ด๋ฅผ ํจ์ฌ ๋ ์ ๋ค๋ฃจ๋ ์ ๋ฌธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์๊ฒ ์ญํ ์ ์์ํ๋ ๊ฒ์ด ์๋์ ์ผ๋ก ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.์ด๋ฅผ ๊ตฌ์ฒด์ ์ธ ์ค๋ฌด ํ๊ณผ ํจ๊ป ์์ธํ ๋๋์ด ์ดํด๋ณด์๋ฉด, ์ฒซ์งธ๋ก ์๋ฒ ์ํ(Server State) ๊ด๋ฆฌ ํจ๋ฌ๋ค์์ ์๋ฒฝํ ์ ํ์ ๋๋ค. ๊ณผ๊ฑฐ์๋ API ํต์ ์ ๋ฐ์ํ๋ ๋ก๋ฉ, ๋ฐ์ดํฐ, ์๋ฌ ์ํ๋ฅผ FETCH_START, FETCH_SUCCESS, FETCH_ERROR ๋ฑ์ ์ก์ ์ผ๋ก ๋๋์ด useReducer๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ ์์ด์์ต๋๋ค. ํ์ง๋ง ์ค์ ์๋น์ค์์๋ ๋จ์ํ ์ํ ์ ์ฅ์ ๋์ด ์บ์ฑ, ํฌ์ปค์ค ์ ์๋ ์ฌ์์ฒญ, ๋๊ด์ ์ ๋ฐ์ดํธ(Optimistic Update), ์๋ฌ ์ฌ์๋(Retry) ๊ฐ์ ๋งค์ฐ ๊ณ ๋ํ๋ ๊ธฐ๋ฅ์ด ํ์์ ์ ๋๋ค. ์ด ์์ฒญ๋ ์์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ฅผ useReducer๋ก ์ง์ ๊ตฌํํ๋ ๊ฒ์ ์ค๋ฌด ๊ด์ ์์ ๋ช ๋ฐฑํ ์ธ๋ ฅ ๋ญ๋น์ด๋ฉฐ, ํ์ฌ๋ TanStack Query(React Query)๋ SWR ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋จ ํ๋ ์ค์ ์ฝ๋๋ก ์ด ๋ชจ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ๋์ฒดํ๊ณ ์๋น์ค์ ์์ ์ฑ์ ํฌ๊ฒ ๋์ฌ์ค๋๋ค.๋์งธ๋ ์ ์ญ ์ํ(Global State) ๊ด๋ฆฌ ๋๊ตฌ๋ค์ ๊ฒฝ๋ํ์ ์ต์ ํ์ ๋๋ค. useReducer๋ฅผ Context API์ ๊ฒฐํฉํ๋ฉด ํ๋ฅญํ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ์ค๋ฌด์์๋ ์ํ๊ฐ ์กฐ๊ธ๋ง ๋ณํด๋ Context๋ฅผ ๊ตฌ๋ ํ๋ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ์ฑ๋ฅ ์ด์์ ์ง๋ฉดํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ๋ง๊ธฐ ์ํด ์ํ์ฉ Context์ ๋์คํจ์น์ฉ Context๋ฅผ ์ชผ๊ฐ๊ณ React.memo๋ฅผ ๊ณณ๊ณณ์ ์์์ผ ํ๋ ์๊ณ ๋ก์์ด ๋ฐ๋ฆ ๋๋ค. ๋ฐ๋ฉด ํ๋ ์ค๋ฌด์ ํ์ค์ผ๋ก ์๋ฆฌ ์ก์ Zustand๋ Jotai, Redux Toolkit ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๊ฑฐ์ ์์ผ๋ฉด์๋ ๋ฆฌ์กํธ์ ๋ ๋๋ง ์ฌ์ดํด ์ธ๋ถ์์ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ์ด๋ฐ ์ฑ๋ฅ ์ต์ ํ ๊ณ ๋ฏผ์ ์์ฒ์ ์ผ๋ก ํด๊ฒฐํด ์ค๋๋ค. ๊ทธ๋์ ์ํ๊ฐ ์กฐ๊ธ์ด๋ผ๋ ๋ณต์กํด์ง ๊ธฐ๋ฏธ๊ฐ ๋ณด์ด๋ฉด useReducer๋ฅผ ์ฐ๊ธฐ๋ณด๋ค ๊ณง๋ฐ๋ก Zustand ๊ฐ์ ์ ์ญ ์คํ ์ด๋ก ๋ก์ง์ ์ฌ๋ ค๋ฒ๋ฆฌ๋ ํ์ด ๋๋ค์์ ๋๋ค.์ ์งธ๋ ํผ(Form) ์ํ ๊ด๋ฆฌ์ ์์์ ๋๋ค. ํ์๊ฐ์ ์ด๋ ์ํ ๋ฑ๋ก ๊ฐ์ ๋ณต์กํ ์ ๋ ฅ ํผ์ ์ ๋ ฅ๊ฐ, ์๋ฌ ์ํ, ํฐ์น ์ฌ๋ถ, ์ ํจ์ฑ ๊ฒ์ฌ ๋ฑ ๊ด๋ฆฌํด์ผ ํ ์ํ๊ฐ ๋ฐฉ๋ํ์ฌ ๊ณผ๊ฑฐ useReducer์ ๋จ๊ณจ ์์ฌ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋งค ํ์ดํ๋ง๋ค ๋ฌด๊ฑฐ์ด ๋ฆฌ๋์ ๋ก์ง์ด ์คํ๋๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ์น๋ช ์ ์ผ ์ ์์ต๋๋ค. ํ์ฌ๋ React Hook Form ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋น์ ์ด(Uncontrolled) ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋ง์ ์ต์ํํ๋ฉฐ ์ด ์ญํ ์ ํจ์ฌ ์ฐ์ํ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ์ ๊ฒฝํ์ผ๋ก ์์ฝ๊ฒ ํด๊ฒฐํด ์ฃผ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ตญ ์ค๋ฌด์์ useReducer์ ํฌ์ง์ ์, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ๊ธฐ์๋ ๊ณผํ๊ณ useState๋ง ์ฐ๊ธฐ์๋ ์ํ ๊ฐ์ ๊ผฌ์์ด ์ฌ๊ฐํ๊ฒ ์ฐ๋ ค๋๋ ์์ฃผ ์ข๊ณ ํน์ํ ๋ก์ปฌ ์ปดํฌ๋ํธ ์์ญ์ผ๋ก ์ถ์๋ ๊ฒ์ด ์์ฐ์ค๋ฌ์ด ํ์ค์ ๋๋ค.์ด๋ฌํ ์ํฉ์์๋ ํ์ ์์ useReducer๋ฅผ ์ ๋ต์ ์ผ๋ก ์ ํํ๋ ๊ตฌ์ฒด์ ์ธ ์์ธ ์ผ์ด์ค๋ค์ด ๋ถ๋ช ์กด์ฌํฉ๋๋ค. ๋จผ์ ์ํ ๊ฐ์ ์์กด์ฑ์ด ๊ทน๋๋ก ๋์ ๊ฒฝ์ฐ๋ฅผ ๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด A ์ํ๊ฐ ๋ฐ๋ ๋ ๋ฐ๋์ B์ C ์ํ๋ ์ด์ ์ํ๊ฐ์ ์ฐธ์กฐํ์ฌ ์ ๊ตํ๊ฒ ๋๊ธฐํ๋์ด ๋ฐ๋์ด์ผ ํ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ทธ๋ฆฌ๋๋ ๋๋๊ทธ ์ค ๋๋กญ ์์ง, ํน์ ๋ ธ์ ๊ฐ์ ๋ฆฌ์น ํ ์คํธ ์๋ํฐ์ ๋ก์ปฌ UI ๋ก์ง์ ์ค๊ณํ ๋ ๊ทธ ์ง๊ฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์์ผ๋ก ์ํ ๋จธ์ ํจํด์ ๊ตฌํํ ๋์ ๋๋ค.// ์ํ ๋จธ์ ํจํด์ ํ์ฉํ ๊ฒฌ๊ณ ํ ๋ก์ง ์์ function dragReducer(state, action) { switch (state.status) { case 'IDLE': if (action.type === 'START') return { status: 'DRAGGING', position: action.payload }; break; case 'DRAGGING': if (action.type === 'MOVE') return { ...state, position: action.payload }; if (action.type === 'DROP') return { status: 'DROPPED', position: action.payload }; break; case 'DROPPED': if (action.type === 'RESET') return { status: 'IDLE', position: { x: 0, y: 0 } }; break; } return state; // ํ์ฌ ์ํ์์ ํ์ฉ๋์ง ์์ ์ก์ ์ ๋ฌด์๋์ด ๋ฒ๊ทธ๋ฅผ ์์ฒ ์ฐจ๋จํจ } ์ด ์ฝ๋์ฒ๋ผ UI๊ฐ ๊ฐ์ง ์ ์๋ ์ํ๊ฐ IDLE, DRAGGING, DROPPED์ ๊ฐ์ด ๋ช ํํ ์ ํด์ ธ ์๊ณ , ํน์ ์ํ์์๋ง ํน์ ์ก์ ์ด ํ์ฉ๋์ด์ผ ํ๋ ๊ฒฌ๊ณ ํ ๋ก์ง์ ์งค ๋๋ switch ๋ฌธ์ ํ์ฉํ๋ ๋ฆฌ๋์๊ฐ ๊ฐ์ฅ ์์ ํ ์ ํ์ง๊ฐ ๋ฉ๋๋ค. ๋ฌผ๋ก ์ด์กฐ์ฐจ๋ ๋ก์ง์ด ๊ฑฐ๋ํด์ง๋ฉด XState ๊ฐ์ ์ ๋ฌธ ์ํ ๋จธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋์ฒด๋๊ณค ํฉ๋๋ค.์ค๋ฌด์์ ์ง์ ์ ์ธ ์ฌ์ฉ ๋น๋๊ฐ ์ด๋ ๊ฒ ์ค์ด๋ค์์์๋ ๋ถ๊ตฌํ๊ณ ์ฐ๋ฆฌ๊ฐ useReducer๋ฅผ ๋ฐ๋์ ๊น์ด ์๊ฒ ํ์ตํ๊ณ ์ดํดํด์ผ ํ๋ ๋ช ํํ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ํฐ ์ด์ ๋ useReducer๊ฐ ํ๋ ํ๋ก ํธ์๋ ์ํ ๊ด๋ฆฌ์ ๊ทผ๊ฐ์ด ๋๋ '๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(Unidirectional Data Flow)'๊ณผ 'ํ๋ญ์ค(Flux) ์ํคํ ์ฒ'์ ํต์ฌ์ ๋ฆฌ์กํธ ๋ด์ฅ ํ ์ผ๋ก ์๋ฒฝํ๊ฒ ๊ตฌํํด ๋ ํ๋ฅญํ ๊ต๋ณด์ฌ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ ๋ง์๋๋ฆฐ Zustand๋ Redux ๊ฐ์ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ด๋ถ์ ์ผ๋ก ํํ๋ง ์กฐ๊ธ ๋ค๋ฅผ ๋ฟ, ๊ฒฐ๊ตญ '์ก์ (Action)'์ ๋ฐ์์ํค๊ณ ์ด๋ฅผ ์ค์์์ ๋ฐ์ '์์ ํจ์(Reducer)'๋ฅผ ํตํด ์์ธก ๊ฐ๋ฅํ ์๋ก์ด ์ํ๋ฅผ ๋ฐํํ๋ค๋ useReducer์ ์ฒ ํ๊ณผ ํจํด์ ๊ทธ๋๋ก ๊ณ์นํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ useReducer์ ๋์ ์๋ฆฌ๋ฅผ ๋ช ํํ ์ดํดํ๊ณ ์๋ค๋ ๊ฒ์ ๋จ์ํ ํ ํ๋๋ฅผ ๋ ์๋ ๊ฒ์ ๋์ด, ์ํ๊ฐ ์ด๋ป๊ฒ ์์ธก ๊ฐ๋ฅํ๊ฒ ์ ์ด๋์ด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ UI ์ปดํฌ๋ํธ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ด๋ป๊ฒ ์๋ฒฝํ ๋ถ๋ฆฌํ ์ ์๋์ง์ ๋ํ ๊น์ ์ํคํ ์ฒ์ ํต์ฐฐ๋ ฅ์ ๊ฐ์ถ๊ฒ ๋จ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํฅํ ๊ฑฐ๋ํ ํ๋ก์ ํธ์ ์ํ ๊ด๋ฆฌ ์์คํ ์ ์ง์ ์ค๊ณํ๊ฑฐ๋ ๋ณต์กํ ์คํ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋ฉ๋๋ค.์ฌ๊ธฐ์ ํ๋ก์ ํธ ์ค๊ณ๋ฅผ ์ํ ๋ ๋ค๋ฅธ ํ์ค์ ์ธ ํ์ ๋ง๋ถ์ด์๋ฉด, ํ๋ก์ ํธ ์ด๊ธฐ ์ค๊ณ ๋จ๊ณ๋ถํฐ ์ด ๋ก์ง์ ๋ณต์กํ๋๊น ๋ฌด์กฐ๊ฑด useReducer๋ฅผ ์จ์ผ์ง๋ผ๊ณ ๊ฒฐ์ ํ๊ธฐ๋ณด๋ค๋, ์ผ๋จ ๊ฐ์ฅ ์ต์ํ useState์ ์ปค์คํ ํ ์ ์กฐํฉ์ผ๋ก ์๋๊ฐ ์๊ฒ ๊ฐ๋ฐ์ ์์ํ์๋ ๊ฒ์ ์ ๊ทน ๊ถ์ฅํฉ๋๋ค. ์ฝ๋๋ฅผ ์์ฑํด ๋๊ฐ๋ค ์ํ ์ ๋ฐ์ดํธ ํจ์ ๋ด๋ถ์ if๋ฌธ์ด ๋๋ฌด ๋ง์์ง๊ณ ์ฌ๋ฌ ์ํ๊ฐ๋ค์ด ์๋ก ์ฝํ์ ์ฌ์ํ ์์ ์๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์๊ณ์ ์ด ์ค๋ฉด, ๊ทธ๋ ํด๋น ์ปดํฌ๋ํธ์ ๋น์ฆ๋์ค ๋ก์ง๋ง ์ถ์ถํ์ฌ useReducer๋ก ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ์์ ๋ง์๋๋ฆฐ Zustand ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์น๊ฒฉ์ํค๋ ๊ฒ์ด ์ค๋ฌด์์ ๊ฒช์ ์ ์๋ ๊ฐ์ฅ ์ ์ฐํ๊ณ ์ด์์ ์ธ ํ๋ฆ์ ๋๋ค.๊ฒฐ๋ก ์ ์ผ๋ก ๋๋ถ๋ถ์ ์ผ์์ ์ธ ๊ฐ๋ฐ์์๋ ์๊ฐํ์ ๋๋ก ์ปค์คํ ํ ๊ณผ useState์ ์กฐํฉ์ผ๋ก ์ถฉ๋ถํ๋ฉฐ ์ค์ง์ ์ผ๋ก๋ ์ทจํฅ ์ฐจ์ด์ ์์ญ์ด ๋ง์ผ๋ฏ๋ก ์ต์ง๋ก useReducer๋ฅผ ๋์ ํ ํ์๋ ์์ต๋๋ค. ๋ค๋ง ์์ ์ค๋ช ํด ๋๋ฆฐ ๋๋ก ์ํ ๋ณ๊ฒฝ ๋ก์ง์ UI์ ์๋ฒฝํ ๊ฒฉ๋ฆฌํ๊ณ ์ก์ ๊ณผ ์ํ ์ ์ด๋ฅผ ๋ถ๋ฆฌํ๋ค๋ ์ด ๊ทผ๋ณธ์ ์ธ ์ค๊ณ ์ฒ ํ์ ๊น์ด ์ดํดํ๊ณ ์ฒดํํ์ ๋ค๋ฉด, ์์ผ๋ก ์ด๋ค ์ํ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ๋ง์ฃผํ๋๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฌด๋ถ๋ณํ๊ฒ ๋น๋ํด์ง๋ ๊ฒ์ ๋ง๋ ํํํ ๋ฐ๊ฑฐ๋ฆ์ด ๋ ๊ฒ์ ๋๋ค. ๊ฐ์๋ฅผ ๋ค์ผ์๋ฉด์ ๋ ๊ถ๊ธํ ์ ์ด๋ ํ์ ์ ์๊ฐ์ด ํ์ํ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง๋ฌธ์ ๋จ๊ฒจ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.๊ฐ์ฌํฉ๋๋ค!
- Likes
- 0
- Comments
- 1
- Viewcount
- 45
Q&A
๋ฏธ์ 14์์ StockButton์ memo๋ ์ด๋ค ์ญํ ์ธ๊ฐ์
์๋ ํ์ธ์ ์ดํ๊ด๋. ์ง๋ฌธํด์ฃผ์ ์ ๋ต ์ฝ๋์ ์๋ต๋ ์ปดํฌ๋ํธ์ ์์น์ ๋ณดํธ ํจ์์ ์ญํ ์ ๋ํด ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ๋ก์ง์ ํ๋ฆ์ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.์ ๋ต ์ฝ๋์์ ์๋ต๋ ProductList ์ปดํฌ๋ํธ๋ ์ํ ์ฑ๋์ธ ProductStateContext๋ฅผ ๊ตฌ๋ ํ์ฌ ์ํ ๋ชฉ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ํ ํญ๋ชฉ์ ๋ ๋๋งํ ๋ StockButton์ ์์ ์ปดํฌ๋ํธ๋ก ํฌํจํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.import React, { useContext } from 'react'; import { ProductStateContext } from '../contexts/ProductContext'; import { StockButton } from './StockButton'; export default function ProductList() { const items = useContext(ProductStateContext); return ( {items.map((item) => ( {item.name} - {item.isSoldOut ? 'ํ์ ' : 'ํ๋งค์ค'} ))} ); } ์ด ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด StockButton์ ๊ฐ๋ณ ์ํ์ ์๋ณํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ProductList ๋ด๋ถ์์ map ํจ์๋ฅผ ํตํด ๋ฐ๋ณต ๋ ๋๋ง๋๋ ๊ฐ ์ํ ํญ๋ชฉ๊ณผ ๋์ผํ ๋ ๋ฒจ์ ์์นํ๋ ๊ฒ์ด ๋ก์ง์ ๊ฐ์ฅ ์ ์ ํฉ๋๋ค.์ด๋ ๊ฒ ๋ฒํผ์ด ๋ฐฐ์น๋ ์ํ์์ StockButton์ ๊ฐ์ธ๊ณ ์๋ React.memo๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ํจ์์ ์ฃผ๋ ์ญํ ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋, ์์ ์ปดํฌ๋ํธ๊ฐ ์ ๋ฌ๋ฐ๋ ์์ฑ์ธ props, ์ฆ ์ฌ๊ธฐ์๋ id ๊ฐ์ด ๋ณํ์ง ์์๋ค๋ฉด ํด๋น ์์ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ๋ง์์ฃผ๋ ๊ฒ์ ๋๋ค. ํ์ฌ ๊ตฌ์กฐ์์๋ ํน์ ์ํ์ ํ์ ์ฌ๋ถ์ ๊ฐ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด items ๋ฐฐ์ด ์ ์ฒด๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ด๋ฅผ ์ง์ ๊ตฌ๋ ํ๊ณ ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ ProductList์ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. React์ ๊ธฐ๋ณธ ๋์ ์๋ฆฌ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ฉด ๊ทธ ๋ด๋ถ์ ์๋ ์์ ์ปดํฌ๋ํธ๋ค๋ ํจ๊ป ๋ค์ ๊ทธ๋ ค์ง๋๋ค.ํ์ง๋ง ์ฌ๊ธฐ์ ๋งค์ฐ ์ค์ํ ์ค๋ฌด์ ํจ์ ์ด์ ์ํคํ ์ฒ ๊ฐ์ ํฌ์ธํธ๋ฅผ ์ง๊ณ ๋์ด๊ฐ์ผ ํฉ๋๋ค. ํ์ฌ ๊ตฌ์กฐ์ฒ๋ผ ProductList ๋ด๋ถ์์ items.map์ ๋๋ ค ๊ฐ๋ณ ์์์ StockButton์ ์ง์ ๋ฐฐ์นํ ๊ฒฝ์ฐ, ProductList๊ฐ ๋ค์ ์คํ๋ ๋ map ํจ์๋ ์ฌ์คํ๋ฉ๋๋ค. ์ด๋ StockButton์ React.memo๋ก ๊ฐ์ธ์ ธ ์์ด ๋ฒํผ ์์ฒด์ ์ฐ์ฐ์ ๋ฐฉ์ดํ ์ ์๊ฒ ์ง๋ง, ๊ทธ ๋ฐ๊นฅ์ ํ๊ทธ์ ํ ์คํธ(์ํ๋ช , ํ์ ์ฌ๋ถ)๋ค์ ๋ ๋๋ง๋ ๋๋ง๋ค ๋ถํ์ํ๊ฒ ๋ค์ ์์ฑ๋ฉ๋๋ค.๋ฐ๋ผ์ ์ค๋ฌด์์ ์ด๋ฅผ ์๋ฒฝํ๊ฒ ์ต์ ํํ๋ ค๋ฉด map ๋ด๋ถ์ ์์ ์ ์ฒด๋ฅผ ์ด๋ผ๋ ๋ณ๋์ ๋จ์ผ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๊ณ , ์ด ์ปดํฌ๋ํธ ์์ฒด๋ฅผ React.memo๋ก ๊ฐ์ธ๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ๋ก๋ถํฐ ์ ํ๋๋ ๊ฐ์ ์ ์ธ ๋ฆฌ๋ ๋๋ง ํญํฌ๋ฅผ ์๋ฒฝํ ์ฐจ๋จํ๋ ๊ฒฌ๊ณ ํ ์ต์ ํ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.import React, { useContext, memo } from 'react'; import { ProductStateContext } from '../contexts/ProductContext'; import { StockButton } from './StockButton'; // 1. ๊ฐ๋ณ ์ํ ํญ๋ชฉ์ ๋ ๋ฆฝ๋ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๊ณ React.memo๋ก ๊ฐ์ธ๊ธฐ const ProductItem = memo(({ item }) => { return ( {item.name} - {item.isSoldOut ? 'ํ์ ' : 'ํ๋งค์ค'} ); }); // 2. ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ ProductList๋ items ๋ฐฐ์ด์ด ๋ฐ๋์ด ๋ฆฌ๋ ๋๋ง ๋๋๋ผ๋, // ๋ด์ฉ์ด ๋ฐ๋์ง ์์ ๋ค๋ฅธ ProductItem๋ค์ ๋ ๋๋ง์ ๊ฑด๋๋ฐ๊ฒ ๋ฉ๋๋ค. export default function ProductList() { const items = useContext(ProductStateContext); return ( {items.map((item) => ( ))} ); } ์ฌ๊ธฐ์ ๋ํด ์ค๋ฌด ์ ์ฉ๊ณผ ๊น์ด ์๋ ์ดํด๋ฅผ ์ํ ๋ด์ฉ๋ ํจ๊ป ์ง์ด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ์ค๋ฌด ํ์ผ๋ก ๋ฌด๋ถ๋ณํ React.memo ์ฌ์ฉ์ ์ฃผ์ํด์ผ ํ๋ค๋ ์ ์ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ์ด ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์ด์ ์์ฑ๊ณผ ์๋ก์ด ์์ฑ์ด ๊ฐ์์ง ์์ ๋น๊ต๋ฅผ ์ํํ๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ ๋ ๋๋ง ์์ฒด๊ฐ ์์ฃผ ๊ฐ๋ฒผ์ด ๋จ์ํ UI ์ปดํฌ๋ํธ๋ผ๋ฉด ์ด ๋น๊ต ์ฐ์ฐ์ ๋๋ ๋ฆฌ์์ค๊ฐ ๋ ๋๋ง ๋น์ฉ๋ณด๋ค ์คํ๋ ค ๋ ํด ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ด ํฌํจ๋ ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ๋น๋๊ฐ ๋งค์ฐ ๋์ ๋ฆฌ์คํธ์ ํ์ ํญ๋ชฉ์ ์ ํ์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ์ค๋ฌด ๋ฐฉ์์ด๋ฉฐ, ์์ ๋ง์๋๋ฆฐ ๋ถ๋ฆฌ ๊ตฌ์กฐ ๊ฐ์ ์ผ์ด์ค๊ฐ ๋ฐ๋ก ๊ทธ ์ ์ ํ ์์์ ๋๋ค.๋ํ Context์ React.memo๊ฐ ๋ง๋๋ ์๋์ง ์ธก๋ฉด์์๋ ์ ๊ทผํด ๋ณผ ์ ์์ต๋๋ค. ์ค๋ฌด์์๋ ์ ์ญ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ํ๋ ๊ด๋ฒ์ํ ๋ ๋๋ง ํญํฌ๋ฅผ ์ ์ดํ๋ ๊ฒ์ด ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ์ผ๋ก ๊ผฝํ๋๋ค. ์ํ์ ๋ช ๋ น ์ฑ๋์ ๋ถ๋ฆฌํ๊ณ , ๋ช ๋ น์ด๋ ๊ณ ์ ๋ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํ๋ ํ์ ์ปดํฌ๋ํธ(ํน์ ๋ฆฌ์คํธ ์์ดํ )๋ฅผ React.memo๋ก ํ ๋ฒ ๋ ๋ณดํธํ๋ ํจํด์ ๋๊ท๋ชจ React ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ ์ ํ์์ ์ผ๋ก ํ์ฉ๋๋ ๊ฒฌ๊ณ ํ ์ํคํ ์ฒ์ ๋๋ค.๋ ๊น์ ํ์ต์ ๋์์ด ๋ ๋งํ ๋ด์ฉ์ผ๋ก ์ฐธ์กฐ ๋๋ฑ์ฑ์ ํจ์ ์ ๋ํด์๋ ์๊ฐํด ๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์์ฑ์ ๋น๊ตํ ๋ ์ซ์๋ ๋ฌธ์์ด ๊ฐ์ ์์ ํ์ ์ ๊ฐ์ด ๊ฐ์ผ๋ฉด ๋์ผํ๋ค๊ณ ํ๋จํ์ง๋ง, ๊ฐ์ฒด๋ ํจ์ ๊ฐ์ ์ฐธ์กฐ ํ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ค๋ฅด๋ฉด ๊ฐ์ด ๋ณํ๋ค๊ณ ํ๋จํ๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ ํ์ ์ปดํฌ๋ํธ์ id๋ผ๋ ์์ ํ์ ๋์ ๋ถ๋ชจ์์ ์์ฑํ ํจ์๋ฅผ ์ง์ ์์ฑ์ผ๋ก ๋๊ฒจ์ฃผ์๋ค๋ฉด ๋ถ๋ชจ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ํจ์๊ฐ ์๋ก ์์ฑ๋์ด ๋ฐฉ์ด๋ง์ด ๋ซ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ํ์์ ๋ง๊ธฐ ์ํด ์ง๊ฟ์ฒ๋ผ ์ฐ์ด๋ ํ ์ด ๋ฐ๋ก useCallback์ ๋๋ค.import React, { useCallback, memo } from 'react'; const StockButton = memo(({ id, onClick }) => { return onClick(id)}>์ฌ๊ณ ๋ณ๊ฒฝ; }); export default function ParentComponent() { // ๋ถ๋ชจ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋๋ผ๋ ํจ์ ์ฐธ์กฐ(๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๋ฅผ ๋์ผํ๊ฒ ์ ์งํ์ฌ // ํ์ ์ปดํฌ๋ํธ์ React.memo ๋ฐฉ์ด๋ง์ด ๋ซ๋ฆฌ์ง ์๋๋ก ๋ณดํธํฉ๋๋ค. const handleStockChange = useCallback((id) => { console.log(`${id}๋ฒ ์ํ ์ฌ๊ณ ๋ณ๊ฒฝ ๋ก์ง`); }, []); // ์์กด์ฑ ๋ฐฐ์ด์ด ๋น์ด์์ด ์ต์ด ํ ๋ฒ๋ง ํจ์ ์์ฑ return ( ); } ๋ง์ง๋ง์ผ๋ก ๋ ๋๋ง ๊ฑด๋๋ฐ๊ธฐ ํ์์ ๋ํ ๊ฐ๋ ๋ ์ค์ํฉ๋๋ค. React ๊ณต์ ๋ฌธ์ ๋ฐ ๋์ ์๋ฆฌ์์๋ ์กฐ๊ฑด ์ถฉ์กฑ์ด๋ ๋์ผํ ์ํ ์ ๋ฐ์ดํธ๋ก ์ธํด ๋ ๋๋ง ์์ ์ด ์ทจ์๋๊ณ ๊ฑด๋๋ฐ์ด์ง๋ ํ์์ 'Bailout'์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ด ํค์๋๋ก React์ ๋ ๋๋ง ์ต์ ํ ๋ก์ง์ ์ถ๊ฐ ํ์ตํ์๋ฉด ํ๋ ์์ํฌ์ ๋ด๋ถ ๋์์ ์๋ฒฝํ ์ดํดํ๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ํ์ต์ ์ ์ฉํ ์ฐธ๊ณ ๊ฐ ๋์๊ธธ ๋ฐ๋๋๋ค.
- Likes
- 0
- Comments
- 2
- Viewcount
- 33
Q&A
์ค์ต ๊ฐ์ด๋: 16๊ฐ ์์ useMemo์ ์ญํ ์ ๋ฌด์์ธ๊ฐ์?
์๋ ํ์ธ์ ์ดํ๊ด๋. ๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ ๋ณด๋ฉด, ๊ฐ์์์ ๋ค๋ฃฌ '์ํ์ ์ํ ๋ณ๊ฒฝ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ๋ฅผ ํตํ ๋ฆฌ๋ ๋๋ง ์ต์ ํ'๋ผ๋ ๋ชฉ์ ์ ์ ํํ๊ฒ ํ์ ํ์ จ์ต๋๋ค.์ ๊ฐ ์ ๊ณตํด๋๋ฆฐ ์ค์ต ์ฝ๋์์ useMemo๊ฐ ์ ํํ ์ด๋ค ์ญํ ์ ํ๋๋ก ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์๋ ์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋ผ๋ณด๊ณ ์ ์ฉํ๋์ง ์ฝ๋๋ฅผ ํตํด ๋จ๊ณ๋ณ๋ก ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.์ ๊ฐ ์ค์ต ๊ฐ์ด๋ ์์์ useMemo๋ฅผ ํตํด ์๋ํ ์ญํ ์ ์ฐธ์กฐ ์ ์ง๋ฅผ ํตํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ด์ ๋๋ค. React์ ๋ ๋๋ง ์์ง์ Context Provider์ ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ ์์ฑ์ ์ฐธ์กฐ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค, ํด๋น Context๋ฅผ ๊ตฌ๋ ํ๋ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ๋ก ๋ฆฌ๋ ๋๋งํ๋ ํน์ฑ์ด ์์ต๋๋ค.// ์ค์ต ์ฝ๋์์์ useMemo ์ฌ์ฉ // ์ํ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ ค๋ '์๋' const memoizedState = useMemo(() => state, [state]); return ( {/* ... */} ); ๋ฐ๋ผ์ ์ ๊ฐ ์ค์ต ์ฝ๋์์ useMemo๋ฅผ ์ฌ์ฉํ ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์, ์ํ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ด ์ค์ ๋ก ๋ณํ์ง ์์๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ค์ ํธ์ถ๋๋๋ผ๋ ์ด์ ๊ณผ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋๋ก ๊ฐ์ ํ๋ ๋ฐ ์์ต๋๋ค. ํ์ ์ปดํฌ๋ํธ๋ค์ด ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์ดํ๋ ์ญํ ์ ํ๋๋ก ์๋ํ ๊ฒ์ ๋๋ค.ํ์ง๋ง ์ฐธ์กฐ ๋๋ฑ์ฑ์ ์ ์งํด์ผ ํ๋ค๋ ๊ฐ๋ ์ ๊ต์กํ๊ธฐ ์ํด ๋ช ์์ ์ผ๋ก ์์ฑํด๋ ์ด useMemo ์ฝ๋๋, React์ ๋ด๋ถ ๋์ ์๋ฆฌ๋ฅผ ๊ณ ๋ คํ์ ๋ ์ฌ์ค์ ์๋ฌด๋ฐ ์ญํ ๋ ํ์ง ์๋ ์ฝ๋์ ๊ฐ๊น์ต๋๋ค. ๊ทธ ์ด์ ๋ useReducer๊ฐ ๊ฐ์ง ๊ณ ์ ์ ํน์ฑ ๋๋ฌธ์ ๋๋ค.const [state, dispatch] = useReducer(authReducer, { user: null, isLoading: false, error: null, }); // useReducer๋ ์ด๋ฏธ ์ํ๊ฐ ์ ๋ณํ๋ฉด ์ฐธ์กฐ๋ฅผ ์ ์งํฉ๋๋ค. // ์ํ๊ฐ ๋ณํ๋ฉด ์ด์ฐจํผ memoizedState๋ ์๋ก ๊ฐฑ์ ๋๋ฏ๋ก, // ์ฌ๊ธฐ์์ useMemo๋ ์ฌ์ค์ ๋์์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. const memoizedState = useMemo(() => state, [state]); React ๋ด๋ถ์ ์ผ๋ก useReducer๋ useState๊ฐ ๋ฐํํ๋ ์ํ ๊ฐ์ฒด๋ ์๋ก์ด ์ํ๋ก ์ ๋ฐ์ดํธ๋์ง ์๋ ์ด์, ๋ ๋๋ง ๊ฐ์ ์ด๋ฏธ ๋์ผํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅ๋ฉ๋๋ค. ๋ง์ฝ dispatch ๋ช ๋ น์ด ํธ์ถ๋์ด ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด useReducer๋ ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋๊ณ , ์ด๋ useMemo์ ์์กด์ฑ ๋ฐฐ์ด([state])์ ๋ฑ๋ก๋ ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก useMemo ์ญ์ ์ฝ๋ฐฑ์ ์ฌ์คํํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.์ฆ, ์ํ๊ฐ ๋ณํ์ง ์์ผ๋ฉด ์ ์ด์ ์ฐธ์กฐ๊ฐ ๊ฐ๊ณ , ์ํ๊ฐ ๋ณํ๋ฉด useMemo๋ ์ด์ฐจํผ ์๋ก์ด ์ฐธ์กฐ๋ฅผ ๋ง๋ค์ด๋ด๊ธฐ ๋๋ฌธ์ ํด๋น ์์น์์์ useMemo ์ฐ์ฐ์ ์ค์ง์ ์ธ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๊ฐ ๊ตฌ์ฑํ ์ด ์ํคํ ์ฒ์์ ๋ฆฌ๋ ๋๋ง ์ต์ ํ๋ฅผ ์์ฑํ ์ง์ง ์ด์ ๋ useMemo๊ฐ ์๋๋ผ Context๋ฅผ ์ํ์ฉ๊ณผ ๋ช ๋ น์ฉ ๋ ๊ฐ๋ก ์ชผ๊ฐ ๊ตฌ์กฐ ๊ทธ ์์ฒด์ ๋๋ค. useReducer๊ฐ ๋ฐํํ๋ dispatch ํจ์๋ ์ปดํฌ๋ํธ์ ์์ ์ฃผ๊ธฐ ๋์ ์ ๋ ์ฐธ์กฐ๊ฐ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋์ ๋ถ๋ฆฌํ ๊ฒ๋ง์ผ๋ก๋ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.๊ทธ๋ ๋ค๋ฉด ์ค๋ฌด์์ Context๋ฅผ ์ต์ ํํ ๋ useMemo๊ฐ ๋ฐ๋์ ํ์ํ ์ํฉ์ ์ธ์ ์ผ๊น์? ๋ณดํต useReducer๋ฅผ ์ฐ์ง ์๊ณ ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ ์ํ๋ฅผ ์กฐํฉํด์ ํ๋์ ๊ฐ์ฒด๋ก ๋ด๋ ค๋ณด๋ผ ๋ ์ฌ์ฉ๋ฉ๋๋ค.์๋ฅผ ๋ค์ด Provider ๋ด๋ถ์ ์ ์ ์ ๋ณด์ ๋ก๋ฉ ์ํ๋ผ๋ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์ํ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.// ๋์ ์ (๋ ๋๋ง ํญํ ๋ฐ์) export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(false); // ๊ฐ์ฒด ๋ฆฌํฐ๋ด { user, isLoading }์ ์ง์ ์ ๋ฌํ๋ฉด // AuthProvider๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์์ ํ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. return ( {children} ); } ์ ์ฝ๋์ฒ๋ผ ๊ฐ ์์ฑ์ ๋ฐ๋ก ๊ฐ์ฒด ํํ๋ก ์ ๋ฌํ๊ฒ ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ์์ฑ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ด Context๋ฅผ ๊ตฌ๋ ํ๋ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๋ ์ค์ ๊ฐ์ด ๋ฐ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ฌด์กฐ๊ฑด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ useMemo์ ์ง์ง ์ญํ ์, ๋ด๋ถ ๊ฐ์ด ์ค์ ๋ก ๋ฐ๋ ๋๋ง ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ๋ฌถ์ด์ฃผ๋ ๊ฒ์ ๋๋ค.// ํด๊ฒฐ์ฑ (useMemo์ ์ฌ๋ฐ๋ฅธ ํ์ฉ) export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(false); // user๋ isLoading ๊ฐ์ด '์ค์ ๋ก' ๋ฐ๋ ๋๋ง ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , // ๊ฐ์ด ๊ฐ๋ค๋ฉด ์ด์ ๋ ๋๋ง์์ ๋ง๋ค์ด๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํฉ๋๋ค. const value = useMemo( () => ({ user, isLoading, setUser }), [user, isLoading] ); return ( {children} ); } ๋ณ์์ useMemo๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํํ ๊ฐ์ฒด์ ์์กด์ฑ ๋ฐฐ์ด์ ์ค์ ํด๋๋ฉด, ๋ด๋ถ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ด์ ๋ ๋๋ง์์ ๋ง๋ค์ด๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด Provider์ ์ฌ๋ฌ ์ํ๋ฅผ ๊ฐ์ฒด๋ก ๋ฌถ์ด ์ ๋ฌํ ๋ ์ฐธ์กฐ๊ฐ ๊นจ์ง์ง ์๋๋ก ๋ฐฉ์ดํ ์ ์์ต๋๋ค.์์ฝํ์๋ฉด ์ฑ๋์ ๋ถ๋ฆฌํ์ฌ ๋ฆฌ๋ ๋๋ง์ ๋ง๋๋ค๋ ์ํคํ ์ฒ์ ๋ฐฉํฅ์ฑ์ ์ ํํฉ๋๋ค. ์ค์ต ์ฝ๋์ ํฌํจ๋ useMemo๋ "๊ฐ์ฒด๋ฅผ ๋๊ธธ ๋๋ ์ฐธ์กฐ๊ฐ ๊นจ์ง์ง ์๊ฒ ์ฃผ์ํด์ผ ํ๋ค"๋ ์ ์ ์ค๋ช ํ๊ธฐ ์ํด ์ ๊ฐ ์ถ๊ฐํด๋ ๊ต์ก์ฉ ์ฅ์น๋ก ์ดํดํ์๋ฉด ๋ฉ๋๋ค.ํ์ ์ค๋ฌด ํ๊ฒฝ์์๋ ์์ ๊ฐ์ด Context API๋ฅผ ์ชผ๊ฐ๊ณ useMemo๋ก ๊ฐ์ธ๋ ์์ ์ด ๋ฒ๊ฑฐ๋กญ๊ณ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ์์ต๋๋ค. ๊ทธ๋์ ์ ์ญ ์ํ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ ํ๋ก์ ํธ์์๋ Zustand๋ Jotai ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ํ ์ํ๋ง ๊ณจ๋ผ์ ๊ตฌ๋ ํ ์ ์๋๋ก ๋ด๋ถ์ ์ผ๋ก ๋ ๋๋ง ์ต์ ํ๊ฐ ์ ์ฉ๋์ด ์์ต๋๋ค.์ด์ฒ๋ผ Context API์ ํ๊ณ์ ๋ ๋๋ง ์ต์ ํ ์๋ฆฌ(์ฐธ์กฐ ๋๋ฑ์ฑ)๋ฅผ ์ดํดํ๊ณ ์ํ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ํ์ฉํ๋ ๊ฒ์ ์ค๋ฌด์์ ๋ฐ์ํ๋ ๋ ๋๋ง ์ด์๋ฅผ ํธ๋ฌ๋ธ์ํ ํ๋ ๋ฐ ํต์ฌ์ ์ธ ๊ธฐ๋ฐ์ด ๋ฉ๋๋ค. ํ์ต์ ์ฐธ๊ณ ๊ฐ ๋์๊ธธ ๋ฐ๋๋๋ค.
- Likes
- 0
- Comments
- 3
- Viewcount
- 42
Q&A
์ค์ต ๊ฐ์ด๋: 16๊ฐ ์์ useMemo์ ์ญํ ์ ๋ฌด์์ธ๊ฐ์?
์๋ ํ์ธ์ ์ดํ๊ด๋. ๋จ๊ฒจ์ฃผ์ ์ง๋ฌธ์ ๋ณด๋ฉด, ๊ฐ์์์ ๋ค๋ฃฌ '์ํ์ ์ํ ๋ณ๊ฒฝ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ๋ฅผ ํตํ ๋ฆฌ๋ ๋๋ง ์ต์ ํ'๋ผ๋ ๋ชฉ์ ์ ์ ํํ๊ฒ ํ์ ํ์ จ์ต๋๋ค.์ ๊ฐ ์ ๊ณตํด๋๋ฆฐ ์ค์ต ์ฝ๋์์ useMemo๊ฐ ์ ํํ ์ด๋ค ์ญํ ์ ํ๋๋ก ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค๋ฌด์์๋ ์ด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋ผ๋ณด๊ณ ์ ์ฉํ๋์ง ์ฝ๋๋ฅผ ํตํด ๋จ๊ณ๋ณ๋ก ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.์ ๊ฐ ์ค์ต ๊ฐ์ด๋ ์์์ useMemo๋ฅผ ํตํด ์๋ํ ์ญํ ์ ์ฐธ์กฐ ์ ์ง๋ฅผ ํตํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ด์ ๋๋ค. React์ ๋ ๋๋ง ์์ง์ Context Provider์ ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ ์์ฑ์ ์ฐธ์กฐ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค, ํด๋น Context๋ฅผ ๊ตฌ๋ ํ๋ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ๋ก ๋ฆฌ๋ ๋๋งํ๋ ํน์ฑ์ด ์์ต๋๋ค.// ์ค์ต ์ฝ๋์์์ useMemo ์ฌ์ฉ // ์ํ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ ค๋ '์๋' const memoizedState = useMemo(() => state, [state]); return ( {/* ... */} ); ๋ฐ๋ผ์ ์ ๊ฐ ์ค์ต ์ฝ๋์์ useMemo๋ฅผ ์ฌ์ฉํ ๊ทผ๋ณธ์ ์ธ ๋ชฉ์ ์, ์ํ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ด ์ค์ ๋ก ๋ณํ์ง ์์๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ค์ ํธ์ถ๋๋๋ผ๋ ์ด์ ๊ณผ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋๋ก ๊ฐ์ ํ๋ ๋ฐ ์์ต๋๋ค. ํ์ ์ปดํฌ๋ํธ๋ค์ด ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์ดํ๋ ์ญํ ์ ํ๋๋ก ์๋ํ ๊ฒ์ ๋๋ค.ํ์ง๋ง ์ฐธ์กฐ ๋๋ฑ์ฑ์ ์ ์งํด์ผ ํ๋ค๋ ๊ฐ๋ ์ ๊ต์กํ๊ธฐ ์ํด ๋ช ์์ ์ผ๋ก ์์ฑํด๋ ์ด useMemo ์ฝ๋๋, React์ ๋ด๋ถ ๋์ ์๋ฆฌ๋ฅผ ๊ณ ๋ คํ์ ๋ ์ฌ์ค์ ์๋ฌด๋ฐ ์ญํ ๋ ํ์ง ์๋ ์ฝ๋์ ๊ฐ๊น์ต๋๋ค. ๊ทธ ์ด์ ๋ useReducer๊ฐ ๊ฐ์ง ๊ณ ์ ์ ํน์ฑ ๋๋ฌธ์ ๋๋ค.const [state, dispatch] = useReducer(authReducer, { user: null, isLoading: false, error: null, }); // useReducer๋ ์ด๋ฏธ ์ํ๊ฐ ์ ๋ณํ๋ฉด ์ฐธ์กฐ๋ฅผ ์ ์งํฉ๋๋ค. // ์ํ๊ฐ ๋ณํ๋ฉด ์ด์ฐจํผ memoizedState๋ ์๋ก ๊ฐฑ์ ๋๋ฏ๋ก, // ์ฌ๊ธฐ์์ useMemo๋ ์ฌ์ค์ ๋์์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. const memoizedState = useMemo(() => state, [state]); React ๋ด๋ถ์ ์ผ๋ก useReducer๋ useState๊ฐ ๋ฐํํ๋ ์ํ ๊ฐ์ฒด๋ ์๋ก์ด ์ํ๋ก ์ ๋ฐ์ดํธ๋์ง ์๋ ์ด์, ๋ ๋๋ง ๊ฐ์ ์ด๋ฏธ ๋์ผํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅ๋ฉ๋๋ค. ๋ง์ฝ dispatch ๋ช ๋ น์ด ํธ์ถ๋์ด ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ฉด useReducer๋ ์๋ก์ด ์ํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋๊ณ , ์ด๋ useMemo์ ์์กด์ฑ ๋ฐฐ์ด([state])์ ๋ฑ๋ก๋ ์ํ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก useMemo ์ญ์ ์ฝ๋ฐฑ์ ์ฌ์คํํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.์ฆ, ์ํ๊ฐ ๋ณํ์ง ์์ผ๋ฉด ์ ์ด์ ์ฐธ์กฐ๊ฐ ๊ฐ๊ณ , ์ํ๊ฐ ๋ณํ๋ฉด useMemo๋ ์ด์ฐจํผ ์๋ก์ด ์ฐธ์กฐ๋ฅผ ๋ง๋ค์ด๋ด๊ธฐ ๋๋ฌธ์ ํด๋น ์์น์์์ useMemo ์ฐ์ฐ์ ์ค์ง์ ์ธ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๊ฐ ๊ตฌ์ฑํ ์ด ์ํคํ ์ฒ์์ ๋ฆฌ๋ ๋๋ง ์ต์ ํ๋ฅผ ์์ฑํ ์ง์ง ์ด์ ๋ useMemo๊ฐ ์๋๋ผ Context๋ฅผ ์ํ์ฉ๊ณผ ๋ช ๋ น์ฉ ๋ ๊ฐ๋ก ์ชผ๊ฐ ๊ตฌ์กฐ ๊ทธ ์์ฒด์ ๋๋ค. useReducer๊ฐ ๋ฐํํ๋ dispatch ํจ์๋ ์ปดํฌ๋ํธ์ ์์ ์ฃผ๊ธฐ ๋์ ์ ๋ ์ฐธ์กฐ๊ฐ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋์ ๋ถ๋ฆฌํ ๊ฒ๋ง์ผ๋ก๋ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.๊ทธ๋ ๋ค๋ฉด ์ค๋ฌด์์ Context๋ฅผ ์ต์ ํํ ๋ useMemo๊ฐ ๋ฐ๋์ ํ์ํ ์ํฉ์ ์ธ์ ์ผ๊น์? ๋ณดํต useReducer๋ฅผ ์ฐ์ง ์๊ณ ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ ์ํ๋ฅผ ์กฐํฉํด์ ํ๋์ ๊ฐ์ฒด๋ก ๋ด๋ ค๋ณด๋ผ ๋ ์ฌ์ฉ๋ฉ๋๋ค.์๋ฅผ ๋ค์ด Provider ๋ด๋ถ์ ์ ์ ์ ๋ณด์ ๋ก๋ฉ ์ํ๋ผ๋ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์ํ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.// ๋์ ์ (๋ ๋๋ง ํญํ ๋ฐ์) export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(false); // ๊ฐ์ฒด ๋ฆฌํฐ๋ด { user, isLoading }์ ์ง์ ์ ๋ฌํ๋ฉด // AuthProvider๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์์ ํ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. return ( {children} ); } ์ ์ฝ๋์ฒ๋ผ ๊ฐ ์์ฑ์ ๋ฐ๋ก ๊ฐ์ฒด ํํ๋ก ์ ๋ฌํ๊ฒ ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ์์ฑ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ด Context๋ฅผ ๊ตฌ๋ ํ๋ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๋ ์ค์ ๊ฐ์ด ๋ฐ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ฌด์กฐ๊ฑด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ useMemo์ ์ง์ง ์ญํ ์, ๋ด๋ถ ๊ฐ์ด ์ค์ ๋ก ๋ฐ๋ ๋๋ง ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ก ๋ฌถ์ด์ฃผ๋ ๊ฒ์ ๋๋ค.// ํด๊ฒฐ์ฑ (useMemo์ ์ฌ๋ฐ๋ฅธ ํ์ฉ) export function AuthProvider({ children }) { const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(false); // user๋ isLoading ๊ฐ์ด '์ค์ ๋ก' ๋ฐ๋ ๋๋ง ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , // ๊ฐ์ด ๊ฐ๋ค๋ฉด ์ด์ ๋ ๋๋ง์์ ๋ง๋ค์ด๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํฉ๋๋ค. const value = useMemo( () => ({ user, isLoading, setUser }), [user, isLoading] ); return ( {children} ); } ๋ณ์์ useMemo๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํํ ๊ฐ์ฒด์ ์์กด์ฑ ๋ฐฐ์ด์ ์ค์ ํด๋๋ฉด, ๋ด๋ถ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ์ด์ ๋ ๋๋ง์์ ๋ง๋ค์ด๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด Provider์ ์ฌ๋ฌ ์ํ๋ฅผ ๊ฐ์ฒด๋ก ๋ฌถ์ด ์ ๋ฌํ ๋ ์ฐธ์กฐ๊ฐ ๊นจ์ง์ง ์๋๋ก ๋ฐฉ์ดํ ์ ์์ต๋๋ค.์์ฝํ์๋ฉด ์ฑ๋์ ๋ถ๋ฆฌํ์ฌ ๋ฆฌ๋ ๋๋ง์ ๋ง๋๋ค๋ ์ํคํ ์ฒ์ ๋ฐฉํฅ์ฑ์ ์ ํํฉ๋๋ค. ์ค์ต ์ฝ๋์ ํฌํจ๋ useMemo๋ "๊ฐ์ฒด๋ฅผ ๋๊ธธ ๋๋ ์ฐธ์กฐ๊ฐ ๊นจ์ง์ง ์๊ฒ ์ฃผ์ํด์ผ ํ๋ค"๋ ์ ์ ์ค๋ช ํ๊ธฐ ์ํด ์ ๊ฐ ์ถ๊ฐํด๋ ๊ต์ก์ฉ ์ฅ์น๋ก ์ดํดํ์๋ฉด ๋ฉ๋๋ค.ํ์ ์ค๋ฌด ํ๊ฒฝ์์๋ ์์ ๊ฐ์ด Context API๋ฅผ ์ชผ๊ฐ๊ณ useMemo๋ก ๊ฐ์ธ๋ ์์ ์ด ๋ฒ๊ฑฐ๋กญ๊ณ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ๊ธธ์ด์ง ์ ์์ต๋๋ค. ๊ทธ๋์ ์ ์ญ ์ํ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๋ ํ๋ก์ ํธ์์๋ Zustand๋ Jotai ๊ฐ์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ํ ์ํ๋ง ๊ณจ๋ผ์ ๊ตฌ๋ ํ ์ ์๋๋ก ๋ด๋ถ์ ์ผ๋ก ๋ ๋๋ง ์ต์ ํ๊ฐ ์ ์ฉ๋์ด ์์ต๋๋ค.์ด์ฒ๋ผ Context API์ ํ๊ณ์ ๋ ๋๋ง ์ต์ ํ ์๋ฆฌ(์ฐธ์กฐ ๋๋ฑ์ฑ)๋ฅผ ์ดํดํ๊ณ ์ํ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ํ์ฉํ๋ ๊ฒ์ ์ค๋ฌด์์ ๋ฐ์ํ๋ ๋ ๋๋ง ์ด์๋ฅผ ํธ๋ฌ๋ธ์ํ ํ๋ ๋ฐ ํต์ฌ์ ์ธ ๊ธฐ๋ฐ์ด ๋ฉ๋๋ค. ํ์ต์ ์ฐธ๊ณ ๊ฐ ๋์๊ธธ ๋ฐ๋๋๋ค.
- Likes
- 0
- Comments
- 3
- Viewcount
- 42
Q&A
1๊ฐ ์ง๋ฌธ
์๋ ํ์ธ์ madwolves98๋. ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!์ฐ์ Apache๋ ์ ํ์ ์ธ Spring Boot ๊ฐ์ ์ ํต์ ์ธ ์๋ฒ ๋ชจ๋ธ์ ์ฌ์ฉ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ผ์ข ์ ์์ ์์ธ Thread๋ฅผ ํ ๋ช ์ฉ ์ ๋ด์ํค๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฐ ๊ตฌ์กฐ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ์ฐพ์์ค๊ฑฐ๋ ์ธ๋ถ ๊ฒฐ์ ์์คํ ์ ํธ์ถํ๊ณ , ๋ ํ์ผ์ ์ฝ๊ณ ์ฐ๋ ๋ฑ์ ๋ฐ์ดํฐ ์ ์ถ๋ ฅ(I/O) ์์ ์ด ๋ฐ์ํ ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค. ์ปดํจํฐ์ ๋๋์ธ CPU๋ ํ ์ผ์ด ์์ด์ ๋๊ณ ์๋๋ฐ๋, ํด๋น ์์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋คํธ์ํฌ์ ์๋ต์ด ์ฌ ๋๊น์ง ์๋ฌด๊ฒ๋ ํ์ง ์๊ณ ๊ฐ๋งํ ๋ฉ์ถฐ ์์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ ๊ฒ ์์ ์๊ฐ ๊ผผ์ง ๋ชป ํ๊ณ ๋๊ธฐํ๋ ์ํ๋ฅผ Blocking ์ํ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.๋ฐ๋ฉด Node.js๋ ๋ฉ์ธ ์์ ์๋ฅผ ๋ฑ ํ ๋ช ๋ง ๋๊ณ ์ด ์์ ์๊ฐ ์ ๋ ๋๊ธฐํ์ง ์๊ณ ๊ณ์ ์์ง์ด๋ Non-blocking ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ Event Loop๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋๋ฐ, ์ด๋ ๋ค์ด์ค๋ ์์ฒญ์ ๋์์์ด ์ ์ํ๋ ๋จ ํ ๋ช ์ ๋ฉ์ถ์ง ์๋ ์ ์๊ณผ ๊ฐ์ต๋๋ค. ๋ง์ฝ ์ฌ์ฉ์์ ์์ฒญ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ๊ฐ์ I/O ์์ ์ด ํฌํจ๋์ด ์๋ค๋ฉด, Event Loop๋ ์ด ์์ ์ ์ด์์ฒด์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์คํ ์ด๋ ์์ฒด์ ์ธ ๋ณด์กฐ ์์ ๊ณต๊ฐ(์๋ฐํ ๋งํ๋ฉด libuv๊ฐ ๊ด๋ฆฌํ๋ ๋ด๋ถ ์ค๋ ๋ ํ)์ ๋์ ธ๋ฒ๋ฆฌ๊ณ ์ฆ์ ๋ค์ ์๋์ ์์ฒญ์ ๋ฐ์ผ๋ฌ ์ด๋ํฉ๋๋ค. ์ดํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์คํ ์ด ์ผ์ ๋๋ด์ ์๋ฃ ์ ํธ๋ฅผ ๋ณด๋ด๋ฉด, Event Loop๋ ๋ค์ ์๋์ ์ฃผ๋ฌธ์ ๋ฐ๋ ํํ์ด ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๊ณ ๊ทธ๋ค์์ผ๋ก ํด์ผ ํ ํ์ ์กฐ์น, ์ฆ Callback ์ฒ๋ฆฌ๋ฅผ ์งํํ๊ฒ ๋ฉ๋๋ค.์ด๋ฅผ ํ์ค ์ธ๊ณ์ ์๋น์ ๋น์ ํด ๋ณด๋ฉด ์ดํด๊ฐ ์ฝ์ต๋๋ค. ์ ํต์ ๋ฐฉ์์ ์๋์ด ๋ฉ๋ด๋ฅผ ๊ณ ๋ฅด๊ณ ์์์ ๋จน๊ณ ๋๊ฐ ๋๊น์ง ์ ์ ํ ๋ช ์ด ๊ทธ ์๋ ํ ์ด๋ธ ์์ ์์ ๊ณ์ ๋๊ธฐํ๋ ๊ตฌ์กฐ์ ๋๋ค. ์๋์ด ๋ง์์ง๋ฉด ์ ์์ ๊ณ์ ๊ณ ์ฉํด์ผ ํ๋๋ฐ, ์ปดํจํฐ ์ธ์์์๋ ์ ์์ด ๋ง์์ง์๋ก ์ด ์ ์๋ค์ ์ผ์ผ์ด ๊ด๋ฆฌํ๊ณ ๊ต๋์ํค๋ ๋ฐ ๋๋ Context Switching ๋น์ฉ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ๊ฒฐ๊ตญ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฒํฐ์ง ๋ชปํ๊ณ ๊ณ ๊ฐ๋์ด ๋ค์ด๋์ด ๋ฒ๋ฆฌ์ฃ . ๋ฐ๋ฉด์ Node.js ๋ฐฉ์์ ๋ฉ์ธ ์ ์ ํ ๋ช ์ด ์ฃผ๋ฌธ๋ง ๊ณ์ ๋ฐ์์ ์ฃผ๋ฐฉ์ ๋๊ธฐ๊ณ , ์ฃผ๋ฐฉ์์ ์์์ ๋ง๋ค์ด ๋ด์ค๋ฉด ์ ์์ ์๋ก์ด ์ฃผ๋ฌธ์ ๋ฐ๋ ํํ์ด ์๋น๋ง ํ๋ ๊ตฌ์กฐ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ ํ ๋ช ์ด ์๋ฐฑ, ์์ฒ ๋ช ์ ์๋์ ๊ฑฐ๋ฌํ ์ปค๋ฒํ ์ ์๋ ๊ฒ์ ๋๋ค.์ค์ ๊ธฐ์ ๋ค์ด ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์ด์ํ๋ ํ์ฅ์ ๋น๋์ด ์์ฅ์ ๋๊ตฌ๋ค์ ๋์ ํ๊ฒ ๋น๊ตํด ๋ณด๋ฉด ์ด ํน์ง๋ค์ด ๋์ฑ ์ ๋ช ํด์ง๋๋ค. Node.js๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ Express๋ NestJS๋ ์์ ๋ง์๋๋ฆฐ ์ฃผ๋ฌธ๋ง ๋น ๋ฅด๊ฒ ์ณ๋ด๋ ๊ตฌ์กฐ ๋๋ถ์ ์๋ง ๋ช ์ ๋์ ์ ์์ ๊ฐ๋ณ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐฐ๋ฌ ์ฑ์์ ์๋ง์ ๋ผ์ด๋์ ๊ณ ๊ฐ์ ์์น ์ ๋ณด๋ฅผ 1์ด ๋จ์๋ก ๋์์์ด ์ค๊ณํ๊ฑฐ๋, ์นด์นด์คํก์ฒ๋ผ ์๋ง ๋ช ์ด ๋์์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ค์๊ฐ ์ฑํ ์๋ฒ๋ฅผ ๋ง๋ค ๋ ์์ฃผ ๊ฐ๋ ฅํฉ๋๋ค. ๋ค๋ง, ๋์์ ์ธ์ฝ๋ฉ์ด๋ ๋ณต์กํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ ๊ณ์ฐ์ฒ๋ผ ๋ฉ์ธ ์ ์ ์ค์ค๋ก ๋จธ๋ฆฌ๋ฅผ ์จ์ ์ค๋ซ๋์ ํ์ด์ผ ํ๋ ๋ฌด๊ฑฐ์ด ์ํ์ ๊ณ์ฐ ์์ ์ด ๋ค์ด์ค๋ฉด, ๋จ ํ ๋ช ๋ฟ์ธ ์ ์์ด ๊ทธ ๊ณ์ฐ์ ํ๋๋ผ ์๋น ์์ฒด๋ฅผ ๋ฉ์ถฐ๋ฒ๋ ค ์ ์ฒด ์๋ฒ๊ฐ ๋จนํต์ด ๋ ์ ์๋ค๋ ์ฝ์ ์ด ์์ต๋๋ค.์ด์ ๋ฌ๋ฆฌ Java ์ง์์ Spring Boot๋ ์ฌ๋ฌ ๋ช ์ ์ ์์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋ฐํ์ผ๋ก ๊ฑฐ๋ํ ๊ธฐ์ ์ฉ ์์คํ ์ ๋ง๋ ๊ฐ๋ ฅํ ๋ผ๋์ ์๊ฒฉํ ๊ท์น์ ์ ๊ณตํฉ๋๋ค. ํ ์ค๋ ์ํ ์ฑ์ฒ๋ผ 1์์ ์ค์ฐจ๋ ํ์ฉ๋์ง ์๋ ๋ณต์กํ ์ก๊ธ ๊ฒฐ์ ์์คํ ์ ๊ฐ๋ฐํ๊ฑฐ๋, ์๋ฐฑ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ณต์กํ๊ฒ ์ฎ์ด์ ์ ๋ฐํ๊ฒ ๊ณ์ฐํ๊ณ ํต์ ํด์ผ ํ๋ ๋๊ธฐ์ ์ ์ฌ๋ด ์ธ์ฌ ๋ฐ ์ฌ๋ฌด ๊ด๋ฆฌ ์์คํ ์ ๋ง๋ค ๋ ๋งค์ฐ ์ ํฉํฉ๋๋ค. (๋ฌผ๋ก ์ต๊ทผ์๋ WebFlux ๊ฐ์ ๋ ผ๋ธ๋กํน ๋ชจ๋ธ์ด๋ Java 21์ ๊ฐ์ ์ค๋ ๋ ๋์ ์ผ๋ก ์ด๋ฌํ ์ ํต์ ์ธ ๊ตฌ์กฐ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํด ๋๊ฐ๊ณ ์๊ธด ํฉ๋๋ค๋ง,) ์ฌ์ ํ ์๋ง์ ์ ์์ ๊ด๋ฆฌํ๊ณ ๊ต๋ํ๋ ๋ฐ ์๋์ ์ผ๋ก ์์คํ ์ ๋น์ฉ์ด ๋ง์ด ๋ ๋ค๋ ์ ์ ๋ถ๋ช ํฉ๋๋ค.ํํธ Go ์ธ์ด๋ ์์ฃผ ๊ฐ๋ณ๊ณ ์์ ์์ ์๋ค์ ์์ฒญ๋๊ฒ ๋ง์ด ๋ง๋ค์ด๋ด๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์๋์ ์ธ ๋์ ์ฒ๋ฆฌ ์ฑ๋ฅ๊ณผ ๋น ๋ฅธ ์คํ ์๋๋ฅผ ์๋ํฉ๋๋ค. ์ด๋ฏธ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํ๊ณ์์๋ ์ฃผ๋ฅ๋ก ์๋ฆฌ ์ก์์ง๋ง, ์์ง ์ผ๋ฐ์ ์ธ ์น ๋น์ฆ๋์ค ๋ก์ง ๊ฐ๋ฐ์ ์์ด์๋ Java๋ Node.js์ ๋นํด ์ค๋ฌด ํ์ฅ์์ ์ด ์ธ์ด๋ฅผ ๋ฅ์ํ๊ฒ ๋ค๋ฃฐ ์ค ์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ฅผ ์ฑ์ฉํ๊ธฐ ์ด๋ ต๋ค๋ ํ์ค์ ์ธ ์ ์ฝ์ด ์์ต๋๋ค.์ฌ๊ธฐ๊น์ง ํ๋ฆ์ ๋ฐ๋ผ์ค์ จ๋ค๋ฉด, ๊ทธ๋ ๋ค๋ฉด ์ปดํจํฐ๊ฐ ๊ฐ์ฅ ์ ์ดํดํ๋ ๋น ๋ฅด๊ณ ๊ทผ๋ณธ์ ์ธ ์ธ์ด์ธ C๋ C++๋ก ์ฒ์๋ถํฐ ๋ชจ๋ ๊ฑธ ๋ง๋ค๋ฉด ์ ์ผ ์ข์ ๊ฒ ์๋๊ฐ ํ๋ ๋ ์นด๋ก์ด ์๋ฌธ์ด ์๊ธฐ์ค ์ ์์ต๋๋ค. ์ค์ ๋ก Node.js๋ฅผ ๋์๊ฐ๊ฒ ํ๋ ์ฌ์ฅ๋ถ์ธ V8 ์์ง๊ณผ ๋ด๋ถ ๋ณด์กฐ ์์ ๊ณต๊ฐ์ธ libuv๋ ๋ชจ๋ C์ C++๋ก ๋ง๋ค์ด์ ธ ์์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก ์ด ์ธ์ด๋ค์ ์ฌ์ฉํด ์์ ์นญ์ฐฌํ๋ ๋ฉ์ถ์ง ์๋ Non-blocking ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ์๋ฒฝํ๊ฒ ๋ง๋ค์ด๋ธ๋ค๋ฉด Node.js๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ์ ๊ฒ ์ธ ๊ฒ์ ๋๋ค.ํ์ง๋ง ํ์ค์ ์ผ๋ก ์ด๋ฅผ ๋ฐ๋ฅ๋ถํฐ ์ง์ ๊ตฌํํ๋ค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์ต๋๋ค. Node.js์ ๊ธฐ๋ฐ์ด ๋๋ libuv ์์ง์ ์ ์ธ๊ณ ์ต๊ณ ์์ค์ ์ฒ์ฌ์ ์ธ ๊ฐ๋ฐ์๋ค์ด ์๋ง์ ์์ธ ์ํฉ๊ณผ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์น์ดํ๊ฒ ๊ณ ๋ฏผํ๊ณ ๊ณ ๋ คํด์ ๋ง๋ค์์ผ๋ฉฐ, ์ง๊ธ ์ด ์๊ฐ์๋ ๊พธ์คํ ๋ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ์งํํ๋ฉฐ ์ ๊ตํ๊ฒ ๋ค๋ฌ์ด๊ฐ๊ณ ์๋ ๊ฑฐ๋ํ ์์คํ ์ ๋๋ค. ๊ฐ์ธ์ด๋ ์์ ํ์ฌ์ ๊ฐ๋ฐ์๋ค์ด ์ด ์ฌ๋๋ค์ด ์์ญ ๋ ๊ฐ ๊น์์จ ์์ค์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ง ์์ง์ ์ง์ ๋ง๋ค์ด์ ์๋น์ค๋ฅผ ๋ฐ์นญํ๋ค๋ ๊ฒ์ ์ฌ์ค์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.๊ฒ๋ค๊ฐ ํ์ ์์ ๋น์ฆ๋์ค ์น ์๋ฒ๋ฅผ C๋ C++๋ก ์ง์ ์ง์ง ์๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋น์ฆ๋์ค์ ๊ธฐํ๋น์ฉ๊ณผ ๊ฐ๋ฐ ์์ฐ์ฑ ๋๋ฌธ์ ๋๋ค. ํ๋ IT ๊ธฐ์ ์ ์์ด๋์ด๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ก๊ทธ๋จ์ผ๋ก ๊ตฌํํด์ ์์ฅ์ ์ถ์ํ๊ณ ๊ณ ๊ฐ์ ๋ฐ์์ ์ดํผ๋ ๊ฒ์ด ์๋ช ์ ๋๋ค. ๊ฐ๋ฐํ์ด C++๋ก ์ ๋ฌ ๋์ ๋ฐค์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ผ์ผ์ด ๊ด๋ฆฌํด๊ฐ๋ฉฐ ์๋ฒ ์๋ต ์๋ 100์ ์ง๋ฆฌ ์๋น์ค๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค, Node.js๋ฅผ ์ด์ฉํด 2์ฃผ์ผ ๋ง์ ์๋ 80์ ์ง๋ฆฌ ์๋น์ค๋ฅผ ๋น ๋ฅด๊ฒ ์ถ์ํด์ ๋จผ์ ์์ฅ์ ์ ์ ํ๊ณ ์์ต์ ๋ด๋ ๊ฒ์ด ๋น์ฆ๋์ค ๊ด์ ์์๋ ์๋์ ์ธ ์น๋ฆฌ์ ๋๋ค.๋ํ C๋ C++์์๋ ๊ฐ๋ฐ์์ ์์ฃผ ์์ ์ค์๋ก ์ฌ์ฉ์ด ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ ๋น์ฐ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฑฐ๋ ํ๋ฝ๋์ง ์์ ์๋ฑํ ๊ณต๊ฐ์ ๊ฑด๋๋ฆฌ๋ฉด, ๋ฉ์ฉกํ ๋์๊ฐ๋ ์๋ฒ ์ ์ฒด๊ฐ ์น๋ช ์ ์ธ ์๋ฌ์ ํจ๊ป ๊ฐ์ ๋ก ๊บผ์ ธ๋ฒ๋ฆฝ๋๋ค. ๋ฐ๋ฉด Node.js๋ JavaScript๋ผ๋ ์ฌ๋์ด ์ฐ๊ธฐ ํธํ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ์ ์ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ๊บผ๊ธฐ๋ค์ ์์คํ ์ด ์์์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ฒญ์ํด ์ฃผ๋ Garbage Collector ๊ธฐ๋ฅ์ด ํ์ฌ๋์ด ์์ด ํจ์ฌ ์์ ํ๊ณ ์ ์ฐํ๊ฒ ๋์๊ฐ๋๋ค. ์ฌ๊ธฐ์ ์ ์ธ๊ณ์์ ๊ฐ์ฅ ๊ฑฐ๋ํ ๋ถํ ์ฐฝ๊ณ ์ธ npm ์ํ๊ณ๊ฐ ๋ํด์ ธ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด๋ ์์ ๋ก๊ทธ์ธ ์ฐ๋ ๋ฑ ๋น์ฅ ํ์ํ ๊ฑฐ์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์ด๋ฏธ ๋ง๋ค์ด์ง ๋ฌด๋ฃ ์คํ์์ค๋ก ์กด์ฌํฉ๋๋ค. C++๋ก ๋ฐ๋ฅ๋ถํฐ ๋ฐํด๋ฅผ ๊น์์ผ ํ๋ ์ํฉ๊ณผ๋ ํ์ฐํ ๋ค๋ฅด์ฃ . ์ฆ, ๊ธฐ๊ณ๊ฐ ์ดํดํ๊ธฐ ๊ฐ์ฅ ์ข์ ์ธ์ด์ ์ธ๊ฐ์ด ๋น์ฆ๋์ค ๋ฌธ์ ๋ฅผ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ข์ ์ธ์ด ์ฌ์ด์์ ์๋ฒฝํ ํํ์ ์ ์ฐพ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋ก Node.js์ ๋๋ค.๊ฒฐ๊ตญ ํ์ ๊ฐ๋ฐ ์ธ๊ณ์์ ๋ฌด์กฐ๊ฑด ์ด ๊ธฐ์ ์ด ์ ๋ต์ด๋ค๋ผ๋ ๋ง์ ๊ฒฐ์ฝ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ชจ๋ Framework์ ์ธ์ด๋ ์ ๋ง๋ค ํ๋๋ฅผ ์ป์ผ๋ฉด ๋ฐ๋์ ๋ค๋ฅธ ํ๋๋ฅผ ์๋ Trade-off ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.๋ฌผ๋ก ๊ธฐ์ ์ ์ผ๋ก ์ต์ง๋ฅผ ๋ถ๋ฆฌ์๋ฉด, Java Spring ํ๊ฒฝ์์๋ ์ค์ ์ ์กฐ์ํด ์ฑ๊ธ ์ค๋ ๋์ฒ๋ผ ๋์ํ๊ฒ ๋ง๋ค ์ ์๊ณ , ๋ฐ๋๋ก Node.js์์๋ ์์ปค ์ค๋ ๋(Worker Thread)๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ฉํฐ ์ค๋ ๋ฉ์ ํ๋ด ๋ผ ์๋ ์์ต๋๋ค. ํ์ง๋ง, ๊ฒฐ๊ตญ ๋น์ฆ๋์ค์ ๊ฐ๋ฐ ์์ฐ์ฑ๊ณผ ์๋ฒ ์ด์์ ํจ์จ์ฑ์ ๊ณ ๋ คํ์ ๋ ๊ฐ ํ๋ ์์ํฌ๊ฐ ํ์์ ์ผ๋ก ๊ฐ์ฅ ์ํ๋ ๊ฒ์ ํ๋๋ก ๋๋ ๊ฒ์ด ๋ง์ต๋๋ค. ์ต์ง๋ก ๋ง์ง ์๋ ์ท์ ์ ํ๋๋ผ ๋๋๋๋ ๊ฒ๋ณด๋ค, ๊ฐ์์ ์ฅ์ ์ ์ด๋ ค ์ ์ฌ์ ์์ ๋ฐฐ์นํ๋ ๊ฒ์ด ํ๋ช ํ์ฃ . Node.js๋ ์๋์ ์ธ ๊ฐ๋ฐ ์์ฐ์ฑ๊ณผ ํจ์จ์ ์ธ ๋คํธ์ํฌ I/O ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์ป์ ๋์ ๋ฌด๊ฑฐ์ด ์ํ์ ์ฐ์ฐ ๋ฅ๋ ฅ์ ์๋ณดํ๊ณ , C์ C++์ ๊ทนํ์ ์ปดํจํฐ ์ฑ๋ฅ์ ์ป์ ๋์ ์ฌ๋์ ๊ฐ๋ฐ ํธ์์ฑ๊ณผ ์์คํ ์ ๋ฐํ์ ์์ ์ฑ์ ์๋ณดํ ๊ฒ์ฒ๋ผ ๋ง์ ๋๋ค.์ฐ๋ฆฌ๊ฐ ์งํฅํด์ผ ํ๋ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์ ์ ํํ๋ ํน์ ๊ธฐ์ ์ ๋งน์ ํ๋ ๊ฒ์ด ์๋๋ผ, ํ์ฌ ์ ์ํ๋ ์ฌ์ฉ์์ ๊ท๋ชจ, ๊ฐ๋ฐํ์ ์ค๋ ฅ, ๋น์ฆ๋์ค ๋ชฉํ ๋ฑ ๋์์ ์ฃผ์ด์ง ์ํฉ๊ณผ ์๋ฒ ์ธํ๋ผ์ ๋ฌผ๋ฆฌ์ ํ๊ณ๋ฅผ ๋ช ํํ ์ธ์ํ๊ณ ๊ทธ ์ํฉ์ ๊ฐ์ฅ ์๋ง์ ๋๊ตฌ๋ฅผ ๋์ ํ๊ฒ ํ๋จํ์ฌ ์ ํํ๋ ์์ผ๋ฅผ ๊ฐ์ถ๋ ๊ฒ์ ๋๋ค.๋ ๋์๊ฐ ์ด๋ค ํ๋ คํ๊ณ ์๋ก์ด Framework๋ฅผ ์ฐ๋๋ผ๋ ๊ทธ ๋ฐ๋ฐํ์ด ๋๋ ๋์ ์๋ฆฌ๋ ๊ฒฐ๊ตญ ๊ฐ์ต๋๋ค. ์ด์์ฒด์ ๊ฐ ์ด๋ป๊ฒ ์ปดํจํฐ์ ํ์ ๋ ์์์ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์๊ฒ ๊ณตํํ๊ฒ ๋น๋ ค์ฃผ๋์ง์ธ System Call๋ถํฐ, ๊น์ํ Kernel ์์ค์์ ํ์ผ๊ณผ ๋คํธ์ํฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ดํ๋ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ผ๋ ์์ ๋ฐ๊ตฌ๋์ธ Buffer์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋์์๋ ๋ฌผ๊ฒฐ์ธ Stream์ฒ๋ผ ํ๋ ค๋ณด๋ด๊ณ ๋ฐ์๋ด๋ ์ปดํจํฐ ๊ณผํ์ ๊ทผ๋ณธ ์๋ฆฌ๋ Java๋ Python์ด๋ C++์ด๋ ๋ชจ๋ ์๋ฒฝํ๊ฒ ๋์ผํฉ๋๋ค.์ฐ๋ฆฌ๊ฐ ์ด ์์ ์์ Node.js๋ผ๋ ์ง๊ด์ ์ธ ๋๊ตฌ๋ฅผ ์ ํํ ์ด์ ๋ ๊ฒฐ๊ตญ ์ด ์๋ฉด ์๋์ ์จ๊ฒจ์ง ์ปดํจํฐ ๊ณผํ์ ๊ทผ๋ณธ ์๋ฆฌ๋ฅผ ํํค์น๊ธฐ ์ํจ์ ๋๋ค. ๋จ์ํ ๋๊ตฌ์ ๊ป๋ฐ๊ธฐ ๊ฐ์ ์ฌ์ฉ๋ฒ์ ์ธ์ฐ๋ ๊ฒ์ ๋์ด ์ด ๋ณธ์ง์ ์ธ ๋ผ๋๋ฅผ ์ดํดํ๊ฒ ๋๋ค๋ฉด, ํ๋ Node.js๊ฐ ์๋ ์์ ํ ์๋ก์ด ๋๊ตฌ๊ฐ ์์ฅ์ ์ง๋ฐฐํ๋๋ผ๋ ์์ฃผ ์์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ทธ ๊ธฐ์ ์ ํต์ฌ์ ์ฅ์ ํ์ค ์ ์์ ๊ฒ์ ๋๋ค.๊ฐ์ฌํฉ๋๋ค!
- Likes
- 0
- Comments
- 2
- Viewcount
- 53
Q&A
ai๊ฐ ๋ง๋ ๊ฐ์์ธ๊ฐ์?
์๋ ํ์ธ์ ๊ณ ๊ฑดํธ ๋, ๋จผ์ ๊ฐ์์ ๊ด์ฌ์ ๊ฐ์ ธ์ฃผ์๊ณ ๋ฌธ์๋ฅผ ๋จ๊ฒจ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฐ๋ คํ์๋ ๋ถ๋ถ์ ๋ํด ์คํด๋ฅผ ํ์ด๋๋ฆฌ๊ณ ์ ์์งํ๊ณ ์์ธํ๊ฒ ๋ต๋ณ์ ๋๋ฆฌ๊ณ ์ ํฉ๋๋ค.๋จผ์ , ๋ณธ ๊ฐ์๋ TTS๊ฐ ์๋ ์ ๋ชฉ์๋ฆฌ๋ก ์ง์ ๋ น์ํ ๊ฒ์ด ๋ง์ต๋๋ค. ๋ค๋ง, ๊ฐ์๋ฅผ ํ ๋ฒ์ ์ฐ์ํด์ ๋ น์ํ๋ ๊ฒ์ด ์๋๋ผ ํํ์ด ์๊ฐ์ ๋ด์ด ์ฌ๋ฌ ์ฐจ๋ก๋ก ๋๋์ด ๋ น์์ ์งํํ์ต๋๋ค. ์๋ฅผ ๋ค์ด 10๋ถ์ง๋ฆฌ ์์์ด๋ผ๋ฉด 2๋ถ์ ๋จผ์ ์ฐ๊ณ , ๋ 2๋ถ์ ์๊ฐ์ด ๋ ๋ ์ฐ๋ ๋ฐฉ์์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ ๋ น์ํ ๋๋ง๋ค ์ฃผ๋ณ ํ๊ฒฝ์ด๋ ์ ์ปจ๋์ ์ ๋ฐ๋ผ ๋ชฉ์๋ฆฌ์ ํค๊ณผ ์ง๊ฐ์ด ๋ง์ด ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์ต์ข ์ ์ผ๋ก ๋ น์์ ์๋ฃํ๊ณ ์ ์ฒด์ ์ธ ์์ฑ์ ๋๋ฎ์ด์ ํค์ ๊ท ์ผํ๊ฒ ๋ง์ถ๋ ๊ณผ์ ์ ๊ฑฐ์ณค๋๋ฐ, ์ด ๊ณผ์ ์์ ์์ฑ์ด ๋ค์ ๋ถํธํ๊ณ ๊ธฐ๊ณ์์ฒ๋ผ ๋ค๋ฆฌ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ตํ์๋ฉด์ ๋ถํธํจ์ ๋๋ผ์ จ๋ค๋ฉด ๋๋ฅธ ์ํด๋ฅผ ๋ถํ๋๋ฆฝ๋๋ค.๋ํ, ๊ฐ์ ์๋ฃ๋ฅผ ๋์ถฉ AI๋ก ๋ง๋ค์๋ค๋ ๋ง์์ ๋ํด์๋ ์ ๋ ๊ทธ๋ ์ง ์๋ค๋ ์ ์ ๋ถ๋ช ํ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ์ด ๊ฐ์๋ 'AI ๋ธ๊น์ ์๋ ์๋ฆฌ๋ก ๋ํํ๋ Node.js์ CS'๋ผ๋ ์ด๋ฆ์ ๊ฑธ๋ง๊ฒ, ์์ ์ง์์ด ์๋ ๊น์ ์๋ฆฌ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ค๋ ๊ธฐ๊ฐ ์ฒ ์ ํ๊ฒ ์ค๋นํ์ต๋๋ค. ์๋ง์ ๊ณต์ ๋ฌธ์์ ์ ๋ขฐํ ์ ์๋ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ค์ ๊ผผ๊ผผํ ์ดํด๋ณด๊ณ ์ต๋ํ ๋ ผ๋์ ์ฌ์ง๊ฐ ์๋๋ก ์ฌํ์ ๊ธฐ์ธ์์ต๋๋ค. ์๊ฐ์๋ถ๋ค์ ์๊ฐ์ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์ผ๋ถ ์ด๋ฏธ์ง ์์์ AI ๋๊ตฌ๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ผ๋, ์ ์ฒด ์ฌ๋ผ์ด๋์ผ๋ ์ ๊ฐ ์ง์ ํ๋ํ๋ ๊ผผ๊ผผํ๊ฒ ๊ธฐํํ๊ณ ์ ์ํ์ต๋๋ค. ๋๋ถ์ด ๊ฐ์ ์์๋ฟ๋ง ์๋๋ผ ๋ด์ฉ ์ ๋ฐ์ ์ ๋ฆฌํ ๋ ธํธ๊น์ง ํ๋๋ถํฐ ์ด๊น์ง ์ ์์ ๊ฑฐ์ณ ๋ค๋ฌ์์ต๋๋ค. ๊ณ ๊ฑดํธ ๋๊ป์ ์ด ๊ฐ์๋ฅผ ์ํด ์ง๋ถํด ์ฃผ์ ๋น์ฉ, ๊ทธ ์ด์์ ๊ฐ์ด์น๋ฅผ ๋ฐ๋์ ์ป์ด ๊ฐ์ค ์ ์๋๋ก ์ง์ฌ์ ๋คํด ์ค๋นํ ๊ฐ์์ ๋๋ค.ํ์ธํด ๋ณด๋ ์์ง 1๊ฐ๋ฐ์ ์๊ฐํ์ง ์์ผ์ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ, ๋ง์ฝ ์ด ๊ฐ์ ์๊ฐ์ ๊ณ์ ํฌ๋งํ์ ๋ค๋ฉด ๊ผญ ์ฌ๋ฌ ๊ฐ์๋ฅผ ์ด์ด์ ์๊ฐํด ๋ณด์๋ ๊ฒ์ ๊ถ์ฅํด ๋๋ฆฝ๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ์๊ฐ ๋ง์กฑ์ค๋ฝ์ง ์๊ณ ๋์ ํ ๋ฉ๋์ด ๋์ง ์์ผ์ ๋ค๋ฉด, ์ ๊ฐ ์ ๊ฐ์ธ ์ฌ๋น๋ก ์ ์ก ํ๋ถํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ํ๋ถ ๋ฐ ๊ธฐํ ๋ฌธ์๋ฅผ ์ํ ์ ์ด๋ฉ์ผ ์ฃผ์๋ jeony0535@naver.com์ ๋๋ค.๋์ผ๋ก ๊ฐ์๋ฅผ ๋ค์ผ์๋ฉด์ ๋ด์ฉ์ ๋ํด ๊ถ๊ธํ ์ ์ด ์๊ธฐ์ ๋ค๋ฉด ์ธ์ ๋ ํธํ๊ฒ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์. ์์ธํ ๋ต๋ณํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- Likes
- 0
- Comments
- 1
- Viewcount
- 105
Q&A
BFF์ ํ์์ฑ
์๋ ํ์ธ์ ์ ธ๋๋, ์์ ์ ๋๋ฌด ์ ๋ฃ๊ณ ๊ณ์ ๋ค๋ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋จ์ํ ๊ธฐ๋ฅ ๊ตฌํ์ ๋์ด์ ์ธ์ฆ๊ณผ ์ธ๊ฐ์ ์ํคํ ์ฒ, ๊ทธ๋ฆฌ๊ณ ๋ณด์์ ๋ณธ์ง์ ์ธ ๋ถ๋ถ๊น์ง ๊น์ด ๊ณ ๋ฏผํ์๋ฉฐ ํ๋ก์ ํธ์ ์ ์ฉํด ๋ณด๋ ค๋ ๋ชจ์ต์ด ์๋์ด ๊ฐ๋ฐ์๋ก ์ฑ์ฅํด ๋๊ฐ๋ ์์ฃผ ํ๋ฅญํ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ง๋ฌธํ์ ๋ด์ฉ์ ๋ํด ์ค๋ฌด์ ์ธ ๊ด์ ๊ณผ ์ค์ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฐํ์ผ๋ก ์ต๋ํ ์์ธํ๊ฒ ๋ต๋ณํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ์๋ฉด, ์์ ๋ก๊ทธ์ธ์ ๋์ ํ์ฌ ์ธ๊ฐ ์ฒ๋ฆฌ๋ฅผ ๊ตฌ๊ธ์ด๋ ์นด์นด์ค ๊ฐ์ ์ธ๋ถ ํ๋ก๋ฐ์ด๋์๊ฒ ์์ํ๋๋ผ๋ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ์๋ฒ ์ฌ์ด์ ์์นํ๋ BFF ํจํด์ ์ฌ์ ํ ๋งค์ฐ ํ์ํ๋ฉฐ, ์คํ๋ ค ๋ณด์๊ณผ ์ ์ฒด์ ์ธ ์์คํ ์ํคํ ์ฒ ์ธก๋ฉด์์ ํจ์ฌ ๋ ์ค์ํ๊ณ ๊ฐ๋ ฅํ ์ญํ ์ ์ํํ๊ฒ ๋ฉ๋๋ค.OAuth๊ฐ ์ธ์ฆ๊ณผ ์ธ๊ฐ๋ฅผ ์์ํ๋ ๊ฒ์ ๋ง์ง๋ง, ๊ทธ๊ฒ์ ์ด๋๊น์ง๋ ์ฐ๋ฆฌ์ ์๋น์ค์ ์ธ๋ถ ํ๋ก๋ฐ์ด๋ ์ฌ์ด์ ์ ๋ขฐ ๊ด๊ณ๋ฅผ ๊ตฌ์ถํ๋ ๋ฌธ์ ์ผ ๋ฟ, ์ต์ข ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ฐ๋ฆฌ์ ์๋น์ค ๊ฐ์ ์ด๋ฃจ์ด์ง๋ ํต์ ์ ์ด๋ป๊ฒ ์์ ํ๊ฒ ๋ณดํธํ ๊ฒ์ธ๊ฐ๋ ์ฌ์ ํ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ค๊ณํ๊ณ ํด๊ฒฐํด์ผ ํ ํต์ฌ ๊ณผ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.์ค๋ฌด ์ผ์ด์ค์ ์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ๋ฉฐ BFF๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์ญํ ์ ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๋ฒํผ์ ํด๋ฆญํ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ ๊ตฌ๊ธ ์๋ฒ์ ํต์ ํ๋ ๊ฒ์ด ์๋๋ผ ๋จผ์ ์ฐ๋ฆฌ์ BFF ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ ๋๋ค. ๊ทธ๋ฌ๋ฉด BFF๊ฐ ์ฌ์ฉ์๋ฅผ ๊ตฌ๊ธ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ์ํค๊ณ , ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์๋ฃํ๋ฉด ๊ตฌ๊ธ์ ๋ค์ ์ฐ๋ฆฌ์ BFF ์๋ฒ๋ก ์ธ๊ฐ ์ฝ๋๋ฅผ ์ ๋ฌํ๊ฒ ๋ฉ๋๋ค.์ฌ๊ธฐ์ OAuth 2.0 ์คํ์ด ์ ์ํ๋ ํด๋ผ์ด์ธํธ์ ๋ ๊ฐ์ง ์ข ๋ฅ์ธ ํผ๋ธ๋ฆญ ํด๋ผ์ด์ธํธ(Public Client)์ ๊ธฐ๋ฐ ํด๋ผ์ด์ธํธ(Confidential Client)์ ๊ฐ๋ ์ด ์ค์ํด์ง๋๋ค. ๋ธ๋ผ์ฐ์ ์ฒ๋ผ ๋ชจ๋ ์ฝ๋๊ฐ ์ธ๋ถ๋ก ๋ ธ์ถ๋๋ ํ๊ฒฝ์ ํผ๋ธ๋ฆญ ํด๋ผ์ด์ธํธ๋ผ๊ณ ํ๊ณ , ์๋ฒ์ฒ๋ผ ๋น๋ฐํค๋ฅผ ์์ ํ๊ฒ ์จ๊ธธ ์ ์๋ ํ๊ฒฝ์ ๊ธฐ๋ฐ ํด๋ผ์ด์ธํธ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๋ง์ฝ ํ๋ก ํธ์๋์์ ์ง์ ์์ ๋ก๊ทธ์ธ์ ์ฒ๋ฆฌํ๋ค๋ฉด, ์ธ๋ถ ํ๋ก๋ฐ์ด๋์๊ฒ ์ธ์ฆ ํ ํฐ์ ๋ฐ์์ค๊ธฐ ์ํด ๋ฐ๋์ ํ์ํ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ ๊ฐ ๋ฑ์ด ๋ธ๋ผ์ฐ์ ์ ๋คํธ์ํฌ ํญ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ค ์ฝ๋์ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ ์น๋ช ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.๋ฌผ๋ก ์ต๊ทผ์๋ ํ๋ก ํธ์๋ ๊ฐ์ ํผ๋ธ๋ฆญ ํด๋ผ์ด์ธํธ์์๋ ์ํฌ๋ฆฟ ์์ด ์ธ๊ฐ ์ฝ๋๋ฅผ ์์ ํ๊ฒ ๊ตํํ ์ ์๋ PKCE(Proof Key for Code Exchange) ๋ฐฉ์์ด ํ์ค์ผ๋ก ์๋ฆฌ ์ก๊ณ ์๊ธฐ๋ ํฉ๋๋ค. ํ์ง๋ง PKCE๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๊ฒฐ๊ตญ ๋ฐ๊ธ๋ฐ์ '์ก์ธ์ค ํ ํฐ' ์์ฒด๋ฅผ ๋ธ๋ผ์ฐ์ ์ด๋๊ฐ์ ์ ์ฅํด์ผ ํ๋ค๋ ๊ทผ๋ณธ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ๊ณ ์ค๋ํ ๋จ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ด ๊ณผ์ ์ BFF๋ฅผ ํตํด ์ฒ๋ฆฌํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ๋จ์ํ ํ๋ฉด ์ด๋๋ง ๋ด๋นํ๊ณ ์ค์ ์ธ๊ฐ ์ฝ๋๋ฅผ ์ฌ์ฉํด ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ๋ฏผ๊ฐํ ๋คํธ์ํฌ ํต์ ์ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ด ์์ ํ๊ฒ ์จ๊ฒจ์ง ์๋ฒ ์ฌ์ด๋, ์ฆ BFF ๋ด๋ถ์์๋ง ์งํ๋๋ฏ๋ก ๋ณด์ ์์ค์ด ๋น์ฝ์ ์ผ๋ก ์์นํฉ๋๋ค.์ด๋ ๊ฒ BFF๊ฐ ๊ตฌ๊ธ์ด๋ ์นด์นด์ค๋ก๋ถํฐ ์ก์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ๊ธ๋ฐ์ ์ดํ์ ํ๋ฆ๋ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ง์ฝ ์ด ํ ํฐ๋ค์ ๊ทธ๋๋ก ๋ธ๋ผ์ฐ์ ๋ก ๋ด๋ ค๋ณด๋ด์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋ฑ์ ์ ์ฅํ๊ฒ ๋ง๋ ๋ค๋ฉด, ์ด๋ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ๋ธ๋ผ์ฐ์ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ํ์ทจํ๋ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ๊ณต๊ฒฉ์ ์์ฃผ ์ข์ ๋จน์๊ฐ์ด ๋์ด๋ฒ๋ฆฝ๋๋ค.๋ฐ๋ก ์ด ์ง์ ์์ BFF๊ฐ ์์ฃผ ์ฐ์ํ๊ณ ๊ฒฌ๊ณ ํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํฉ๋๋ค. BFF๋ ํ๋ก๋ฐ์ด๋๋ก๋ถํฐ ๋ฐ์ ํ ํฐ์ด๋ ํน์ ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ฐ๋ฆฌ ๋ด๋ถ ๋ฐฑ์๋์์ ์๋ก ๋ฐ๊ธํ ์์ฒด ํ ํฐ์ ๋ธ๋ผ์ฐ์ ์ ์ ๋ ๋๊ธฐ์ง ์๊ณ , ์์ ์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ๋์ค ๊ฐ์ ์ธ๋ถ ์บ์ ์์คํ , ํน์ ์์ ํ ์ธ์ ์คํ ๋ฆฌ์ง์ ๋ณด๊ดํฉ๋๋ค. ๊ทธ ๋์ ๋ธ๋ผ์ฐ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์ ๋ ์ ๊ทผํ ์ ์๋๋ก HttpOnly ์์ฑ๊ณผ Secure ์์ฑ์ด ์๊ฒฉํ๊ฒ ๋ถ์ฌ๋ ์ธ์ ์ฟ ํค๋ง์ ๋ฐ๊ธํ์ฌ ๋ด๋ ค์ค๋๋ค.์ด๋ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด XSS ๊ณต๊ฒฉ์ ์๋ฒฝํ๊ฒ ๋ฐฉ์ดํ ์ ์์ง๋ง, ๋์ ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์์กฐ(CSRF) ๊ณต๊ฒฉ์ ๋ ธ์ถ๋ ์ ์๋ค๋ ์ ์ ํจ๊ป ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์ดํ๊ธฐ ์ํด ์ฟ ํค์ SameSite=Strict (๋๋ ํ๊ฒฝ์ ๋ฐ๋ผ Lax) ์์ฑ์ ๋ถ์ฌํ๊ฑฐ๋, CSRF ํ ํฐ์ ํ์ฉํ๋ ์ํคํ ์ฒ๋ฅผ ์ถ๊ฐ๋ก ๊ตฌ์ฑํ๊ฒ ๋ฉ๋๋ค.์ดํ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ๋ง์ดํ์ด์ง ์ ๋ณด๋ฅผ ์์ฒญํ๊ฑฐ๋ ๊ฒฐ์ ๋ฅผ ์๋ํ๋ ๋ฑ API๋ฅผ ํธ์ถํ ๋๋ง๋ค ์ด ์์ ํ ์ฟ ํค๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ํด ์๋์ผ๋ก ์๋ฒ๋ก ์ ์ก๋ฉ๋๋ค. ์์ฒญ์ ๋ฐ์ BFF๋ ์ฟ ํค๋ฅผ ํ์ธํ์ฌ ์์ ์ด ์์ ํ๊ฒ ๋ณด๊ดํ๊ณ ์๋ ์ง์ง ๋ง๋ฅ ํค์ธ ์ก์ธ์ค ํ ํฐ์ ๊บผ๋ธ ๋ค, ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ค์ด์คํธ๋ฆผ ๋ฐฑ์๋ API ์๋ฒ๋ก ์์ฒญ์ ๋๋ฆฌํ์ฌ ์ ๋ฌํ๋ ํ๋ก์ ์ญํ ์ ์๋ฒฝํ๊ฒ ์ํํ๊ฒ ๋ฉ๋๋ค.์ฌ์ฉ์๊ฐ ์๋น์ค๋ฅผ ์ด์ฉํ๋ค ๋ณด๋ฉด ํ์ฐ์ ์ผ๋ก ์ก์ธ์ค ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋๋ ์๊ฐ์ด ์ฐพ์์ต๋๋ค. ์ด๋ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ด์ฉํด ์๋ก์ด ํ ํฐ์ ์ฌ๋ฐ๊ธ๋ฐ๋ ๋ก์ง์ ์๊ฐ๋ณด๋ค ๋งค์ฐ ๊น๋ค๋กญ์ต๋๋ค. ํ๋ก ํธ์๋์์ ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๋์๋ค๋ฐ์ ์ผ๋ก API ์์ฒญ์ ๋ณด๋ด๋ ์ํฉ์์ ํ ํฐ์ด ๋ง๋ฃ๋์๋ค๋ฉด, ์๋ง์ ์์ฒญ์ด ๋์์ ๊ฐฑ์ ์ ์๋ํ๊ฒ ๋์ด ์ถฉ๋์ด ๋ฐ์ํ๋ ์ด๋ฅธ๋ฐ ๊ฒฝ์ ์ํ(Race Condition)์ ๋น ์ง ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ง๊ธฐ ์ํด ํ๋ก ํธ์๋์ Axios ์ธํฐ์ ํฐ ๋ฑ์์ ๋ฎคํ ์ค ๋ฝ์ ๊ฑธ๊ฑฐ๋ ์์ฒญ๋ค์ ํ(Queue)์ ๋ด์๋๊ณ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฑ ๋ณต์กํ ์ ์ด๊ฐ ํ์ํด์ง๋๋ค.์ด๋ฌํ ๋ฌด๊ฒ๊ณ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ๊ฐ์ ํ๋ก ํธ์๋ ์์ญ์ ๋๋ ๊ฒ์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ ์์น์ ํฌ๊ฒ ์ด๊ธ๋ฉ๋๋ค. ํ์ง๋ง BFF ์ํคํ ์ฒ์์๋ ํ๋ก ํธ์๋๊ฐ ํ ํฐ์ ๋ง๋ฃ ์ฌ๋ถ๋ฅผ ์ ํ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค. ๋ฐฑ์๋ API๊ฐ ํ ํฐ ๋ง๋ฃ ์๋ฌ๋ฅผ ๋ฐํํ๋ฉด, ์ค๊ฐ์ ์๋ BFF๊ฐ ์ด๋ฅผ ๊ฐ๋ก์ฑ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๊ฒฝ์์ ์ฆ๊ฐ์ ์ผ๋ก ํ ํฐ ๊ฐฑ์ ๋ก์ง์ ์ ๋ดํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. ์๋ก์ด ํ ํฐ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ ์์ ์ ์คํ ๋ฆฌ์ง๋ฅผ ์ ๋ฐ์ดํธํ ํ, ์คํจํ๋ ์๋์ ์์ฒญ์ ๋ค์ ๋ฐฑ์๋๋ก ๋ณด๋ด์ด ์ ์์ ์ธ ์๋ต์ ๋ฐ์๋ธ ๋ค ํ๋ก ํธ์๋์๊ฒ ๋งค๋๋ฝ๊ฒ ์ ๋ฌํด ์ค๋๋ค. ํ๋ก ํธ์๋ ์ฝ๋๋ ํ ํฐ์ด๋ผ๋ ์กด์ฌ ์์ฒด๋ฅผ ๋ชจ๋ฅธ ์ฑ ์ค๋ก์ง ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๋ ๋๋ง์๋ง ์จ์ ํ ์ง์คํ ์ ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค.๋ง์ง๋ง์ผ๋ก ๋ฐ์ดํฐ ์ ๊ทํ(Normalization) ๊ณผ์ ์์์ ์ด์ ๋ ๋นผ๋์ ์ ์์ต๋๋ค. ๊ตฌ๊ธ, ์นด์นด์ค, ๋ค์ด๋ฒ ๋ฑ ์ฌ๋ฌ ์์ ๋ก๊ทธ์ธ์ ์ฐ๋ํ๋ค ๋ณด๋ฉด ๊ฐ ํ๋ก๋ฐ์ด๋๊ฐ ๋ฐํํด ์ฃผ๋ ์ฌ์ฉ์ ์ ๋ณด์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํ๋ ์ด๋ฆ์ด ๋ชจ๋ ์ ๊ฐ๊ฐ์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋ฉ๋๋ค. ์ด ์ ์ ๋์ง ์๊ณ ํํธํ๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ํ๋ก ํธ์๋๊ฐ ์ง์ ๋ฐ์์ ์กฐ๊ฑด๋ฌธ์ ๋จ๋ฐํ๋ฉฐ ํ์ฑํ๊ณ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๋งค์ฐ ๋นํจ์จ์ ์ ๋๋ค. BFF๋ ์ด๋ ๊ฒ ๋ค์ํ ํํ๋ก ๋ค์ด์ค๋ ์๋ต ๋ฐ์ดํฐ๋ฅผ ํ๋ก ํธ์๋๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ๋ฑ ์ข์ ํ๋์ ํต์ผ๋ ๊ท๊ฒฉ์ผ๋ก ์์๊ฒ ์ ์ ํ๊ณ ์กฐ๋ฆฝํ์ฌ ๋๊ฒจ์ฃผ๋ ์ญํ ์ ์ํํ์ฌ ํ๋ก ํธ์๋์ ๋ถ๋ด์ ํฌ๊ฒ ๋์ด์ค๋๋ค.์ต๊ทผ ์ค๋ฌด์์ ๋ง์ด ํ์ฉ๋๋ ๋ฅ์คํธ์ ์ด์์ค(Next.js)์ ๋ผ์ฐํธ ํธ๋ค๋ฌ(Route Handlers)๋ ์๋ฒ ์ก์ (Server Actions), ํน์ ๋ ธ๋์ ์ด์์ค(Node.js) ๊ธฐ๋ฐ์ ์๋ฒ ํ๊ฒฝ์ ํ์ฉํ์ฌ BFF๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ณ์ ๋ค๋ฉด, ํ์ฌ ์ ธ๋๋์ด ์ค๊ณํ๊ณ ๋์๊ฐ๋ ๋ฐฉํฅ์ด ์ํคํ ์ฒ์ ์ผ๋ก ์์ฃผ ์ ํํ๋ค๊ณ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ์ธ๋ถ ํ๋ก๋ฐ์ด๋์๊ฒ ์ธ์ฆ์ ์์ํ๋๋ผ๋, ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ ์ ์ฒด์ ์ธ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ๋ณด์์ด๋ผ๋ ๊ฐ์ฅ ์ค์ํ๊ณ ๋ฌด๊ฑฐ์ด ์ฑ ์์ BFF๊ฐ ๊ฐ์ฅ ์์ ํ ์์น์์ ํต์ ํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.ํํํ ์ปดํจํฐ ๊ณตํ์ ๊ธฐ๋ฐ ์ง์๊ณผ ๋คํธ์ํฌ ํ๋ฆ์ ๋ํ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๊ณ ๊ณ์๋, ๋ถ๋ช ๊ตฌ์กฐ์ ์ผ๋ก ์์ฃผ ํ๋ฅญํ๊ณ ๊ฒฌ๊ณ ํ ํ๋ก์ ํธ๊ฐ ์์ฑ๋ ๊ฒ์ด๋ผ ํ์ ํฉ๋๋ค. ํ๋ก์ ํธ๋ฅผ ์งํํ์๋ฉด์ ๋ ๊น์ด ์๋ ๊ณ ๋ฏผ์ด ์๊ธฐ๊ฑฐ๋ ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ํธํ๊ฒ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ์ ธ๋๋์ ๋ฉ์ง ํ๋ก์ ํธ ์์ฑ์ ์ง์ฌ์ผ๋ก ์์ํฉ๋๋ค.์ฐธ๊ณ ํด์ฃผ์ธ์!
- Likes
- 0
- Comments
- 2
- Viewcount
- 53




