์๋ก์ด ๋ฐ์ ๋ผ์ฐํฐ v4์ ํจ๊ป next.js๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
@Knaackee ๊ฐ๋ฅ์ฑ์ ์ํํด ๋ณด์์ต๋๊น? ๋๊ตฐ๊ฐ๊ฐ RR์ ๋ชจ๋ ๋ฒ์ ๊ณผ ํจ๊ป ์๋ํ๋๋กํ๋์ง ๊ถ๊ธํฉ๋๋ค.
๋ค์์ผ๋ก ์์ ์ ๋ผ์ฐํฐ๊ฐ ์๋๋ฐ ์ RR์ ์ฌ์ฉํฉ๋๊น?
๊ธฐ์กด ์ฑ์ Next๋ก ์ด์ ํ ๋ @sergiodxa ๊ณ๋ ์ต์ . ์ ์ , ์ค์ฒฉ ๋ ๊ฒฝ๋ก ๊ตฌ์ฑ์ด ์๋ํ๊ณ ๋ฌด์์ ๊ณ์ ์ฌ์ฉํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
@oyeanuj ๐ค ์ ์ง์ ์ผ๋ก Next๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค. Next.js๋ฅผ 1 ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ค์ ํ๊ณ ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ์ฑ๊ณผ Next.js๋ฅผ ๋ชจ๋ ๋ณด์ ํ ๋ค์ ๋ ๋ฒ์งธ ๊ฒฝ๋ก๋ฅผ RR์์ Next.js๋ก ์ด๋ํ๋ฉด๋ฉ๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋์ ํ์ฌ ์ฑ์ ์ ์งํ ์์๋ ๋ฐฉ๋ฒ์ ๊ฒฐ๊ตญ Next.js์ ๋ชจ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
์์ ๋ฅผ ์ดํด๋ณด๋ฉด next์๋ RRv2-3๊ณผ ๊ฐ์ ๋จ์ผ ๋ผ์ฐํ ํ ์ด๋ธ์ด ์๊ณ RRv4์ ๊ฐ์ "์ค์ฒฉ ๋ ๊ฒฝ๋ก"๋ฅผ ์ง์ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๊ฒ๋ค์ ๋ฉ์ง๋ค.
RR์ ์ฌ์ฉํ๋ ค๊ณ ํ๊ฑฐ๋ ๋ชจ๋ฅด๋ ํฐ์ฃผ์ ์ฌํญ์ด ์์ต๋๊น?
@igl ๊ทธ๊ฒ์ ๋ํ ํด๊ฒฐ์ฑ ์
์ค์ฒฉ ๋ ๊ฒฝ๋ก์ ์๋ก์ด react-router 4 ํจ๋ฌ๋ค์์ ๊ฒ์ ์ฒด์ธ์ ์ด๋ฉฐ ํ์ฌ ํ๋ก์ ํธ์์ ํ์ ํญ๋ชฉ์ ๋๋ค. rr4๋ฅผ next.js์ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐ ์ฑ๊ณตํ ์ฌ๋์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
MemoryRouter
๋ ์๋ ํ๋๋ก ์๋ํ์ง ์์ต๋๋ค ...
๊ทธ๋ ์ง ์์ผ๋ฉด ๋์ ๊ตฌ์ฑ ์์๋ HashRouter
๊ฐ ์ ๋๋ก ์๋ํ๋ ํด๋ผ์ด์ธํธ ์ธก๋ง ๋ ์ ์์ต๋๋ค.
const AdminPage = dynamic(
import('..../AdminPage'),
{ ssr: false }
);
๋๋ ๋ํ @malixsys ์ ๊ทผ ๋ฐฉ์์ react-router
ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํ
์ ์ฒ๋ฆฌํ๊ณ next
๋ผ์ฐํฐ๋ก ๋ชจ๋ ์๋ฒ ๋ ๋๋ง ์ฝํ
์ธ ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค.
@malixsys @pegiadise ๋ค์ ๋ผ์ฐํฐ์ ๋ฆฌ ์กํธ ๋ผ์ฐํฐ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น?
componentDidMount
ํ๋๊ทธ๋ฅผ ์ค์ ํ๊ณ ํ๋๊ทธ๊ฐ ์ง์ค ์ผ ๋ <Router />
์กฐ๊ฑด๋ถ๋ก ๋ ๋๋ง ํ ์ ์์ต๋๋ค. ( componentDidMount
๋ ์๋ฒ์์ ์คํ๋์ง ์์ต๋๋ค ๐)
์ฌ์ค, ๊ณง Next.js์ React Router๋ฅผ ํตํฉ ํ ์์ ์ ๋๋ค. :)
โ https://twitter.com/rauchg/status/948318111828099072
์ฌ์ ํ ์ผ์ด๋๊ณ ์์ต๋๊น? V6 ์นด๋๋ฆฌ์์ ๋ฆด๋ฆฌ์ค ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ง๋ง ์ด์ ๋ํ ์ธ๊ธ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ. ํ์คํ ์ฐ๋ฆฌ ๋ง์์ ์์ต๋๋ค. ์ง๊ธ ๋น์ฅ ๋ค๋ฅธ ์ฐ์ ์์๊ฐ ์์ต๋๋ค (๋ ์ด์์ ๊ตฌ์ฑ ์์, ์์ ์ ์ธ ๊ฐ๋ฐ ๋ฐ ๊ธฐํ ์ค๋ ์ง์๋๋ ๋ช ๊ฐ์ง ๋ฏธํด๊ฒฐ ๋ฌธ์ ).
๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. ํ์ ์ฐ์ ์์๊ฐ ๋ฎ์ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ๊ฐ์ ์ฌ๋๋ค์ด ์ฌ์ฉ์ ์์ํ๋ ๊ฒ์ ๋ง๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ผ์ฐํธ๋ฅผ ๋ ๋ฒ ์ค์ ํ๊ณ ํฌ๊ธฐํด์ผํ๋ค๋ ๋ด์ฉ์ ๋๋ฌ ํ ๋๊น์ง ํํ ๋ฆฌ์ผ์ ์ฝ์์ต๋๋ค.
@timneutkens๊ฐ ๋ฐ์ ๋ผ์ฐํฐ ํตํฉ์ ์ถ๊ฐํ๋ฉด nextjs ์ฑํ์ ๋๋ฆฌ๊ณ ๊ฐ๋ฐ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ ์ ๊ฐ์ ๊ฐ๋ฐ์๋ค์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ฐ์ ์์๋ฅผ ๋์ด๋ ๊ฒ์ ๊ณ ๋ คํด์ฃผ์ธ์.
๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. ํ์ ์ฐ์ ์์๊ฐ ๋ฎ์ ์ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ ๊ฐ์ ์ฌ๋๋ค์ด ์ฌ์ฉ์ ์์ํ๋ ๊ฒ์ ๋ง๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋๋ค.
๊ฐ์.
์ถ์ ํ ์ ์๋๋ก ์ ์ด๋์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ์ ์์ต๋๊น?
๋๋ ์ด๊ฒ์ ๋ค์ ์ด ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์คํ ์์ค ํ๋ก์ ํธ ์ด๊ณ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ Next.js๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ฌ zeit.co์ ๋ํด ๊ทธ๋ค์ง ๊ฐ๋ ฅํ ์ฌ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค.
์ด๊ฒ์ด ์ ๊ฐ ์ฅ๊ธฐ ๋ชฉํ์ ์ผ๋ถ์ด๋ฉฐ ์ฆ์ ๊ตฌํํ ์ ์๋ค๊ณ ๋งํ ์ด์ ์ ๋๋ค.ํ์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
Next 6์์ ์๊ฐ ํ ๊ธฐ๋ฅ์ ์ค์ ๋ก React Router ์ง์์ ์ํด ์๋ํ๊ณ ์์ต๋๋ค.
Next 6์ ๋ํ ๋ค๋ฅธ ์ฐ์ ์์๋ Next.js์ ์์ ์ฑ๊ณผ ํ์ฅ ์ฑ์ ์์ฒญ๋๊ฒ ํฅ์ ์ํค๋๋ฐ, ์๋ฅผ ๋ค์ด 100 ๋ฐฐ ๋ ๋น ๋ฅธ ํ์ด์ง ํ์ธ, ์ฑ ๊ตฌ์ฑ ์์, ๊ฐ๋ฐ์ค์ธ ๋ค์ ๋ด๋ณด๋ด๊ธฐ ์์ ๋ง๋ค๊ธฐ, babel 7 ๋ฑ.
๋๋ ์ด๊ฒ์ด ๋์ ์ด์ ์๊ฒฌ์ ๋ํด ์์ธํ ์ค๋ช ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ฐ๋ผ์ TLDR์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@timneutkens ์ ์๊ฒฌ์ ๋ ํ์ฅํ๊ธฐ ์ํด : ์ฐ๋ฆฌ๋ ํ์คํ RR์ ์ํ์ง๋ง ํ์ฌ ๋ผ์ฐํฐ์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ๋ ๊ธด๊ธํ ์ ํ์ด ์์ต๋๋ค. ์์ํ ์์๋ ๋ชจ๋ ๋ผ์ฐํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ํ์ฌ Next.js API๋ก ์ฑ๊ณต์ ์ผ๋ก ๊ตฌํ๋์์ต๋๋ค.
React Router ์ง์ ์ ๊ฐ ์์ต๋๋ค .
๋ฐ๋ผ์์ด ๋ฌธ์ ๋ฅผ ๊ณ์ ๊ณต๊ฐํด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค!
๋์๋ฒ์ผ๋ก react-router๊ฐ ์๋ค๋ ๊ฒ์ next๊ฐ relay-modern๊ณผ ์ ์๋ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ด์ react-router ์ฑ์์ next๋ก ์ ํ ํ ์ด์ ์ค ํ๋์์ต๋๋ค.
@merry ์๋
์ ๋ฆด๋ ์ด ๋ชจ๋์ผ๋ก RRv4 ์ฑ์์ ์์
ํ๋์ง ์ฌ๋ถ. ์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช
ํ์๊ฒ ์ต๋๊น?
๋ ์ค ํ๋ ๋๋ฌธ์ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์์๋ ๊ธฐ์ต์ด ์์ต๋๋ค.
@igl ์ด๊ฒ์ ๋ฆด๋ ์ด ๋ฌธ์์ ๋ฐ๋ฅธ ๊ฒ์ ๋๋ค : https://facebook.github.io/relay/docs/en/routing.html#react -router-https-reacttrainingcom-react-router
๋ฌธ์ ๋ RRv4์ ๊ตฌ์ฑ ์์ ์ ๊ทผ ๋ฐฉ์์ด ์ฌ์ ์ปดํ์ผ ๋จ๊ณ์์ ๊ฒฐ์ ์ฑ์ ํ์ฉํ์ง ์์ ํด๋ผ์ด์ธํธ์์ ์์ฒญ ํญํฌ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
@rauchg ํฅ๋ฏธ๋กญ๊ฒ๋ Next์ ๋ผ์ฐํฐ์ ๋ํ ๋์ ์ดํด๋ ์ค์ฒฉ ๋ผ์ฐํ ๊ฐ๋ ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์ด์ง ๋ด์์ ํ์ํ๋ ๋์ ์ธ๋ถ ๋งํฌ ์ ์ ์ ์งํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํ์ฌ ๋ผ์ฐํฐ๋ก์ด๋ฅผ ๊ฐ๋ฅํ๊ฒํ๋ ๋ฐฉ๋ฒ์ด ์๋์ง ์๊ณ ์์ต๋๊น?
@dbbk ๋ nextgram ์์ ์ฑ (https://github.com/now-examples/nextgram)์ ํ์ธํฉ๋๋ค.
๋ค์ 5 ๋ฒ์์๋ ๋ชจ๋ ํ์ด์ง๊ฐ ํ์ฅ๋๋ ์ต์์ ๋ ์ด์์ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ "์ธ๋ถ ๋งํฌ ์
"์ ์ํํฉ๋๋ค. ๊ธฐ๋ณธ ๋ ์ด์์์๋ ์๋จ ํ์์ด ์๊ณ , ๋ชฉ๋ก / ์ธ๋ถ ์ ๋ณด / ๊ธฐํ์ ๋ํ ๊ธฐ๋ณธ์ ํ์ฅํ๋ ๋ช ๊ฐ์ง ํ์ ๋ ์ด์์์ด ์์ต๋๋ค. ํ์ด์ง ๊ตฌ์ฑ ์์๋ ์ด๋ฌํ ํ์ ๋ ์ด์์์ ๊ณ ์ ํ ํน์ ์ฝํ
์ธ ๋ก ํ์ฅํฉ๋๋ค. ๋ค์ 6์์๋ _app.js
์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ "์ธ๋ถ ๋งํฌ ์
"์ ์ํ ํ ์๋ ์์ต๋๋ค.
๋ค์ ๋ฒ์ ์ React Router๊ฐ ์๋ ๋ผ์ฐํ ์๋ฃจ์ ์ ์ ํํ๋๋ก ๊ตฌ์ฑ ํ ์ ์์ต๋๊น?
์๋
, ๋ ๋จ์ง (์ฌ์ฉ ํ์ด์ง์ ์ํ์ ํต๊ณผํ๊ธฐ ์ํด ๋ผ์ฐํฐ ๋ฐ์ ํ ํ์ <Route render ={} />
๋์ <Route component ={} />
๋๋์ด ๋ค์์ ํ ์์๋)?
https://github.com/zachrbrown/next-react-router๋ฅผ ์ฐธ์กฐ https://github.com/zachrbrown/next-react-router/blob/master/src/IsomorphicRouter.js์ ๋ช ๊ฐ์ง ๊ฐ๋จํ ์ค๋ช ์ด
์์ ๋ฅผ ์ดํด๋ณด๋ฉด next์๋ RRv2-3๊ณผ ๊ฐ์ ๋จ์ผ ๋ผ์ฐํ ํ ์ด๋ธ์ด ์๊ณ RRv4์ ๊ฐ์ "์ค์ฒฉ ๋ ๊ฒฝ๋ก"๋ฅผ ์ง์ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด๊ฒ๋ค์ ๋ฉ์ง๋ค.
์๋ ํ์ธ์,
์ด๊ฒ์ ๋จ์ผ ๊ฒฝ๋ก์ ๋ํด ๋จ์ผ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผ ํจ์ ์๋ฏธํฉ๋๊น?
2 ๊ฐ์ ๊ฒฝ๋ก sign up
, log in
๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋์ผํ ๋ ์ด์์์ ๊ณต์ ํ๋ 1 ํ์ด์ง๊ฐ์์ ๊ฒ์
๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ์์ ์์ญ์
๋๋ค. pages
ํด๋์ ํ์ผ 1 ๊ฐ๋ฅผ ์์ฑํ๋ฉด๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ ๊ฒฝ๋ก์์๋ pages
ํด๋์ 2 ๊ฐ์ ํ์ผ์ ๋ง๋ค์ด์ผํฉ๋๋ค. ๋ง๋์?
๊ทธ๋ ๋ค๋ฉด ๋ ์ด์์์ ์์ ์์ญ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ํ์๊ณผ ํจ๊ป ๋ค์ ๋ง์ดํธ๋ฉ๋๋ค.
@ 7c78 ํ ์์๋ ํ ๊ฐ์ง๋ ๋ชจ๋ ํ์ด์ง์ ๋ํ ์๊ตฌ ํ์ด์ง ๋ ์ด์์์ _app.js
๋ฅผ ํ์ฉํ๋ ๊ฒ์
๋๋ค. ๋ ๋ค๋ฅธ ์์
์ ์ํ๋ ๊ฒ์ ์ป๊ธฐ ์ํด ๋ค์ํ ํ์ด์ง์์ ์ฌ์ฌ์ฉ ํ ์์๋ ๊ณต์ ๋ ์ด์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋๋ ๊ฒ์
๋๋ค.
// pages/login.js
class LoginPage extends React.Component {
render() {
return (
<AuthForm> // same component can be reused in signup
<form>
...implementation of login
</form>
</AuthForm>
);
}
}
๋ํ ์ต๊ทผ์ ์ํ ํ ์์ ์ ์ํํ๊ณ ํ์ด์ง ๊ตฌ์ฑ ์์๊ฐ ๋ชจ๋ ํ์ฅํ๋ ๊ธฐ๋ณธ ๋ ์ด์์ ๊ตฌ์ฑ ์์๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
//layouts/baseAuth.js
class BaseAuth extends React.Component {
abstract formContent(); // we use typescript, but you can have the same concepts
abstract formSubmit():
render() {
return (
<SomeStyledDiv>
<form>
{this.formContent()}
{this.formSubmit()}
</form>
</SomeStyledDiv>
);
}
}
๊ทธ๋ฐ ๋ค์ ๋ก๊ทธ์ธ ๋ฐ ๊ฐ์
ํ์ด์ง์์ BaseAuth๋ฅผ ํ์ฅํ๊ณ ๊ฐ๊ฐ์ formContent
๋ฐ formSubmit
๋ฅผ ์ ์ํฉ๋๋ค (์ ํํ ์๊ตฌ ์ฌํญ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฅ๋๊ฐ ์์ ์
๋๋ค).
์๋
ํ์ธ์.
๋๋ ํ์ฌ ๋น์ ์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ค์ ์์ ๋ ๊ทธ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ด ๊ด์ฌ์ฌ๋ ๋ณ๋์ ์์์ ๋ํด ๋ณ๋์ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ ์ด์์์ด ์ฌ์ฌ์ฉ๋์ง๋ง ํ์ด์ง๋ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ด์์์ ๋ชจ๋ ํ์๊ณผ ํจ๊ป ๋ค์ ๋ง์ดํธ๋ฉ๋๋ค.
RRv4์์๋ ๋จ์ผ ํ์ด์ง๊ฐ ์์ผ๋ฉฐ ์์์ ์ ์ฒด ํ์ด์ง๊ฐ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋ง / ์ฌ ๋ง์ดํธ๋ฉ๋๋ค. ๊ฒฝ๋ก๋ ๊ตฌ์ฑ ์์ ์ผ๋ฟ์ ๋๋ค.
๋น ๋ฅธ ์๋ต์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
@ 7c78 vDOM ์ด ๋์ผํ ์ํ๋ก ํ์ธ ๋ ๋ โโDOM ๋ ธ๋๊ฐ ๋ค์ ์ฌ์ฉ๋๋ค๊ณ ์๊ฐํ์ง๋ง ๋ค์ ๋ง์ดํธํ๋ ๊ฒ์ ์ฌ์ค์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ํ ๋ฆด๋ ์ด ๋ชจ๋๊ณผ ํจ๊ป ๋ฆฌ ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๋งค์ฐ ์ผ๋ ค ํด ์๋ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์๊ด์์ด์ด ํจํด์ ์ฌ์ฉํด์ผํ์ต๋๋ค.
@merry ์๋ฒ๊ฐ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด ์ ๋ฌธ์ / html์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ vDOM์ ๋ํด ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฃ์กํฉ๋๋ค.์ด ๊ฐ์ ์ ๋ฌด์ํ์ญ์์ค. ์ ๋ ๋จ์ง ์ด๋ณด์ ์ผ๋ฟ์ ๋๋ค.
์ด์จ๋ ์ด ํจํด์ ์ฌ์ฉํด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ฐ์ฌ!
์ ์ฒด ์ฑ์ด pages / index.js์ ์๋๋กํ์ฌ next.js์ ํจ๊ป RR์ ์ฌ์ฉํ ์ ์์ง๋ง, ์ฆ์ ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ๋ค์์ ์ฅ์ ์ค ์ผ๋ถ๋ฅผ ์๊ณ ์ง์ ์ค์ ํด์ผํฉ๋๋ค.
Reach Router๊ฐ ๊ณ ๋ ค๋๋ค๋ฉด ๊ทธ๊ฒ์ ์ข์ํ ๊ฒ์ ๋๋ค. react-router์ ๋งค์ฐ ์ ์ฌํ๋ฉฐ ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
๋๋ฌ ๋ผ์ฐํฐ๋ ํ๋ฅญํฉ๋๋ค ๐ฅ
RR ์คํ์ผ์ ๋์ ๊ฒฝ๋ก๋ ์ข์ API์ด์ง๋ง ์ ์ (์ ์ ์ผ๋ก ๋ถ์ ๊ฐ๋ฅํ) ๋ผ์ฐํ ๋ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๋ ์ ๊ทผ๋ฒ ๋ชจ๋ ์ฌ๋จ ๋ฉํฌ ์น์๊ฐ ์๋๋๋ค.
@sorokinvj ํ๋ฌ๊ทธ์ธ์ ํตํด์๋ง ์ง์๋ฉ๋๋ค (ํ์ฌ) .. https://github.com/fridays/next-routes
์ ์ ๋งํฌ๋ ๋๋ฌด ๊ธฐ๋ณธ์ ์ด์ด์ ๋งํฌ์ ๋งค๊ฐ ๋ณ์๋ ์ง์ํ์ง ์์ต๋๋ค.
๋๋ ํ์ฌ ํจํค์ง ๋ค์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค .https : //github.com/fridays/next-routes
๋ด iPhone์์ ๋ณด๋
2018 ๋ 10 ์ 24 ์ผ 23:01์ Andy Ingram [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
RR ์คํ์ผ์ ๋์ ๊ฒฝ๋ก๋ ์ข์ API์ด์ง๋ง ์ ์ (์ ์ ์ผ๋ก ๋ถ์ ๊ฐ๋ฅํ) ๋ผ์ฐํ ๋ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๋ ์ ๊ทผ๋ฒ ๋ชจ๋ ์ฌ๋จ ๋ฉํฌ ์น์๊ฐ ์๋๋๋ค.
โ
์ด ์ค๋ ๋๋ฅผ ๊ตฌ๋ ํ๊ธฐ ๋๋ฌธ์์ด ๋ฉ์์ง๊ฐ ์ ์ก๋์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ญ์์ค.
์ฐ๋ฆฌ๋ ๋น๋ถ๊ฐ next-routes
๋ ์ฌ์ฉํ๊ณ ์์ง๋ง ๋ค์ ํ์ ์ ๊ท์ ํ์ผ ์ด๋ฆ (Sapper์์ ์๊ฐ์ ์ป์)์ ํตํด ํ์ผ ์์คํ
๋ผ์ฐํ
์ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ์์
์ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@merrywhether ๋๋ next-routes
๋ ์ฌ์ฉํ๊ณ ์์ง๋ง ์ด๊ฒ์ด Next.js ์ฝ์ด์ ์ผ๋ถ๊ฐ๋๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
๋น์ ์ ์ธ๊ธํ์ต๋๋ค
๋ค์ ํ์ด ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์ ์ถ๊ฐ ์์ ์ํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค ...
์ด๊ฒ์ ๋ํ ์ฐธ๊ณ ๋ฌธํ์ด ์์ต๋๊น? ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์์ ๋ํ ๋ฏธํด๊ฒฐ ๋ฌธ์ ์ผ๊น์? ํ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค ... ์๋ง๋ ํ๋ฌ๊ทธ์ธ์ด ํ์๋ฅผ ํด๊ฒฐํ๊ณ ์์ผ๋ก ๊ถ์ฅ๋๋ ์๋ฃจ์ ์ด ๋ ๊ฒ์ ๋๋ค.
@curran ์์ค๋
์ด ๋ฌธ์ ๋ 2017 ๋
4 ์ 5 ์ผ์ ์ ๊ธฐ๋์์ผ๋ฉฐ ์ง๊ธ์ 2019 ๋
2 ์ 27 ์ผ์
๋๋ค. ๊ฑฐ์ 2 ๋
๋์ ํด๊ฒฐ์ฑ
์ด ์์ต๋๋ค.
์ ๋ฐ ์ ๋์ ๋ด์ฅ ๋ผ์ฐํฐ๋ฅผ ์ข์ ๊ฒ์ผ๋ก ๊ต์ฒด ํ ๋๊ฐ ๋์์๊น์?
์์ผ. ์ด๋ ๋ผ์ฐํ ์๋ฃจ์ ์ ๋ง์ ์๊ฐ์ ํฌ์ ํ NextJS ๊ฐ๋ฐ์์๊ฒ ์๋นํ ๋ชจ์์ ์ ๋๋ค.
์ฒ์์๋ ReactRouter๋ฅผ ๋์ณค์ต๋๋ค. ์ด์ ๋ ๋๊ตฐ๊ฐ๊ฐ ๋์๊ฒ ์๊ธฐ์ํค๊ธฐ ์ ๊น์ง NextJS๊ฐ ๋ค๋ฅธ ๋ผ์ฐํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ฌ์ค์กฐ์ฐจ ๊ธฐ์ตํ์ง ๋ชปํฉ๋๋ค. ์๋ฅผ ๋ค์ด Verbose Link
API๋ (๋ฐ์ดํฐ / API ์ํคํ
์ฒ์ ๋ฐ๋ผ) ํ๋ก์๋ก ๋ํํ๊ธฐ๊ฐ ์ฝ์ต๋๋ค. ์ด ์ผ๊ธ ๋น๋ฐ ๊ณต์ : ๐
import _Link from "next/link"
export function Link({as, children, href}) {
as = as || QS.parse(U.parse(href).query || "").url || null // QS, U are parsing libs
return <_Link as={as} href={href}>
{children}
</_Link>
}
<Link as="/about" href="/page?url=/about"/> verbose
โ
<Link href="/page?url=/about"/> ok
๋๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋ถ์ฐจ์ ์ธ ๊ฒ์ ๋ํด ๋ถํํ๋ ๋ฐ ๋ ์ ์ ์๊ฐ์ ์๋นํด์ผํ๋ค๊ณ ์๊ฐํ๋ค ๐
@ ivan-kleshnin Nice ๋น์ทํ ๋ํผ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์ด์ ์๊ฒฌ์ ๋ฐ๋ผ https://www.contributor-covenant.org/version/1/4/code-of-conduct ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์ถ์ต๋๋ค.
๋๊ธ์ ์จ๊ฒผ์ต๋๋ค.
๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์์ next/router
์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ universal routing
๋ถ๋ถ์์ ์ฝ๊ฐ ๊ฐ์ ๋์ด์ผํฉ๋๋ค.
Now 2 ๋ฐฐํฌ์ ๊ฒฝ์ฐ now.json
๋ง ๊ฐ์ ธ ์์ ๋ด ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ผ์ฐํ
ํ๋ ๋ฐ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
RR4๋ฅผ nextJs ํ๋ก์ ํธ์ ๊ตฌํํ๋ ค๋ฉด ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์ํํด์ผํฉ๋๋ค.
next/dynamic
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.HashRouter
๋์ BrowserRouter
-> ์ฌ์ฉ์ ์ฌ ์ฅ์ ํ์ด์ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์ด์ ํ์ด์ง๋ฅผ๋ก๋ ํ ์์๋ ๊ฒฝ์ฐ (์ 404 ํ์ด์ง)RR4๋ฅผ nextJs ํ๋ก์ ํธ์ ๊ตฌํํ๋ ค๋ฉด ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์ํํด์ผํฉ๋๋ค.
- NextJS SSR ๋ฐฉ์ง,
next/dynamic
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.- ์ฌ์ฉ
HashRouter
๋์BrowserRouter
-> ์ฌ์ฉ์ ์ฌ ์ฅ์ ํ์ด์ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์ด์ ํ์ด์ง๋ฅผ๋ก๋ ํ ์์๋ ๊ฒฝ์ฐ (์ 404 ํ์ด์ง)
์ด ๋ต์ฅ์ ๋ณด๋ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@ reach / router์ react-router 5๊ฐ ๋ณํฉ๋ฉ๋๋ค : https://reacttraining.com/blog/reach-react-router-future/
์ด๊ฒ์ด next.js์ ์ด๋ค ์ํฅ์ ๋ฏธ์นฉ๋ ๊น?
@ alp82 Next.js๋ ์ฌ์ ํ React Router ๋๋ Reach Router๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ Next.js์๋ ์ ํ ์ํฅ์์ฃผ์ง ์์ต๋๋ค.
์ธ๋ฑ์ค ํ์ด์ง์์ ์ฌ๋ฌ ํ์ด์ง ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด nextjs์ ์ค์์น ๊ฒฝ๋ก ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
๊ทธ๋์ ์ด๋ป๊ฒ nextjs ....... ??์์ ์ด๊ฒ์ ๊ตฌํํ ์ ์์ต๋๊น?
RR4๋ฅผ nextJs ํ๋ก์ ํธ์ ๊ตฌํํ๋ ค๋ฉด ๋ค์ ๋ ๊ฐ์ง๋ฅผ ์ํํด์ผํฉ๋๋ค.
- NextJS SSR ๋ฐฉ์ง,
next/dynamic
๋ฅผ ์ฌ์ฉํ๋ฉด ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค.- ์ฌ์ฉ
HashRouter
๋์BrowserRouter
-> ์ฌ์ฉ์ ์ฌ ์ฅ์ ํ์ด์ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์ด์ ํ์ด์ง๋ฅผ๋ก๋ ํ ์์๋ ๊ฒฝ์ฐ (์ 404 ํ์ด์ง)
404 ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์ด์ ํ์ด์ง๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ค๋ฉด ์ต์คํ๋ ์ค ์๋ฒ ํ์ผ์์์ด get ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ญ์์ค.
server.get ( 'your params', (req, res) => {
const actualPage = '/ your_page'
const queryParams = {id : req.params.id}
app.render (req, res, actualPage, queryParams)
})
๋ด๊ฐ ์ฌ์ฉํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ํ next.js
๊ฐ์ง react-router
๋จ์ผ ์ง์
์ ํ์ผ ๋์ ๊ธฐ๋ณธ ํ์ผ ์์คํ
๊ธฐ๋ฐ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ SSR์ ๋ณด์กด ์์ ํ ๋ผ์ฐํ
๋ฑ์ ์ ๊ณตํฉ๋๋ค.
ํผ๋๋ฐฑ์ ๋ฐ๊ณ ๊ฐ์ ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ค๋ช ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฑด๋ฐฐ!
๋จ์ผ ์ง์ ์ ์ผ๋ก ๋๋ ๋ ๋ฐ์ ๋ผ์ฐํฐ๋ฅผ ํฌํจํ๋ ๊ฒ์ ๋งค์ฐ ๊ถ์ฅํ์ง ์์ต๋๋ค. ์ฆ (์์ฒญ๋๊ฒ) ๊ฐ๋ฐ ๋น๋๊ฐ ๋๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ ์ธก์ ๋๋ฌด ๋ง์ ์ฝ๋๋ฅผ ์ ๋ฌํ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ ์๋ ์ ์ ๋ด๋ณด๋ด๊ธฐ์ ๊ฐ์ ์ต์ ํ์ ๋ํ ๊ฐ์์ฑ์ด ๋จ์ด์ง๋๋ค.
@timneutkens ์ด์ฉ๋ฉด ๋ด๊ฐ ํ๋ ธ๋ค. ๊ทธ๋ฌ๋ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๋ฉด ๋ผ์ฐํ
๊ตฌ์ฑ์ ํ๋์ ๊ตฌ์ฑ ํ์ผ ์ผ๋ฟ์
๋๋ค. ์ฌ๊ธฐ์๋ ํ์ฅ ์ฑ์ด๋ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์์ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ๋ํด ๋ ๋ฐฐ์ฐ๊ณ ์ถ์ต๋๋ค.
react-router์ ์ฅ์ ์ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ ํ ์ ์ด ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
@timneutkens , ์ฌ๊ธฐ์ ๋ ผ์์ ์์ํ์ง๋ ์๊ฒ ์ง ๋ง ๋ด ๋๊ธ ์จ๊ธฐ๊ธฐ๋ฅผ ํด์ ํด๋ฌ๋ผ๊ณ ๋ถํ๋๋ฆฝ๋๋ค. ๋๋ ๋ด ์ง์ ์ ์ฌ์ฉํ ์์๊ฒ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ ์ปค๋ฎค๋ํฐ์ ๋๋ ค์ฃผ๊ธฐ ์ํด ์๊ฐ์ ๋ณด๋์ง ๋ง ์ฌ๋๋ค์ ์นจ๋ฌต์ํค๋ ๊ฒ์ด ์คํ ์์ค ๊ฐ๋ฐ์ ์ด๋ป๊ฒ ๋์์ด ๋ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@timneutkens ๋ ๋น์ ์ด ์ธ๊ธ ํ ์ ์ ๊ดํด์๋ ํธ๋ ์ด๋ ์คํ ๋ฌธ์ ์ ๋๋ค. Mine์ Next.js๊ฐ ๋ค๋ฅธ ์ค์ ์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ์คํ์ ๋๋ค.
๋ชจ๋ ์ต์ ๋ฒ๋ค์ ํด๋ผ์ด์ธํธ ์์ฐ์ ์ฒญํฌ๋ก ๋ถํ ํ ์ ์์ผ๋ฉฐ react-router
๊ฒฝ๋ก๋ ์ค์ ๋ก ๋งค์ฐ ํธ๋ฆฌํ ๋ถํ ์ง์ ์
๋๋ค.
ํฐ ํ๋ก์ ํธ์ ์ง๋ถํ๋ ๋๊ฐ์ด์ง๋ง ์ ์ ํ ์นํฉ ๋ฏธ์ธ ์กฐ์ ์ผ๋ก๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ ์ ๋ด๋ณด๋ด๊ธฐ๊ฐ ์ค์ํ ์ต์ ํ ๋ ์ด์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ํ๊ท ์ ์ธ Next.js ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๊ณตํ๋ ๋๋ถ๋ถ์ ํ์ด์ง๋ ์ด์จ๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํด์ผํ๋ฉฐ ์ ์ ๋ด๋ณด๋ด๊ธฐ์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ๋ถ์กฑํ์ง ์์ต๋๋ค. ์ : ์ ์ ์ผ๋ก ๋ด๋ณด๋ผ ๊ฒฝ๋ก ๋ชฉ๋ก์ ์๋์ผ๋ก ์ ์ธ ํ ์๋ ์์ต๋๋ค.
๋ด๊ฐ ๋๊ธ์ ์จ๊ธด ์ด์ ๋ ์ด๊ฒ์ด ๋์ ํธ๋ํฝ ๋ฌธ์ ์ด๋ฉฐ Next.js ์ฑ ๋น๋์ ๋ํ ๊ถ์ฅ ์ฌํญ์ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์ฌ๊ธฐ์ react-router๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด ๊ทธ๋ค์ ์ฌ๋ฌ๋ถ์ ์์ ๋ฅผ ๋งน๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๊ณ Next.js๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์กฐ์ฌํ์ง ์์ ๊ฒ์ ๋๋ค.
ํฐ ํ๋ก์ ํธ์ ์ง๋ถํ๋ ๋๊ฐ์ด์ง๋ง ์ ์ ํ ์นํฉ ๋ฏธ์ธ ์กฐ์ ์ผ๋ก๋ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฐ๋ฐ ์๊ฐ ๋ถํ ์๋๋ฅผ ๋์ผ ์๋ ์์ต๋๋ค. webpack์ ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ ์์์ ๋ํ ํธ์ง ์๋๋ฅผ ๋ํญ ๋๋ฆฌ๊ฒ ๋ง๋๋ ๋ชจ๋ ๋จ์ผ ๊ฒฝ๋ก๋ฅผ ์ปดํ์ผํ๊ณ ๊ฐ์ํ๊ธฐ ๋๋ฌธ์ webpack ๊ตฌ์ฑ์ ๋ํ ํน์ ๋ฏธ์ธ ์กฐ์ ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ Next.js์ ์ฃผ๋ฌธํ ํญ๋ชฉ์ด์๋ ์ด์ : https://nextjs.org/blog/next-8#improved -on-demand-entries
๋ํ ๊ฒฝ๋ก ๋ฑ์ (์๋) ๋ฏธ๋ฆฌ ๊ฐ์ ธ ์ค๊ธฐ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ค์ด๊ฐ ์์๋ ์ธ๋ถ ์ฌํญ์ด ๋ง์ด ์์ง๋ง tldr์ ๊ฒฐ๊ตญ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ์ฑ์ด ๋ ๋๋น ์ง ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
์ฌ์ฉํ๋ ค๋ ์ ์ผํ ์๊ฐ์ด ์ด๋ฏธ react-router๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฑ์ ๋ง์ด๊ทธ๋ ์ด์ ํ ๋ค์ ์ ์ฐจ ์ฌ๋ฌ ํ์ด์ง๋ก ์ด๋ํ๋ ๊ฒ์์ ์ ์ ํ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋๊ธ ์จ๊น์ ํด์ ํด๋ ๊ด์ฐฎ์ต๋๋ค.
์๋
ํ์ธ์ @timneutkens
์ ์ ์ผ๋ก ๋ถ์ ํ ์์๋ ๋ช ๊ฐ์ง ์ ๋ฌธ๊ฐ๋ฅผ ๊ณ์ฐํด ๋ณด์๊ณ ๋์ ๋ผ์ฐํ
์๋ฃจ์
์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ ์ผ์ด ์์ผ์ญ๋๊น?
https://github.com/jaredpalmer/after.js ๊ฐ์ ๊ฒ์ด ์์ต๋๊น?
๋๋ ๋ชจ๋ ์๊ฒฌ์ ์ฝ์์ผ๋ฉฐ RR4 +๊ฐ next.js์ ํฅํ ๋ฐ๋ณต์์ ํฌํจ๋๋์ง ๋๋ ์ ํ ์ฌํญ์ธ์ง ์์ง ๋ช ํํ์ง ์์ต๋๋ค. ๋ผ์ฐํฐ ๋ก๋๋งต ๋๋ ์ ์ฌํ ๊ฒ์ ๋๊น?
@laurencefass (์ค๋ ํ์ฌ) react-router
๋ฅผ ์ง์ํ ๊ณํ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋์๊ฒ Next.js์ ๋ผ์ฐํ ์์คํ ์ ์ถฉ๋ถํ ์ฑ์ ํด์ง๊ณ ์์ผ๋ฏ๋ก ์ด์จ๋ (๋ ์ด์) ํ์ํ์ง ์์ ๊ฒ์ ๋๋ค. :)
"๋์๊ฒ Next.js์ ๋ผ์ฐํ ์์คํ ์ ์ถฉ๋ถํ ์ฑ์ ํด์ ธ์ ์๋ง (๋ ์ด์) ํ์ํ์ง ์์ ๊ฒ์ ๋๋ค. :)"
๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค์์ Next.js๋ฅผ ์ ์ง์ ์ผ๋ก ์ฑํํ๋ ค๋ ์ฌ๋๋ค์ ์ ์ธํ๊ณ . ๋ ์ ์ฉํ ํ ๋ก ์ ์๋ง๋ "Next.js ๋ผ์ฐํ ๋ ๋ฐ์ ๋ผ์ฐํฐ ๋ผ์ฐํ "์ด ์๋ ๊ฒ์ ๋๋ค. ๋ ์ ์ฉํ ํ ๋ก ์ "react-router๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋ํ ์ฑ์ Next.js๋ก ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ"์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ค์์ ๋ผ์ฐํฐ๋ ๊ฒฝ๋ก๋ณด๊ธฐ๋ฅผ ์ค์ฒฉ ํ ์ ์์ต๋๋ค. ๊ทธ๋ ์ฃ ? ๊ฒฝ๋ก์ ๋ํ ๋ชจ๋ ํ์์ DOM์ ๋ ๋ ค ๋ฒ๋ฆฌ๊ณ ์๋ก ๊ณ ์นฉ๋๋ค. ์ค์ฒฉ ๋ ๋ทฐ๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ ๋๋ค.
@dbbk nextjs ํ์ด ์์ ์ค์ด๋ผ๊ณ ๋ค์์ต๋๋ค.
๋ค์ js๋ ๋ผ์ฐํฐ์ ๋งค์ฐ ์ ์ฐํฉ๋๋ค. https://dev.to/toomuchdesign/next-js-react-router-2kl8
์น ์ฌ์ดํธ๋ฅผ ์ผ๋ฐ JS ๋ฐ jQuery ์ฝ๋์์ React๋ก ์ด๋ํ๊ณ ์์ต๋๋ค. ์์ ์ฝ๋์ ๋ฌ๋ฆฌ ํ์ด์ง๋ฅผ ๋ณ๊ฒฝํ ๋ ์์ ์ด ๋ฉ์ถ์ง ์๋๋กํด์ผํด์ React Router๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ด์ SEO ๋ชฉ์ ์ผ๋ก Google ๊ฒ์์์ ์ข์ ํธ๋ํฝ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์์ด๋ฅผ ์ ์งํด์ผํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ๋์ ์ฑ๋ฅ์ ์ํด Next.js์ ํจ๊ป SSR์ ์ ํธํฉ๋๋ค.
Next.js๋ ์๋ฒ ์ธก์์ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํ ์ ์์ผ๋ฉฐ ํด๋ผ์ด์ธํธ ์ธก์์ ํ์ด์ง๊ฐ๋ก๋๋๋ฉด Next.js๋ React Router ์ ์ด ํ์์ ํ์์ ํ์ฉํ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์์ ์ ๋ฃ๊ณ ์์ผ๋ฉด Next.js ๋งํฌ๊ฐ ์์ ์ ์ค์งํ๋ ค๋ฉด ํ์ฌ ํ์ด์ง๋ฅผ ๋ ๋์ผํฉ๋๊น?
O Next.js๋ ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํ ๋ง ๋ง๋ค ์ ์์ต๋๊น?
React Router๋ฅผ ํตํฉํ๋ฉด์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์์ ๊ฒ์ ๋๋ค. ์ฑ์ด ํด๋ผ์ด์ธํธ ์ธก์ ๋๋ฌํ๋ฉด ์ฐ์ ์์ ์ฌ์์ด ํ์์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ค์ js๋ ๋ผ์ฐํฐ์ ๋งค์ฐ ์ ์ฐํฉ๋๋ค. https://dev.to/toomuchdesign/next-js-react-router-2kl8
@laurencefass , ์์ฃผ ์ข์ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์ ์ ์ฝ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ์ฌ๋ Next.js ํ์ด ๊ถ์ฅํ์ง ์๋๋ค๊ณ ๋งํฉ๋๋ค. ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํ์ง๋ง ๋์๊ฒ ์ข์ ๊ฒ ๊ฐ์
@KeitelDOG ๋ฅผ ์ํด react-router๊ฐ ํ์ํ์ง ์์ต๋๋ค. Next.js ๋ผ์ฐํ ์ ๋์ผํ ์ด์ ์ ์ ๊ณต ํ ๋ฟ๋ง ์๋๋ผ ์๋ ์ฝ๋ ๋ถํ ๋๋ถ์ ์ฑ์ด ๋ ๊ฐ๋ฒผ์์ง๋๋ค (react-router๋ก๋ ์ฝ๊ฒ ์ป์ ์ ์์).
_edit : ๊ทธ๋ฅ ์ถ๊ฐํ๊ฒ ์ต๋๋ค : react-router์ ์ ์ผํ ์ฅ์ ์ ๋์ผํ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ค์ฒฉ ๋ ๊ฒฝ๋ก ์ผ ์ ์์ต๋๋ค. Next.js ๋ผ์ฐํฐ๋ ์ฌ์ฉ ์ฌ๋ก์ 95 %๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค _
@martpie ์๋ต Link
๊ตฌ์ฑ ์์๋ก ๋ณด์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ Next.js๋ ๋ด๊ฐ ์ํ๋ ๋ฏน์ค ์๋ฒ-ํด๋ผ์ด์ธํธ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ ์ผ๋ก ์ค์ฒฉ ๋ ๊ฒฝ๋ก๋ฅผ ์ธ๋ถ์ ์ผ๋ก ์ ์ดํ๋ โโ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ React Router๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ React ์น ์ฌ์ดํธ๋ฅผ Next.js๋ก ๋ณ๊ฒฝํ์ง ์๊ณ ๋์ JS-jQuery ์น ์ฌ์ดํธ๋ฅผ ๋ด SEO ์ด์ ์ ์์ง ์๊ณ React ๋ค์ค ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด ๊ณํํ๊ณ ํ ์คํธํ๊ธฐ ๋๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ป์ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค. Google์์. ๊ทธ๋์ Next.js๋ก ๊ฐ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@timneutkens Next.js 10์์์ด๋ฅผ ์ง์ํ ๊ณํ์ด ์์ต๋๊น?
@TrejGun ๊ฐ์ฌํฉ๋๋ค, ๊ทธ๊ฒ์ ํ์คํ ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ์ด ์๋๋๋ค.
๊ณํ์ด ์์ต๋๊น?
next/router
๋ ํ๋ฅญํ๊ณ ๋ง์ ๋์์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋์ฒํ๋ ค๋ฉด ๋ ์ ๋ฌธ์ ์ธ ๋ผ์ฐํฐ๊ฐ ํ์ํฉ๋๋ค. React-router๋ ๋ผ์ฐํฐ์ ์ ๋ ์ฃผ์์
๋๋ค.
after.js ๋ฅผ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
์,์ด ํ์ด์ง ๊ธฐ๋ฐ ์์คํ ์ ์ค์ฒฉ ๋ ๊ฒฝ๋ก์ ์ด์ ์ ์ป์ ์์๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ๋ฆฌ ํ ๋งํผ ์ ๊ตํ์ง ์์ต๋๋ค.
React-router๋ ํ์ฌ๊น์ง ์ต๊ณ ์ ๋ผ์ฐํฐ๊ฐ ๋ v6 ๋ฒ์ ์ ๊ณง ์ถ์ ํ ์์ ์
๋๋ค. next.js
์ง์์ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ next.js
์ router
์ ๋ถ๋ฆฌํ์ฌ ์ฌ๋๋ค์ด ์ข์ํ๋ router
์์ ๋กญ๊ฒ ์ ํํ ์ ์๋๋กํ๋ ๊ฒ์
๋๋ค.
์ด์ ๋๊ธ์ +1. next.js๋ ๋ด๊ฐ ์ฌ์ฉํ์ง ์๋ ์ ์ผํ ์ด์ ๋ ๋ผ์ฐํฐ์ ์ ์ฐ์ฑ์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํฅํ ๋ฆด๋ฆฌ์ค์์ React Router 6์ ์ง์ํ๊ฑฐ๋ ๋ผ์ฐํฐ๋ฅผ ์ค์ ๊ฐ๋ฅํ๊ฒ ๋ง๋์ญ์์ค.
React Router๋ฅผ ์ ๋ง ์ข์ํ๋ ์ฌ๋๋ค์ ๊ฐ์ ์ ์์๊ฐ ๋ง๋ React Router๋ฅผ ์ฌ์ฉํ๋ Next.js ๋์ ์ธ "Remix"๋ผ๋ ์ ํ๋ก์ ํธ๋ฅผ ๋ฐ๋ฅด๋ ๋ฐ ๊ด์ฌ์ด์์ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ ํ๋ ์ ์ํฌ๊ฐ SSR, Server Side Props ๋ฑ์ผ๋ก ์ธํด ํด๋น ๋ผ์ฐํฐ์ ๊น์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
Next๋ ์ฑ๋ฅ์ ์ผ๋์๋๊ณ ๊ตฌ์ถ๋์์ผ๋ฉฐ ์๋ฒ ์ธก react-router๋ ๋ ๋๋งํ๋ ค๋ ํญ๋ชฉ๊ณผ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์๊ธฐ ์ ์ DOM ํธ๋ฆฌ๋ฅผ ๊ฑธ์ด์ผํ๋ค๋ ์ ์์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. getInitialProps
์ ์ ์ฒด ๋ชฉ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ ์ ์ ๋ฐ์์ ์ผ์์ ์ผ๋ก ๋ ๋๋ง ํ ํ์๊ฐ ์๋๋กํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๋ง์ ํ๋ ์ ์ํฌ๊ฐ ์๋ฒ (๋ฐ ํด๋ผ์ด์ธํธ์์ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋จ)์์ ๊ฒฝํํ๋ ์ผ๋ฐ์ ์ธ ํจ์ ์
๋๋ค. ํญํฌ ์์ฒญ). ๋ค์์ผ๋ก ๊ฐ ์ต์์ ํ์ด์ง์์ ๋ค์ํ ํ์ ๊ตฌ์ฑ ์์๊ฐ ํ์๋ก ํ ์์๋ ๋ค์ํ ๋ฐ์ดํฐ ํจํด์ _all_ ์ ์ธํ๊ณ ์ ์ฒด ์์ฒญ ๊ฒฝ๋ก์์ ๋ถ๊ธฐ (๋๋ ๋๊ท๋ชจ ๋จ์ผ ์ค๋ฒ ํ์น ์ํ)ํจ์ผ๋ก์จ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ค์ ๋ก ๊ฐ ํ์ด์ง๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ธํ๋ ๊ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
์ด๊ฒ์ Relay๊ฐ react-router ์๋ ํธํ๋์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ์ด๋ฉฐ facebook.com์ด ๋ณต์กํ ์น ์ฌ์ดํธ๊ฐ ์๋๋ผ๊ณ ๋น๋ ํ ์๋ ์์ต๋๋ค.
Next ๋ผ์ฐํฐ๋ก ์์
ํ๊ธฐ์ํ ์ฃผ์ ์ฑ๊ณต์ ์ธ ์ ๋ต์ ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ (์ด์จ๋ ํ๋ React์ ์ถ์ง ์ถ์ธ)์ผ๋ก ๊ธฐ์ธ์ฌ ์ฃผ์ ์ค๋ณต์์ด ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฌ์ฉ ํ ์์๋ ๋์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์์๋ ํจ์จ์ ์ธ SSR์ ๋ณด์ ํ๋ ๊ฒ์
๋๋ค. ( getInitialProps
๋ฅผ ํตํด) React ๋ ๋๋ฌ์ ๋ํํ๊ธฐ ์ ์.
๋๋ ๋๋ฌด๋ฅผ ๊ฑท๋ ๊ฒ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ์ ํ๊ฐ ๊ณผ์ฅ๋ ๊ฒ ๊ฐ๋ค. ์ค๋๋ ๋ง์ ํ๋ก๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ฅผ ๋ค์ด Apollo๋ก์ด ์์ ์ ์ํํ๊ณ ์์ผ๋ฉฐ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ์๋ฒ๊ฐ ๋๋ฌด ๋ง์ ์์ ์ ์ํํ๋ ๊ฒ์ ์ ๋ง๋ก ๋์ด์ฃผ๊ณ ์ถ๋ค๋ฉด CDN์์ ์๋ต์ ์บ์ ํ ์๋ ์์ต๋๋ค.
๋ฌผ๋ก , React-router๊ฐ (AFAICT) ํ์ฌ ๊ตฌํ์์ Next์ ๊ทผ๋ณธ์ ์ผ๋ก ํธํ๋์ง ์๋ ์ฃผ๋ ์ด์ ๋ฅผ ์ง์ ํ๊ณ ์์ต๋๋ค. ๋๋ฆฐ ์ฝ๋ ์คํํธ โโ์๊ฐ์ผ๋ก ๋ฌด๋ฃ Heroku ๋ค์ด๋ ธ๋ฅผ ํ๋ณตํ๊ฒ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ด ์ ์ฆํ๋ฏ์ด ๋ง์ ์ฌ์ดํธ์๋ ์ค์ ๋ก ์ฑ๋ฅ์ด ์ ํ ํ์ํ์ง ์์ต๋๋ค. ์๋ฒฝํ๊ฒ ๋ง์ ์ ์์ต๋๋ค). ๊ทธ๋ฌ๋ Next๋ ์๋ฒ ์๋ต ์๊ฐ์ด ๋์ ๋๊ฒ ๋๋ ค์ง๋ ๊ฒ์ ๊ด์ฌ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ๋ ๊ณต๊ฒฉ์ ์ด๋ผ๋ฉด์ด๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ถ ๋๊ธฐ์ ๋ค์๊ฒ ์ธ๊ธฐ๊ฐ ์์ ๊ฒ์ ๋๋ค. ์ผ๋ถ ์ฌ์ดํธ์์ ๋ฌธ์ ๊ฐ๋์ง ์์๋ค๋ฉด ์ฌ๋๋ค์ React์ ์คํธ๋ฆฌ๋ฐ ๋ ๋๋ฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ (๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ ๊ฐ์ ํ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค) ๋ ๊ฐ์ ๋ ๋๋ง์ด ์๋ฃ๋๊ธฐ ์ ์ ์๋ต์ ์์ํ์ง ์์ ๊ฒ์ ๋๋ค.
CDN์ ์๋ต์ ์บ์ ํ ์ ์์ง๋ง ๋ง์ ๊ฐ์ธํ / ๋ก๊ทธ์ธ ์ต์
์ ์ ๊ฑฐํฉ๋๋ค (์ ์ค๋ฅ ์ ๋์ด๊ฑฐ๋ ํด๋ผ์ด์ธํธ์ ๋ํ ๋ถ๋ถ ํ์ด์ง ๋ ๋๋ง์ ์ฐ๊ธฐํ๋ ค๋ ์ ๋์์ ์์ถฉ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์). ์ ์ฒด ์ฑ์ CDN ์บ์ ํ ์ ์๋ค๋ฉด CRA ๋ฐ react-snapshot
ํ๊ณ ์๋ฒ๋ฅผ ์์ ํ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋ฒ๊ฐ ์ผ๋ง๋ ๋ง์ ์์
์ ์ํํ๋์ง์ ๋ํ ์ง๋ฌธ์ด ์๋๋ผ ์์ฒญ์ ์๋ตํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ Apollo๋ Relay์ ๊ฐ์๋ณด๋ค ๋ ๋จ์ ์ด๊ณ ์ฑ๋ฅ ์งํฅ์ ์ธ ํ๋ ์ ์ํฌ์ ๋นํด ์ฑ๋ฅ๋ณด๋ค ์ฌ์ฉ ํธ์์ฑ์ ๊ฐ์กฐํ๋ ํ๋ ์ ์ํฌ์ ํ๋ฅญํ ์์ ๋๋ค. ๊ทธ๊ฒ์ ๋ชจ๋ ์คํํธ๋ผ์ ๋๋ค.
๋ค, ์ถฉ๋ถํ ๊ณตํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ remix.run์ด ์ด๋ป๊ฒ ๋ฐํ ์ก๋์ง ๊ถ๊ธํฉ๋๋ค. ์๋ง๋ ๊ทธ๋ค์ react-router
์ ํจ๊ป ์๋ํ๋๋ก ์๋ก์ด ์ ๊ทผ ๋ฐฉ์์ ์ ์ ํ ๊ฒ์
๋๋ค. ๋ค, ์ค์ฒฉ ๋ ๊ฒฝ๋ก๊ฐ ํ์๋ ์๋์ง๋ง, ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ด๋ถ UI์ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๊ฐ์ง๊ณ ๊ฐ ํ์ด์ง๋ฅผ ๋ค๋ฅธ ๋ ์ด์์์ผ๋ก ๋ํํ๋ ๊ฒ๋ณด๋ค ๋ ์ง๊ด์ ์ด๋ผ๋ ๋ฐ ๋์ํด์ผํฉ๋๋ค.
๋ค์ 9.3๋ก, ๊ฑฐ๊ธฐ์ getStaticPaths
์ ์ถ๊ฐ๋ก getServerSideProps
๋์์ ํ๋ ์ ์ํฌ๋ ๊ฒฝ๋ก๊ฐ ๋ฃจํธ ๋งค๊ฐ ๋ณ์๊ฐ์๋ ๊ฒฝ์ฐ ๊ฒฝ๋ก๊ฐ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ ๋ฐ๊ฒฌ ํ ์ ์์ต๋๋ค. react-router๋ก ๋น์ทํ ์ ๊ทผ ๋ฐฉ์์ ์ทจํ ์ ์์ต๋๋ค.
@merryweather : "Next๋ ์ฑ๋ฅ์ ์ผ๋์๋๊ณ ๊ตฌ์ถ๋์์ผ๋ฉฐ, ์๋ฒ ์ธก react-router๋ ๋ ๋๋ง ํ ๋์์ ์๊ธฐ ์ ์ DOM ํธ๋ฆฌ๋ฅผ ์ดํด ๋ด์ผํ๋ค๋ ์ ์์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค."
์์งํ ์ง๋ฌธ : ํด๋ผ์ด์ธํธ์์ ์ฝ๋๊ฐ ์คํ๋๋ฉด ์ต์์ ๋งํฌ๋ฅผ ๋ ๋๋งํ๊ณ ๊ฐ์ ธ ์ค๊ธฐ / ํ๋ฆฌ ํ์น / ์บ์ ํ ์ ์์ต๋๊น? ํด๋ผ์ด์ธํธ๊ฐ ์ด๋๋ฅผ ํ์ํ ์ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ ์๋ฒ์์ DOM ํธ๋ฆฌ๋ฅผ ํ์ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๊น?
์์งํ ์์ ์๋๋ฆฌ์ค : ํด๋ผ์ด์ธํธ๊ฐ URL์ ์์ฒญํ๋ฉด ์ต์์ ๋งํฌ์ ๊ธฐ๋ณธ ํ์ฑ ๋งํฌ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๊ณ ์์ฒญ์ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ajax / ๊ฐ์ ธ์ต๋๋ค (๋๋ ํ์ด์ง๊ฐ๋ก๋๋๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ๋ฆฌ ํ์น). ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์๋ ํ์ ์์ค์ด ๋ชจ๋ ํฌํจ๋ฉ๋๋ค. ๊ฒฝ๋ก ... ํน๊ตฌ๊ณ ๋ฐ๋ณต ...?
@laurencefass ๊ทธ๋ฌ๋ ์ต์์ ๋งํฌ์กฐ์ฐจ๋ ์ฝ๋์ ์์ผ๋ฉฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ๊ฒฌํด์ผํฉ๋๊น? ์๋๋ฉด react-router์ ํจ๊ป ํ์ผ ์์คํ ๋ผ์ฐํ ์ ์ฌ์ฉํ์ฌ ์ต์์ ๋งํฌ๋ฅผ ์ฐพ์ ์ ์๋๋ก ํ์๊ฒ ์ต๋๊น?
@ avin-kavish Im์ ๊ตฌํ์ ๋ํ ์ธ๋ถ ์ ๋ณด์ ๋๋ตํ๋ ๊ฐ์ฅ ์ข์ ์ฌ๋์ ์๋์ง๋ง ํด๋ผ์ด์ธํธ์์๋ ์ด๊ธฐ ํ๋ฉด ์ฝํ ์ธ (์ต์์ ๋งํฌ + ๊ธฐ๋ณธ ์ฝํ ์ธ ) ๋ง ๋ ๋๋งํ๋ฉด๋ฉ๋๋ค. ๋ค๋ฅธ ๊ฒ์ ๋ด๊ฐ ์๊ฐํ๋ ์ฒซ ๋ฒ์งธ๋ก๋์์ ์ค๋ณต๋ฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ์๋ฒ์์ DOM์ ์ฌ์ฉํฉ๋๊น?
Next.js์ ์ฃผ์ ๋ฌธ์ ๋ ๋ผ์ฐํฐ๊ฐ ์๋๋ผ getInitialProps
, getServerProps
๋๋ getStaticProps
์ ๋ฐ์ดํฐ ๊ฐ์ ธ ์ค๊ธฐ ํจํด์
๋๋ค. ์ ? ํ์ํ ๊ตฌ์ฑ ์์์ ๋ํ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ๋ฅผ ์ค๋จํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ฉ๋ด์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ค๋ ๊ฒฝ์ฐ ์ด๋์์ ๊ฐ์ ธ ์ค๊ฒ ์ต๋๊น? ๋ชจ๋ฅด๊ฒ ์ด์. pages
์ ๊ฐ์ ์์ ๊ตฌ์ฑ ์์๋ ๊ทธ๊ฒ์ ๋ํด ์๋ฌด๊ฒ๋ ์์ง ๋ชปํฉ๋๋ค.
Next.js์ ์ฃผ์ ๋ฌธ์ ๋ ๋ผ์ฐํฐ๊ฐ ์๋๋ผ
getInitialProps
,getServerProps
๋๋getStaticProps
์ ๋ฐ์ดํฐ ๊ฐ์ ธ ์ค๊ธฐ ํจํด์ ๋๋ค. ์ ? ํ์ํ ๊ตฌ์ฑ ์์์ ๋ํ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ๋ฅผ ์ค๋จํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฉ๋ด์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ค๋ ๊ฒฝ์ฐ ์ด๋์์ ๊ฐ์ ธ ์ค๊ฒ ์ต๋๊น? ๋ชจ๋ฅด๊ฒ ์ด์.pages
์ ๊ฐ์ ์์ ๊ตฌ์ฑ ์์๋ ๊ทธ๊ฒ์ ๋ํด ์๋ฌด๊ฒ๋ ์์ง ๋ชปํฉ๋๋ค.
์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋์ฒด ์๋ฃจ์ ์ ๋ฌด์์ ๋๊น?
@lishine ์ฌ๊ธฐ์์ ์ฝ๊ฐ์ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ ๊ฒ์ ๋ํด ์ฃ์กํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ผ์ฐํฐ๊ฐ ์ฌ๊ธฐ์์ ์ฃผ์ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์์ง ๋ชปํฉ๋๋ค. Next.js ๋ผ์ฐํฐ๋ ํ๋ฅญํ๊ณ ์ ์ธ์ ์ด๋ฉฐ ๊ตฌ์ฑ์ ๋ํ ๊ท์น์ด ์ข์ต๋๋ค. Next.js์์ ์ฌ์ฉํ ์์๋ ์ ์ผํ ๊ฒ์ getInitialProps
, ...์ ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ ธ ์ค๊ธฐ ๋ฐฉ๋ฒ์
๋๋ค.
๋ด ์ฑ์์ ๊ฐ ๊ตฌ์ฑ ์์๋ graphql ๋๋ rest์ ๊ด๊ณ์์ด ๋์ผํ ์์น, ๋์ผํ ํ์ผ์์ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ์ธํด์ผํฉ๋๋ค.
์์ ํ์ด์ง ๊ตฌ์ฑ ์์๋ ํ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ฑํ๊ธฐ์ํ ๊ฒ์ด๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ์์
์ด ์๋๋๋ค. ์์ ๊ตฌ์ฑ ์์๋ ๋ถ๋ชจ๊ฐ ์๋ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํฉ๋๋ค.
๋ช ํ์ฑ์ ์ํด ์ฑ์ ์ฌ์ฉํ๋ ์ฝ๋ ์ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const query = `
{
result:users(
where:{
_and:[{
active:{
_eq:true
}
}, {
is_exam_manager:{
_eq:true
}
}]
},
order_by:{
created_at:desc_nulls_last
}
){
id
key:id
user_code
first_name
last_name
password
active
}
}
`
const Main = (props: any) => {
const {
data: { result }
} = props
return (
<div>
<Add title={'Add user'} role={'exam_manager'} />
<Table
columns={columns}
dataSource={result}
bordered={true}
size={'small'}
/>
</div>
)
}
const MainWithData = graphql(query)(Main)
export default MainWithData
๋ณด์๋ค์ํผ ์์ฒด ๋ฐ์ดํฐ๊ฐ์๋ ๊ตฌ์ฑ ์์๊ฐ ํ๋ ์์ต๋๋ค. ์ํ๋ ๊ณณ์ ๋ ์ ์์ต๋๋ค.
๋ฌผ๋ก Next.js ํจํด์ ์๋ฌด ๋ฌธ์ ์์ด ์ฌ์ฉํ ์ ์์ง๋ง ์ ๊ฒฝ์ฐ์๋ ๋์ค์ ์ฝ๊ฒ ์ ์ง ๊ด๋ฆฌํ๊ณ ๋ฆฌํฉํ ๋งํ๊ธฐ ์ํด ๊ฐ๋ฅํ ํ ๋ฐ์ดํฐ ๋ฐ ๊ตฌ์ฑ ์์์ ๋ํ ๊ฒฉ๋ฆฌ๋ฅผ ์ ํธํฉ๋๋ค.
๋ด ์ฑ์์ ๊ฐ ๊ตฌ์ฑ ์์๋ graphql ๋๋ rest์ ๊ด๊ณ์์ด ๋์ผํ ์์น, ๋์ผํ ํ์ผ์์ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ์ธํด์ผํฉ๋๋ค.
์์ ํ์ด์ง ๊ตฌ์ฑ ์์๋ ํ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ฑํ๊ธฐ์ํ ๊ฒ์ด๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ์์ ์ด ์๋๋๋ค. ์์ ๊ตฌ์ฑ ์์๋ ๋ถ๋ชจ๊ฐ ์๋ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํฉ๋๋ค.
์ ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ผ์ SSR ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ๋๋ค์ ์ค์ ๋ก Next.js๋ก SSR ๊ฐ์ ธ ์ค๊ธฐ๋ฅผ ์ด๋ป๊ฒ ์ํํฉ๋๊น?!
@linshine ์ฐ๋ฆฌ๋ ์ต์์ ํ์ด์ง ์์ค์์ ํ์ํ ๊ฒ์ ๋ค์ด๋ก๋ํด์ผํฉ๋๋ค.
@lishine ์ฌ๊ธฐ์์ ์ฝ๊ฐ์ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ ๊ฒ์ ๋ํด ์ฃ์กํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ผ์ฐํฐ๊ฐ ์ฌ๊ธฐ์์ ์ฃผ์ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์์ง ๋ชปํฉ๋๋ค. Next.js ๋ผ์ฐํฐ๋ ํ๋ฅญํ๊ณ ์ ์ธ์ ์ด๋ฉฐ ๊ตฌ์ฑ์ ๋ํ ๊ท์น์ด ์ข์ต๋๋ค. Next.js์์ ์ฌ์ฉํ ์์๋ ์ ์ผํ ๊ฒ์
getInitialProps
, ...์ ๊ฐ์ ๋ฐ์ดํฐ ๊ฐ์ ธ ์ค๊ธฐ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ด ์ฑ์์ ๊ฐ ๊ตฌ์ฑ ์์๋ graphql ๋๋ rest์ ๊ด๊ณ์์ด ๋์ผํ ์์น, ๋์ผํ ํ์ผ์์ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ์ธํด์ผํฉ๋๋ค.
์์ ํ์ด์ง ๊ตฌ์ฑ ์์๋ ํ์ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ์ฑํ๊ธฐ์ํ ๊ฒ์ด๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ์์ ์ด ์๋๋๋ค. ์์ ๊ตฌ์ฑ ์์๋ ๋ถ๋ชจ๊ฐ ์๋ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผํฉ๋๋ค.๋ช ํ์ฑ์ ์ํด ์ฑ์ ์ฌ์ฉํ๋ ์ฝ๋ ์ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
...
๋ณด์๋ค์ํผ ์์ฒด ๋ฐ์ดํฐ๊ฐ์๋ ๊ตฌ์ฑ ์์๊ฐ ํ๋ ์์ต๋๋ค. ์ํ๋ ๊ณณ์ ๋ ์ ์์ต๋๋ค.
๋ฌผ๋ก Next.js ํจํด์ ์๋ฌด ๋ฌธ์ ์์ด ์ฌ์ฉํ ์ ์์ง๋ง ์ ๊ฒฝ์ฐ์๋ ๋์ค์ ์ฝ๊ฒ ์ ์ง ๊ด๋ฆฌํ๊ณ ๋ฆฌํฉํ ๋งํ๊ธฐ ์ํด ๊ฐ๋ฅํ ํ ๋ฐ์ดํฐ ๋ฐ ๊ตฌ์ฑ ์์์ ๋ํ ๊ฒฉ๋ฆฌ๋ฅผ ์ ํธํฉ๋๋ค.
@ revskill10 ์์์ด ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์ ์ธํ๊ณ ๋ถ๋ชจ๊ฐ ์ต์์ ์ฟผ๋ฆฌ์ ํด๋น ์กฐ๊ฐ์ ํฌํจํ๋๋ก ํ ์์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ํนํ ํ์ ๊ด๋ จ ์กฐ๊ฐ์ ๋ ๋ง์ด ๋ง๋ค๋ฉด ์๋ฒฝํ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์์ ์กฐ๊ฐ์ด์๋ ๋ถ๋ชจ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ ๊ฒ์ JSX์์ ์์์ ์ ์ธํ๋ ๊ฒ๊ณผ ๋ค๋ฅด์ง ์์ผ๋ฏ๋ก ๋์ผํ ์์ค์ ๊ฒฐํฉ์ ๊ฐ์ง์ง ๋ง ์์ฒญ ํญํฌ๋ฅผ ํผํ ์ ์์ต๋๋ค (์ฌํ๊ฒ๋ REST์์๋ ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค).
Relay-Next ์ฑ์ด ์์ผ๋ฉฐ์ด ํจํด์ ๋ฐ์ดํฐ ์บก์ํ ๋ฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ์ผ๋ก ์๋ฒฝํ๊ฒ ์๋ํ๋ฉฐ getInitialProps
๋ฅผ ์ฝ๊ฒ ํ์ฉํฉ๋๋ค.
@merrywhether much harder in REST
์ ๋ํด์๋ ๋งํ ๊ฒ๋์๊ณ , ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ค fragments
๊ฐ SSG / SSR์ด ๋ ์ง ์๋๋ฉด CSR์ด ๋ ์ง ๊ฒฐ์ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ด ์ ๊ทผ ๋ฐฉ์์์๋ { noSSR: true/false}
ํด๋น ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ ธ ์ค๋ ๊ฒ๋ง ํผ ์ฝ์ต๋๋ค.
์ฃผ์ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ณต์ ํ์ง ์๋ ๊ณต๊ธ ์ ์ฒด๋ณ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ข ์์ ๋งค์ฐ ์ฐ๋ ค๋๋ ๋ถ๋ถ์ ๋๋ค.
์ต๊ทผ์ Next.js๋ฅผ ๊ฒํ ํ์ฌ ํ์ฌ ํด๋ผ์ด์ธํธ๋ฅผ ์ํด ๊ตฌ์ถ๋๋ ์ฌ๋ฌ ํ๋ฐํธ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๊ณต์ ๋๋ ๊ณตํต ์ฝ์ด์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํด์ผํ๋์ง ์ฌ๋ถ๋ฅผ ํ๊ฐํ์ต๋๋ค. Next.js์๋ ์ ์ฌ๋ ฅ์ด ์์ต๋๋ค. ์ด ๋ผ์ฐํฐ๋ ๋ด๊ฐ Next.js๋ฅผ ๊ฑฐ๋ถํ๊ณ ๋์ CRA๋ฅผ ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ ์งํ๊ฒ ๋ ์ฃผ์ ์ด์ ์ค ํ๋์ ๋๋ค.
react-router
/ @reach/router
์ ๊ตฌ์ฑ ์์ ๊ธฐ๋ฐ ์ต์์ API๋ฅผ SSR์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ด๋ ค์์ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ด ๊ธฐ๋ณธ ๊ตฌํ์ด ์์ ํ ๋ง์ถคํ ๋ ์ด์ ๋ ์๋๋๋ค. Gatsby์ SSG๋ Next.js์ ๊ฐ์ ๊ด์ฌ์ฌ๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ
๊ตฌ์กฐ์ ์ค ์ ์ฌํฉ๋๋ค. ํ์ง๋ง ๋ด ์ดํด์ Gatsby๋ ํ ์ ์ฌ๋ฐ ๋ช
ํ๊ฑฐ๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๋ Link API์ ์ผ์นํ์ง ์๋ Link API๋ฅผ ๋
ธ์ถํ๋ ๋์ ๋ผ์ฐํ
๊ตฌํ์ ๊ฐํํ๊ธฐ ์ํด ํ๋ ์๋์์ @reach/router
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@dantman Next.js ๋์์ผ๋ก ๋ฌด์์ ์ ํํ๋์ง ๋ฌผ์ด๋ณผ ์ ์์ต๋๋ค. ์๋ฒ ์ธก ๋ ๋๋ง์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค .... ์ ๋ After.js๋ฅผ ์ฌ์ฉํด ๋ณด์์ต๋๋ค. Zeit์์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ Next.js์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ / ์์ด๋์ด๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
@dantman Next.js ๋์์ผ๋ก ๋ฌด์์ ์ ํํ๋์ง ๋ฌผ์ด๋ณผ ์ ์์ต๋๋ค. ์๋ฒ ์ธก ๋ ๋๋ง์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค .... ์ ๋ After.js๋ฅผ ์ฌ์ฉํด ๋ณด์์ต๋๋ค. Zeit์์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ Next.js์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์๊ฐ / ์์ด๋์ด๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ๋์์ด๋๋ ๋ต๋ณ์ด ์์ต๋๋ค. SSR์ ์ด๋ ค์ด ์๊ตฌ ์ฌํญ์ด ์๋์๊ธฐ ๋๋ฌธ์ ํ๋กํ ํ์ ์ ์ฌ์ฉ ๋ CRA๋ฅผ ๊ณ์ ์ฌ์ฉํ์ต๋๋ค.
Next.js๋ ์ต๊ทผ์ SSR / SSG / ํด๋ผ์ด์ธํธ ์ ์ฉ ํ์ด์ง๋ฅผ ํผํฉํ๊ณ ๋ํ ์ฑ ๋๋ ์ ์ / PWA ์ฑ์ผ๋ก ์คํํ ์์๋ ๊ธฐ๋ฅ์ ์ป์ ๊ธฐ ๋๋ฌธ์ ๋ฒ์ฉ ํ๋ ์ ์ํฌ๋ก์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. WebPack ์ฌ์ฉ์ ์ ์๋ CRA๊ฐ globalize-compiler๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ํน์ ์ด์์ต๋๋ค. Next.js ์๋ฒ๋ GraphQL / REST ๋ธ๋ฆฌ์ง๋ฅผ์ํ API ์๋ฒ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฆฝ์ / ๊ธ์ ์ ์ด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ SSR / SSG์ ์ต์ ์ ๊ธ์ ์ ์ด์์ต๋๋ค. ํต์ฌ์ ๊ตฌ์ถ ํ ๋ 6 ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ธฐ๋ฐ์๋๊ณ ์์ผ๋ฉฐ ๋ฏธ๋์ ์ ์ฉ ํ ์ ์๋ค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ Next.js์ SSR์ด ์๋ํ๋ ๋ฐฉ์์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์์ผ๋ฉฐ ์ด๋ฌํ ๊ธ์ ์ ์ธ ์ ์ ๋ผ์ฐํฐ๋ก ์ธํ ๋ฌธ์ ์ ๊ฐ์น๊ฐ ์์์ต๋๋ค.
@dantman
์ฃผ์ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ณต์ ํ์ง ์๋ ๊ณต๊ธ ์ ์ฒด๋ณ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ข ์์ ๋งค์ฐ ์ฐ๋ ค๋๋ ๋ถ๋ถ์ ๋๋ค.
๋ฐ์ด๋ ์์ ์ฑ๊ณผ "์ ํ / ์์ฅ ์ ํฉ์ฑ"์ผ๋ก ์ธํด 3 ๋ ๋์ ๋ณ๊ฒฝ๋์ง ์์ API๋ก ์คํ ์์ค ๊ตฌ์ฑ ์์๋ฅผ "์ ๊ธ"์ผ๋ก ํ์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ด์ํฉ๋๋ค.
Next.js๋ ์ฑ๊ณต ํ์ผ๋ฉฐ ๋ผ์ฐํฐ ์๋ ๋ถ๊ตฌํ๊ณ
๋ง์ ์ฌ๋๋ค์ด ์ ๊ฐ ํธ์ํฐ์ ๋๊ธ์๋ค๋ ๊ฒ์ ๋ณด์ ๋ฏ์ด, ์๋ ์ ์ฐ๋ฆฌ๋ ์ผ๋ถ ๋ผ์ฐํฐ์์ ๋ณํฉํ๋ ๊ฒ์ ์ง์งํ๊ฒ ์ฆ๊ฒผ์ต๋๋ค (ํ์ง๋ง Reach ๋๋ React Router ์ค ์ด๋ ๊ฒ์ด ํ์ค์ธ์ง, ์ด๋ค ์ฃผ์ ๋ฒ์ ์ธ์ง ํผ๋ ์ค๋ฝ์ง๋ง). ๊ทธ๋ฌ๋ ์ธ์์ ์ฐ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๋ฐฉํฅ์ผ๋ก ์ด๋์์ต๋๋ค. ์ค์ ๋ก ๋ชจ๋ ์ฌ๋๋ค์ด Next.js๋ก ๊ณ์ ์ฑ๊ณตํ๊ณ ๋ฉ์ง ์ ํ์ ๊ตฌ์ถํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ถ๊ฐ์ ์์ ์ด ๋ฌด์์ธ์ง ๋ชฐ๋์ต๋๋ค.
๋ค๋ฅธ ๋ผ์ฐํฐ API๋ฅผ ์ํ๋ ์ด์ ๋ฅผ ์ฌ๋๋ค์๊ฒ ์ค์ ๋ก ๋ฌผ์ด๋ณผ ๋ ๊ฐ์ฅ ์์ฃผ ๋ฑ์ฅํ๋ ์ด์ ๋ ์ฌ๋๋ค์ด ๋ผ์ฐํฐ์ ๊ตฌ์ถ ๋ ์์ฒด ๊ฐ๋ฐ ํ๋ ์ ์ํฌ ์๋ฃจ์ ์ ๊ฐํ ์๊ณ ๋ถ๋ง์ค๋ฌ์์ Next๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. . ์ ํ ๋์์ธ์ ๋ฟ๋ฆฌ๋ฅผ ๋ ์ด์ ๊ฐ ์๋ ์์ต๋๋ค.
Next๊ฐ ๋ผ์ฐํฐ ๋๋ถ์ ์ฑ๊ณตํ๋ค๊ณ ๋งํ๋ฉด ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์ ๊ฑฐ ๋์๊ธฐ ๋๋ฌธ์
๋๋ค.
1๏ธโฃ ๋ผ์ฐํฐ๋ฅผ ์ ํํด์ผํ๋ค๋ ์๊ฐ . ์ด๊ฒ์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋์ด์ผ ๋ณด๋ฉด ํ๋ฅญํ ๊ฒฐ์ ์
๋๋ค. ์์ ์ ์ธ ๋ผ์ฐํฐ๋ฅผ ๊ฐ์ถ Next.js๊ฐ ์กด์ฌํ๋ ๋์ ๋ผ์ฐํฐ ์ธ๊ณ๋ ๋ถ์ด๋์ด ๋ชจ๋ ์ข
๋ฅ์ API ๋ณ๊ฒฝ์ ์์ํ์ต๋๋ค.
2๏ธโฃ ๋ผ์ฐํฐ์ ํ์ต ๊ณก์ . ๋ผ์ฐํ ์ ๋ํ ๋ง์ ์ํฌ์ต๊ณผ ์์ต์๊ฐ ์ ๊ณต๋์์ง๋ง Next.js ํ์ผ ์์คํ ์ฐ์ ๋ผ์ฐํ ์ ์ค๋ช ํ๋ ๋ฐ 2 โโ์ด๊ฐ ๊ฑธ๋ฆฌ๋ฉฐ ๋๋ผ์ด ๊ฒ์ ๋น๋ ํ ์์๋ ํ๋ซํผ์ ์ ๊ณตํ๋ฉฐ ์ ํ ๊ฐ๋ฐ๋ก ๋ฐ๋ก ์ด๋ํฉ๋๋ค.
์ด ๋ง์ง๋ง ์์ ์ ๊ฐ์กฐํ๊ณ ์ถ์ต๋๋ค. Next.js์ ๊ตฌ์ถ ๋ ์ธ๊ณ์์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๋ ์ต์ ์น ์ฌ์ดํธ ์ค ํ๋ ์ธ TikTok.com์ ๊ณ ๋ คํด๋ณด์ธ์. ํด๋น ์น ์ฌ์ดํธ์ ์ ์ฒด ๋ผ์ฐํ
ํ ํด๋ก์ง๋ 2 ์ด ํ์ต ๊ณก์ ์ผ๋ก ์ค๋ช
ํ ์ ์์ต๋๋ค. https://www.tiktok.com/@sheezus.christ/video/6824007862197439750 ์ pages/[user]/video/[id].js
์ด๊ณ https://www.tiktok.com/trending ์ pages/trending.js
ํ์ด๋ธ๋ฆฌ๋ ์ ์ / SSG / SSR๊ณผ ๊ฐ์ด ๊ทํ๊ฐ ์ธ๊ธ ํ ์ต๊ทผ Next.js ํ์ ์ค ์๋น์๋ ๋ผ์ฐํฐ ์ค๊ณ๋ฅผ ํตํด ํ์ฑํ๋ฉ๋๋ค. ์ฌ์ค, ๋ผ์ฐํฐ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ ์ ์ JS๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์์ผ๋ก ๋์ฌ ๋ค๋ฅธ ๋ง์ ์ ์ฌํ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ Next.js์ SSR์ด ์๋ํ๋ ๋ฐฉ์์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์์ผ๋ฉฐ ์ด๋ฌํ ๊ธ์ ์ ์ธ ์ ์ ๋ผ์ฐํฐ๋ก ์ธํ ๋ฌธ์ ์ ๊ฐ์น๊ฐ ์์์ต๋๋ค.
์ด๊ฒ์ ๋ํด ๋ฃ๊ณ ์ถ์ต๋๋ค. ์์ ์์ ๋ Next.js ํ์ด๋ธ๋ฆฌ๋ ์ ์ / SSR๋ก ๊ตฌ๋๋๋ฉฐ ์ ๋ฐ์ ์ผ๋ก ๋ง์ ์ฑ๊ณต์ ๊ฑฐ๋์์ต๋๋ค!
์ด๊ฒ์ ์ ๋ง ์ฌ๋ฏธ์๋ ์ค๋ ๋์
๋๋ค. Next๋ ํญํฌ ๋ผ์ฐํ
(react-router ๋ฐ ์น๊ตฌ๋ผ๊ณ ๋ ํจ)์ ํผํด์ผํ๋ ๊ตฌ์ฒด์ ์ธ ์ด์ ๊ฐ ์์ต๋๋ค. getInitialProps
๋ ๋ง์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒํ๊ณ , ํนํ ์ผ๋ถ ์ฌ๋๋ค์ด ํน๋ณํ ์ด๋ฌํ ์ต์ ํ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ Next์ ์ ๊ทผ ๋ฐฉ์์ ๊ฝค ์ธ๊ธฐ๊ฐ ์์ต๋๋ค. ์ฑ๋ฅ์ ๋์์ธ ํธ๋ ์ด๋ ์คํ์ ํจ๊ป ์ ๊ณต๋๋ฉฐ ๋๋ก๋ ์ฑ๋ฅ๋ณด๋ค ๋์์ธ์ ์ ํํ๋ ๊ฒ์ ์ ํธ ํ ์ ์์ง๋ง ๋๊ตฌ๊ฐ ์๋ชป๋๋ ๊ฒ์ ์๋๋ฉฐ ํน์ ํ๋ก์ ํธ์ ๋ํด ์๋ชป๋ ๊ฒ์
๋๋ค.
๊ถ๊ทน์ ์ผ๋ก react-router๋ ๋ชจ๋ ๋ผ์ฐํ ์๋ฃจ์ ์ด ์๋๋๋ค. Next์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฅ๋จ์ ์ด ์์ต๋๋ค. FWIW, Facebook์ react-router๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ์๋ง๋ React ์ฌ์ฉ์ ๋ํด ํ๋ ๊ฐ์ง๋ฅผ ์๊ณ ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ๋์์ด์๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค. ์ค์ ๋ก JS ์ํ๊ณ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๋ ์์ด๋์ด์ ์์ญ์์ ์๋ก ๋ค๋ฅธ ์์๊ฐ ๊ฒฝ์ํ๊ฒํ๊ณ ๊ถ๊ทน์ ์ผ๋ก ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ์์ผ๋ก ๋์๊ฐ ์ ์๋๋กํ๋ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ ์ค์ด๋ฏ๋ก ๋ผ์ฐํ ๊ธฐ๋ฅ์ ๋ํ ์๊ฒฌ, ๊ธฐ๋ฅ ์์ฒญ ๋ฐ ๋ฒ๊ทธ ๋ณด๊ณ ์์ ํญ์ ์ด๋ ค ์์์ ๋ถ๋ช ํํ๊ณ ์ถ์ต๋๋ค.
์ด์์ ์ผ๋ก๋ ์ ํ ์ค์ฌ์ ์ธ ๊ฒ์ ๋๋ค ( "X๋ฅผํด์ผํ์ง๋ง ๋ถ๊ฐ๋ฅํฉ๋๋ค"๋๋ "Y๋ ๊ฐ๋ฅํ์ง๋ง ์ธ์ฒด ๊ณตํ์ ์ด์ง ์์"). ์ฐ๋ฆฌ๋ ํญ์ ํ๋ฅญํ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ๋ฆฐ ์น ์ฌ์ดํธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ๋์์ด๋๋ ๊ฐ์ ์ฌํญ์ ์ฐพ๊ณ ์์ต๋๋ค ๐ค
@rauchg ๋งํฌ ์ href
๋ฐ as
๋ ๊ฐ์ ์ํ์ด์๋ ์ด์ ๋ฅผ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? as
prop์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ ํ ํ์ด์ง๋ฅผ ์ถ๋ก ํ ์์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
ํํ์ ์๋ฅผ ๋ค์ด ๋ด๊ฐ ๊ฐ์ ๊ฒฝ๋ก๊ฐ์๋ ๊ฒฝ์ฐ /blog/:slug
, ๋ ๊ทธ๋ฅ์ HTTP ์์ฒญ์ ๋ณด๋ผ ์ /blog/hello-world
ํ๊ณ ๊ทธ๊ฒ์ ๋ฐ ๋ผ์ฐํฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค. /blog/:slug
์ blog/hello-world
๋ฅผ ๋ชจ๋ ์๋ฒ๋ก ๋ณด๋ผ ํ์๊ฐ ์์ต๋๋ค.
@ avin-kavish ์ข์ ์ง๋ฌธ์ ๋๋ค. URL์ ํ์๋๋ ๋ด์ฉ๊ณผ๋ก๋ ํ ํ์ด์ง ์ฌ์ด์๋ ์ค์ํ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ฌ์ค TikTok์์ด๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํญ๋ชฉ์ ๋ชจ๋ฌ๋ก ๋ ๋๋งํ๋ฏ๋ก ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์น๋ฉด ๋ค๋ฅธ ํ์ด์ง๊ฐ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ํ ๊ฐ์ง ํฐ ๊ฐ์ ์์ญ์ ํ์ผ ์์คํ ์์๋ ์ ํจํ ํ์ด์ง๋ฅผ ์ฐธ์กฐํ๋๋ก ์ ์ ์ผ๋ก ์ ์ฉํด์ผํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด์ ๋ํ ํ ๋ก ์ ๋ง๋ค๊ณ ํ๊ทธ๋ฅผ ์ง์ ํ์ฌ ํ์ ์กฐ์น๋ฅผ ์ทจํ ๊ฒ์ ๋๋ค!
https://github.com/zeit/next.js/issues/8207์ ๋ํ ๋ฌธ์ ๊ฐ ์ด๋ฏธ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๋์ฒ๋ผ ๋ชจ๋ ๊ฒ์ ๋ค์ ๋ ๋๋งํ์ง ์๊ณ ์ ํ์ด์ง๋ก ์ด๋ํ ์์๋ "์ค์ฒฉ ๋ ๊ฒฝ๋ก"๊ธฐ๋ฅ๊ณผ ๊ฐ์ ๋ฐ์ ๋ผ์ฐํฐ๋ก์ด ๋ฌธ์ ๋ฅผ ๋ณธ ๊ฒฝ์ฐ ์ค์ ๋ก๋ณด๊ณ ํฌํ ํ ์์๋ ์ ์ฉ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ ๋ฐฉ๊ธ ๊ทธ๊ฒ์ ๋ํด ์์ ๋์ต๋๋ค : https://github.com/zeit/next.js/issues/8193
ํ
์ด ๋ด ๊ธฐ๋ณธ ๋ฌธ์ ์์ ๋ช ํํ๊ฒํ๊ธฐ ์ํดํ๋ ๊ฒ์ RR / ๋๋ฌ ์คํ์ผ์ ๊ตฌ์ฑ ์์ API์ ๋ถ์กฑ ์๋๋ค, ๋๋ SSR ์์๋ ํ์ผ / ์ค์ ๊ธฐ๋ฐ์ API์ ์์ ๋๋ค. ๋๋ ๋ฏธ๋์ Suspense๊ฐ ๋์ฒด SSR / ๋ผ์ฐํ API๋ฅผ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์์์ ๊ฒ์ด๋ผ๊ณ ์ฝ๊ฐ ๋๊ด์ ์ด์ง๋ง. ๋ด ์ฃผ์ ๋ฌธ์ ๋ ๋ผ์ฐํฐ๊ฐ ๋ ๋์ React ์ปค๋ฎค๋ํฐ์ ์ผ๋ถ์ ๊ณต์ ํ๋ ๋์ ๋ค์ ๊ตฌํ๋๋ ๊ตฌํ์ ๋ํ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ก ์์ ํ ์ฌ์ฉ์ ์ง์ ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋๋ Gatsby์ ์ ๊ทผ ๋ฐฉ์์ด ์์ฉ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํฉ๋๋ค. SSG ๊ฐ๋ฅ ํ์ผ + ๊ตฌ์ฑ ๊ธฐ๋ฐ ๋ผ์ฐํ
API๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์์ฒด ํฅ์๋ ๋งํฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ด ๋ณด๋
๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ @reach/router
๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ฐํํฉ๋๋ค.
์ฃผ์ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ณต์ ํ์ง ์๋ ๊ณต๊ธ ์ ์ฒด๋ณ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ข ์์ ๋งค์ฐ ์ฐ๋ ค๋๋ ๋ถ๋ถ์ ๋๋ค.
๋ฐ์ด๋ ์์ ์ฑ๊ณผ "์ ํ / ์์ฅ ์ ํฉ์ฑ"์ผ๋ก ์ธํด 3 ๋ ๋์ ๋ณ๊ฒฝ๋์ง ์์ API๋ก ์คํ ์์ค ๊ตฌ์ฑ ์์๋ฅผ "์ ๊ธ"์ผ๋ก ํ์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ด์ํฉ๋๋ค.
๋ผ์ฐํฐ๋ ๋ณธ์ง์ ์ผ๋ก Next.js์ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ํ ๊ฐ์ง ์ด์ ๋ก Next.js๋ฅผ ์ฑํํ๋ค๋ ๊ฒ์ ๋ผ์ฐํฐ์ ๋ฌถ์ฌ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. Next.js๋ฅผ ์ฑํํ๊ณ ๋์ค์ next / router์ ์ฐ๋ฆฌ๊ฐํ๋ ค๋ ์ผ์ ๋ฐฉํดํ๋ ํ๊ณ๊ฐ ์์์ ๋ฐ๊ฒฌํ๋ฉด ํฉ๋ฆฌ์ ์ธ ํ์ถ ํด์น๊ฐ ์ ํ ์์ต๋๋ค. "Lock-in"์ ๊ทธ๊ฒ์ ๋ํ ์๋ฒฝํ ์ค๋ช ์ ๋๋ค.
๋ฝ์ธ๋ง์ผ๋ก๋ ํฐ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค. Gatsby์ @reach/router
๋ ์ข
์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ @reach/router
๋ Gatsby ์ธ๋ถ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ ์ฒด ๋ผ์ฐํฐ ์คํ์ ์ ์งํ๊ธฐ ์ํด Gatsby ์ปค๋ฎค๋ํฐ ๋ง ์ ๋ขฐํ ํ์๋ ์์ต๋๋ค. ๋๋ ๋ ํฐ ์ปค๋ฎค๋ํฐ๊ฐ ๊ทธ๊ฒ์ ์์กดํ๊ณ ๋ ๋ง์ ์ดํด ๊ด๊ณ์๊ฐ (๋ผ์ฐํ
์คํ์ ํน์ ํ) ๊ด๋ จ๋์ด ์ ์ง๋๊ณ , ์ด๋ ค์ด ๋ผ์ฐํ
๋ฌธ์ (์ : ์ ๊ทผ์ฑ)๋ฅผ ๋ฐ๋ผ ์ก์ผ๋ฉฐ, ๋ ๋ค์ํ ์ปค๋ฎค๋ํฐ์ ์์กดํ๊ณ ์๋ค๊ณ ๋ฏฟ์ ์ ์์ต๋๋ค. ์์ผ๋ก ๋ฐ์ํ ์์๋ ์ ์ฌ์ ์ผ๋ก ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ๊ณต์ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ด๋ค ๊ฒ์ด ๋น์ ์ ๋ง์ ์์์๋ ํ์ค, Reach ๋๋ React Router, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ฃผ์ ๋ฒ์ ์ธ์ง ํผ๋ ์ค๋ฝ์ง๋ง
<Link>
์ ์ค์ง์ ์ธ ํ์ค ์ธก๋ฉด์์. Reach์ React Router (RR)๋ ๋ชจ๋ ๋งค์ฐ ์ ์ฌํ API๋ฅผ ๊ณต์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด <Link to='/about'>About</Link>
๋ RR๊ณผ Reach ๋ชจ๋์์ ์ ํจํฉ๋๋ค (๋ฌผ๋ก ํ์ฅ Gatsby). ์ด๊ฒ์ Next.js์ ํน์ดํ <Link href='/about'><a>About</a></Link>
๋ฅผ ํจ์ฌ ๋ ์ด๋ฆฌ๋ฅ์ ํ๊ฒ ๋ง๋ญ๋๋ค.
Next.js๊ฐ ์ฌ์ฉํด์ผํ๋ค๊ณ ์๊ฐํ๋ ์ธก๋ฉด์์. Next.js๊ฐ ์ด๋ฏธ ํ๋๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌถ์ฌ ์์ง๋ ์์ต๋๋ค. ๋ด ์ฃผ์ ๊ด์ฌ์ฌ๋ ๋ผ์ฐํ ๊ตฌํ์ด Next.js ์ธ๋ถ์ ๋ ๋์ ์ปค๋ฎค๋ํฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ณต์ ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ค์ ๋ก ๊ทธ๊ฒ์ ์๋์ ์ผ๋ก ๋ ผ์์ ์ฌ์ง๊ฐ ์์ต๋๋ค. ์ง๊ธ๊น์ง ๋๊ท๋ชจ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ RR ๋ฐ Reach ์ธ์๋ React ๋ผ์ฐํฐ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ RR๊ณผ Reach๋ ํ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ๊ฒ์ด๋ฏ๋ก ์ต์ข ๊ฒฐ๊ณผ๋ก ์์ํ๋ ๊ฒ์ด ๋์ผํฉ๋๋ค.
์ผ๋ง ์ ์ Next๋ฅผ ์๋ํ์ง๋ง ๋ผ์ฐํฐ์ ์ ์ฐ์ฑ์ด ๋ถ์กฑํ์ฌ After.js https://github.com/jaredpalmer/after.js?utm_source=hashnode.com ์ด๋ผ๋ Razzle ๊ตฌํ์ ๋ฐ๊ฒฌํ์ต๋๋ค
React Router๋ ๋จ์ง ํจํค์ง์ด๋ฏ๋ก ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ ๋ ๋๋ง์ ํด๋ผ์ด์ธํธ ์ธก์ผ๋ก ๋ง ์ ํํ์ฌ ํ์ํ ๊ณณ์์ SPA์ฒ๋ผ ์๋ํ๊ณ ์ค์ฒฉ ๋ ๊ตฌ์ฑ ์์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น? React ๋ผ์ฐํฐ๋ ํ์ด์ง์ (์ ์ฌ์ ์ผ๋ก) ํฌํจ๋๊ณ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก Next.js ํ์ด์ง ๋ผ์ฐํฐ์ ํจ๊ป๋ก๋๋๋ ๊ตฌ์ฑ ์์ ์งํฉ ์ผ ๋ฟ์ ๋ ๊น?
zeit์ด RR์ ํตํฉ ํ ๊ณํ์ด๋ผ๋ ์ด์ ์ค๋ ๋๋ฅผ ์ฝ์๋๋ฐ ์ค๋๋ ์๋ ์ฌ์ ํ ์ฌ์ค์ ๋๊น?
์ตํ์ ์๋จ์ผ๋ก next.js ๋ผ์ฐํฐ์ ์ค์ฒฉ ๋ ๊ฒฝ๋ก๋ฅผ ํ์ฉํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ด๋ฉฐ ์ด๋ฌํ ์์ญ์ด ์ฌ์ ๋ ๋๋ง๋์ง ์์ ๊ฒ์์ ๋ถ๋ช ํํฉ๋๋ค. ์ต์ํ ๊ฒฝ๋ก์ ๋ฐ๋ผ ํ์ด์ง์ ํ์ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋๊ธฐ๋ฅผ ์ํ ๋ ํ์ฐ์ ์ผ๋ก ์์ฑํด์ผํ๋ if ์กฐ๊ฑด์ ์์ฑํ์ง ์์ผ๋ ค๋ ๋ ธ๋ ฅ์ ์ ์ฝ ํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ํฌํ๋ฅผ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
์ธ๊ธ๋์ง ์์ ๋ ๋ค๋ฅธ ํ๋ก๋ RR์ด ๋ ํ ์คํธ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค. (AFAIK๋ ๋ผ์ฐํฐ ํ ์คํธ๋ฅผ์ํ ๊ณต์ nextjs API๊ฐ ์์ต๋๋ค) ํ ์คํธ ๋ฐ ์คํ ๋ฆฌ๋ฅผ ๋ํํ๊ธฐ์ํ MemoryRouter๊ฐ ์์ต๋๋ค.
Next.js์๋ ๋ง์ ์ข์ ๊ธฐ๋ฅ (์๋ WebPack, ์ ์ ํ์ผ ๋ฐ CRA์ ๊ฐ์ TypeScript๊ฐ ์์ง๋ง PWA, API ๊ฒฝ๋ก, ์๋ฒ๋ฆฌ์ค ์ง์, ๋น ๋ฅธ ์๋ก ๊ณ ์นจ, ์น + ๋ค์ดํฐ๋ธ ์ฑ์ ๋ํ ์คํ์ ์ธ Expo ์ง์)๊ณผ ์ฝ์ด๊ฐ ์์ต๋๋ค. API๊ฐ ํ๋ฅญํ์ง ์๋๋ผ๋ SSR ๋ฐ SSG ์ฉ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ด์ฅ ๋ผ์ฐํ ์์คํ ๊ณผ SSR / SSG๊ฐ ์ผ๋ถ๋ฅผ ์ํด ์๋ํ๋ ๋์; ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๋ API์ ํ๊ณ๊ฐ ํด๋น ํ๋ก์ ํธ์ ๋ํด ์๋ชป๋ ํธ๋ ์ด๋ ์คํ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ๋ฐฉํดํฉ๋๋ค.
ํํ์ ์ด๋ป์ต๋๊น. Next.js์๋ ์ด๋ฏธ ํ๋ฌ๊ทธ์ธ์ด ์์ต๋๋ค. ๋ผ์ฐํฐ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๊ต์ฒดํ๋ ๋์ Next.js์ ์ฝ์ด์์ ๋ผ์ฐํฐ์ SSR API (์ : ๊ฒฝ๋ก ํ์ผ์ getStaticProps
/ getServerSideProps
)๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ด๋จ๊น์? ์๋ฅผ ๋ค์ด ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ํต์ฌ ๋ถ๋ถ์ @next/core
๋ฃ๊ณ ํ์ฌ ์๊ฒฌ์ด์๋ ๋ผ์ฐํฐ์ get*Props
API๋ฅผ @next/router
๋ก ์ด๋ํ ์ ์์ต๋๋ค. ๋จ์์ฑ๊ณผ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด next
๋ @next/core
๋ฅผ ๋ค์ ๋ด๋ณด๋ด๊ณ Vercel์ด ์ ํธํ๋ ๋ผ์ฐํฐ๋ก ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋์ด ์ ๊ณต๋๋ ํ๋ ์ ์ํฌ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ปค๋ฎค๋ํฐ๊ฐ Next.js์ ์ข์ ๋ถ๋ถ์ ๋ชฉ์๋ฌผ๊ณผ ํจ๊ป ๋ฒ๋ ค์ผํ๋ ํ๋ก์ ํธ์ ๋ ์ ํฉํ ์๋ก ๋ค๋ฅธ ์ ์ถฉ์์ผ๋ก ๋ผ์ฐํฐ ๋ฐ SSR / SSG API๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์
๋๋ค.
Next.js ์ฝ์ด๊ฐ ์ ๊ณตํ๊ธฐ ์ํด ๋ผ์ฐํฐ ํ๋ฌ๊ทธ์ธ์ด ํ์ํ ์ฌํญ์ ๋ํ ๋ช ๊ฐ์ง ์๊ฐ :
@next/router
๋ ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํํ์ฌ API๋ฅผ ํตํด ๋์ผํ ํจํด์ ๊ตฌํํ ๊ฒ์
๋๋ค.
getStaticPaths
๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋ด๊ธฐ์ ์ ์ ํ์ด์ง ๋ชฉ๋ก ์ ๊ณต@apollo/react-ssr
์ ํจ๊ป React Router v6์ ์ฌ์ฉํ๊ณ react-ssr-prepass
๋๋ react@experimental
์ ํจ๊ป Suspense๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํฐ ํ๋ฌ๊ทธ์ธ์ ์คํํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ํ SSR ๊ฒฝ๋ก์ ๋ํ SSR ์ ์ฉ ๊ฒฝ๋ก๋ฅผ ํฌ๊ธฐํ๊ณ get*Props
์คํ์ผ API๋ฅผ ์ ํํ์ง ์๊ณ SSR / SSG๋ฅผ ๊ตฌํํฉ๋๋ค.
๋ด๊ฐ ๊นจ๋ฌ์ ๊ฒ์ ์ค์ฒฉ ๋ผ์ฐํ
+ SSG๋ฅผ ํ์ฌ API๋ฅผ ์์์ํค์ง ์๊ณ ๋ฌ์ฑ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ํ์ฌ getStaticPaths
๊ฐ) ์์ผ๋ฏ๋ก์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ ๋ ๋๋ง์ ์ํด ์ค์ฒฉ ๋ ๊ฒฝ๋ก๋ฅผ ํํธ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด
/foo/[...slug]
๊ฒฝ๋ก๊ฐ ์ฃผ์ด์ง๋ฉด
function FooPage() {
return (
<Switch>
<Route path="/foo/bar">
<SomeResource />
<Route path={`${parenthPath}/baz`} component={SomeSubResource} />
</Route>
.... more routes
</Switch>
)
}
๋ฏธ๋ฆฌ ๋ ๋๋ง ํ ์ ์์ต๋๋ค.
export async function getStaticPaths() {
return {
paths: [
{ slug: [ 'bar' ] },
{ slug: [ 'bar', 'baz' ] },
],
}
}
ํ์ฌ ์ํฉ์์ next.js๋ ๋ฐ์ ํ ํ์ด์ง ์์ฑ์ ํธ์์ฑ์ ๊ฐ์ถ ์๋ฒ ์ธก ํ๋ ์ ์ํฌ์ ๊ฐ์ต๋๋ค. react-router
๋งํผ ๊ฐ๋ ฅํ์ง ์์ต๋๋ค. ๋๋ ํ ๋ฆฌ ๊ธฐ๋ฐ ๋ผ์ฐํ
์ ์์์ ์ธ๊ธํ๋ฏ์ด tiktok๊ณผ ๊ฐ์ ์๋น์ ๋๋ฉด ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉ ํ ์ ์์ง๋ง ๋ณต์กํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
ํฌํธ์ ๊ฒฝ์ฐ ์ค์ฒฉ ๋ผ์ฐํ
์ด ์ฌ์ ํ ์์
๋๋ค. ์ด๊ฒ์ด ๋จ์ผ ํ์ด์ง ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฒ์์ ๋ง๋ค์ด์ง ์ด์ ์ด๋ฉฐ ์ ์ฒด ํ์ด์ง๋ฅผ ๊ต์ฒดํ์ง ์๊ณ ๋ UI์ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฆฌ์์ค-ํ์ ๋ฆฌ์์ค ๊ด๊ณ๋ฅผ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ๋ชจ๋ธ๋งํ๋ ๋ฐ ํ์ฉํ ์ ์์ต๋๋ค. ํ์ฌ ์ ์ ์๊ฑฐ๋ ์ฌ์ดํธ์ ๊ฐ์ ์๋น์ ์ฌ์ดํธ์ ๊ณต๊ฐ ํ์ด์ง๋ฅผ ๊ตฌ์ถํ๋ ค๋ฉด next.js
์ฌ์ฉํ ์ ์์ง๋ง ๊ด๋ฆฌ์, ๊ตฌ๋งค์ ๋ฐ ํ๋งค์ ํฌํธ๊ณผ ๊ฐ์ ๋น๊ณต๊ฐ ์์ญ์ ๊ตฌ์ถํด์ผ ํ ๋๋ CRA๋ก ์ ํํ์ญ์์ค.
@ avin-kavish์ ์ฃผ์ ๋ฌธ์ ๋ ์๋ํ๋๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ์ต์ ํํ๋ ๊ฒ์ ๋๋ค. Next.js ๊ธฐ๋ณธ์ ๊ฐ ํ์ด์ง์๋ ์์ฒด ๋ฒ๋ค์ด ์์ผ๋ฉฐ ์๋์ ์ต์ ํ๋์ด ์์ต๋๋ค.
ํ ํ์ด์ง์ ๋ง์ ์ฝํ
์ธ / ํ์ ์ฝํ
์ธ ๋ฅผ ์ถ๊ฐํ๊ธฐ ์์ํ๋ฉด ๊ฒฐ๊ตญ์๋ ์๋นํ ํฐ ๋ฒ๋ค๋ก ๋๋ ์ ์์ต๋๋ค (๊ทธ ์์ฒด๋ก๋ "๋์ฐํ"๊ฒ์ ์๋์ง๋ง ์ฅ๋จ์ ). next/dynamic
์๊ฐ์ผ๋ก ์๋ ์ต์ ํ๋ฅผ ์ํ ํ ์ ์์ต๋๋ค. :)
@rauchg ์ ์ผํ ์ฐจ์์ ๋ค์ ๋ผ์ฐํฐ๊ฐ ์ข์์ง ๋์์ง ์ฌ๋ถ๊ฐ ์๋๋๋ค. ๋ ๋ค๋ฅธ ๋งค์ฐ ์ค์ํ ๊ฒ์ next.js ๋ฐ ์ปค๋ฎค๋ํฐ ์ง์๊ณผ์ ๋ง์ด๊ทธ๋ ์ด์ ์ด๋ฉฐ https://github.com/vercel/next.js/issues/1632#issuecomment -633310614๊ฐ ์ ์ค๋ช ํฉ๋๋ค. Next.js๋ ๊ณ ํ์ง SSR ์ฑ์ ํ์ํ ๋ง์ ์์ฉ๊ตฌ๋ฅผ ์ถ์ํ ํ ์์๋ ์ข์ ์๋ฃจ์ ์ด๋ฉฐ, ๋ฐ๋ผ์ ๋ง์ ์น ์ฑ์์ ๋งค์ฐ ๋งค๋ ฅ์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ๋์์ ๋๋ค. ํ์ฌ ๋ฌธ์ ๋ next.js๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ ์ํด ์์ ํ ๋ผ์ฐํ ์ฌ ์์ฑ์ด ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด์ ์ @dantman์ด ์ ์ํ ํ๋ฌ๊ทธ ํ ๋ผ์ฐํ ์์ด ๋ฌธ์ ๋ฅผ ๋งค์ฐ ์ฐ์ํ ๋ฌธ์ ๋ก ํด๊ฒฐํ๊ณ ๋๊ตฌ์๊ฒ๋ ์์น์ ํ๋งคํ๋๋ก ์๊ตฌํ์ง ์์ต๋๋ค ๐
react-router (๋ฐ ์ค์ฒฉ ๋ผ์ฐํ ์๋ฃจ์ )์ ๋ฌธ์ ๋ ์ฝ๋ ์์ฒด๋ฅผ ์คํ (๋๋ ์๋ฎฌ๋ ์ด์ )ํ์ง ์๊ณ ๋ ํน์ URL์ ๋ํ ๊ด๋ จ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ ๋ถ์์ ํจ์ฌ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค. ๋ค์์ ๋จ์ํ "์น ํ์ด์ง์ UI ๋ฐฐ์น"ํ๋ ์ ์ํฌ ์ด์์ ๋๋ค. ์๋ฅผ ๋ค์ด Chrome ํ๊ณผ ํ๋ ฅํ์ฌ ๋์ฑ ์ต์ ํ ๋ ๋ฒ๋ค๋ง ์ ๋ต์ ๊ฐ๋ฐํ์ต๋๋ค.
react-router ์ฌ์ฉ์๋ ๊ทธ ์ฑ ์์ ์ต์ข ์ฌ์ฉ์์๊ฒ ์ ์ ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ react-loadable์ ์ง์ ์ฌ์ฉํ๋ ๋ฐ ์ต์ํ์ง๋ง Next๋ ์ฝ์ง ์์ ์ถ์ํ์ ์๋ํ๋ฅผ ์๋ํฉ๋๋ค. ์ ์ ๋ ํ๋ฌ๊ทธ ํ ๋ผ์ฐํฐ ์ ๊ทผ ๋ฐฉ์์ ๋์ผํ ์ ํ์ ์ถ๋ ฅ์ ์ป๊ธฐ ์ํด ํ๋ ์ ์ํฌ์ ๊ด๋ฒ์ํ ๋น๋ ์๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ผ์ฐํฐ ํ๋ฌ๊ทธ์ธ์ ํฌํจํด์ผ ํ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋ผ์ฐํฐ๋ ์์ฒด ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฌํ ์ ๋ณด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ ํ ์ถ์ธก์ด์ง๋ง React๊ฐ Suspense๋ฅผ ์๋ฃํ๋ ๋์ ๋ง์ ๊ฒ๋ค์ด ๋ฆผ๋ณด์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ํด๋์ค ํจํด์ด ๋ชจ๋ ๋ผ์ฐํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฐ ์ํฅ์ ๋ฏธ์น๊ณ ๋น๋๊ธฐ /๋ก๋ ๊ฐ๋ฅ ๋น๋๋ฅผ์ํ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฐ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฒ๋ค ํจํด.
์งง์ ์ด์ผ๊ธฐ / ์๋์ ๋ํ ์ข์ ์์ฝ : "๋ชจ๋ ์๋ฃจ์ ์ ์ ํฉํ ๋จ์ผ ํฌ๊ธฐ"๋ผ๋ ๊ฒ์ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ ์ฅ๋จ์ ์ด ์์ต๋๋ค. Next.js๊ฐ ํ์ฌํ๋ ๋ฐฉ์์ ๋ชจ๋ "์ฅ์ "์๋ ๋จ์ ์ด ์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ์ฅ์ / ๋จ์ ์ ๊ฐ ํ๋ก์ ํธ๋ง๋ค ๋ค๋ฆ ๋๋ค. ๋ฐ๋ผ์ ํ๋ฌ๊ทธ ํ ๋ผ์ฐํฐ / ssg / ssr ์ํคํ ์ฒ์ ๋ํ ๊ถ์ฅ ์ฌํญ์ ๋๋ค. ํ๋ก์ ํธ๋ง๋ค ๋ค๋ฅธ ๊ฒ์ด ํ์ํ๋ฉฐ ํ์ฌ Next.js๋ ์ ์ถฉ์ ๋ํ ์ฐ์ ์์๊ฐ Next.js์์ ํ๋ ์ฝ๋ฉ๋๋ ๋ฐฉ์๊ณผ ์ผ์นํ๋ ํ๋ก์ ํธ์์๋ง ์๋ํฉ๋๋ค.
react-router (๋ฐ ์ค์ฒฉ ๋ผ์ฐํ ์๋ฃจ์ )์ ๋ฌธ์ ๋ ์ฝ๋ ์์ฒด๋ฅผ ์คํ (๋๋ ์๋ฎฌ๋ ์ด์ )ํ์ง ์๊ณ ๋ ํน์ URL์ ๋ํ ๊ด๋ จ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ ๋ถ์์ ํจ์ฌ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ค.
์์งํ SSG๋ฅผ ์ฌ์ฉํ๊ณ ๋น ๋์ ๊ฒฝ๋ก๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ง ์ค์ํฉ๋๋ค. ๋ชจ๋ ๊ฒฝ๋ก๊ฐ SSG ๋๋ ํด๋ผ์ด์ธํธ ์ ์ฉ์ด๋ฉด ์ ์ฉํ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ์ ๊ฒฝ๋ก๊ฐ ๋์ ์ด๋ฉด getStaticPaths
์ฌ์ฉํ์ฌ ๋ช
์ ์ ์ผ๋ก ์ ์ธํด์ผํฉ๋๋ค. ์์ ์์ด ์์ react-router๋ฅผ ์ฌ์ฉํ๊ณ ๋ช
์ ์ ์ผ๋ก ์ ์ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋๋ก ์์ฒญํ๋ ๊ฐ์์ Next.js ํ๋ฌ๊ทธ์ธ์์ ๊ฒฝ๋ก๋ฅผ ๋ช
์ ์ ์ผ๋ก ์ ์ํ๋ ๊ฒ๊ณผ ๋์ผํ ์์
๋์
๋๋ค.
ํ์คํ ์ด์ ์ด๋ฉฐ ์ผ๋ถ ํ์ ๊ทธ๊ฒ์ ์ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ ์ฌ์ ์ธ Next.js ์ฌ์ฉ์์ ํ์ ๊ทธ๋ฃน์ ๋ถ๊ณผํฉ๋๋ค. RR ๋๋ ๋ค๋ฅธ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ด์ ์ค ์ผ๋ถ๋ฅผ ์ํ ์์๋ ๋ค๋ฅธ ๊ทธ๋ฃน์ด ์์ผ๋ฉฐ ์ ์ ๊ฒฝ๋ก๋ฅผ ๋ช ์ ์ ์ผ๋ก ์ ์ธํด์ผํ๋ ํ์์ฑ์ ํ์ฉ ๊ฐ๋ฅํ ์ ์ถฉ์ ์ด๊ฑฐ๋ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ๋ง์ง๋ง ๋ช ๊ฐ์ง ํ๋ก์ ํธ๋ 100 %๊ฐ ๋ก๊ทธ์ธ ํ์ด์ง ๋ค์ ์๊ณ ์ ์ ์ผ๋ก ๋ ๋๋ง ํ ํ์๊ฐ์๋ B2B / B2C ์ฑ์ ๋๋ค. Next.js๋ Next.js๋ฅผ ์ ํธํ๋ CRA์ ๋นํด ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ผ์ฐํฐ์ ๊ฐ์ ๊ฒ๋ค์ ํฐ ์ํ ์ ํธ ์๊ณ ์ฐ๋ฆฌ๋ CRA๋ฅผ ๊ณ์ ์ฌ์ฉํ์ต๋๋ค. ์ด๋ฌํ ํ๋ก์ ํธ๋ raw react-router๊ฐ์๋ Next.js์ ๋งค์ฐ ์ ํฉํ์ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ํ next/router
์ํ์ง ์๋ ๋ชจ๋ ์ฌ๋๋ค์ด JSX ํํ์ react-router๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด๊ฒ์ด next/router
๋์์ ์ ์ผํ ์ ํ์ ์๋๋๋ค.
๋ค๋ฅธ ์ ํ์ ๋ผ์ฐํฐ๋ Gatsby.js ์คํ์ผ์
๋๋ค. ํ๋ก์ ํธ๊ฐ ์ฌ์ ํ ํ์ผ ์์คํ
๊ธฐ๋ฐ ํ์ด์ง ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ด๋ถ๋ react-router์ ๊ฐ์ ๋ค๋ฅธ ๋ผ์ฐํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌํ๋ฉ๋๋ค (Gatsby๋ ๋ด๋ถ์ ์ผ๋ก @reach/router
). ์ด๋ฌํ ์ข
๋ฅ์ ๋ผ์ฐํฐ ํ๋ฌ๊ทธ์ธ์ ๋์ผํ ์ ์ ๋ถ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ฒด ๋ผ์ฐํฐ๊ฐ ์ค์ฒฉ ๋ผ์ฐํ
๊ณผ ๊ด๋ จ์ด์๋ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒฝ๋ก API์ ๋ํ ์ ์ฌ์ ์ธ ์ ํธ ์ฌํญ ์์ฉ, ์ ๊ทผ์ฑ ์ฒ๋ฆฌ ๊ฐ์ , ํด๋น ๋ผ์ฐํฐ ์ฃผ๋ณ์ ์ํ๊ณ์ ๋ํ ํตํฉ ๊ฐ์ .
๋ฌผ๋ก react-router ์ํ๊ณ ๋ด์์๋ JSX ์์์ด react-router๋ฅผ ์ฌ์ฉํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋๋ค. react-router-config๋ ์์ต๋๋ค. ์ ์ ๋ถ์์ ์ํํ๊ธฐ ์ฝ๊ณ ์ค์ฒฉ ๋ผ์ฐํ ๋ ์ง์ํฉ๋๋ค.
react-router ์ฌ์ฉ์๋ ๊ทธ ์ฑ ์์ ์ต์ข ์ฌ์ฉ์์๊ฒ ์ ์ ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ react-loadable์ ์ง์ ์ฌ์ฉํ๋ ๋ฐ ์ต์ํ์ง๋ง Next๋ ์ฝ์ง ์์ ์ถ์ํ์ ์๋ํ๋ฅผ ์๋ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ ์ฝ๋ ๋ถํ ์ฒ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ค์ฒฉ ๋ผ์ฐํ ์ ์๋ ์ฝ๋ ๋ถํ ๋ณด๋ค ํ๋ก์ ํธ์ ๋ ์ค์ ํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ํธ๋ ์ด๋ ์คํ๊ฐ ๋ฌด์์ธ์ง์ ๊ดํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ถ์์ ์ด์ง๋ง ์ค์ ๋ก ๊ฒฝ๋ก์ ๋ํด์ด๋ฅผ ์๋์ผ๋ก ์ํํ๋ babel / webpack ํ๋ฌ๊ทธ์ธ์ ์ ์ฌ๋ ฅ์ ๋ํด ๊ถ๊ธํฉ๋๋ค.
๋ํ react-loadable์ ํจ๊ณผ์ ์ผ๋ก ์๋ฉธ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค (๊ฒ์ ํ 2 ๋
, ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์๋ฝํ์ง ์์). ๊ฐ์ธ์ ์ผ๋ก ์ ๋ react-loadable์ ๋ด๋ถ ํฌํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Next.js์ ์๋์ผ๋ก ๋ด์ฅ ๋ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค @loadable/components
์ฝ๋ ๋ถํ ์ ์๋์ผ๋ก ์ํํ๊ณ ์ถ์ต๋๋ค.
์ ์ ๋ ํ๋ฌ๊ทธ ํ ๋ผ์ฐํฐ ์ ๊ทผ ๋ฐฉ์์ ๋์ผํ ์ ํ์ ์ถ๋ ฅ์ ์ป๊ธฐ ์ํด ํ๋ ์ ์ํฌ์ ๊ด๋ฒ์ํ ๋น๋ ์๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ผ์ฐํฐ ํ๋ฌ๊ทธ์ธ์ ํฌํจํด์ผ ํ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋ผ์ฐํฐ๋ ์์ฒด ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฌํ ์ ๋ณด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์์ผํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์. ์ด๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ํ๋ฌ๊ทธ์ธ ์์คํ ์ด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค. ์์งํ ์ด๋ฐ ์ข ๋ฅ์ ์ ๋ณด๊ฐ ํ๋ฌ๊ทธ์ธ์ ์ํด ์ ๊ณต ๋ ์ ์๋ค๋ ์ฌ์ค์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์ฅ์ ์ ๋๋ค. ํ๋ฌ๊ทธ์ธ์ ์ด๊ฒ์ ํฌํจํ๋ค๋ ๊ฒ์ Next.js๊ฐ์ด ์ ๋ณด๋ฅผ ์์งํ๋ ๋ฐฉ์์ด ์ผ๋ถ ์ ํ์ ํ๋ก์ ํธ ์๊ตฌ์ ์ ํฉํ์ง ์์ ๊ฒฝ์ฐ ํด๋น ํ๋ก์ ํธ์ ์๊ตฌ์ ๋ง๋ ๊ฒ์ผ๋ก ๋์ฒด ํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ ๊ฒํ๊ธฐ ์ํด ๋ชจ๋ Next.js๋ฅผ ํฌํฌํ๊ณ ๋ค์ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค.
์์ ํ ์ถ์ธก์ด์ง๋ง React๊ฐ Suspense๋ฅผ ์๋ฃํ๋ ๋์ ๋ง์ ๊ฒ๋ค์ด ๋ฆผ๋ณด์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ํด๋์ค ํจํด์ด ๋ชจ๋ ๋ผ์ฐํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฐ ์ํฅ์ ๋ฏธ์น๊ณ ๋น๋๊ธฐ /๋ก๋ ๊ฐ๋ฅ ๋น๋๋ฅผ์ํ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฐ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฒ๋ค ํจํด.
์ด๊ฒ์ ๊ทธ ์์ฒด๋ก ํ๋ฌ๊ทธ ํ ๋ผ์ฐํฐ ์์คํ ์์ ์์ ํ๊ธฐ์ํ ๊ฝค ์ข์ ์ฃผ์ฅ์ด ๋ ์ ์์ต๋๋ค. ๋ผ์ฐํ ๋ฐ SSR ๋ฌผ๊ฑด ๋ชจ๋ Next.js์ ํ๋ ์ฝ๋ฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ ์ฝ๊ฒ Next.js. ๋ด์์ ์์คํ ์ ๋ผ์ฐํ ๋ฏธ๋์ ๋ชจ๋ ์ ํ์ ์คํ์ ํ ์ ์์ต๋๋ค Suspense๋ Next.js์ ๋ผ์ฐํ ๋ฐ ๊ธฐํ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ค ์ํฅ์ ๋ฏธ์นฉ๋ ๊น? Next.js ์ฒญํฌ๋ฅผ ํฌํฌํ๊ณ ๋ค์ ์์ฑํ์ง ์๊ณ ๋ (์ ์ด๋ Next.js์ SSR ๋ฐ ๋ฒ๋ค๋ง๊ณผ ๊ด๋ จํ์ฌ) ์คํ ํ ์์๋ ๊ฒ์ด ์๋๋๋ค.
๋ผ์ฐํฐ ํ๋ฌ๊ทธ์ธ์ ์ด๋ฐ ์ข
๋ฅ์ ์คํ์ ์ํํ๊ธฐ์ ์ข์ ์ฅ์์
๋๋ค. ํ๋ฌ๊ทธ์ธ API๊ฐ ์ถฉ๋ถํ ๋ฎ์ ์์ค์ด๋ฉด next/router
ํ๋ฌ๊ทธ์ธ ๋ง ํฌํฌํ๊ณ ํด๋น ๋ผ์ฐํฐ์ react @ experimental + Suspense ๊ธฐ๋ฐ ๋ฒ์ ์ ์์ฑํด ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ํ๋ฌ๊ทธ์ธ (Next.js์ ๋ชจ๋ ํฌํฌ๊ฐ ์๋)์ด๊ธฐ ๋๋ฌธ์ ์คํ์ ์ฐธ์ฌํ๊ณ ์๋ก์ด ์์คํ์ค ๊ธฐ๋ฐ ๋ผ์ฐํฐ๋ฅผ ํ
์คํธํ๊ธฐ๊ฐ ์ฝ์ต๋๋ค. ์ด๋ฐ ์ข
๋ฅ์ ์คํ์ด ์ค์ ํ๋ก์ ํธ์์ ํผ๋๋ฐฑ์ ์์งํ๊ธฐ ์ํด react @ experimental ์ด ์กด์ฌํ๋ ์ด์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋์ค๋ณด๋ค๋ ์ง๊ธ ์ค์ํฉ๋๋ค.
@dantman ๋๋ ๋น์ ์ด ๋งํ ๊ฒ์ ๋์ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ชจ๋ ํธ๋ ์ด๋ ์คํ์ ๊ดํ ๊ฒ์ ๋๋ค. ๊ฐ์ฅ ํฐ ๋จ์ ์ Next ํ์ด ์๊ฐ์ ๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ์ง๊ธ๊น์ง ์ ๊ตฌ์ฑ ๊ณ ์ฑ๋ฅ SSR์ด ์ฃผ์ ์ด์ ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๋ฐ๋์ ๊ด๋ จ์ด์๋ ๊ฒ์ ์๋์ง๋ง Next๊ฐ ์ฒ์์ ๋์ ๋๋ ๋ฐ ์ฌ์ฉ ๋ ๊ฐ๋๋ผ๋ ๊ฒ์ ์ดํดํฉ๋๋ค (์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ง์ฅ์์ ๊ทธ๋ค์ ์ ํํ๋ ์ด์ ์ ๋๋ค). ๊ทธ๋ค์ ์ต๊ทผ Gatsby์ Jamstack์ ์ธ๊ธฐ๋ก ์ธํด SSG๋ฅผ ๋ ๋ง์ด ํ๊ณ ์์์ง๋ง ์ฌ์ ํ SSR imo์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
์์งํ SSG๋ฅผ ์ฌ์ฉํ๊ณ ๋น ๋์ ๊ฒฝ๋ก๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ง ์ค์ํฉ๋๋ค.
SSG ๋ SSR์ ์ฒซ ํ์ด์ง ( "์ค์ ๊ฒฝ๋ก"JS)์ ๋ํด ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ JS ํ์ด๋ก๋๋ฅผ ์ ๊ณตํ๋ ค๊ณ ์๋ํ๊ฑฐ๋ ๋์ ๊ฒฝ๋ก๋ฅผ ์ํํ๋ ๋ฐ ์ค์ ๋ก ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ค์ ๊ฒฝ๋ก ์์ฐ์ ์ต์ํํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก SSR ์ฑ์ ๋งค์ฐ ์ค์ํ๋ฏ๋ก (๋ฐ๋ผ์ ๋ชจ๋ ๋ ธ๋ ฅ) ๊ฐ์ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์งํ, ๋น์ ์ด ๋ง๋๋ ๋ชจ๋ ๊ฒ์ด ๋ก๊ทธ์ธ ์ CSR ์ ์ฉ ์ฑ์ด๋ผ๋ฉด, Next _does_๋ CRA์ ๋นํด ๋ง์ ๋จ์ ์ด ์์ต๋๋ค (SSR์ ๊ฒฐ์ฝ CSR๋งํผ ํธ๋ฆฌํ์ง ์์ ๊ฒ์ ๋๋ค). ์ค์ ๋ก ์ฑ๋ฅ ํฅ์์ ์ํด ๋ฐํ์ SSR (๋ก๊ทธ์ธ / ๊ฐ์ธํ์ ์๋ฒ ์ธก ์ฒ๋ฆฌ ํฌํจ)์ ์ํํ๋ ์ฑ์ ํ ์ธํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋ชจ๋ ๊ฒ์ด SSG์ CSR ์ด๋ถ๋ฒ์ ๋ถํฉํ๋ ๊ฒ์ ์๋๋๋ค.
์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ ์ฝ๋ ๋ถํ ์ฒ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ ์นํฉ, react-dom / server ๋ฑ์ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ์ง๊ธ๊น์ง Next์ ๋ชฉํ๋ CRA์ฒ๋ผ ์ด๋ฌํ ๋ฐฐ์ถ์ ๋ ํฌ๊ทํ๊ณ ํฌ๊ทํ๊ฒ ๋ง๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ด ์ณ์ต๋๋ค. ๊ทธ ๊ณต๊ฐ์๋ ๋ง์ ์๋ฃจ์ ์ด ์๊ณ Relay์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ฌ์ค ์ฝ๋ ํจํด์ผ๋ก ์ธํด ๋์ฑ ์ด๊ตญ์ ์ด๋ฏ๋ก ๋ฐ์๋ก๋ ๊ฐ๋ฅ์ด๋ผ๊ณ ๋ง ํ์ด์ผํ์ต๋๋ค.
๊ถ๊ทน์ ์ผ๋ก ํ๋ฌ๊ทธ ํ ๋ผ์ฐํฐ ์์คํ ์ด ์ข์ ์ ์๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ์ ๋ Next ํ์ด ํ๋ ์ ์ํฌ์ ํต์ฌ ์์น (์ : ๋ฒ๋ค ๋ถํ ๋ ผ๋ฆฌ)์ ์ ๊ฑฐํ๊ณ ํ๋ฌ๊ทธ ํ ์ํคํ ์ฒ๋ก ์ถ์ถํ๋ ๊ฒ์ด ๋ง์ ์์ ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์ง์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ด ์ถ์ธก์ ๊ณง ๋ด ํต์ฌ ์ข ์์ฑ์ ๋ํ ํฅํ ๋ณ๊ฒฝ์ผ๋ก ์ฝ๊ฒ ๋ค์งํ ์์๋ ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ๋ณ๊ฒฝ์ ์ค๊ณํ๊ณ ์ถ์ง ์๋ค๋ ์ฌ์ค์ ๊ฐ์กฐํ๊ณ ์์์ต๋๋ค. ๋ฅ์คํธ ๋์์ธ์ ์ผ๋ถ ์ธก๋ฉด์ด ์ ํ์ ์ด๋ผ๋ ๋ฐ ํ์คํ ๋์ํ์ง๋ง, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ฌํ ์ ํ์ ์ง๊ธ๊น์ง์ ๋์์ธ ์ ์ฝ์ ๊ณ ๋ คํ ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์์งํ SSG๋ฅผ ์ฌ์ฉํ๊ณ ๋น ๋์ ๊ฒฝ๋ก๊ฐ ๋ง์ ๊ฒฝ์ฐ์๋ง ์ค์ํฉ๋๋ค.
SSG ๋ SSR์ ์ฒซ ํ์ด์ง ( "์ค์ ๊ฒฝ๋ก"JS)์ ๋ํด ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ JS ํ์ด๋ก๋๋ฅผ ์ ๊ณตํ๋ ค๊ณ ์๋ํ๊ฑฐ๋ ๋์ ๊ฒฝ๋ก๋ฅผ ์ํํ๋ ๋ฐ ์ค์ ๋ก ์ค์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์๋ง๋ ์ด๋ค ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋์ง ์ ์ ์ผ๋ก ๋ถ์ํ๋ ๋ฅ๋ ฅ์ด ํ์ํ ๋ค๋ฅธ ์ด์ ๋ฅผ ์๊ฐํ๊ณ ์์ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ ๋ ๋ค "์ ์ ๋ถ์"์ "๋จ์ํ ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ๋ง์ผ๋ก ๋น๋์ ๊ฒฝ๋ก ๋ชฉ๋ก (์ : ['/about', '/', '/profile']
)์ ์๋ณ ํ ์์๋ ๋ฅ๋ ฅ"์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด๋ค ์ ํ์ JS ๋ฒ๋ค ์ต์ ํ์ ๋ํด ๋งํ๋ ๊ฒ ๊ฐ์ต๋๊น? ๋ฌธ์์์ ์ ๋ณด๋ฅผ ์ฐพ์ง ๋ชป ํ์ผ๋ฏ๋ก ์ ์ ๊ฒฝ๋ก ๋ถ์์ ๊ธฐ๋ฐ์ผ๋กํ๋ ์ต์ ํ ์ ํ์ ์ ํํ ์์ง ๋ชปํฉ๋๋ค.
์ด ์ ์ ๊ฒฝ๋ก ๋ถ์์ด ์ฃผ๋ก SSG์ ์ ์ฉํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ฆ, ์ฌ์ดํธ๋ฅผ ๋น๋ ํ ๋ pages/about.js
ํ์ผ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ Next.js๋ /about
๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ ์๊ณ ๋ช
์ ์ ์ผ๋ก ์ธ๊ธ ํ ์ ์ด ์๋๋ผ๋์ด ๊ฒฝ๋ก์ ๋ํ html์ ๋ฏธ๋ฆฌ ๋ ๋๋งํด์ผํฉ๋๋ค. ์ฌ์ ๋ ๋๋ง์ ๋ํ /about
๊ฒฝ๋ก๊ฐ ์์ต๋๋ค.
SSR์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง ์ํํ๋ฏ๋ก ๋ฏธ๋ฆฌ ๋น๋ ๋ html์ด ํ์ํ์ง ์์ต๋๋ค (์ด ์์ ์์ ์ฝ๋๋ฅผ ์คํํ๊ณ ๋ ๋๋ง ํ ๊ฒฝ๋ก๊ฐ ํ๋ ์์). ํด๋ผ์ด์ธํธ๊ฐ ๋ ๋๋ง ํ ํ์ด์ง์๋ ๋ฏธ๋ฆฌ ๋ ๋๋ง ๋ HTML์ด ์ ํ ์์ต๋๋ค. SSG ํ์ด์ง๊ฐ ๋์ ์ด๋ฉด ์ด์จ๋ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์ ์ธํด์ผํฉ๋๋ค. ๋ฐ๋ผ์ ๋ด ์๊ฐ.
๊ทธ๋ฆฌ๊ณ ์์งํ, ๋น์ ์ด ๋ง๋๋ ๋ชจ๋ ๊ฒ์ด ๋ก๊ทธ์ธ ์ CSR ์ ์ฉ ์ฑ์ด๋ผ๋ฉด, Next _does_๋ CRA์ ๋นํด ๋ง์ ๋จ์ ์ด ์์ต๋๋ค (SSR์ ๊ฒฐ์ฝ CSR๋งํผ ํธ๋ฆฌํ์ง ์์ ๊ฒ์ ๋๋ค).
CSR ์ฑ๊ณผ ๊ด๋ จํ์ฌ Next.js์์ ์ด๋ค ๋จ์ ์ ์๊ฐํ๊ณ ์์ต๋๊น? ์์ ์ธ๊ธ ํ ๋ผ์ฐํฐ ๋ฌธ์ ์ธ์.
๋ด ์ดํด์ Next.js๋ SSR / SSG / CSR ๊ฒฝ๋ก์ ์ ์ฒด ์์ญ์ ์ง์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ก๊ทธ์ธ ๋ฒฝ์ผ๋ก ๋ CSR ์ ์ฉ ์ฑ์ ์์ฑํ๋ ๋ฐ ์ฌ์ ํ ์ ํฉํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ด ๊ด์ ์ ๋๋๋ก SSR ๋ฐ SSG๊ฐ ํ์ํ ๋ง์ CSR ์ฑ์ ์์ฑํ๋ ๋๊ตฐ๊ฐ๋ก๋ถํฐ ๋ด ๋ชจ๋ ํ๋ก์ ํธ์ ๋ํด ๊ฐ๋ ฅํ ๋จ์ผ ํดํท์ ์ํ๊ณ ๊ทธ๋ค์ด ํ์ํ SSR / SSG / CSR์ ์กฐํฉ์ ์๊ด์์ด ์ํ๋ ๊ฒ์ ๋๋ค.
๋ด ๊ฒฝํ์ CRA๋ CSR ์ ์ฉ ์ฑ ๋ด์์๋ Next.js์ CSR ํ์ด์ง๋ฅผ ์ ๋ฆฌํ๊ฒ ๋ง๋ค ์์๋ ๋ง์ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊บผ๋ด์ง ์๊ณ WebPack ๊ตฌ์ฑ ์ฌ์ฉ์ ์ ์๋ ํฐ ๋ฌธ์ ์ ๋๋ค. i18n์ ์ฑ์ ์ถ๊ฐ ํ ๋ ๋จ์ํ globalize-compiler WebPack ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์ ์์์ ๋ ์ด๋ก ์ธํด ๋ง์ ๊ณ ํต์ ๊ฒช์์ต๋๋ค. ๋๋ถ๋ถ์ ํ์ด์ง๊ฐ CSR ์ธ ๊ฒฝ์ฐ์๋ ํน์ ํ์ด์ง์ ๋ํด SSR / SSG๋ฅผ ์ตํธ ์ธํ๋ ๊ธฐ๋ฅ๋ ์ฅ์ ์ ๋๋ค (์ : ํ์ด์ง์ 99.9 %๊ฐ CSR์ด๊ณ ๋ก๊ทธ์ธ ํ์ด์ง ๋ค์ ์์ง๋ง ๋๋ฉ ํ์ด์ง๊ฐ ์๊ณ ์ฝ๊ด / ์ฐ๋ฝ์ฒ๊ฐ์์ ์ ์์) SSG ๋๋ SSR์ ์ํ๋ ํ์ด์ง). CRA์ ๊ฐ์ ๊ฒ๋ค๋ก๋ ํฉ๋ฆฌ์ ์ผ๋ก ๊ทธ๋ฐ ์ผ์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ ์ฝ๋ ๋ถํ ์ฒ๋ฆฌ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ฐ๋ฆฌ ์ค ์ผ๋ถ๋ ์นํฉ, react-dom / server ๋ฑ์ ์ฒ๋ฆฌ ํ ์ โโ์์ต๋๋ค. ์ง๊ธ๊น์ง Next์ ๋ชฉํ๋ CRA์ฒ๋ผ ์ด๋ฌํ ๋ฐฐ์ถ์ ๋ ํฌ๊ทํ๊ณ ํฌ๊ทํ๊ฒ ๋ง๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์งํ, ๊ฒฝ๋ก ๊ธฐ๋ฐ ์ฝ๋ ๋ถํ (React.lazy ๋๋ ์ง์ ๊ฐ์ ธ ์ค๊ธฐ ๋์ ๋์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๊ฒฝ๋ก ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋๋ก ์์ )์ ์๋์ผ๋ก ์ํํ๋ ๊ฒ์ ์ฌ์ฉ์ ์ง์ WebPack ๊ตฌ์ฑ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ฑฐ๋ ์์ฑํ๋ ๊ฒ๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์ต๋๋ค. react-dom/server
์์ ์ SSR ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ ์ฒด WebPack ๊ตฌ์ฑ ๋๋ ์ฌ์ฉ์ ์ง์ SSR ์๋ฒ (์ : Next.js์ ๊ฐ์ด ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ๋ ์ ์ํฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ)๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ถ์ง๋ ์์ง๋ง, react-router๋ฅผ ์ฌ์ฉํ๊ณ ๊ฒฝ๋ก ๊ธฐ๋ฐ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์ํํ๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค. ํํธ. ํนํ ์๋ ๊ฒฝ๋ก ๊ธฐ๋ฐ ์ฝ๋ ๋ถํ ์ ์ ํํ๋ฉด ์ฌ์ฉ์ค์ธ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ผ์ฐํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ด ๋ฒ๋ฆฌ๊ณ ๋ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋๋ ๋ผ์ฐํฐ์๋ ๋งค์ฐ ๋ค๋ฅธ API์ ํ์ํ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด์๋ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ์๋ฒ๋ฅผ ๋ง๋ค ํ์๊ฐ์๋ NextJS์ react-router
์ (๋ฅผ) ํตํฉํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์ ๋ ํญ์์ด ๋ฌธ์ ์ ์ฐฉ์ํ์ต๋๋ค. ๊ทธ๋์ ์ง์ ์๋ํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
react-router
v6 (๋ฒ ํ)๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ง์ _app
:
// _app.js || _app.tsx
import * as React from 'react'
import App from 'next/app'
import NextRouter from 'next/router'
export default class CustomApp extends App {
render() {
const { Component, pageProps } = this.props
if (process.browser) {
const { Router } = require('react-router-dom')
const { createMemoryHistory } = require('history')
const history = createMemoryHistory({
initialEntries: [this.props.router.asPath],
})
history.listen(function ({ action, location }) {
const url = {
hash: location.hash,
pathname: location.pathname,
search: location.search,
}
switch (action) {
case 'PUSH':
return NextRouter.push(url)
case 'REPLACE':
return NextRouter.replace(url)
default:
return void 0
}
})
return (
<Router location={history.location} navigator={history} action={history.action}>
<Component {...pageProps} />
</Router>
)
} else {
const { StaticRouter } = require('react-router-dom/server')
return (
<StaticRouter location={this.props.router.asPath}>
<Component {...pageProps} />
</StaticRouter>
)
}
}
}
NextJS (์ : /foo/[[...bar]].js
)์์ _optional catch all route_๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ข
๋ฅ์ ํ์ด์ง์ ๋ํด react-router
๋ฅผ ์ฌ์ฉํ ์์๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ค๋ฅธ ์ด์ ๋ฅผ ๊ฐ์ง๊ณ ์์์ง ๋ชจ๋ฅด์ง๋ง ๊ทธ๊ฒ์ด ๋์ ์ฃผ์ ๊ด์ฌ์ฌ์ด๋ฉฐ react-router
๋ ํนํ ํ์ฌ ๋ฒ ํ ๋ฒ์ ์ธ v6์์ ๋ฉ์ง API๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ทธ๊ฒ์ ๋จ์ง ์ฌ์ฉ์์๊ฒ ์์ฑ MemoryRouter
๋์ BrowserRouter
์ฐ๋ฆฌ๊ฐ NextJS ๋ผ์ฐํฐ ๋ฐ NextJS ๋ผ์ฐํฐ๋ฅผํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ก๊น์ง ์๋ง๊ฐ ์์ต๋๋ค. PUSH
๋ฐ REPLACE
์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ก ๋ณ๊ฒฝ์ ์์ ํ๋ฏ๋ก react-router
ํํฌ ๋๋ Link
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ํ ์ ์์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ NextJS ๋ผ์ฐํฐ ๋ฉ์๋ .push
๋ฐ .replace
ํธ์ถ.
NextJS ๋ผ์ฐํฐ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฒฝ๋ก ๋ณ๊ฒฝ์ด ์ค์ ๋ก NextJS get*Props
๋ฉ์๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์์ต๋๋ค. ์ฆ, NextJS Link
์ฌ์ฉํ๋ shallow
์ต์
๊ณผ ์ ์ฌํ๊ฒ ์๋ํฉ๋๋ค. ์ฌ์ฉ์ ๋จ์ react-router
์ Link
์ ํ ์๋ค๋ ๊ฒ์ด๋ค prefetch
. ๊ทธ๋ฌ๋ ๋์ NextJS Link
๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ react-router
๋ ์ฌ์ ํ ๊ฒฝ๋ก ๋ณ๊ฒฝ์ ๋ฐ์ ํ ์ ์์ต๋๋ค.
๋ฉ์ง ์ ์ ์ด์ NextJS dynamic
๋ฐ react-router
๊ฒฝ๋ก๋ฅผ ํ์ฉํ๊ณ ๋ค์๊ณผ ๊ฐ์ ์์
์ ์ํ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
// /foo/[[...bar]].js
import * as React from 'react'
import { Route, Routes } from 'react-router-dom'
import dynamic from 'next/dynamic'
const Home = dynamic(() => import('src/views/Home'))
const About = dynamic(() => import('src/views/About'))
const Navigation = dynamic(() => import('src/views/Navigation'))
export default function Root() {
return (
<>
<Navigation />
<Routes>
<Route path="/foo/" element={<Home />} />
<Route path="/foo/about" element={<About />} />
</Routes>
</>
)
}
์ด์จ๋ ์ด๊ฒ์ด ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋๋ ์ด๊ฒ์ ํ๋ก๋์ ์์ ์ฌ์ฉํ์ง ์์๊ณ ์ด ์ฝ๋๋ ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ง์ญ ๋์ดํฐ์์ ์จ ๊ฒ์ด๋ฏ๋ก ์๋ง๋ ๊ฐ์ ํ ์์๋ ๊ฒ์ด์์ ๊ฒ์ด์ง๋ง ์์์ผ ๋ฟ์ด๋ค.
๋น์ ์ดํด์ผ ํ Next.js 9.5 ์ด์ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ด ํจ๊ป ๋ค์ ์ฐ๊ธฐ . _ ์ฌ์ฉ์ ์ ์ ์๋ฒ๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค _! ์ด ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์์ต์๊ฐ ์์ต๋๋ค : https://colinhacks.com/essays/building-a-spa-with-nextjs
๊ธฐ๋ณธ ์์ด๋์ด :
์ฌ์ฉ์ ์ง์ ์ฑ ๋ง๋ค๊ธฐ ( /pages/_app.tsx
)
๋์ null
์ ๊ฒฝ์ฐ typeof window === "undefined"
. ์ด๋ SSR ๋จ๊ณ์์ react-router๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ์ํฉ๋๋ค!
// pages/_app.tsx
import { AppProps } from 'next/app';
function App({ Component, pageProps }: AppProps) {
return (
<div suppressHydrationWarning>
{typeof window === 'undefined' ? null : <Component {...pageProps} />}
</div>
);
}
export default App;
suppressHydrationWarning
์์ฑ์ ์๋ฒ์์ ๋ ๋๋ง ํ ์ฝํ
์ธ ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ๋ ๋๋ง ํ ์ฝํ
์ธ ์ ์ผ์นํ์ง ์์ ๋ React๊ฐ ๋์ง๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์
๋๋ค.
// next.config.js
module.exports = {
async rewrites() {
return [
// Rewrite everything else to use `pages/index`
{
source: '/:path*',
destination: '/',
},
];
},
};
๊ทธ๋ฌ๋ฉด ํ์์ฒ๋ผ React Router๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค! ๋งํฌ ๋ ํํ ๋ฆฌ์ผ์๋ ๋ ๋ง์ ์ปจํ ์คํธ / ์ค๋ช ์ด ์์ง๋ง ์์ํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. https://vriad.com/essays/building-a-spa-with-nextjs
@colinhacks ๋ฉ์ง ์๋ฃจ์ ์ด ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์๊ฐํด์ผ ํ ์ ์ ์ฑ์ app.js ๋๋ routes.js์ ๊ฐ์ ์์ฒด ํ์ด์ง๋ก ์ด๋ํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ค์ ์ฐ๊ธฐ
// next.config.js
module.exports = {
async rewrites() {
return [
{
source: '/app/:path*',
destination: '/app',
},
];
},
};
์๊ฐํด ๋ณผ๋งํ ๊ฒ์ด ๋ฐ๋ก ๊ทํ์ ์๋ฃจ์ ์ด ์ ๊ฐ ์ฐพ์ ๊ฒ ์ค ์ต๊ณ ์ ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@timneutkens๊ฐ ๋ฐ์ ๋ผ์ฐํฐ ํตํฉ์ ์ถ๊ฐํ๋ฉด nextjs ์ฑํ์ ๋๋ฆฌ๊ณ ๊ฐ๋ฐ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ ์ ๊ฐ์ ๊ฐ๋ฐ์๋ค์ ์ด๋ฐ ์ผ์ด ์ผ์ด๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ฐ์ ์์๋ฅผ ๋์ด๋ ๊ฒ์ ๊ณ ๋ คํด์ฃผ์ธ์.