๐Ÿช ์ƒˆ๋กœ๊ณ ์นจ + ๋’ค๋กœ๊ฐ€๊ธฐ ์ดํƒˆ ๋ชจ๋‹ฌ ๊ตฌํ˜„ ์‚ฝ์งˆ๊ธฐ

2026. 2. 24. 22:14ยท๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™/ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + ๋ฆฌํŒฉํ† ๋ง

ํ”„๋กœ์ ํŠธ์—์„œ ํผ ์ž‘์„ฑ ๋„์ค‘ ํŽ˜์ด์ง€๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ƒํ™ฉ์„ ๋ง‰๋Š” ๋ชจ๋‹ฌ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค.

๋’ค๋กœ๊ฐ€๊ธฐ, ๋‚ด๋ถ€ ๋งํฌ ์ด๋™, ์ƒˆ๋กœ๊ณ ์นจ ๋“ฑ

์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ 

ํ™•์ธ ๋ชจ๋‹ฌ์„ ๋„์›Œ ์ดํƒˆ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์•ผ ํ–ˆ๋‹ค.

 

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋‹ˆ ์ƒˆ๋กœ๊ณ ์นจ + ๋’ค๋กœ๊ฐ€๊ธฐ ์ผ€์ด์Šค์—์„œ ๋งŽ์€ ์˜ˆ์™ธ ์ƒํ™ฉ์ด ์กด์žฌํ–ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์€ ๊ทธ ๊ณผ์ •์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

1๏ธโƒฃ ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ธฐ

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ง‰์œผ๋ฉด ๋œ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ๊ตฌํ˜„์„ ์‹œ์ž‘ํ–ˆ๋‹ค.

ํผ์— ์ง„์ž…ํ•  ๋•Œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ๋” ์Œ“์•„๋‘๊ณ 

๋’ค๋กœ๊ฐ€๊ธฐ ์ด๋ฒคํŠธ(popstate)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ€๋กœ์ฑ„์„œ ํ™•์ธ ๋ชจ๋‹ฌ์„ ๋„์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

const handlePopState = () => {
  history.pushState(null, '', location.href);

  overlayStore.push(
    <Dialog
      variant="confirm"
      message={
        <>
          ์ž‘์„ฑ ์ค‘์ธ ๋‚ด์šฉ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.<br />
          ์ •๋ง ๋’ค๋กœ ๊ฐ€์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
        </>
      }
      onConfirm={() => {
        window.removeEventListener('popstate', handlePopState);
        history.go(-2);
      }}
      onCancel={() => overlayStore.pop()}
    />
  );
};

// ์ดˆ๊ธฐ ๋ฐฉ์–ด์šฉ ์Šคํƒ
history.pushState(null, '', location.href);

์ด ๋ฐฉ์‹์€ ๋’ค๋กœ๊ฐ€๊ธฐ ์ž์ฒด๋ฅผ ๋ง‰๊ณ  ๋ชจ๋‹ฌ์„ ๋„์šฐ๋Š” ๊ฑด ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ƒˆ๋กœ๊ณ ์นจ์„ ์„ž๋Š” ์ˆœ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

๐Ÿคฏ ์˜ˆ์ƒ๊ณผ ๋‹ฌ๋ž๋˜ ๋™์ž‘

์ƒˆ๋กœ๊ณ ์นจ > ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด ์ƒˆ๋กœ๊ณ ์นจ ์•ˆ๋‚ด ๋ชจ๋‹ฌ >

๋ชจ๋‹ฌ ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ ํด๋ฆญ > ํผ ์ˆ˜์ • > ๋’ค๋กœ๊ฐ€๊ธฐ > ๋’ค๋กœ๊ฐ€๊ธฐ ์•ˆ๋‚ด ๋ชจ๋‹ฌ... ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š”

๋’ค๋กœ๊ฐ€๊ธฐ๊ฐ€ ํ•œ ๋ฒˆ์— ์ด์ „ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ณ 

