Next.js: ์ƒํƒœ๋ฅผ ๋‹ค์Œ/๋ผ์šฐํ„ฐ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2017๋…„ 01์›” 15์ผ  ยท  34์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vercel/next.js

react-router๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

browserHistory.push({ pathname: "/", state: { message: 'This is a message forwarded in a state.' } })

๋‹ค์Œ/๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๋ฅผ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ณ  ์ผ๋ถ€ ๊ฐ’์„ ์ƒˆ ํŽ˜์ด์ง€๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค Router.push() ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋‚˜์ค‘์— withRouter ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  34 ๋Œ“๊ธ€

ํ˜„์žฌ๋กœ์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— ์ง€์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์„ ์—ด์–ด์„œ ์ด๊ฒƒ์ด ์ •๋ง๋กœ ํ•„์š”ํ•œ์ง€ ๋ด…์‹œ๋‹ค.

์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ง์€ nkzawa๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋น„์Šทํ•œ ๊ฒƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ http://www.example.com/?message=This%20is%20a%20long%20message%20forwarded%20to%20be%20displayed ๋กœ URL์„ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ  react-router๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒํƒœ ์ „์†ก์„ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

as ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL์„ ์œ„์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ํ•˜์ง€๋งŒ as ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฒฝ๋กœ ์ด๋ฆ„์€ props.url.pathname ์— ์‹ค์ œ ๊ฒฝ๋กœ ์ด๋ฆ„์„ ์œ ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฟผ๋ฆฌ์— ์ „๋‹ฌํ•  ๋” ๋งŽ์€ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ _cleaner_์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ next.js๋กœ ํฌํŒ…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“  ์ดํ›„๋กœ ํฐ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. .

๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ๋น„ํ™œ์„ฑ ์›์ธ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

์ด๊ฑฐ ์˜ฌ๋ฆฐ์ง€ 1๋…„ ์กฐ๊ธˆ ๋„˜์—ˆ๋Š”๋ฐ ์•„์ง๋„ ์ง€์› ์•ˆ๋˜๋‚˜์š”?

localStorage, sessionStorage, ๋ณ€์ˆ˜, Redux ์ €์žฅ์†Œ ๋“ฑ์— ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ ๋‹ค์Œ getInitialProps์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ).

nextjs๊ฐ€ react-router ์ง€์›์„ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์—๋Š” CRA๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๊ทธ๊ณณ์—์„œ ๋ผ์šฐํŠธ๋œ ๊ตฌ์„ฑ ์š”์†Œ์— ์ƒํƒœ๋ฅผ ์ „์†กํ•˜๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค. nextjs์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

@sergiodxa ๊ฐ€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์—์„œ ์ œ์•ˆํ–ˆ์ง€๋งŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค Router.push() ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋‚˜์ค‘์— withRouter ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ €๋„ ์š”

์ด ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Router.push()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋‚ด URL์„ ์˜ค์—ผ์‹œํ‚ค๊ณ  ์‹ถ์ง€ ์•Š๊ณ  ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ์— ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? localStorage ๋˜๋Š” ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ React hooks ๋˜๋Š” ์ด์ „ React ๋ผ์ดํ”„์‚ฌ์ดํด์— ์˜ํ•ด ์ง์ ‘ ์ œ์–ด๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์œ ์Šต๊ด€์ž…๋‹ˆ๋‹ค.

ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ฆญํ•˜๋ฉด ์„ธ๋ถ€ ์ •๋ณด ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ํ˜„์žฌ next.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ID๋ฅผ ์ „๋‹ฌํ•œ ๋‹ค์Œ useEffect ๋ฐ axios ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ƒํƒœ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์ •๋ง๋กœ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค.

์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@sergiodxa ์˜ˆ, ์ž„์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๋ผ์šฐํ„ฐ์— ์—ฐ๊ฒฐํ•˜๋ฉด ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ ํƒ์ƒ‰ ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐ๋˜๋ฉฐ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด redux ์Šคํ† ์–ด์— ํ‘ธ์‹œํ•˜๋ฉด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์œ ์ง€๋˜์ง€ ์•Š๋„๋ก ์ œ์™ธํ•˜๊ณ  ์ˆ˜์‹  ์ธก์—์„œ ๋ช…ํ™•ํ•œ ๋ฉ”์‹œ์ง€ ์ž‘์—…๋„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ฑ…๊ฐˆํ”ผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜์ค‘์— ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ์˜๊ตฌ ๋งํฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ router.push ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณด์ƒ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ’์€ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ํ”Œ๋ž˜์‹œ ์™€ ๋งค์šฐ ์œ ์‚ฌ

