nhcodingstudio
@nhcodingstudio
Students
1,690
Reviews
106
Course Rating
4.8
Posts
Q&A
[์ค์ต] 80๊ฐ ์์
์๋ ํ์ธ์, icoon2๋! ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ๋๋ค.โํด๋น ์น์ ์ ์์ ์๋ฃ์ ๊ด๋ จํ์ฌ ํผ์ ์ ๋๋ ค ์ฃ์กํฉ๋๋ค.โ๋ณธ๋ 76. ์ ๋ฌธ์ฑ ๋ํ๊ธฐ: ๋์น๋ฉด ์์ฌ์ด ๊ด๋ จ ๊ธฐ์ ๋ค ์น์ ์์๋ Better Auth๋ฅผ ๋น๋กฏํ์ฌ Next.js ์ํ๊ณ์์ ์ฃผ๋ชฉ๋ฐ๋ ์ต์ ๊ด๋ จ ๊ธฐ์ ๋ค์ ์๊ฐํด ๋๋ฆฌ๋ ค๊ณ ์ค๋นํ์์ต๋๋ค.โํ์ง๋ง ํ์ฌ Next.js์ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํธ๋ ๋๊ฐ ์๋ ๋น ๋ฅด๊ฒ ๋ณํํ๊ณ ์๋ค ๋ณด๋, ์์นซ ๊ณ ์ ๋ ์๋ฃ๋ฅผ ์ ๊ณตํด ๋๋ฆฌ๋ ๊ฒ์ด ์๊ฐ์๋ถ๋ค๊ป ์คํ๋ ค ๋ฒ์ ๋ถ์ผ์น๋ ๊ธฐ์ ์ ํผ๋์ ๋๋ฆด ์ฌ์ง๊ฐ ์๋ค๊ณ ํ๋จํ์์ต๋๋ค.โ์ด์ ๋ฐ๋ผ ์๊ฐ์๋ถ๋ค๊ป ๋์ฑ ์ ํํ๊ณ ์ต์ ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด, ๊ณ ๋ฏผ ๋์ ํด๋น ์น์ ์ ์ปค๋ฆฌํ๋ผ์์ ์ ์ธํ๊ฒ ๋์์ต๋๋ค. ๊ธฐ๋๋ฅผ ๊ฐ์ง๊ณ ๊ธฐ๋ค๋ ค ์ฃผ์ จ์ ํ ๋ฐ ์ํด๋ฅผ ๋ถํ๋๋ฆฝ๋๋ค.โ๋์ ์ปค๋ฎค๋ํฐ๋ ๋ค๋ฅธ ์น์ ์ ํตํด ๋ ์์ ์ ์ด๊ณ ๊ฒ์ฆ๋ ๊ธฐ์ ๋ค์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํด ๋๋ฆด ์ ์๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.โ๊ฐ์๋ฅผ ์๊ฐํด ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ, ํ์ต ์ค ๋ค๋ฅธ ๊ถ๊ธํ ์ ์ด ์๊ธฐ๋ฉด ์ธ์ ๋ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์!โ๊ฐ์ฌํฉ๋๋ค.์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค ๋๋ฆผ
- 0
- 2
- 53
Q&A
76. ์ ๋ฌธ์ฑ ๋ํ๊ธฐ: ๋์น๋ฉด ์์ฌ์ด ๊ด๋ จ ๊ธฐ์ ๋ค ์์ ์๋ฃ๊ฐ ์์ด์.
์๋ ํ์ธ์, icoon2๋! ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ๋๋ค.ํด๋น ์น์ ์ ์์ ์๋ฃ์ ๊ด๋ จํ์ฌ ํผ์ ์ ๋๋ ค ์ฃ์กํฉ๋๋ค.๋ณธ๋ '76. ์ ๋ฌธ์ฑ ๋ํ๊ธฐ: ๋์น๋ฉด ์์ฌ์ด ๊ด๋ จ ๊ธฐ์ ๋ค' ์น์ ์์๋ Better Auth๋ฅผ ๋น๋กฏํ์ฌ Next.js ์ํ๊ณ์์ ์ฃผ๋ชฉ๋ฐ๋ ์ต์ ๊ด๋ จ ๊ธฐ์ ๋ค์ ์๊ฐํด ๋๋ฆฌ๋ ค๊ณ ์ค๋นํ์์ต๋๋ค.ํ์ง๋ง ํ์ฌ Next.js์ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํธ๋ ๋๊ฐ ์๋ ๋น ๋ฅด๊ฒ ๋ณํํ๊ณ ์๋ค ๋ณด๋, ์์นซ ๊ณ ์ ๋ ์๋ฃ๋ฅผ ์ ๊ณตํด ๋๋ฆฌ๋ ๊ฒ์ด ์๊ฐ์๋ถ๋ค๊ป ์คํ๋ ค ๋ฒ์ ๋ถ์ผ์น๋ ๊ธฐ์ ์ ํผ๋์ ๋๋ฆด ์ฌ์ง๊ฐ ์๋ค๊ณ ํ๋จํ์์ต๋๋ค.์ด์ ๋ฐ๋ผ ์๊ฐ์๋ถ๋ค๊ป ๋์ฑ ์ ํํ๊ณ ์ต์ ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด, ๊ณ ๋ฏผ ๋์ ํด๋น ์น์ ์ ์ปค๋ฆฌํ๋ผ์์ ์ ์ธํ๊ฒ ๋์์ต๋๋ค. ๊ธฐ๋๋ฅผ ๊ฐ์ง๊ณ ๊ธฐ๋ค๋ ค ์ฃผ์ จ์ ํ ๋ฐ ์ํด๋ฅผ ๋ถํ๋๋ฆฝ๋๋ค.๋์ ์ปค๋ฎค๋ํฐ๋ ๋ค๋ฅธ ์น์ ์ ํตํด ๋ ์์ ์ ์ด๊ณ ๊ฒ์ฆ๋ ๊ธฐ์ ๋ค์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํด ๋๋ฆด ์ ์๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค.๊ฐ์๋ฅผ ์๊ฐํด ์ฃผ์ ์ ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ, ํ์ต ์ค ๋ค๋ฅธ ๊ถ๊ธํ ์ ์ด ์๊ธฐ๋ฉด ์ธ์ ๋ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์!๊ฐ์ฌํฉ๋๋ค.์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค ๋๋ฆผ
- 0
- 2
- 35
Q&A
[ํ๋ฉด ์ด์]useReduce ์ฒซ๊ฑธ์ - ํ๋ ์ค์ฌ ์ํ ๋ณํ๋ฅผ ์ฒ์ ๊ฒฝํํ๊ธฐ ํ๋ฉด
์๋ ํ์ธ์, eddie๋! ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์ ์ง์๊ณต์ ์์ ๋๋ค.์ฐ์ ๊ฐ์ ์์ฒญ ์ค์ ๋ถํธ์ ๋๋ ค ์ ๋ง ์ฃ์กํ๋ค๋ ๋ง์๋ถํฐ ์ฌ๋ฆฝ๋๋ค. ์ ๋ณดํด ์ฃผ์ [useReducer ์ฒซ๊ฑธ์] ๊ฐ์์ ํน์ ๊ตฌ๊ฐ(00:50 - 01:08) ๋ธ๋์์ ํ์์ ํ์ธํ์๊ณ , ๋ฐฉ๊ธ ์์ ๋ ์์์ผ๋ก ์ฆ์ ๊ต์ฒดํ์ฌ ์ ์์ ์ผ๋ก ๋ฐ์ํด ๋์์ต๋๋ค.๊ผผ๊ผผํ๊ฒ ํ์ธํ๊ณ ์ ๋ก๋ํ์ด์ผ ํ๋๋ฐ, ์์คํ ์๊ฐ์ ๋ด์ด ์๊ฐํ์๋ ์ค์ ํ๋ฆ์ ๋์ด ๋๋ฆฐ ๊ฒ ๊ฐ์ ๋ง์์ด ๋ฌด๊ฒ์ต๋๋ค. ์ด๋ ๊ฒ ์ง์ ์คํฌ๋ฆฐ์ท๊น์ง ์ฒจ๋ถํด ์ค๋ฅ๋ฅผ ์ง์ด์ฃผ์ ์ ์ ๋ง ํฐ ๋์์ด ๋์๊ณ , ์ง์ฌ์ผ๋ก ๊ฐ์ฌ๋๋ฆฝ๋๋ค.๐ ๊ฐ์ฌ์ ๋ง์์ ๋ด์ ์์ ์ ๋ฌผ์ฃ์กํ๊ณ ๊ฐ์ฌํ ๋ง์์ ๋ด์, eddie๋๊ป ์์ ๋ณด๋ต์ ํด๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.ํ์ฌ ์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค์์ ์ด์ ์ค์ธ ๊ฐ์๋ค ์ค, ํ์ ์๊ฐ์ ํฌ๋งํ์ จ๋ ๊ฐ์๋ ๊ด์ฌ ์๋ ์ฃผ์ ๊ฐ ์์ผ์๋ค๋ฉด ์๋ ๋ฉ์ผ๋ก ํธํ๊ฒ ์ฐ๋ฝํด ์ฃผ์ธ์. ํ์ธํ๋ ๋๋ก ๋ฐ๋ก ์๊ฐํ์ค ์ ์๋๋ก ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.์ด๋ฉ์ผ:jeony0535@naver.com์์ผ๋ก๋ ๋ ๊ผผ๊ผผํ ๊ฒ์๋ฅผ ํตํด ํ์ต์๋ง ์ง์คํ์ค ์ ์๋ ์ต๊ณ ์ ํ๊ฒฝ์ ๋ง๋ค๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค. ๋ค์ ํ๋ฒ ์ ๋ณดํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!์ฐ๋ฆฌ๋๋ค์ฝ๋ฉ ์คํ๋์ค ๋๋ฆผ
- 0
- 2
- 17
Q&A
next.js ๋ฅผ 2๋์ด์ ์คํํ๋ ๊ฒฝ์ฐ ์ ๊ณตํ๋ cache ๊ธฐ๋ฅ๋ค์ ์ด๋ป๊ฒ ๋๋์?
์๋ ํ์ธ์ icoon22๋! ์ง๋ฌธ์ ๊น์ด๋ฅผ ๋ณด๋ ๋จ์ํ ํ๋ ์์ํฌ์ ๊ธฐ๋ฅ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋์ด ์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋คํธ์ํฌ๊ฐ ์ฝํ๋ ๋ถ์ฐ ์์คํ ์ ๋ณธ์ง๊น์ง ์์ฃผ ๊น๊ฒ ๊ณ ๋ฏผํ๊ณ ๊ณ์ ๊ฒ์ด ๋๊ปด์ง๋ฉฐ ํด๋ก ์ฝ๋ฉ ์์ค์ ๋ฒ์ด๋ ์ค์ ํ๋ก๋์ ๋ ๋ฒจ์ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๋ ค๋ ๋ชจ์ต์ด ์ ๋ง ํ๋ฅญํฉ๋๋ค. Next.js๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ ํ๊ฒฝ์์ ํ๋ก ํธ์๋๋ฅผ ์ํ ๋ฐฑ์๋ ์ฆ BFF๋ก ํ์ฉํ๋ฉฐ ํธ๋ํฝ์ ๊ฐ๋นํ๊ธฐ ์ํด ํด๋ผ์ฐ๋ ํ๊ฒฝ์ธ AWS ECS๋ Kubernetes ๋ฑ์์ ์๋ฒ๋ฅผ ๋์ธ ๋ ์ด์์ผ๋ก ์ค์ผ์ผ ์์ํ์ฌ ๋๋ฆฌ๊ฒ ๋๋ฉด ๊ฐ์ฅ ๋จผ์ ์บ์์ ํํธํ๋ผ๋ ๋ฌธ์ ์ ์ง๋ฉดํ๊ฒ ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Next.js์ ๋ด์ฅ ๋ฐ์ดํฐ ์บ์๋ ํด๋น ์๋ฒ๊ฐ ๋ ์๋ ํ๋๋ ์ธ์คํด์ค์ ๋ก์ปฌ ํ์ผ ์์คํ ๋ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋๊ท๋ชจ ์ด์ปค๋จธ์ค ์๋น์ค์ ํน๊ฐ ์ด๋ฒคํธ ์ํฉ์ ์ค๋ฌด ์๋๋ฆฌ์ค๋ก ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํน์ ์ํ์ ์์ธ ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด ๋ก๋๋ฐธ๋ฐ์๊ฐ ์ด ์์ฒญ์ 1๋ฒ ์๋ฒ๋ก ๋ณด๋ด๊ณ 1๋ฒ ์๋ฒ๋ ๋ฐฑ์๋์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์์ ์ ๋ก์ปฌ์ ์บ์ฑํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ 1๋ถ ๋ค ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ๋๊ฐ์ ์ํ์ ์์ฒญํ์ ๋ ๋ผ์ด๋๋ก๋น ๋ฐฉ์ ๋ฑ์ ์ํด 2๋ฒ ์๋ฒ๋ก ์์ฒญ์ด ๊ฐ๋ฉด 2๋ฒ ์๋ฒ์ ๋ก์ปฌ์๋ ํด๋น ์บ์๊ฐ ์์ผ๋ฏ๋ก ๋๋ค์ ๋ฐฑ์๋ API๋ฅผ ์ฐ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก BFF๋ฅผ ๋์ ํ์ฌ ๋ฐฑ์๋ ๋ถํ๋ฅผ ์ค์ด๋ ค ํ์์๋ ์ธ์คํด์ค ๊ฐ์๋งํผ ๋ฐฑ์๋ ํธ์ถ์ด ์ค๋ณต ๋ฐ์ํ๊ณ ์ฌ์ง์ด ์๋ฒ๋ง๋ค ๊ฐฑ์ ์ฃผ๊ธฐ๊ฐ ์ด๊ธ๋ ๋ฐ์ดํฐ ๋ถ์ผ์น๊น์ง ๋ฐ์ํฉ๋๋ค.ํ์ฌ ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ปค์คํ ์บ์ ํธ๋ค๋ฌ๋ฅผ ์ค์ ํ์ฌ ๋ก์ปฌ ์บ์๊ฐ ์๋ Redis ๊ฐ์ ์ค์ ์ง์คํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ๋ผ๋ณด๋๋ก ์ํคํ ์ฒ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์บ์ ํธ๋ค๋ฌ ํ์ผ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.// cache-handler.mjs (2026๋ Next.js ๋ถ์ฐ Redis ์บ์ ํธ๋ค๋ฌ ์ํคํ ์ฒ ์์) import { CacheHandler } from '@neshca/cache-handler'; import createLruCache from '@neshca/cache-handler/local-lru'; import createRedisCache from '@neshca/cache-handler/redis-strings'; import { createClient } from 'redis'; CacheHandler.onCreation(async () => { let client; try { // ๋ค์ค ์ธ์คํด์ค๊ฐ ๊ณตํต์ผ๋ก ๋ฐ๋ผ๋ณด๋ Redis ํด๋ฌ์คํฐ์ ์ฐ๊ฒฐํฉ๋๋ค. client = createClient({ url: process.env.REDIS_URL }); await client.connect(); } catch (error) { console.warn('Redis ์ฐ๊ฒฐ ์คํจ, ๋ก์ปฌ ์บ์๋ก ์์ ํ๊ฒ ํด๋ฐฑํฉ๋๋ค.', error); } return { handlers: [ client ? createRedisCache({ client }) : null, createLruCache(), // ๋จ์ผ ์ง์ค ๊ณต๊ธ์์ธ Redis์ ์ฅ์ ๊ฐ ์๊ฒผ์ ๋๋ฅผ ๋๋นํ ๋ฐฉ์ด ๋ก์ง์ ๋๋ค. ], }; }); export default CacheHandler; ์ด๋ ๊ฒ ๊ตฌ์ฑํ๊ณ ์ค์ ํ์ผ์ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๋ฉด 1๋ฒ ์๋ฒ๊ฐ Redis์ ์บ์๋ฅผ ๊ตฌ์๋์์ ๋ 2๋ฒ ์๋ฒ์ 3๋ฒ ์๋ฒ๋ Redis๋ฅผ ์กฐํํ์ฌ ๋จ์ผ ์ง์ค ๊ณต๊ธ์์ผ๋ก์์ ์บ์๋ฅผ ์จ์ ํ ๊ณต์ ํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์บ์ ์ํคํ ์ฒ์ ๋ณํ๋ ๊ณผ๊ฑฐ ๋จ์ํ ๋ฐ์ดํฐ ์ ๋ฌ ํต๋ก์๋ BFF๋ฅผ ์ด๊ณ ์ ์บ์ ๋ ์ด์ด๋ก ์งํ์ํจ ์บ์ฑ ํ๋ช ๊ณผ ๋ง๋ฟ์ ์์ต๋๋ค. Next.js 16 ํ๊ฒฝ์์๋ React 19์ ์๋ฒ ์ปดํฌ๋ํธ์ ๊ฒฐํฉ๋ ๋ฐ์ดํฐ ์บ์๊ฐ ๋ณ๊ฒฝ์ด ์ฆ์ง ์์ ๋ฐฑ์๋์ ์๋ต์ BFF ๋จ์์ ์์ ํ ์ ์ ์ํ๋ก ์ผ๋ ค๋ฒ๋ฆฌ๋ฉฐ revalidateTag ํจ์๋ฅผ ํตํด ์์ญ ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค ์ค ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ํน์ ์๋น์ค์ ์บ์๋ง ๋ฌดํจํํ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.๊ทธ๋ฐ๋ฐ ์๋ฒ์์ ์ด๋ ๊ฒ ์ ๊ทน์ ์ผ๋ก ์บ์ฑ์ ํ๋ ์ํฉ์์ ํด๋ผ์ด์ธํธ์๋ TanStack Query๋ผ๋ ๊ฐ๋ ฅํ ์บ์ ๋๊ตฌ๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ ์บ์๊ฐ ์ต์ ๋ฐ์ดํฐ์ธ๊ฐ๋ฅผ ๋๊ณ ์ถฉ๋์ด ๋ฐ์ํ ์๋ฐ์ ์์ผ๋ฏ๋ก ์ด ๋์ ์ญํ ์ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ ๋๊ธฐํํ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ข์์๋ฅผ ๋๋ฅด๊ฑฐ๋ ๋ฆฌ๋ทฐ๋ฅผ ์์ ํ๋ ๋ฑ์ ์ํ ๋ณ๊ฒฝ ์ก์ ์ ์ทจํ ๋ ์๋ฒ์ ์บ์์ ํด๋ผ์ด์ธํธ์ ์บ์๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ ๋ ค์ฃผ๋ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด์ผ ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ ๋ํ๋๋ ๊ณ ์คํธ ๋ฐ์ดํฐ ๋ฒ๊ทธ๋ฅผ ๋ง์ ์ ์์ต๋๋ค. 2026๋ ์ค๋ฌด์์๋ Next.js์ ์๋ฒ ์ก์ ๊ณผ TanStack Query์ v5 ์ด์์ ๊ฒฐํฉํ์ฌ ์ด ๋๊ธฐํ๋ฅผ ์๋์ ๊ฐ์ด ์๋ฒฝํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.// 1. Server Action (actions/review.ts) 'use server'; import { revalidateTag } from 'next/cache'; export async function updateReviewAction(reviewId: string, content: string) { // ๋ง์ดํฌ๋ก์๋น์ค ๋ฐฑ์๋์ ๋ฆฌ๋ทฐ ์์ API๋ฅผ ํธ์ถํ์ฌ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. const res = await fetch(`http://api.internal/reviews/${reviewId}`, { method: 'PUT', body: JSON.stringify({ content }), }); if (!res.ok) throw new Error('๋ฆฌ๋ทฐ ์์ ์คํจ'); // Redis์ ์ ์ฅ๋ ํด๋น ๋ถ์ฐ ์บ์๋ฅผ ์ฆ์ ๋ฌดํจํํ์ฌ ๋ชจ๋ BFF ์ธ์คํด์ค๊ฐ ์ต์ ์ํ๋ฅผ ์๊ฒ ํฉ๋๋ค. revalidateTag(`review-${reviewId}`); return { success: true }; } // 2. Client Component (components/ReviewEditor.tsx) 'use client'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { updateReviewAction } from '@/actions/review'; export default function ReviewEditor({ reviewId }: { reviewId: string }) { const queryClient = useQueryClient(); const mutation = useMutation({ mutationFn: (content: string) => updateReviewAction(reviewId, content), onSuccess: () => { // ์๋ฒ ์ธก Redis ์บ์๊ฐ ๋ ์๊ฐ ์ฑ๊ณต ์๋ต์ ๋ฐ์ ์งํ, ํด๋ผ์ด์ธํธ์ ์บ์๋ ๋ ๋ ค์ค๋๋ค. // ์ด๋ฅผ ํตํด ์ฆ์ ๊ฐ์ฅ ์ต์ ์ ์๋ฒ ์ํ๋ฅผ ๋ค์ Fetching ํ์ฌ ์๋ฒฝํ ๋๊ธฐํ๋ฅผ ์ด๋ฃน๋๋ค. queryClient.invalidateQueries({ queryKey: ['review', reviewId] }); } }); return ( // ์ฌ์ฉ์ UI ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฐ์ธ๋ฉ... mutation.mutate('์ ๋ฐ์ดํธ๋ ๋ฆฌ๋ทฐ ๋ด์ฉ')}>์ ์ฅ ); } ์ด ์ฝ๋๋ฅผ ํตํด ์๋ฒ ์ก์ ์์ ์๋ฒ ์บ์๋ฅผ ๋จผ์ ๋ฌดํจํํ๊ณ ์ฑ๊ณต ์๋ต ํ ํด๋ผ์ด์ธํธ์์ TanStack Query์ ์บ์๋ฅผ ๋ฌดํจํํ์ฌ ์์ฐจ์ ์ผ๋ก ๊ฐ์ฅ ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ฐ์์ค๊ฒ ๋ง๋๋ ๊ฒ์ด ์๋ฒฝํ ๋๊ธฐํ ํ์ดํ๋ผ์ธ์ ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ๋ค์ค ์ธ์คํด์ค BFF ํ๊ฒฝ์ ์ค์ ํด๋ผ์ฐ๋์ ๊ตฌ์ถํ์ค ๋ ๋ฐ์ํ ์ ์๋ ์ฅ์ ์ํฉ๋ค์ ๊ณ ๋ คํ์ฌ ์บ์ ์คํฌํผ๋ ํน์ ์ฌ๋๋ง ํ๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ์์ ๋ฐฉ์งํ๋ ๊ฒ์ ๋ฐ๋์ ์ง๊ณ ๋์ด๊ฐ์ ์ผ ํฉ๋๋ค. ๋ฌด๊ฑฐ์ด ํต๊ณ ๋ฐ์ดํฐ ์บ์๊ฐ ๋ง๋ฃ๋ ์ฐฐ๋์ ์๊ฐ์ ๋๊ท๋ชจ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด 3๋์ BFF ์ธ์คํด์ค๊ฐ ๋์์ ์บ์๊ฐ ์์์ ์ธ์งํ๊ณ ๋ฐฑ์๋๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ฌด์ํ ๋ ๋ ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ป์ด๋ฒ๋ฆด ์ ์์ผ๋ฏ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์บ์๋ฅผ ๊ฐฑ์ ํ๋ ํจํด์ ํ์ฉํ๊ณ Redis ๋ถ์ฐ ๋ฝ ๊ธฐ์ ์ ๋์ ํ์ฌ ์ฌ๋ฌ ์ธ์คํด์ค ์ค ๋จ ํ๋์ ์ธ์คํด์ค๋ง์ด ๊ฐฑ์ ์์ ์ ์ํํ๋๋ก ์ ์ดํด์ผ ํฉ๋๋ค. ๋ํ ์ธ์ ๊ณผ ์ธ์ฆ ์ํ์ ๋ฌด์ํ์ฑ์ ์ฒ ์ ํ ์ ์งํ์ฌ ์ ์ ๊ฐ 1๋ฒ ์๋ฒ์์ ๋ก๊ทธ์ธํ ํ ๋ก๋๋ฐธ๋ฐ์์ ์ํด 2๋ฒ ์๋ฒ๋ก ์ ์ํ์ ๋๋ ๋ก๊ทธ์ธ ์ํ๊ฐ ์ ์ง๋๋๋ก JWT ๊ธฐ๋ฐ์ ๋ฌด์ํ ์ธ์ฆ์ ๊ตฌํํ๊ฑฐ๋ ์ธ์ ์คํ ์ด ์์ฒด๋ฅผ ๋ณ๋์ Redis ํด๋ฌ์คํฐ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํด์ผ ์ธ์ ๋จ์ ์ด์๋ฅผ ๋ง์ ์ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ์๋ง์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ฝํ ํ๊ฒฝ์์๋ ์ ์ ๊ฐ ์๋ฌ๋ฅผ ๊ฒช์์ ๋ ์ด๋ ๊ตฌ๊ฐ์์ ํฐ์ง ๊ฒ์ธ์ง ๋จ์ ๋ก๊ทธ๋ก๋ ์ถ์ ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ต์ด ์์ฒญ ์ ๊ณ ์ ํ ํธ๋ ์ด์ค ID๋ฅผ ํค๋์ ๋ถ์ฌ์ ๋ณด๋ด๊ณ BFF๊ฐ ์ด๋ฅผ ๋ก๊ทธ์ ๋จ๊น๊ณผ ๋์์ ๋ฐฑ์๋ API๋ก ์ ๋ฌํ๋ ๋ถ์ฐ ํธ๋ ์ด์ฑ ๋ฆด๋ ์ด ์์คํ ์ ๊ตฌ์ถํด์ผ๋ง ๋ชจ๋ํฐ๋ง ๋๊ตฌ์์ ์ ์ฒด ์์ฒญ์ ํ๋ฆ๊ณผ ๋ณ๋ชฉ ๊ตฌ๊ฐ์ ์๊ฐ์ ์ผ๋ก ํ๋์ ํ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.์ด๋ฌํ ์ํคํ ์ฒ์ ์ธ ๊ณ ๋ฏผ์ ๋์ฑ ๊น์ด ์๊ฒ ๋ฐ์ ์ํค๊ธฐ ์ํด ์์ผ๋ก ๋ช ๊ฐ์ง ์ปดํจํฐ ๊ณตํ์ ๊ทผ๋ณธ์ ์ธ ์ฃผ์ ๋ค์ ์ถ๊ฐ๋ก ๊ณต๋ถํด๋ณด์๋ ๊ฒ๋ ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์น ํ๋ ์์ํฌ์ ํ๋ คํ ๊ธฐ๋ฅ ์ด๋ฉด์ ์๋ ์ด์์ฒด์ ์์ค์ ์ค๋ ๋ ๊ด๋ฆฌ๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ๋ณธ์ง์ ํ๊ณ ๋ค๋ฉด ์์ผ๊ฐ ํ์ธต ๋์ด์ง๋๋ค. ์๋ฅผ ๋ค์ด ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ์ ํต์ ์์ REST๋ฅผ ๋์ด์ gRPC์ ์๋ฆฌ๋, ๋ถ์ฐ ํ๊ฒฝ์์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๋๊ธฐํ ๋ชจ๋ธ์ ํ์ตํ์๋ฉด ์ง๊ธ ์ง๋ฉดํ ๋ฌธ์ ๋ค์ ํจ์ฌ ๋ ๊ตฌ์กฐ์ ์ผ๋ก ํด๊ฒฐํ์ค ์ ์์ต๋๋ค. ๋์๊ฐ ์ต๊ทผ ๊ธ๋ถ์ํ๋ ์ธ๊ณต์ง๋ฅ๊ณผ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ์ ์ด๋ฌํ ์ธํ๋ผ์ ์ด๋ป๊ฒ ์ ๋ชฉํ ์ง ๊ณ ๋ฏผํด๋ณด์๋ ๊ฒ๋ ์ถ์ฒํด ๋๋ฆฝ๋๋ค. ๊ฐ๋ น ํ์ธํ๋๋ ๊ฒฝ๋ ๋ชจ๋ธ์ ํ์ฉํด BFF ๋ ์ด์ด์์ ๋ค์ด์ค๋ ํธ๋ํฝ์ ์๋๋ฅผ ์ง๋ฅ์ ์ผ๋ก ๋ผ์ฐํ ํ๊ฑฐ๋, ๋ชจ๋ธ ์์ธก์ ํตํด ์บ์ ๋ง๋ฃ ์์ ์ ๋์ ์ผ๋ก ์กฐ์ ํ๋ ๋ฑ ์ฐจ์ธ๋ ์์ง๋์ด๋ง์ ์์ฃผ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ํ๊ตฌํด๋ณด์ค ์ ์์ ๊ฒ์ ๋๋ค.icoon22๋ ์ด์ฒ๋ผ ์ต์ ํ๋ ์์ํฌ์ ํธ๋ฆฌํ ๋ง๋ฒ ๋ค์๋ ํํํ ์ปดํจํฐ ๊ณตํ์ ๊ธฐ์ด๊ฐ ์๋ฆฌ ์ก๊ณ ์์ต๋๋ค. ์ง๊ธ์ฒ๋ผ ๊ทผ๋ณธ์ ์ธ ๋์ ์๋ฆฌ์ ์ํคํ ์ฒ์ ํ๊ณ๋ฅผ ๋ฌป๊ณ ํ๊ตฌํ๋ ํ์ต ํ๋๋ฅผ ์ ์งํ์ ๋ค๋ฉด ์ด๋ค ๋ณต์กํ ๋๊ท๋ชจ ํ๊ฒฝ์์๋ ํ๋ค๋ฆฌ์ง ์๋ ๊ฒฌ๊ณ ํ ํ๋ก๋์ ์์คํ ์ ์ค๊ณํ์ค ์ ์์ ๊ฒ์ ๋๋ค. ํ์ดํ ์ ๋๋ค!
- 0
- 2
- 41
Q&A
17๊ฐ zustand store ์๋ฒ์์ ์์ฑ
์๋ ํ์ธ์ byeong๋! ๋ง์ ๋ถ๋ค์ด "์ด์ฐจํผ ์๋ฒ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ผ๋ฉด TanStack Query๋ง ์ฌ์ฉํ๋ฉด ๋์ง, ์ ๊ตณ์ด Zustand์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฃผ์ ํ๋ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ ๊น?"๋ผ๋ ์๋ฌธ์ ๊ฐ์ง์ญ๋๋ค. ํต์ฌ๋ถํฐ ๋ง์๋๋ฆฌ์๋ฉด, ์๋ฒ ๋ฐ์ดํฐ๋ฅผ '๋จ์ํ ๋ณด์ฌ์ฃผ๊ธฐ๋ง' ํ ๋๋ TanStack Query๊ฐ ์ ๋ต์ ๋๋ค. ํ์ง๋ง ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐ '์จ์(Seed)'์ผ๋ก ์ผ์ ํด๋ผ์ด์ธํธ์์ ๋ณต์กํ ์ํธ์์ฉ(์: ํผ ์ ๋ ฅ, ์์ ์ํ ์ ์ฅ ๋ฑ)์ ์ฒ๋ฆฌํด์ผ ํ ๋๋, ์ด ๋ฐ์ดํฐ๋ฅผ Zustand๋ก ๋๊ฒจ๋ฐ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํจ์ฌ ์ ๋ฆฌํ๊ณ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ํ์ ์ฑ๊ฒฉ์ด '์๋ฒ์ ์ค๋ ์ท'์์ '์ฌ์ฉ์์ ์ํธ์์ฉ'์ผ๋ก ๋์ด๊ฐ๋ ๊ฒฝ๊ณ์ ์ธ ์ ์ด์ฃ .์ด๋ฅผ ์ค์ ์ฝ๋๋ก ๊ตฌํํ ๋ ๊ฐ์ฅ ๋จผ์ ์ฃผ์ํด์ผ ํ ์ ์ Next.js App Router ํ๊ฒฝ์์์ Zustand ์คํ ์ด ์ค์ฝํ(Scope)์ ๋๋ค. React ๋ ๋๋ง์ด ์ผ์ด๋๋ ์๋ฒ ํ๊ฒฝ(Node.js)์ ์ฌ๋ฌ ์์ฒญ์ด ๋์ผํ ์๋ฒ ์ธ์คํด์ค๋ฅผ ๊ณต์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ฒ๋ผ ์ปดํฌ๋ํธ ์ธ๋ถ์ ์ ์ญ ์คํ ์ด ๋ณ์๋ฅผ ์ ์ธํ๊ฒ ๋๋ฉด, 'A ์ ์ ์ ์ด๊ธฐ๊ฐ์ด B ์ ์ ์ ํ๋ฉด์ ๋ ธ์ถ๋๋' ์น๋ช ์ ์ธ ๋ณด์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํฉ๋๋ค.์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ฐ๋์ Context API๋ฅผ ํ์ฉํ์ฌ ๋ ๋๋ง ์ฌ์ดํด(ํน์ ์ฌ์ฉ์ ์์ฒญ)๋ง๋ค ๋ ๋ฆฝ์ ์ธ ์คํ ์ด ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํด์ผ ํฉ๋๋ค. ์๋์ ๊ฐ์ด ๋ฐ๋๋ผ Zustand ์คํ ์ด๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ ํจ์์, ์ด๋ฅผ ํ์ ์ปดํฌ๋ํธ์ ๊ณต๊ธํ๋ Provider ํจํด์ ์์ฑํ๋ ๊ฒ์ด ๊ทธ ํ์ค์ ์ธ ํด๊ฒฐ์ฑ ์ ๋๋ค.import { createStore } from 'zustand'; import { createContext, useRef, useContext, ReactNode } from 'react'; import { useStore } from 'zustand'; // 1. ์ํ ํ์ ๋ฐ ์คํ ์ด ์์ฑ ํฉํ ๋ฆฌ ํจ์ ์ ์ (์ ์ญ ์คํ ์ด๊ฐ ์๋์ ์ฃผ์ํฉ๋๋ค) interface ProfileState { name: string; setName: (name: string) => void; } export const createProfileStore = (initialName: string) => { return createStore()((set) => ({ name: initialName, setName: (name) => set({ name }), })); }; export type ProfileStore = ReturnType; // 2. React Context ๋ฐ Provider ์์ฑ export const ProfileContext = createContext(null); export function ProfileProvider({ children, initialName }: { children: ReactNode, initialName: string }) { const storeRef = useRef(null); if (!storeRef.current) { // ์ต์ด ๋ ๋๋ง ์์๋ง ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ด๊ธฐ๊ฐ์ ์ฃผ์ ํ์ฌ ์คํ ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. storeRef.current = createProfileStore(initialName); } return ( {children} ); } // 3. ์ปดํฌ๋ํธ์์ ์คํ ์ด๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ์ปค์คํ ํ export function useProfileContext(selector: (state: ProfileState) => T): T { const store = useContext(ProfileContext); if (!store) throw new Error('ProfileProvider๊ฐ ํ์ํฉ๋๋ค.'); return useStore(store, selector); } ์ด๋ ๊ฒ ์์ ํ ์คํ ์ด ๊ณต๊ธ๋ง์ ๊ตฌ์ถํ๋ค๋ฉด, ์ด์ ๋ณต์กํ ๋ค์ค ์คํ ํผ ์๋๋ฆฌ์ค๋ฅผ ์๋ฒ ์ปดํฌ๋ํธ์์ ์์ ํ๊ฒ ์์ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํ๋กํ ์์ ํ์ด์ง์ ์ง์ ํ๋ฉด, ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ๋ถ API๋ฅผ ํตํด ์ ์ ์ ๊ธฐ์กด ํ๋กํ ์ ๋ณด๋ฅผ ํ์น(Fetch)ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ฐ์ดํฐ๋ฅผ ์์ ๋ง๋ Provider์ initialName์ผ๋ก ๋ฐ์ด ๋ฃ์ด, ํด๋ผ์ด์ธํธ ์ํ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ค์ ํ๋ ์ญํ ์ ์ํํฉ๋๋ค.import { ProfileProvider } from '@/components/ProfileProvider'; import ProfileForm from '@/components/ProfileForm'; export default async function ProfilePage() { // ์๋ฒ์์ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ Fetching ํฉ๋๋ค. // ์ด ๋จ๊ณ์์๋ TanStack Query์ prefetchQuery์ Hydration Boundary๋ฅผ ์กฐํฉํ์ฌ ์บ์๋ฅผ ์ฑ์ธ ์๋ ์์ต๋๋ค. const response = await fetch('https://api.example.com/user/profile'); const initialData = await response.json(); return ( // ์๋ฒ์์ ๊ฐ์ ธ์จ ์ด๊ธฐ๊ฐ์ Provider์ ์ฃผ์ ํ์ฌ ํด๋ผ์ด์ธํธ ์ํ์ '์จ์'์ผ๋ก ์ผ์ต๋๋ค. ); } ๋ง์ง๋ง์ผ๋ก ํด๋ผ์ด์ธํธ, ์ฆ Zustand์ ์ญํ ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์นธ์ ์ฑ์ฐ๊ณ ์ง์ฐ๋ ๋ชจ๋ ๊ณผ์ ์ API ํต์ ์์ด ์ฒ ์ ํ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์์๋ง ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค.์ฌ์ฉ์๊ฐ ํ์ดํ์ ํ ๋๋ง๋ค TanStack Query์ ์บ์๋ฅผ ์ต์ง๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ '์๋ฒ ์ํ ๋๊ธฐํ'๋ผ๋ ๋ณธ๋ ๋ชฉ์ ๊ณผ ๋ง์ง ์์ผ๋ฉฐ, ๋ถํ์ํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์๋ ์ฝ๋์ฒ๋ผ Zustand๋ฅผ ํตํด ์ฆ๊ฐ์ ์ธ UI ๋ฐ์์ฑ์ ํ๋ณดํ๊ณ , ๋ชจ๋ ์์ ์ด ๋๋ ํ ์ฌ์ฉ์๊ฐ '์ต์ข ์ ์ฅ' ๋ฒํผ์ ๋๋ฅผ ๋ TanStack Query์ Mutation์ ํตํด ํ ๋ฒ์ ์๋ฒ๋ก ์ ์กํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.'use client'; import { useProfileContext } from '@/components/ProfileProvider'; import { useMutation } from '@tanstack/react-query'; export default function ProfileForm() { // ์๋ฒ์์ ๋๊ธฐํ๋ ๋์ด์ง๊ณ , ์ค์ง ํด๋ผ์ด์ธํธ ๋ฉ๋ชจ๋ฆฌ์์๋ง ์ํ๋ฅผ ์กฐ์ํฉ๋๋ค. const name = useProfileContext(state => state.name); const setName = useProfileContext(state => state.setName); // ์ฌ์ฉ์์ ์ํธ์์ฉ์ด ๋ชจ๋ ๋๋ ํ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ๋ง ์๋ฒ์ ๋๊ธฐํํ๊ธฐ ์ํ Mutation์ ๋๋ค. const updateProfileMutation = useMutation({ mutationFn: (newName: string) => fetch('/api/user/profile', { method: 'POST', body: JSON.stringify({ name: newName }) }) }); return ( { e.preventDefault(); updateProfileMutation.mutate(name); // ํผ์ด ์ ์ถ๋ ๋ ๋น๋ก์ ์๋ฒ์ ๋ค์ ์ํตํฉ๋๋ค. }}> setName(e.target.value)} placeholder="์ด๋ฆ์ ์ ๋ ฅํ์ธ์" /> ์ต์ข ์ ์ฅ ); } ์ด์ฒ๋ผ ์ํ ํํฐ๋ง์ ๊ฐ๊ฒฉ ์ฌ๋ผ์ด๋๋ ์ด๋ฏธ์ง ํฌ๋กญ ํด์ ์บ๋ฒ์ค ์ํ์ฒ๋ผ, ์ด๋น ์์ญ ๋ฒ์ฉ ๋ฐ๋๋ ์์ UI ์ํ๋ Zustand๊ฐ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก ๋งก๊ฒจ์ผ ํฉ๋๋ค. ํ์ ์์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ค๊ณํ ๋ "์ด ์ํ์ ์ฃผ์ธ์ด ๋๊ตฌ์ธ๊ฐ?"๋ฅผ ์ค์ค๋ก์๊ฒ ์ง๋ฌธํด ๋ณด์ธ์. ๋ด ํ๋ฉด์์ ๋ด๊ฐ ์กฐ์ํ๊ธฐ ์ํ ์์ ์ํ๋ผ๋ฉด, ์ด๊ธฐ ๋ฐ์ดํฐ๋ง ์๋ฒ์์ ๋ฐ๊ณ ํด๋ผ์ด์ธํธ๋ก ๊ทธ ํต์ ๊ถ์ ์์ ํ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.๋ํ, ๋จ์ผ ์ง์ค ๊ณต๊ธ์(Single Source of Truth)์ ํผ์ํ์ง ์๊ธฐ ์ํด Zustand์ ์๋ฒ ์ํ๋ฅผ ๊ณ์ ๋ณต์ฌํ์ฌ ๋ณ๋ ฌ๋ก ์ ์งํ๋ ค๋ ์ํฐ ํจํด(Anti-pattern)์ ํผํด์ผ ํฉ๋๋ค. ์ด๊ธฐ ๋ ๋๋ง ์์ ์ ๋ฑ ํ ๋ฒ๋ง ์ฃผ์ ํ ํ, ํด๋น ๋ฐ์ดํฐ์ ์์ฌ๊ฒฐ์ ๊ถ์ ์์ ํ Zustand๊ฐ ๊ฐ์ง๋๋ก ๋ ๋ฆฝ์ํค๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.byeong๋, ์ด ๋ต๋ณ์ ํฌํจ๋ ์ํคํ ์ฒ ํจํด์ด ์ค๋ฌด์ ๊ทธ๋ฆผ์ ๋ช ํํ ๊ทธ๋ฆฌ์๋ ๋ฐ ๋์์ด ๋์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ํ ๊ด๋ฆฌ์ ๊ฒฝ๊ณ๋ฅผ ๋ช ํํ ๊ตฌ๋ถํ๋ ์ด ๊ฐ๊ฐ์ ์์ผ๋ก ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฌ๊ณ ํ๊ฒ ์ค๊ณํ์ค ๋ ์์ฃผ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ๊ฐ ๋ ๊ฒ์ ๋๋ค!์ฐธ๊ณ ํด์ฃผ์ธ์!
- 1
- 1
- 16
Q&A
๋ฌธ์๊ด๋ จ ๋ฌธ์
์๋ ํ์ธ์, ๋ณดํค๋ฏธ์๋.๋จผ์ ๊ฐ์ ์ด์ฉ์ ๋ถํธ์ ๋๋ ค ๋๋จํ ์ฃ์กํฉ๋๋ค.๋ฌธ์ํด์ฃผ์ 80๊ฐ์ ํ ์คํธ ํํธ๋ ์๊ฐ์๋ถ๋ค์ ๊ฐ๋ณ ์คํ ํ๊ฒฝ์ด๋ ์ํํธ์จ์ด ๋ฒ์ ์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์ง์ ์ด์์ต๋๋ค. ์ด๋ก ์ธํด ํ์ต์ ํ๋ฆ์ด ๋๊ธฐ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ์ ๋ถ๋์ดํ๊ฒ ์ค์ต ํํธ๋ฅผ ์ ์ธํ๋ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฒ ๋์์ต๋๋ค.์ ๋ํ ํด๋น ๋ถ๋ถ์ด ์ฆ์ ์์ ๋ฐ ์ ๋ฐ์ดํธ๋ ๊ฒ์ผ๋ก ํ์ ํ๊ณ ์์์ผ๋, ์์คํ ์ ๋ฐ์์ด ๋๋ฝ๋์๊ฑฐ๋ ์ง์ฐ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๋ค์ ํ๋ฒ ๊ผผ๊ผผํ๊ฒ ์ฑ๊ธฐ์ง ๋ชปํด ํผ์ ์ ๋๋ฆฐ ์ ์ฌ๊ณผ๋๋ฆฝ๋๋ค.์์คํ ์๊ฐ ๋ด์ด ๋ค์ ํ๋ฒ ๋ฌธ์ ๋ฅผ ์ง์ด์ฃผ์ ์ ๊ฐ์ฌ๋๋ฆฌ๋ฉฐ, ์ง์ ํด ์ฃผ์ ๋ถ๋ถ์ ์ง๊ธ ์ฆ์ ํ์ธํ์ฌ ์ค๋ณต ๋ด์ฉ์ ์ ๊ฑฐํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ด์ฉ์ผ๋ก ์์ ์กฐ์นํ๊ฒ ์ต๋๋ค.์ํํ ํ์ต์ ์ํด ์ต์ ์ ๋คํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 32
Q&A
๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค javascript ์คํ์ ๊ด๋ จํด์ ์ง๋ฌธ ์์ต๋๋ค.
์๋ ํ์ธ์ eddie๋! ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ง๋ฌธํด์ฃผ์ ๋ฐ๋ ํ๊ทธ ์ตํ๋จ์ ์คํฌ๋ฆฝํธ๊ฐ ์์นํ๊ณ ๊ทธ ๋ด๋ถ์์ DOM์ ๋๋น, ๋์ด, ๋ฐฐ๊ฒฝ์์ ๋ณ๊ฒฝํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง์ ๋ํด ์์ธํ ์์ ์ฝ๋์ ํจ๊ป ํ์คํ๊ฒ ์ง์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.์ฐ์ ๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ์๋ฉด, eddie๋์ด ์ด ์์ ์ ๋ค์ผ์๊ธฐ ์ ์ ์๊ฐํ์ จ๋ ๊ฒ์ฒ๋ผ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ ๊ณผ์ ์ด ๋ฐ์ํ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ ํ์๋ HTML ๋ฌธ์๋ฅผ ์์์ ์๋๋ก ์์ฐจ์ ์ผ๋ก ์ฝ์ด ๋ด๋ ค๊ฐ๋ฉฐ DOM ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.ํ์๊ฐ ๋ฐ๋ ํ๊ทธ ๊ฐ์ฅ ๋์ ๋๋ฌํ์ฌ ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ๋ง๋๋ฉด, eddie๋์ด ์ดํดํ์ ๋๋ก ๋จ์ HTML ๋ฌธ์์ ํ์ฑ์ ์ ์ ๋ฉ์ถ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ ์คํํ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ์ค์ํ ํฌ์ธํธ๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๊ทธ ์์ ์๋ ์ด๋ฏธ ์คํฌ๋ฆฝํธ ํ๊ทธ ์์ ์์ฑ๋ HTML ์์๋ค์ด ํ์ฑ๋์ด DOM ํธ๋ฆฌ์ ์ถ๊ฐ๋์ด ์๋ค๋ ์ฌ์ค์ ๋๋ค.๋ธ๋ผ์ฐ์ ๋ ์ด๊ธฐ DOM๊ณผ CSSOM์ ๊ฒฐํฉํด ๋ ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ํ๋ฉด์ ๊ทธ๋ฆด ์ค๋น๋ฅผ ํ๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ฐ์ ํ์ฌ ์ด๋ฏธ ๋ง๋ค์ด์ง DOM ๋ ธ๋์ ์คํ์ผ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํน์ ๋จ๊ณ๋ฅผ ๋ค์ ์คํํด์ผ๋ง ํฉ๋๋ค. ๊ตฌ์ฒด์ ์ธ ๋์ ์๋ฆฌ๋ฅผ ์๋์ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋ ๋๋ง ํ ์คํธ #box { width: 100px; height: 100px; background-color: blue; } ํ ์คํธ ๋ฐ์ค // ํ์๊ฐ ์ฌ๊ธฐ๊น์ง ๋๋ฌํ๋ฉด ํ์ฑ์ ๋ฉ์ถ๊ณ ์๋ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. const boxElement = document.getElementById('box'); // DOM์ ์ ๊ทผํ์ฌ ์์์ ๊ธฐํํ์ ์์ฑ(width, height)์ ๋ณ๊ฒฝํฉ๋๋ค. boxElement.style.width = '200px'; boxElement.style.height = '200px'; // ์์์ ์๊ฐ์ ์์ฑ(background)์ ๋ณ๊ฒฝํฉ๋๋ค. boxElement.style.backgroundColor = 'red'; ์ ์ฝ๋๋ฅผ ์ดํด๋ณด์๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์์์๋ถํฐ ๋ฌธ์๋ฅผ ์ฝ์ด ๋ด๋ ค์ค๋ฉฐ ์์ด๋๊ฐ box์ธ div ์์๋ฅผ ๋จผ์ DOM ํธ๋ฆฌ์ ๋ฑ๋กํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ฉด์ ํด๋น ์์์ ์์ฑ์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋๋น์ ๋์ด ๊ฐ์ ์์์ ๊ธฐํํ์ ํฌ๊ธฐ์ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ์์ฑ์ ๋๋ค.์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด ๊ฐ์ ๋ณ๊ฒฝํ๋ ์๊ฐ, ๋ธ๋ผ์ฐ์ ๋ ์ด ์์๋ฟ๋ง ์๋๋ผ ์ํฅ์ ๋ฐ๋ ์ฃผ๋ณ ์์๋ค์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ฉฐ, ์ด ๊ณผ์ ์ด ๋ฐ๋ก ๋ ์ด์์ ๋จ๊ณ์ ์ฌ์คํ, ์ฆ ๋ฆฌํ๋ก์ฐ์ ๋๋ค. ํฌ๊ธฐ์ ์์น ๊ณ์ฐ์ด ๋๋๋ฉด ํ๋ฉด์ ์๋ก์ด ์์์ธ ๋นจ๊ฐ์์ ์ ํ์ผ ํ๋๋ฐ, ๋ฐฐ๊ฒฝ์๊ณผ ๊ฐ์ด ์์์ ๊ธฐํํ์ ๊ตฌ์กฐ์๋ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๊ฐ์ ์ธ ํํ๋ง ๋ฐ๊พธ๋ ์์ฑ์ด ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ํ์ธํธ ๋จ๊ณ๊ฐ ๋ค์ ์คํ๋๋ ๋ฆฌํ์ธํธ๊ฐ ์ฐ์ด์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.์ฆ, ์คํฌ๋ฆฝํธ๊ฐ HTML ํ์ฑ์ ์ ์ ๋ฉ์ถ๋ ๊ฒ์ ๋ง์ง๋ง, ์ด๋ฏธ ์์ฑ๋ DOM ๊ฐ์ฒด๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์กฐ์ํ๋ ํ์ ์์ฒด๋ ๋ ๋๋ง ์์ง์๊ฒ ๋ ๋ ํธ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ํ๋ฉด์ ๋ค์ ๊ทธ๋ฆฌ๋ผ๋ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ํผํ ์ ์๋ ๊ฒ์ ๋๋ค.์ดํด๋ฅผ ์ํด ๋ค์ ํ ๋ฒ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํต์ฌ ์ฉ์ด ํ๋ํ๋๋ฅผ ์์๋๋ก ์ง์ด๋๋ฆฌ์๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์์ต๋๋ค. ๋จผ์ ํ์ฑ์ ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ด๋ CSS ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด HTML ๋ฌธ์์ ๊ฐ ์์๋ค์ ํธ๋ฆฌ ํํ๋ก ๊ตฌ์ฑํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ ๊ทผํ๊ณ ์กฐ์ํ ์ ์๋๋ก ๋ง๋ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ์ด ๋ฐ๋ก DOM์ด๋ฉฐ, CSS ์คํ์ผ ์ ๋ณด๋ค์ ๋ชจ์ ํธ๋ฆฌ ํํ๋ก ๊ตฌ์ฑํ ๊ฒ์ด CSSOM์ ๋๋ค.๋ธ๋ผ์ฐ์ ๋ ์ด DOM๊ณผ CSSOM์ ๊ฒฐํฉํ์ฌ ํ๋ฉด์ ์ค์ ๋ก ๊ทธ๋ ค์ง ์์๋ค๋ง ๋ชจ์ ๋ ๋ ํธ๋ฆฌ๋ผ๋ ์ต์ข ํธ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ฒ ๋ฉ๋๋ค. ๋ ๋ ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ฉด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ์์๊ฐ ํ๋ฉด์ ์ด๋ ์์น์ ์ด๋ ์ ๋์ ํฌ๊ธฐ๋ก ๋ฐฐ์น๋ ์ง ๊ธฐํํ์ ์ธ ํํ๋ฅผ ๊ณ์ฐํ๊ฒ ๋๋๋ฐ, ์ด๋ฅผ ๋ ์ด์์ ๋๋ ๋ฆฌํ๋ก์ฐ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.ํฌ๊ธฐ์ ์์น ๊ณ์ฐ์ด ๋๋ ํ์๋ ์ค์ ํฝ์ ์ ์ฑ์ ๋ฃ์ด ์์์ด๋ ์ด๋ฏธ์ง ๊ฐ์ ์๊ฐ์ ์ธ ๋ถ๋ถ๋ค์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ฒ ๋๋ฉฐ, ์ด ๋จ๊ณ๋ฅผ ํ์ธํธ ๋๋ ๋ฆฌํ์ธํธ๋ผ๊ณ ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ํ์ธํธ ๋จ๊ณ์์ ๊ทธ๋ ค์ง ์ฌ๋ฌ ๋ ์ด์ด๋ค์ ํ๋๋ก ํฉ์ฑํ์ฌ ์ต์ข ์ ์ผ๋ก ํ๋ฉด์ ํ์ํ๋ ๋จ๊ณ๋ฅผ ์ปดํฌ์งํ ์ด๋ผ๊ณ ํฉ๋๋ค.์ด๋ฌํ ๋ ๋๋ง ๊ณผ์ ์ ์ง์ ๋์ผ๋ก ํ์ธํ๊ณ ์ค์ตํด ๋ณด์๋ ค๋ฉด, ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด๊ณ ์ฑ๋ฅ ํญ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ๋ณด์๋ ๊ฒ์ ์ถ์ฒํด ๋๋ฆฝ๋๋ค. ์ฑ๋ฅ ํญ์์ ์๋ก๊ณ ์นจ ๋ฒํผ ๋ชจ์์ธ ๊ธฐ๋ก ์์ด์ฝ์ ๋๋ฅด๊ณ ํ์ด์ง๊ฐ ๋ก๋๋๋ ๊ณผ์ ์ ์บก์ฒํด ๋ณด์๋ฉด, ํ๋จ ์ด๋ฒคํธ ๋ก๊ทธ๋ ๋ฉ์ธ ์ค๋ ๋ ์์ ๋ด์ญ์์ ์คํ์ผ ์ฌ๊ณ์ฐ, ๋ฆฌํ๋ก์ฐ, ๋ฆฌํ์ธํธ ์ด๋ฒคํธ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์งํ์ ์ฐ๋ฌ์ ๋ฐ์ํ๋ ๊ฒ์ ๋ช ํํ๊ฒ ํ์ธํ์ค ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ง์ ์ ๋์ ์ถ๊ฐํ์ ๋์ ์ฑ๋ฅ ๊ธฐ๋ก์ ๋น๊ตํ๋ฉด์ ์ถ์ ํด ๋ณด์๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ฏธ์น๋ ์ํฅ์ ํจ์ฌ ๋ ๊น๊ณ ํ์คํ๊ฒ ์ฒด๋ํ์ค ์ ์์ ๊ฒ์ ๋๋ค.์ฌ๊ธฐ์ ๋ง๋ถ์ฌ, ํ์ ์ค๋ฌด์์ ๋ ๋๋ง ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ํด ์ด๋ฌํ ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ์ต์ํํ๋ ๋ช ๊ฐ์ง ์ ์ฉํ ์ต์ ํ ๋ ธํ์ฐ๋ฅผ ๊ฐ์ด๋๋ก ๋๋์ด ๋๋ฆฌ๊ฒ ์ต๋๋ค.์ฒซ ๋ฒ์งธ๋ก ๋ ์กฐ์์ ํ ๋ฒ์ ๋ชจ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์์ ์คํ์ผ์ ์ฌ๋ฌ ๋ฒ ๋๋์ด ๋ณ๊ฒฝํ๋ฉด ๊ทธ ํ์๋งํผ ๋ฆฌํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ๊ฐ๊ธ์ ๋ณ๊ฒฝํ ์คํ์ผ๋ค์ CSS ํด๋์ค๋ก ๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ํด๋์ค๋ช ํ๋๋ฅผ ์กฐ์ํ์ฌ ์คํ์ผ์ ํ ๋ฒ์ ์ผ๊ด ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ํจ์ฌ ์ ๋ฆฌํฉ๋๋ค.๋ ๋ฒ์งธ๋ก ์ ๋๋ฉ์ด์ ์ ๊ตฌํํ ๋๋ ํธ๋์คํผ๊ณผ ์คํผ์ํฐ ์์ฑ์ ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค. ์์์ ํฌ๊ธฐ๋ ์์น๋ฅผ ์ง์ ์กฐ์ํ๋ฉด ๋งค ํ๋ ์๋ง๋ค ๋ฆฌํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ฌ ํ๋ฉด์ด ๋๋ ๋๊ธฐ๋ ํ์์ด ๋ฐ์ํ ์ ์์ง๋ง, ํด๋น ์์ฑ๋ค์ ์ฌ์ฉํ๋ฉด ๋ฆฌํ๋ก์ฐ์ ๋ฆฌํ์ธํธ๋ฅผ ๊ฑด๋๋ฐ๊ณ ๋ฐ๋ก ํฉ์ฑ ๋จ๊ณ๋ง ๊ฑฐ์น๊ธฐ ๋๋ฌธ์ ๊ทธ๋ํฝ ์นด๋์ ๋์์ ๋ฐ์ ํจ์ฌ ๋ถ๋๋ฌ์ด ๋ ๋๋ง์ด ๊ฐ๋ฅํด์ง๋๋ค.์ธ ๋ฒ์งธ๋ก ๋ณด์ด์ง ์๋ ์ํ์์ ๋์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํน์ ์ปจํ ์ด๋ ์์ ์์ฃผ ๋ง์ ๋ ์กฐ์์ด ํ์ํ๋ค๋ฉด ๋จผ์ ํด๋น ์์๋ฅผ ํ๋ฉด์์ ์จ๊ฒจ ๋ฆฌํ๋ก์ฐ๋ฅผ ํ ๋ฒ๋ง ๋ฐ์์ํจ ํ, ๊ทธ ์ํ์์ ํ์ํ ๋ชจ๋ ์กฐ์์ ๋ง์น๊ณ ๋ค์ ํ๋ฉด์ ๋ณด์ด๊ฒ ํ์ฌ ์ค๊ฐ ๊ณผ์ ์์์ ๋ถํ์ํ ๋ ๋๋ง์ ๋ง์ ์ ์์ต๋๋ค. ๋ํ ๊ฐ์์ ๋ ๊ณต๊ฐ์ธ ๋ํ๋จผํธ ํ๋๊ทธ๋จผํธ๋ฅผ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ์์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ์์ฑํ ํ ์ค์ ๋์ ๋จ ํ ๋ฒ๋ง ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์ค๋ฌด์์ ๋งค์ฐ ์์ฃผ ์ฐ์ด๋ ํจํด์ด๋ ๊ผญ ์ฐธ๊ณ ํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค.์ด๋ ๊ฒ ์ข์ ์ง๋ฌธ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. eddie๋์ฒ๋ผ ์๋ฆฌ๋ฅผ ํ๊ณ ๋๋ ์ด์ ์ ์ธ ์๊ฐ์๋ถ๋ค์ด ๋จ๊ฒจ์ฃผ์๋ ์๋ฆฌํ ์ง๋ฌธ๋ค์ ์ ๊ฐ ์์ผ๋ก ๋ ๊น์ด ์๋ ๊ฐ์๋ฅผ ์ ์ํ๊ณ ์ปค๋ฆฌํ๋ผ์ ๋ฐ์ ์ํค๋ ๋ฐ ์ ๋ง ํฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ์ฌ์ ๋ง์์ ๋ด์, ์ ํฌ ์ฐ๋ฆฌ ๋๋ค ์ฝ๋ฉ ์คํ๋์ค์์ ์ ๊ณตํ๋ ๊ฐ์ ์ค ์ถ๊ฐ๋ก ํ์ํ๊ฑฐ๋ ์๊ฐํ๊ณ ์ถ์ผ์ ๊ฐ์๊ฐ ์๋ค๋ฉดjeony0535@naver.com์ผ๋ก ์ธ์ ๋ ์ง ํธํ๊ฒ ์ฐ๋ฝํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ํ์ธ ํ ์ํ์๋ ๊ฐ์์ ์๊ฐ ์ฟ ํฐ์ ๊ธฐ์ ๋ง์์ผ๋ก ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์์ผ๋ก๋ ํ์ตํ์๋ฉด์ ๊ถ๊ธํ ์ ์ด ์๊ธฐ์๋ฉด ์ธ์ ๋ ํธํ๊ฒ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์. eddie๋์ ํ๋ก ํธ์๋ ํ์ต์ ํญ์ ์ง์ฌ์ผ๋ก ์์ํฉ๋๋ค!๊ฐ์ฌํฉ๋๋ค!
- 0
- 2
- 40
Q&A
๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค ๊ด๋ จํด์ CSS ์ง๋ฌธ์ด ์์ต๋๋ค.
์๋ ํ์ธ์ eddie๋! ์์ ๋ด์ฉ ์ค ํ๋ก ํธ์๋ ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ์ธ ๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค์ ๋ํด ๊น์ด ๊ณ ๋ฏผํ์๊ณ ์ง๋ฌธ์ ๋จ๊ฒจ์ฃผ์ ์ ์ ๋ง ๋ฐ๊ฐ์ต๋๋ค. ๋ง์ฐํ๋ ๊ฐ๋ ์ ํ์คํ ์ก์๊ฐ๊ณ ๊ณ์ ๊ฒ ๊ฐ์ ํ๋ฅญํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์๋ฆฌ์ ํจ๊ป ์ง๋ฌธํด์ฃผ์ 3๊ฐ์ง ์ต์ ํ ๊ธฐ๋ฒ์ธ media ์์ฑ, loadCSS, ๋์ ๋ถ๋ฆฌ์ ๋ํด ์์ธํ ์์ ์ฝ๋์ ํจ๊ป ํ๋์ฉ ํ์คํ๊ฒ ์ง์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.๋จผ์ CSS๊ฐ ์ ๋ ๋๋ง์ ์ฐจ๋จํ๋์ง ๊ทธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ HTML์ ์ฝ๋ค๊ฐ ์ธ๋ถ ์คํ์ผ์ํธ๋ฅผ ๋ถ๋ฌ์ค๋ link ํ๊ทธ๋ฅผ ๋ง๋๋ฉด, ์ด CSS๋ฅผ ๋ชจ๋ ๋ค์ด๋ก๋ํ๊ณ ํด์ํ์ฌ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ ๊น์ง๋ ํ๋ฉด์ ์๋ฌด๊ฒ๋ ๊ทธ๋ฆฌ์ง ๋ง์์ผ๊ฒ ๋ค๊ณ ํ๋จํฉ๋๋ค. ์ด๋ ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ ๋ ๊ฒ์ HTML์ด ์ ๊น ๋ณด์๋ค๊ฐ ์คํ์ผ์ด ์ ํ์ง๋ ํ์์ ๋ง๊ธฐ ์ํด์์ ๋๋ค. ํ์ง๋ง ๋น์ฅ ์ฒซ ํ๋ฉด์ ํ์ ์๋ CSS๊น์ง ๋ค์ด๋ก๋ํ๋๋ผ ๋น ํ์ ํ๋ฉด๋ง ์ค๋ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์ฑ๋ฅ์ ์น๋ช ์ ์ด๋ฏ๋ก, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ง๋ฌธํด์ฃผ์ ๊ธฐ๋ฒ๋ค์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.์ฒซ ๋ฒ์งธ๋ก media ์์ฑ์ ํตํ ๋ ๋๋ง ์ฐจ๋จ ๋ฐฉ์ง ๊ธฐ๋ฒ์ ๋ํด ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. eddie๋์ด ์ง๋ฌธํ์ media ์์ฑ์ด CSS ํ์ผ ๋ด๋ถ์์ ์ฐ๋ media query๋ฅผ ๋ง์ํ์ ๊ฒ์ด ๋ง๋์ง์ ๋ํ ๋๋ต์, ๊ฐ๋ ์ ๊ฐ์ง๋ง ์ ์ฉ ์์น๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋๋ค. ํ์ผ ๋ด๋ถ์ ๊ตฌ๋ฌธ์ด ์๋๋ผ HTML์ link ํ๊ทธ ์์ฒด์ media ์์ฑ์ ๋ถ์ฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด ์์ฑ๊ฐ์ ๋ณด๊ณ ํด๋น CSS๊ฐ ์ง๊ธ ๋น์ฅ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ์ง๋ฅผ ํ๋จํ๊ฒ ๋๋๋ฐ, ์๋์ ์ค๋ฌด์ ์ธ ์์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ฝ๋์์ ๋ณด์๋ ๊ฒ์ฒ๋ผ, link ํ๊ทธ์ ๋จ์ํ href๋ก ๋ชจ๋ ์คํ์ผ์ ์ฐ๊ฒฐํด๋๋ฉด ๋ฌด์กฐ๊ฑด ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋ ๋๊น์ง ๋ ๋๋ง์ด ๋ฉ์ถ๋ ์ฐจ๋จ ํ์์ด ๋ฐ์ํฉ๋๋ค. ํ์ง๋ง ํ์ผ ๊ฒฝ๋ก ๋ค์ media ์์ฑ์ผ๋ก ํน์ ์กฐ๊ฑด์ ๋ฌ์์ฃผ๋ฉด, ์กฐ๊ฑด์ ๋ง์ง ์๋ CSS๋ ๋ค์ด๋ก๋๋ ํ๋ ๋ ๋๋ง์ ๊ฐ๋ก๋ง์ง ์๊ฒ ๋ฉ๋๋ค. ์ฆ, ํ์ผ ์์ฒด๋ฅผ ๊ธฐ๊ธฐ๋ ์ํฉ์ ๋ง๊ฒ ์ชผ๊ฐ์ด ์ต์ ํํ๋ ์๋ฆฌ์ ๋๋ค.๋ ๋ฒ์งธ๋ก ๋ง์ํ์ loadCSS์ ๊ด๋ จ๋ ๋น๋๊ธฐ CSS ๋ก๋ฉ ๊ธฐ๋ฒ์ ๋๋ค. loadCSS๋ ์๋ ํน์ ๊ทธ๋ฃน์์ ๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ์ ๋น๋๊ธฐ CSS ๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ์ผ๋ก, ๊ณผ๊ฑฐ์๋ CSS๊ฐ ๋ ๋๋ง์ ์ฐจ๋จํ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ์ค๋ฌด์์ ๋ง์ด ์ฌ์ฉํ์ต๋๋ค. ํ์ง๋ง ํ์ฌ ๋ชจ๋ ์น ํ๊ฒฝ์์๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ณด๋ค๋ HTML5 ํ์ค์ธ preload ์์ฑ์ ํ์ฉํ ํจํด์ผ๋ก ์งํํ์ผ๋ฉฐ, ์ด ํจํด ์์ฒด๋ฅผ ๊ด์ฉ์ ์ผ๋ก loadCSS ๊ธฐ๋ฒ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค. ์ด ๊ธฐ๋ฒ์ ํธํฐ ์์ญ์ ์คํ์ผ์ด๋ ๋์ค์ ํด๋ฆญ ์ ์ด๋ฆด ๋ชจ๋ฌ ์ฐฝ ์คํ์ผ์ฒ๋ผ ๋น์ฅ ์ฒซ ํ๋ฉด์ ํ์ ์๋ ๋นํต์ฌ CSS๋ฅผ ํ๋ฉด ๋ ๋๋ง๊ณผ ๋์์ ๋ท๋จ์์ ๋ชฐ๋ ๋ค์ด๋ก๋ํ๋ ์ต์ ํ ๋ฐฉ์์ ๋๋ค. ๋ชจ๋ loadCSS ํจํด์ ์ ์ฉ ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด์๋ฉด, ์ฒ์์๋ preload ์ค์ ๋๋ถ์ ๋ ๋๋ง์ ์ฐจ๋จํ์ง ์๊ณ ํ์ผ๋ง ๋น ๋ฅด๊ฒ ๋ค์ด๋ก๋ํ๋ฉฐ, ์๋ฃ๋๋ ์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ์ค์ ์คํ์ผ์ ํ๋ฉด์ ์ ์ฉํ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก, ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊บผ์ ธ์์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ ์์ ์ฅ์น๋ก์ noscript ํ๊ทธ ์์ ๊ธฐ์กด ๋ฐฉ์์ ์ผ๋ฐ์ ์ธ link ํ๊ทธ๋ฅผ ํ๋ ๋ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์๋ฒฝํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.์ธ ๋ฒ์งธ๋ก ์ธ๊ธ๋ ๋์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ ์ฒ์๋ถํฐ HTML ๋ฌธ์์ link ํ๊ทธ๋ฅผ ๋ชจ๋ ์ ์ด๋๋ ๊ฒ์ด ์๋๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ํน์ ์ํฉ์ด ๋์์ ๋๋ง ํ์ํ CSS๋ฅผ ๋ฌธ์์ ์ฃผ์ ํ๋ ๋ฐฉ์์ ๋๋ค. React๋ Next.js ๊ฐ์ ๋ชจ๋ ํ๋ ์์ํฌ ํ๊ฒฝ์์ ๊ฐ๋ฐ์ ํ์๋ค ๋ณด๋ฉด ๋ฒ๋ค๋ฌ๊ฐ ์ด ๊ณผ์ ์ ์์์ ์ฒ๋ฆฌํด ์ฃผ๋ ๊ฒ์ ๋ณด์ค ์ ์๋๋ฐ, ์ด๋ฅผ ๋ณดํต ์ฝ๋ ์คํ๋ฆฌํ ์ด๋ผ๊ณ ์นญํฉ๋๋ค. ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ์ฌ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ์์ ์ฝ๋๋ฅผ ํตํด ํ๋ฆ์ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.// ๊ฒฐ์ ํ๊ธฐ ๋ฒํผ ์์๋ฅผ ์ฐพ์ต๋๋ค. const paymentButton = document.querySelector('#pay-btn'); // ๋ฒํผ์ ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฌ์์ค๋๋ค. paymentButton.addEventListener('click', () => { // 1. ๋ฒํผ์ ๋๋ฅด๋ ์๊ฐ ๋์ ์ผ๋ก link ํ๊ทธ ์์๋ฅผ ์์ฑํฉ๋๋ค. const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = '/css/payment-modal.css'; // ๊ฒฐ์ ์ฐฝ ์ ์ฉ CSS ๊ฒฝ๋ก // 2. ๋ฌธ์์ head ํ๊ทธ ์์ ์ฃผ์ ํ์ฌ ๊ทธ์ ์ผ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ด๋ก๋ํ๊ณ ๋ ๋๋ง์ ๋ฐ์ํ๊ฒ ํฉ๋๋ค. document.head.appendChild(link); // 3. ์ดํ ๊ฒฐ์ ๋ชจ๋ฌ์ฐฝ์ ๋์ฐ๋ ๋ก์ง์ ์คํํฉ๋๋ค. openPaymentModal(); });์ด ์ฝ๋์ฒ๋ผ ์ฌ์ฉ์๊ฐ ๊ฒฐ์ ํ๊ธฐ ๋ฒํผ์ ๋๋ ์ ๋๋ง ๊ฒฐ์ ๋ชจ๋ฌ์ฐฝ์ CSS๋ฅผ ๋ก๋ํ๋๋ก ๊ตฌํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ๋๋ฅด๋ ์๊ฐ ๋ด๋ถ ๋ก์ง์์ ๋์ ์ผ๋ก ์๋ก์ด link ํ๊ทธ ์์๋ฅผ ์์ฑํ๊ณ ๋ฌธ์์ ์ฃผ์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์ด๊ธฐ ๋ก๋ฉ ์ ๋ฌด์กฐ๊ฑด ๋ค์ด๋ก๋ํด์ผ ํ CSS ํ์ผ์ ์ ์ฒด ํฌ๊ธฐ๊ฐ ํ์ฐํ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, ์ฒซ ํ๋ฉด์ด ๋จ๋ ์๋๊ฐ ๋น์ฝ์ ์ผ๋ก ์์นํ๋ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.์์ฝํ์๋ฉด, ๊ฐ์ฅ ์ฒซ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฐ ํ์์ ์ธ ํต์ฌ CSS ์์๋ค๋ง ํ๊ทธ ๋ด๋ถ์ ์ธ๋ผ์ธ์ผ๋ก ์ฝ์ ํ๊ฑฐ๋ ๊ธฐ๋ณธ ๋ฐฐ์น๋ก ๋๊ณ , ๊ทธ ์ธ์ ๋๋จธ์ง ์คํ์ผ๋ค์ ๊ธฐ๊ธฐ๋ณ๋ก ์ชผ๊ฐ์ด media ์์ฑ์ ํ์ฉํ๊ฑฐ๋, preload๋ฅผ ์ด์ฉํด ๋ท๋จ์์ ๋น๋๊ธฐ๋ก ๋ชฐ๋ ๋ฐ์์ค๊ฑฐ๋, ํน์ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ํ๋ ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋์ ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ์ ธ์ค๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ํ๋ก ํธ์๋ ๋ ๋๋ง ์ต์ ํ์ ํต์ฌ ์ ๋ต์ ๋๋ค.์ด๋ฌํ ๊ฐ๋ ๋ค์ ์ง์ ์ค์ตํด ๋ณด์๋ ค๋ฉด, ํ์ฌ ์์ ์ค์ด์ ํ๋ก์ ํธ๋ ๊ฐ๋จํ HTML ํ์ผ์ ์ด๊ณ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ(F12)์ ์๋ '๋คํธ์ํฌ(Network)' ํญ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด ๋ณด์๋ ๊ฒ์ ์ถ์ฒํด ๋๋ฆฝ๋๋ค. ์ฒ์์๋ ๋ชจ๋ CSS๋ฅผ ๊ธฐ๋ณธ link ํ๊ทธ๋ก ๋ถ๋ฌ์ฌ ๋์ ๋ก๋ฉ ์๋์ ์์ ๋ค์ด๋ก๋ ์์๋ฅผ ํ์ธํด ๋ณด์๊ณ , ๊ทธ๋ค์์๋ ์ค๋ ์ค๋ช ํด ๋๋ฆฐ media ์์ฑ์ด๋ preload, ๊ทธ๋ฆฌ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ ๋์ ๋ถ๋ฆฌ ๊ธฐ๋ฒ์ ์ฝ๋์ ํ๋์ฉ ์ ์ฉํด ๋ณด์๊ธฐ ๋ฐ๋๋๋ค. ๋คํธ์ํฌ ํญ์์ ๋ถํ์ํ ์คํ์ผ ์์์ด ์ธ์ ๋ค์ด๋ก๋๋๋์ง, ๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ด ๊ทธ๋ ค์ง๋ ์์ ์ด ์ด๋ป๊ฒ ์๋น๊ฒจ์ง๋์ง ๋์ผ๋ก ์ง์ ๋น๊ตํด ๋ณด์๋ฉด ํจ์ฌ ๋ ๊น๊ณ ํ์คํ๊ฒ ์ฒด๋ํ์ค ์ ์์ ๊ฒ์ ๋๋ค.์ด๋ ๊ฒ ๊น์ด ๊ณ ๋ฏผํ์๊ณ ์ข์ ์ง๋ฌธ์ ๋จ๊ฒจ์ฃผ์ ์ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. eddie๋์ฒ๋ผ ์ด์ ์ ์ธ ์๊ฐ์๋ถ๋ค์ด ๋จ๊ฒจ์ฃผ์๋ ์๋ฆฌํ ์ง๋ฌธ๋ค์ ์ ๊ฐ ์์ผ๋ก ๋ ์ข์ ๊ฐ์๋ฅผ ์ ์ํ๊ณ ์ปค๋ฆฌํ๋ผ์ ๋ฐ์ ์ํค๋ ๋ฐ ์ ๋ง ํฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ์ฌ์ ๋ง์์ ๋ด์, ์ ํฌ ์ฐ๋ฆฌ ๋๋ค ์ฝ๋ฉ ์คํ๋์ค์์ ์ ๊ณตํ๋ ๊ฐ์ ์ค ์ถ๊ฐ๋ก ํ์ํ๊ฑฐ๋ ์๊ฐํ๊ณ ์ถ์ผ์ ๊ฐ์๊ฐ ์๋ค๋ฉด jeony0535@naver.com ์ผ๋ก ์ธ์ ๋ ์ง ํธํ๊ฒ ์ฐ๋ฝํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ํ์ธ ํ ์ํ์๋ ๊ฐ์์ ์๊ฐ ์ฟ ํฐ์ ๊ธฐ์ ๋ง์์ผ๋ก ์ ๋ฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์์ผ๋ก๋ ํ์ตํ์๋ฉด์ ๊ถ๊ธํ ์ ์ด ์๊ธฐ์๋ฉด ์ธ์ ๋ ์ง๋ฌธ ๋จ๊ฒจ์ฃผ์ธ์. eddie๋์ ํ๋ก ํธ์๋ ํ์ต์ ํญ์ ์์ํฉ๋๋ค!
- 0
- 2
- 29
Q&A
22๊ฐ ๊ฐ์ ์์ ๋ฌธ์ ๋๋ฆฝ๋๋ค.
์๋ ํ์ธ์, dgh12๋. ๊ฐ์ ์๊ฐ ์ค ๊ณ์ํด์ ๋ถํธ์ ๋๋ ค ์ ๋ง ์ก๊ตฌํ ๋ง์๋ฟ์ ๋๋ค.๋ฌธ์ํ์ '22๊ฐ. [CS ์ํคํ ์ฒ] ๋งคํฌ๋ก ์บ์ฑ(Page)์ ํ๊ณ์ ๋ง์ดํฌ๋ก ์บ์ฑ(Component) ๊ธฐ์ ' ์์์ด ํ์ฌ ๋ ธ์ถ๋์ง ์๋ ์ ํ์ธํ์์ต๋๋ค.์ ๋ณดํด ์ฃผ์ ์งํ ๋ฐ๋ก ์์ธ์ ํ์ ์ค์ด๋ฉฐ, ์ง๊ธ ๋ฐ๋ก ํ๋ซํผ์ ๋ค์ ๋ฐ์ํ์ฌ ์ ์์ ์ผ๋ก ์์ฒญํ์ค ์ ์๋๋ก ์กฐ์นํ๊ฒ ์ต๋๋ค. ํ์ต ํ๋ฆ์ด ๋๊ธฐ๊ฒ ํด๋๋ ค ๊ฐ์ฌ๋ก์ ๋ง์์ด ๋ฌด๊ฒ์ต๋๋ค.dgh12๋๊ป์ ๋จ๊ฒจ์ฃผ์๋ ํผ๋๋ฐฑ ํ๋ํ๋๊ฐ ๊ฐ์์ ์์ฑ๋๋ฅผ ๋์ด๋ ๋ฐ ํฐ ํ์ด ๋๊ณ ์์ต๋๋ค. ์์ ๋ง์๋๋ฆฐ nhcodingstudio ๊ฐ์ ๊ด๋ จ ํ ์ธ ์ฟ ํฐ ํํ์ ์ธ์ ๋ jeony0535@naver.com์ผ๋ก ๋ฉ์ผ ์ฃผ์๋ฉด ๋ฐ๋ก ์ฒ๋ฆฌํด ๋๋ฆด ํ ๋ ๋ถ๋ด ์์ด ๋ง์ํด ์ฃผ์ธ์.์กฐ์น๊ฐ ์๋ฃ๋๋ ๋๋ก ๋ค์ ํ๋ฒ ํ์ธ ๋ถํ๋๋ฆฌ๋ฉฐ, ๋ค์ ํ๋ฒ ์ง์ฌ์ผ๋ก ์ฌ๊ณผ๋๋ฆฝ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 2
- 45
Q&A
์๋ ์์น์ ๋์์์ด ๋ณด์ด์ง ์์ต๋๋ค.
์๋ ํ์ธ์, ์ฌ์ฌํ๋. ๊ฐ์ ์๊ฐ ์ค ๊ณ์ํด์ ๋ถํธ์ ๋๋ ค ์ ๋ง ์ก๊ตฌํ ๋ง์๋ฟ์ ๋๋ค.๋ฌธ์ํ์ '18๊ฐ. [Next.js ์ค์ ] redirect() ํจ์๋ก ๊ตฌํํ๋ ์๋ฒฝํ ๋์ ์ ์ด' ์์์ด ํ์ฌ ๋ ธ์ถ๋์ง ์๋ ์ ํ์ธํ์์ต๋๋ค.์ ๋ณดํด ์ฃผ์ ์งํ ๋ฐ๋ก ์์ธ์ ํ์ ์ค์ด๋ฉฐ, ์ง๊ธ์ผ๋ก๋ถํฐ 5๋ถ ๋ด๋ก ํ๋ซํผ์ ๋ค์ ๋ฐ์ํ์ฌ ์ ์์ ์ผ๋ก ์์ฒญํ์ค ์ ์๋๋ก ์กฐ์นํ๊ฒ ์ต๋๋ค. ํ์ต ํ๋ฆ์ด ์์ฃผ ๋๊ธฐ๊ฒ ํด๋๋ ค ๊ฐ์ฌ๋ก์ ๋ง์์ด ๋ฌด๊ฒ์ต๋๋ค.์ฌ์ฌํ๋๊ป์ ๋จ๊ฒจ์ฃผ์๋ ํผ๋๋ฐฑ ํ๋ํ๋๊ฐ ๊ฐ์์ ์์ฑ๋๋ฅผ ๋์ด๋ ๋ฐ ํฐ ํ์ด ๋๊ณ ์์ต๋๋ค. ์์ ๋ง์๋๋ฆฐ nhcodingstudio ๊ฐ์ ๊ด๋ จ ํ ์ธ ์ฟ ํฐ ํํ์ ์ธ์ ๋ jeony0535@naver.com์ผ๋ก ๋ฉ์ผ ์ฃผ์๋ฉด ๋ฐ๋ก ์ฒ๋ฆฌํด ๋๋ฆด ํ ๋ ๋ถ๋ด ์์ด ๋ง์ํด ์ฃผ์ธ์.์กฐ์น๊ฐ ์๋ฃ๋๋ ๋๋ก ๋ค์ ํ๋ฒ ํ์ธ ๋ถํ๋๋ฆฌ๋ฉฐ, ๋ค์ ํ๋ฒ ์ง์ฌ์ผ๋ก ์ฌ๊ณผ๋๋ฆฝ๋๋ค.๊ฐ์ฌํฉ๋๋ค.
- 0
- 1
- 49