์ค‘๊ฐ„์—์„œ ์ƒํƒœ๊ฐ€ ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ–ˆ๋‹ค.

 

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ history.go(-2)๋กœ ํ•ด๊ฒฐํ•˜๋ ค ํ–ˆ์ง€๋งŒ

ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณตํ• ์ˆ˜๋ก ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ์ด ํ•ญ์ƒ ๋™์ผํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

2๏ธโƒฃ ์นด์šดํŠธ๋กœ ๋ณด์ •ํ•˜๊ธฐ

๊ทธ๋ž˜์„œ ์ƒ๊ฐํ•œ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด

ํžˆ์Šคํ† ๋ฆฌ ๋ณ€ํ™” ํšŸ์ˆ˜๋ฅผ ref๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค.

 

pushState๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ 

๋’ค๋กœ๊ฐ€๊ธฐ ์‹œ ํ•ด๋‹น ํšŸ์ˆ˜๋งŒํผ ํ•œ ๋ฒˆ์— ์ด๋™ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

const pushCount = useRef(0);

const handlePopState = () => {
  history.pushState(null, '', location.href);
  pushCount.current += 1;

  const targetIndex = -(pushCount.current + 1);
  history.go(targetIndex);
};

์ด ๋ฐฉ์‹์€ ์ผ๋ถ€ ์ผ€์ด์Šค์—์„œ๋Š” ์›ํ•˜๋Š” ๋Œ€๋กœ ๋™์ž‘ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค...๐Ÿคฆ‍โ™€๏ธ

๋ธŒ๋ผ์šฐ์ € ์ž์ฒด ์ƒˆ๋กœ๊ณ ์นจ ๋ชจ๋‹ฌ์ด ๋œจ๊ณ  ์œ ์ €๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ์„ ๋ˆŒ๋ €์„ ๋•Œ๋Š”

๋ธŒ๋ผ์šฐ์ €์˜ ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ์ด ์ฆ๊ฐ€ํ•ด์„œ ๋ฌธ์ œ ์—†์ด ๋’ค๋กœ๊ฐ€๊ธฐ๊ฐ€ ๋™์ž‘ํ–ˆ์ง€๋งŒ

์ทจ์†Œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋Š” ์ผ€์ด์Šค๋‚˜ ํผ์— ์•„๋ฌด๋Ÿฐ ์ž…๋ ฅ ์—†์ด ์ƒˆ๋กœ๊ณ ์นจ์„ ํ–ˆ์„๋•Œ๋Š”

๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์Œ“์ด์ง€ ์•Š์•„์„œ ์นด์šดํŠธ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š”๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์€

ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ฑฐ๋‚˜ ์กฐ์ž‘์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๊ณ  ๋А๊ผˆ๊ณ 

๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋‹ค์‹œ ํ•ด๊ฒฐํ•ด๋ณด๋ ค๊ณ  ํ–ˆ๋‹ค.

 

3๏ธโƒฃ URL ๊ด€๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜

ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹ 

์–ด๋””๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

 

์œ ์ €๊ฐ€ ๋ฐฉ๋ฌธํ•œ URL์„ Zustand์— ์ €์žฅํ•ด์„œ ์Šคํƒ์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ–ˆ๊ณ ,

๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ํ•  ๋•Œ ์ด์ „ URL๋กœ ์ง์ ‘ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

const targetUrl = getPreviousUrl();
router.push(targetUrl);

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ–ˆ๋”๋‹ˆ ์ƒˆ๋กœ๊ณ ์นจ ์—ฌ๋ถ€๋‚˜ ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ์— ์ƒ๊ด€์—†์ด

ํ•ญ์ƒ ์ด๋™ํ•  URL์ด ๋ช…ํ™•ํ•ด์ง€๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๐Ÿคฏ ๋‹ค ๋๋‚ฌ๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ..

๊ทธ๋Ÿฐ๋ฐ...URL ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ”๊พผ ์ดํ›„์—๋„ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋” ๋‚จ์•„ ์žˆ์—ˆ๋‹ค.

์ƒˆ๋กœ๊ณ ์นจ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•œ ๋’ค ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ์‹œ๋„ํ•˜๋ฉด

๋ชจ๋‹ฌ์ด ๋œจ์ง€ ์•Š๊ฑฐ๋‚˜ router.push๊ฐ€ ๊ฐ„ํ—์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