2017๋…„ 1์›” 15์ผ ์ดํ›„ ์†”๋ฃจ์…˜์ด ์—†์Šต๋‹ˆ๊นŒ?
์šฐ๋ฆฌ๋Š” ๊ทธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

์—ฌ๊ธฐ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค Router.push() ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๋‚˜์ค‘์— withRouter ๋กœ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

nextjs์— ์žˆ์œผ๋ฉด ์ข‹์„ํ…๋ฐ

์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ˆจ๊ธฐ๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

Router.push(`/main?userName=${userName}`, 'main')

๋ฉ”์ธ ํŽ˜์ด์ง€๋ณด๋‹ค url์—์„œ /main ๋งŒ ๋ณผ ์ˆ˜ ์žˆ๊ณ ,
console.log(Router.route) ์ฟผ๋ฆฌ ํ‘œ์‹œ

pathname: "/main"
query: {userName: "fadsfasd"}
asPath: "main"

๋„ค, ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. Btw ๋ผ์šฐํ„ฐ์— ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์ •๋ง ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. react-router ์—†์ด๋„ ์•„๋ฆ„๋‹ต๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ถ„๋“ค์€ Context Api ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Next.js๋Š” shallow: true ๋ฅผ ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” $ router.push() ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค.
https://nextjs.org/docs/api-reference/next/router#routerpush

์ด๊ฒƒ์„ ์žฌ๊ณ ํ•˜๊ณ ์ž ํ•˜์ง€๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด ํžˆ์Šคํ† ๋ฆฌ ์ƒํƒœ ์„œ๋ฒ„ ์ธก์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํžˆ์Šคํ† ๋ฆฌ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐœ์— ์ด์„ ์˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ›Œ๋ฅญํ•œ ์ œ์•ˆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜๋ถ„ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋‹ค์‹œ ์—ฌ๋Š” ๊ฒƒ์ด ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ RFC๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๋ฉฐ ์ด ๊ธฐ๋Šฅ์„ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

Router.push({ pathname: '/', query: { message: 'This is a message forwarded in a state.' } }, '/')

2๋…„ ์ด์ƒ ์•„์ง ๊ตญ๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

Router.push({ pathname: '/', query: { message: 'This is a message forwarded in a state.' } }, '/')

์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋งˆ์Šคํฌ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด๋Š” ์ƒ๋‹นํžˆ ์ด์ƒํ•œ ์ผ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” React ์ƒํƒœ๊ณ„์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

router.push(
  { pathname: '/hello-world' }, 
  '/hello-world/2', 
  { step: 2 }
);

๋Œ์•„๊ฐ€์„œ PopState ์ „์— ํ™•์ธํ•˜๋ฉด ์˜ต์…˜ ์†Œํ’ˆ์— { step: 2 } ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” router ๊ฐ์ฒด์—์„œ๋งŒ ์ด๊ฒƒ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” React ์ƒํƒœ๊ณ„์— ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค

router.push(
  { pathname: '/hello-world' }, 
  '/hello-world/2', 
  { step: 2 }
);

๋Œ์•„๊ฐ€์„œ PopState ์ „์— ํ™•์ธํ•˜๋ฉด ์˜ต์…˜ ์†Œํ’ˆ์— { step: 2 } ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” router ๊ฐ์ฒด์—์„œ๋งŒ ์ด๊ฒƒ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์˜๋„์ ์ธ ํ–‰๋™์ด ์•„๋‹ˆ๋ผ ๋˜ ๋‹ค๋ฅธ ์ผ์‹œ์ ์ธ ํ•ดํ‚น์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ๋˜๋Š” ์˜ต์…˜์€ ๋ฌธ์„œ ์— ๋‚˜์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์™€ ๋น„์Šทํ•œ ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ํ–‰๋™ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@likerRr ๋ถ„๋ช…ํžˆ ๋ชจ๋“  ์˜ต์…˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ window.history.state ์— ์ „๋‹ฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
window.history.state == { step: 2 }

@likerRr ๋ถ„๋ช…ํžˆ ๋ชจ๋“  ์˜ต์…˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ window.history.state ์— ์ „๋‹ฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
window.history.state == { step: 2 }

๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ๋ฌธ์„œํ™”๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” prod์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ ์˜ต์…˜์˜ ๊ตฌํ˜„์€ ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‹ค๋ง: ํžˆ์Šคํ† ๋ฆฌ ์ƒํƒœ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ(?)๊ฐ€ ์ง€์†๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "๋’ค๋กœ"/"์•ž์œผ๋กœ" ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋ ˆ์ดํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์›ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ•œ ํŽ˜์ด์ง€์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ „ํ™˜ํ•˜๋Š” ๋™์•ˆ์—๋งŒ ๋‚จ๊ฒŒ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ง€์šฐ๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ "๋’ค๋กœ/์•ž์œผ๋กœ"๋ฅผ ํด๋ฆญํ•  ๋•Œ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด๊ฒƒ์ด ์ตœ์„ ์˜ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค(imo).