์›์ธ์„ ์ฐพ์•„๋ณด๋‹ˆ Next.js์—์„œ popstate ์ด๋ฒคํŠธ๊ฐ€ ๋ผ์šฐํ„ฐ ์ƒํƒœ ๋ณต๊ตฌ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋˜์–ด

ํƒ€์ด๋ฐ ์ด์Šˆ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด์—ˆ๋‹ค.

setTimeout(() => {
    onPrevent('POPSTATE');
}, 0);

๊ทธ๋ž˜์„œ navigation ์ฒ˜๋ฆฌ๋ฅผ setTimeout๋กœ ์ฒ˜๋ฆฌํ–ˆ๋”๋‹ˆ

ํƒ€์ด๋ฐ ์ด์Šˆ ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ–ˆ๋‹ค.

 

๐Ÿ“Œ ์ •๋ฆฌ

๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ฑด ์ •๋ง ๋งŽ์€ ์˜ˆ์™ธ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

ํŽ˜์ด์ง€ ์ดํƒˆ ๋กœ์ง์—์„œ๋Š” ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ธฐ ๋ณด๋‹ค๋Š”

์‚ฌ์šฉ์ž๋ฅผ ์–ด๋””๋กœ ์ด๋™์‹œํ‚ฌ์ง€๋ฅผ ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ๋” ์•ˆ์ •์ ์ด๋ผ๋Š” ๊ฑธ ๋ฐฐ์› ๋‹ค.

 

๋” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋œ๋‹ค๋ฉด ์ถ”๊ฐ€ ํฌ์ŠคํŒ…์œผ๋กœ ๋‚จ๊ฒจ์•ผ๊ฒ ๋‹ค๐Ÿฅน

728x90
'๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™/ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + ๋ฆฌํŒฉํ† ๋ง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • hooks, utils, components ๊ตฌ์กฐ์—์„œ Feature ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ
  • ๐Ÿš€ Vercel ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ API๊ฐ€ ๋А๋ฆฌ๋‹ค๋ฉด? Region ์„ค์ •์„ ํ™•์ธํ•˜์ž!
  • ๐Ÿšจ ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ — ์ด๋ชจ์ง€ ๋ฐ˜์‘ UI ๋ฏธ๋ฐ˜์˜ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  • ๐Ÿšจ PropTypes์—์„œ JSDoc์œผ๋กœ — React 19 ํƒ€์ž… ๊ด€๋ฆฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
_์ด์•Ž
_์ด์•Ž
๊ณต๋ถ€ ๊ธฐ๋ก ๋ธ”๋กœ๊ทธ
  • _์ด์•Ž
    ๊ณต๋ถ€
    _์ด์•Ž
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • โœ๏ธ ๋ชจ๋“  ๊ธ€ (86)
      • ๐Ÿ“š ํ”„๋ก ํŠธ์—”๋“œ (50)
        • Web (6)
        • React (11)
        • Next.js (2)
        • JavaScript (13)
        • TypeScript (2)
        • Dev Setup (1)
        • git+github (5)
        • HTML+CSS (9)
        • ๊ฐ€๋ณ๊ฒŒ ๊ธฐ๋ก (1)
      • ๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™ (29)
        • ์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ 19๊ธฐ (20)
        • ํ”„๋กœ์ ํŠธ (2)
        • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + ๋ฆฌํŒฉํ† ๋ง (6)
        • ๊ธฐํƒ€ (1)
      • ๐Ÿ“ ์ž๋ฃŒ ์ •๋ฆฌ (3)
        • React ๊ณต์‹๋ฌธ์„œ (3)
      • โš™๏ธ etc. (4)
  • ๋งํฌ

    • ๐Ÿ‘‹ GitHub
    • ๐Ÿง ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ธฐ๋ก
    • ๐Ÿ“š ์ฑ…
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
_์ด์•Ž
๐Ÿช ์ƒˆ๋กœ๊ณ ์นจ + ๋’ค๋กœ๊ฐ€๊ธฐ ์ดํƒˆ ๋ชจ๋‹ฌ ๊ตฌํ˜„ ์‚ฝ์งˆ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”