๋‹ค์Œ js๊ฐ€ ์ด๊ฒƒ์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/vercel/next.js/issues/771#issuecomment -612018764

1: ๊ตฌ๋… ํŽ˜์ด์ง€์—์„œ:
const handleClick = useCallback((๋งˆ์šดํŠธ) => {
Router.push( /payment?mount=${mount} , '/๊ฒฐ์ œ');
}, []);
2: ๊ฒฐ์ œ ํŽ˜์ด์ง€์—์„œ
useEffect(() => {
์ƒ์ˆ˜ {
์ฟผ๋ฆฌ: { ๋งˆ์šดํŠธ },
} = ๋ผ์šฐํ„ฐ;
!mount && Router.push('/campaign-overview/subscription');
console.log('PaymentVM:React.FC -> ๋งˆ์šดํŠธ', ๋งˆ์šดํŠธ);
}, []);

์ฝ˜์†” ๋ธŒ๋ผ์šฐ์ €์—์„œ mount ์˜ ๊ฐ’์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌธ์ œ์™€ router.push์—์„œ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŽธ๋ฆฌํ•จ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์ด ๋ ๊นŒ์š”?

๋ธŒ๋ผ์šฐ์ €์˜ history.pushState์™€ ์œ„์น˜ ๋ฌธ์ž์—ด์˜ local useState๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ํ•˜๊ณ ์ž ํ•  ๋•Œ history.pushState๋ฅผ ์‚ฌ์šฉํ•จ๊ณผ ๋™์‹œ์— ์ƒˆ๋กœ์šด ๊ฐ’์„ local location state๋กœ ์„ค์ •ํ•œ๋‹ค. ์œ„์น˜ ๋ฌธ์ž์—ด ์ƒํƒœ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋Š” useEffect ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ„์น˜๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” JS switch ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  history.pushState ์—†์ด ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋„๋‹ฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจํ•˜๋Š” ๊ฒฝ์šฐ) ์œ„์น˜๋ฅผ ๋™์  ๋‹ค์Œ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- ์‹œ๋„ํ•˜์ง€ ์•Š๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งŒ๋“ค๊ณ  ์‹ถ์€ ๋ถ„๋“ค์€ Context Api ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Next.js๋Š” shallow: true ๋ฅผ ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” $ router.push() ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค.
https://nextjs.org/docs/api-reference/next/router#routerpush

my in my getServerSideProps ์—์„œ ๋‘ ๊ฐœ์˜ ํ˜ธ์ถœ์„ ํ•˜๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ชจ๋“  ๋กœ๋“œ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ณ  ํ•˜๋‚˜๋Š” ์กฐ๊ฑด๋งŒ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ์ด๋ฅผ ์œ„ํ•ด Shallow: true ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ getServerSideProps ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์ „ํ˜€ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋กœ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ด ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ์˜ˆ๋Š” getServerSideProps ์—์„œ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ํŽ˜์ด์ง€์˜ ์ฃผ์š” ์ฝ˜ํ…์ธ ์šฉ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํƒ์ƒ‰ ๋งํฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ Œ๋”๋ง์—์„œ๋Š” ๋‘ ํ˜ธ์ถœ์ด ๋ชจ๋‘ ์„œ๋ฒ„์— ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ์— ํƒ์ƒ‰ ๋งํฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ๊ตญ๊ฐ€๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์œ ์ผํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ˆจ๊ฒจ์ง„ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ as ์˜ต์…˜์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด์ง€๋งŒ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ํฌํ•จ๋œ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฌด๋ฆฌ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ชจ๋“  <Link/> ์— ๋Œ€ํ•ด ์ฝ”๋“œ๊ฐ€ ๋”์ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์‚ฌ์‹ค, ๋‚ด๊ฐ€ ๊ธ€์„ ์“ธ ๋•Œ ๋‚˜๋Š” ์ง€์ •๋œ href๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๊ณ  ํ˜„์žฌ ์ƒํƒœ์™€ ํ•จ๊ป˜ ์ฟผ๋ฆฌ ๊ฐœ์ฒด๋ฅผ ๋ณด๋‚ด์•ผ ํ•˜๋Š” HOC ๋งํฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ <Linke/> ์— ์ƒํƒœ ๊ฐœ์ฒด๋ฅผ ์“ธ ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. HOC์—์„œ๋งŒ ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