๐Ÿ—บ๏ธ ์ง€๋„์™€ ํ•จ๊ป˜ ์›€์ง์ด๋Š” ์บ”๋ฒ„์Šค ์„ค๊ณ„/๊ตฌํ˜„ ์‹œํ–‰์ฐฉ์˜ค ์Šคํ† ๋ฆฌ

์ •ํ˜œ์ธยท2024๋…„ 11์›” 29์ผ
0

์ €๋Š” ์ตœ๊ทผ ์ง€๋„ ์œ„์— ์บ”๋ฒ„์Šค์—์„œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณผ์ •์—์„œ ๊ฐ€์žฅ ํฐ ๊ณ ๋ฏผ์€ ์คŒ์ธ/์คŒ์•„์›ƒ๊ณผ ์ด๋™(ํŒฌ)์„ ํ–ˆ์„ ๋•Œ, ์ง€๋„์™€ ์บ”๋ฒ„์Šค๊ฐ€ ํ•จ๊ป˜ ์›€์ง์ด๋ฉฐ, ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์ด ์ขŒํ‘œ์— ๋”ฐ๋ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์œ ์ง€๋˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ฏผ ๋์— ์„ค๊ณ„๋ฅผ ๊ตฌ์ฒดํ™”ํ•˜๊ณ , ์ด๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฒ˜์Œ ์„ค๊ณ„์™€ ๊ณ ๋ฏผํ–ˆ๋˜ ํ•œ๊ณ„, ์„ค๊ณ„ ๋ณ€๊ฒฝ ๊ณผ์ •, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•์„ ์ค‘์‹ฌ์œผ๋กœ ์†Œ๊ฐœํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.


์‚ฌ์‹ค, ์ด ์ง€๋„-์บ”๋ฒ„์Šค ์—ฐ๋™ ๊ณผ์ •์€ ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ฐ€ ๋งก์•˜๋˜ ๋ถ€๋ถ„์ด ์•„๋‹ˆ์—ˆ๋Š”๋ฐ ํŒ€์› ๋ถ„๊ป˜์„œ 2์ฃผ ๋™์•ˆ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•˜์…”์„œ ๋จธ๋ฆฌ๋ฅผ ์‹ธ๋งค์‹œ๋Š” ๊ฒƒ์„ ๋ณด๊ณ โ€ฆโ€ฆ

๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด์ง€ ์ €๋„ ์Šน๋ถ€์š•์ด ์ƒ๊ฒจ์„œ ์ฃผ๋ง์— ์ž ๊น ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค๊ฐ€ ํ•ด๊ฒฐํ•ด๋ฒ„๋ฆฐ ํƒœ์Šคํฌ์˜€๋Š”๋ฐ์š”โ€ฆโ€ฆ..

์ €ํฌ ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๊ธฐ๋„ ํ–ˆ๊ณ , ์ฒซ ์ฃผ์ฐจ ๋•Œ๋ถ€ํ„ฐ ์‹ค์ œ๋กœ ๊ตฌํ˜„์ด ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€๋ฅผ ์ž‘์„ฑํ•ด๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ํฌ์ŠคํŒ…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿšฉ ๊ตฌํ˜„ ๋ชฉํ‘œ

๋จผ์ € ๊ตฌํ˜„ ๋ชฉํ‘œ๋Š” ๊ฐ„๋‹จํ–ˆ์ง€๋งŒ ๋„์ „์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž๋Š” ์ง€๋„ ์œ„์— ์บ”๋ฒ„์Šค๋ฅผ ํ†ตํ•ด ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  2. ์ง€๋„๋ฅผ ์คŒ์ธ/์คŒ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ–ˆ์„ ๋•Œ, ์บ”๋ฒ„์Šค์™€ ์ง€๋„๋Š” ๋™๊ธฐํ™”๋˜์–ด ์›€์ง์ธ๋‹ค.
  3. ๊ทธ๋ ค์ง„ ๊ทธ๋ฆผ์€ ์ง€๋„ ์ขŒํ‘œ์™€ ์—ฐ๊ด€๋˜์–ด์•ผ ํ•˜๋ฉฐ, ์ง€๋„ ์ด๋™ ํ›„์—๋„ ๊ฐ™์€ ์œ„์น˜์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.


๐Ÿค” ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„

๊ตฌํ˜„์„ ์‹œ์ž‘ํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์งˆ๋ฌธ์„ ๋˜์กŒ์Šต๋‹ˆ๋‹ค:

  1. ์ง€๋„์™€ ์บ”๋ฒ„์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋ ˆ์ด์–ด๋กœ ๊ตฌ์„ฑ๋  ํ…๋ฐ, ์ด ๋‘ ๋ ˆ์ด์–ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋™๊ธฐํ™”ํ•  ๊ฒƒ์ธ๊ฐ€?
  2. ์ง€๋„๋ฅผ ์คŒ์ธ/์คŒ์•„์›ƒํ•  ๋•Œ, ๊ทธ๋ ค์ง„ ๊ทธ๋ฆผ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜๋Š” ์–ด๋–ป๊ฒŒ ๋ณ€ํ•ด์•ผ ํ• ๊นŒ?
  3. ์บ”๋ฒ„์Šค ์œ„์— ๊ทธ๋ ค์ง„ ์ขŒํ‘œ๋ฅผ ์ง€๋„ ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ์–ด๋–ค ์ˆ˜ํ•™์  ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ• ๊นŒ?

๐Ÿค” ์ฒ˜์Œ ์„ค๊ณ„ํ–ˆ๋˜ ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์ง€๋„์™€ ์บ”๋ฒ„์Šค ์ด๋ฒคํŠธ ์—ฐ๊ณ„

์ฒ˜์Œ์—๋Š” ์บ”๋ฒ„์Šค์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ(๋งˆ์šฐ์Šค ํด๋ฆญ, ๋“œ๋ž˜๊ทธ ๋“ฑ)๋ฅผ ์•„๋ž˜ ์ง€๋„์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์บ”๋ฒ„์Šค๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ๋“œ๋ž˜๊ทธํ•˜๋ฉด, ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ง€๋„ API์— ๋„˜๊ฒจ ์ง€๋„์—์„œ ์คŒ์ด๋‚˜ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณ„๋„์˜ ๋ณต์žกํ•œ ๋™๊ธฐํ™” ๋กœ์ง ์—†์ด, ์ง€๋„ API๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋œ ๋ถ€๋ถ„

  • ์ง€์—ฐ ๋ฐœ์ƒ: ์บ”๋ฒ„์Šค์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ง€๋„์— ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ธธ์–ด์กŒ๊ณ , ์ง€๋„๊ฐ€ ์›€์ง์ด๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•˜: ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ‰๊ฐ์ ์ธ ๋ฐ˜์‘์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋”œ๋ ˆ์ด๋Š” ์น˜๋ช…์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”„ ๋‘ ๋ฒˆ์งธ ์„ค๊ณ„: ์บ”๋ฒ„์Šค์™€ ์ง€๋„ ํฌ๊ธฐ ๊ณ ์ • ๋ฐฉ์‹

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์บ”๋ฒ„์Šค๋ฅผ ๋Œ€ํ•œ๋ฏผ๊ตญ ์ง€๋„ ํฌ๊ธฐ๋งŒํผ ๊ณ ์ •ํ•˜๋Š” ์„ค๊ณ„๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ณ ์ • ์บ”๋ฒ„์Šค ์„ค๊ณ„

  • ๋Œ€ํ•œ๋ฏผ๊ตญ ์ง€๋„์˜ ์ „์ฒด ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์บ”๋ฒ„์Šค๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ง€๋„์˜ ์คŒ ๋ฐ ์ด๋™์„ ์ œํ•œํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋„์—์„œ ์คŒ/์ด๋™์„ ํ•˜๋ฉด, ์บ”๋ฒ„์Šค๋ฅผ ๊ฐ™์€ ๋น„์œจ๋กœ ํ™•๋Œ€/์ถ•์†Œํ•˜๊ฑฐ๋‚˜ ์ด๋™์‹œ์ผœ ๋™๊ธฐํ™”๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ํ™”๋ฉด์€ ํ™•๋Œ€๋œ ๋ถ€๋ถ„๋งŒ์ด๊ณ , ์‹ค์ œ ์บ”๋ฒ„์Šค๋Š” ๊ทธ ๋ฐ‘์— ๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ํฌ๊ธฐ๋งŒํผ์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์˜€์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„: ๋Œ€ํ•œ๋ฏผ๊ตญ ํฌ๊ธฐ๋กœ ๊ณ ์ •๋œ ์บ”๋ฒ„์Šค ์œ„์—์„œ๋งŒ ์ž‘์—…ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋ณต์žกํ•œ ์ขŒํ‘œ ๋ณ€ํ™˜ ๋กœ์ง์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋™๊ธฐํ™” ๋ถˆํ•„์š”: ์บ”๋ฒ„์Šค ์ž์ฒด๊ฐ€ ์ง€๋„์™€ ํ•ญ์ƒ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฏ€๋กœ, ๋ณ„๋„์˜ ๋™๊ธฐํ™” ๋กœ์ง ์—†์ด ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋œ ๋ถ€๋ถ„

  1. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€:

    ๋Œ€ํ•œ๋ฏผ๊ตญ ํฌ๊ธฐ ์ „์ฒด์— ํ•ด๋‹นํ•˜๋Š” ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆผ ๋ฐ์ดํ„ฐ์™€ ์ขŒํ‘œ๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•˜๋ ค๋‹ˆ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

    ํŠนํžˆ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ปธ์Šต๋‹ˆ๋‹ค.

  2. ์บ”๋ฒ„์Šค๊ฐ€ ๋„ˆ๋ฌดํฌ๊ธฐ์— ์ด๋ฏธ์ง€๊ฐ€ ๊นจ์งˆ ๊ฐ€๋Šฅ์„ฑ O:

    ์บ”๋ฒ„์Šค์— ํ‘œ์‹œ๋˜๋Š” ์ด๋ฏธ์ง€๋‚˜ ์š”์†Œ๋“ค์ด ๊นจ์งˆ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋–จ์–ด๋œจ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”„ ์„ธ๋ฒˆ์งธ ์„ค๊ณ„: pointer-event ์†์„ฑ ๋„๊ธฐ

pointer-events - CSS: Cascading Style Sheets | MDN

pointer-event๋ผ๊ณ  ํ•จ์€ CSS์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜๋กœ, ์š”์†Œ๊ฐ€ ๋งˆ์šฐ์Šค ํด๋ฆญ, ํ„ฐ์น˜, ์ปค์„œ ์ด๋™๊ณผ ๊ฐ™์€ ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

์ €ํฌ๋Š” tailwindcss๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ์—, ๋‹ค์Œ๊ณผ ๊ฐ™์ด pointer-event-none ํด๋ž˜์Šค๋ฅผ ์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ด ์˜ต์…˜์„ ๋Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

<div class='container relative w-[300px] h-[300px]'>
	<div class='top-child absolute z-30 w-full h-full pointer-event-none' />
	<div class='bottom-child absolute z-0 w-full h-full' />
</div>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด top-child์˜ ๋ชจ๋“  ํฌ์ธํ„ฐ ์ด๋ฒคํŠธ๋ฅผ ๋Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ธ๋ฐ,

๊ฒฐ๋ก ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€๋กœ์ฑ„์ง€ ์•Š๊ณ  ํด๋ฆญ ๋“ฑ์˜ ์ด๋ฒคํŠธ๊ฐ€ bottom-child๋กœ ์ „๋‹ฌ์ด ๋ฉ๋‹ˆ๋‹ค.

์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์บ”๋ฒ„์Šค์—์„œ pointer-event ์†์„ฑ์„ ๊บผ์ฃผ๋‹ˆ, ์ง€๋„๋กœ ๋ฐ”๋กœ event๊ฐ€ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด๋ ‡๊ฒŒ ์ง€๋„์— ๋จผ์ € ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๊ณ  ์บ”๋ฒ„์Šค์— ์ด๋ฒคํŠธ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹๋„ ๊ณ ๋ คํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ์ง€๋„๋กœ ๋„˜๊ฒผ๋‹ค๊ฐ€, ์ง€๋„์—์„œ ์บ”๋ฒ„์Šค๋กœ ์œ„๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์ด ํ›จ์”ฌ ๋ณต์žกํ•˜๊ณ  ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์˜€๊ณ ,

๊ฒฐ๊ตญ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ… ์ตœ์ข… ์„ค๊ณ„: ์ด๋™๋งˆ๋‹ค ์บ”๋ฒ„์Šค ์žฌ๋ Œ๋”๋ง

3๏ธโƒฃ ์ตœ์ข…์ ์ธ ๋ฐฉ๋ฒ•

๊ณ ๋ฏผ ๋์—, ์บ”๋ฒ„์Šค๋ฅผ ๊ณ ์ •ํ•˜์ง€ ์•Š๊ณ  ์ด๋™ ๋ฐ ์คŒ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์บ”๋ฒ„์Šค๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์„ค๊ณ„ ์•„์ด๋””์–ด

  • ์ง€๋„ ์ขŒํ‘œ๊ณ„์™€ ํ”ฝ์…€ ์ขŒํ‘œ๊ณ„๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ, ๊ทธ๋ฆผ์˜ ๋ฐ์ดํ„ฐ๋Š” ์ง€๋„ ์ขŒํ‘œ๊ณ„๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€๋„ ์ด๋™/์คŒ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์บ”๋ฒ„์Šค๋ฅผ ํด๋ฆฌ์–ดํ•œ ๋’ค, ์ง€๋„ ์ขŒํ‘œ๋ฅผ ํ”ฝ์…€ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“– ์„ค๊ณ„ ๋ณ€ํ™” ์š”์•ฝ

์„ค๊ณ„ ๋‹จ๊ณ„๋ฐฉ๋ฒ•์žฅ์ ํ•œ๊ณ„์ 
1์ฐจ์บ”๋ฒ„์Šค ์ด๋ฒคํŠธ โ†’ ์ง€๋„ ์ด๋ฒคํŠธ ์ „๋‹ฌ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„, ๊ธฐ์กด ์ง€๋„ ๋กœ์ง ์žฌ์‚ฌ์šฉ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋”œ๋ ˆ์ด, UX ์ €ํ•˜
2์ฐจ์บ”๋ฒ„์Šค ๊ณ ์ • & ์ง€๋„ ์ด๋™/์คŒ ์ œํ•œ๋™๊ธฐํ™” ๋ถˆํ•„์š”, ๊ตฌํ˜„ ๊ฐ„๋‹จ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์–ด๋ ค์›€, ์œ ์—ฐ์„ฑ ๋ถ€์กฑ
3์ฐจ์ด๋ฒคํŠธ โ†’ ์ง€๋„ ์ด๋ฒคํŠธ โ†’ ์บ”๋ฒ„์Šค ์ด๋ฒคํŠธ์ง€๋„๋ฅผ ํ„ฐ์น˜ํ•˜๋Š” ๋™์ž‘๊ณผ ๋™์ผ, ์ง€๋„ api์—์„œ ์ œ๊ณตํ•˜๋Š” ์ด๋ฒคํŠธ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜, ๋กœ์ง ๋ณต์žก
์ตœ์ข…์ด๋™๋งˆ๋‹ค ์บ”๋ฒ„์Šค ์žฌ๋ Œ๋”๋ง๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ํšจ์œจ์ , ์„ฑ๋Šฅ ์œ ์—ฐ์•ฝ๊ฐ„์˜ ๋ Œ๋”๋ง ๋น„์šฉ ๋ฐœ์ƒ

๐Ÿ› ๏ธ ๊ตฌ์ฒด์  ์„ค๊ณ„ ๊ณผ์ •

๊ฒฐ๊ตญ ์œ„์—์„œ ๊ฒฐ์ •ํ•œ ๋Œ€๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์บ”๋ฒ„์Šค๋ฅผ ์žฌ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ , ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘์‹œํ‚ฌ์ง€์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ์ง€๋„์™€ ์บ”๋ฒ„์Šค์˜ ๊ตฌ์กฐ ์ •์˜

์ง€๋„๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ• ์€ ์ง€๋„ API(์˜ˆ: ๋„ค์ด๋ฒ„ ์ง€๋„)๊ฐ€ ๋งก๊ณ , ์บ”๋ฒ„์Šค๋Š” HTML <canvas> ์—˜๋ฆฌ๋จผํŠธ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๋„์™€ ์บ”๋ฒ„์Šค๋Š” ๋™์ผํ•œ DOM ํŠธ๋ฆฌ ์•ˆ์— ์žˆ์ง€๋งŒ, ์บ”๋ฒ„์Šค๋Š” ํˆฌ๋ช…ํ•œ ์˜ค๋ฒ„๋ ˆ์ด์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐ ์„ค๊ณ„
    <div id="map-container">
      <div id="map"></div> <!-- ์ง€๋„ -->
      <canvas id="canvas"></canvas> <!-- ์บ”๋ฒ„์Šค -->
    </div>
    • #map์€ ์ง€๋„ API๋กœ ์ดˆ๊ธฐํ™”.
    • #canvas-overlay๋Š” absolute๋กœ ์ง€๋„ ์œ„๋ฅผ ๋ฎ์–ด ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ.


2๏ธโƒฃ ์บ”๋ฒ„์Šค์™€ ์ง€๋„์˜ ๋™๊ธฐํ™”

์คŒ์ด๋‚˜ ์ด๋™ ์‹œ, ์ง€๋„์™€ ์บ”๋ฒ„์Šค์˜ ์œ„์น˜ ๋ฐ ํฌ๊ธฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. ์คŒ ๋™๊ธฐํ™”

    ์ง€๋„์˜ ์คŒ ๋ ˆ๋ฒจ์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ๊ทธ๋ฆผ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋„ ๋™์ผํ•˜๊ฒŒ ๋ณ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ง€๋„์—์„œ ์ œ๊ณตํ•˜๋Š” zoom_changed ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด ํ˜„์žฌ ์คŒ ๋ ˆ๋ฒจ์„ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ์บ”๋ฒ„์Šค์˜ ํฌ๊ธฐ๋ฅผ ์ง€๋„ ์คŒ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ๋น„๋ก€์ ์œผ๋กœ ์กฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ์ด๋™ ๋™๊ธฐํ™”

    ์ง€๋„๊ฐ€ ์ด๋™ํ•  ๋•Œ ์บ”๋ฒ„์Šค์™€ ๊ทธ๋ฆผ๋„ ํ•จ๊ป˜ ์ด๋™ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

    • center_changed ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ง€๋„ ์ค‘์‹ฌ ์ขŒํ‘œ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ๊ทธ์— ๋”ฐ๋ผ ์บ”๋ฒ„์Šค๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ๊ทธ๋ฆผ ์ขŒํ‘œ์˜ ๋ณ€ํ™˜

๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ๋•Œ ์‚ฌ์šฉ์ž๋Š” ํ”ฝ์…€ ์ขŒํ‘œ๋กœ ์ž‘์—…ํ•˜์ง€๋งŒ, ์ด ์ขŒํ‘œ๋ฅผ ์ง€๋„ ์ขŒํ‘œ(LatLng)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•ด์•ผ ์ด๋™๊ณผ ์คŒ์—๋„ ์œ„์น˜๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • ํ”ฝ์…€ ์ขŒํ‘œ โ†’ ์ง€๋„ ์ขŒํ‘œ ๋ณ€ํ™˜ ์ง€๋„ API์˜ canvasPointToLatLng() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์บ”๋ฒ„์Šค ํ”ฝ์…€ ์ขŒํ‘œ๋ฅผ ์ง€๋„ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€๋„ ์ขŒํ‘œ โ†’ ํ”ฝ์…€ ์ขŒํ‘œ ๋ณ€ํ™˜ latLngToCanvasPoint() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ €์žฅ๋œ ์ขŒํ‘œ๋ฅผ ๋‹ค์‹œ ์บ”๋ฒ„์Šค์˜ ํ”ฝ์…€ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๊ทธ๋ฆผ์„ ๋ Œ๋”๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃ ๊ฒฐ๊ณผ๋ฌผ ๋ Œ๋”๋ง ๋ฐฉ์‹ ์„ค๊ณ„

์ง€๋„ ์ด๋™/์คŒ ์‹œ, ์บ”๋ฒ„์Šค๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•  ๋•Œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด:

  • ๊ทธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€๋„ ์ขŒํ‘œ๊ณ„๋กœ ์ €์žฅํ•œ ํ›„, redraw() ํ•จ์ˆ˜ ํ›…์„ ๊ตฌํ˜„ํ•˜์—ฌ ํ™œ์šฉํ•ด ํšจ์œจ์ ์œผ๋กœ ์บ”๋ฒ„์Šค๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๊ตฌํ˜„ ๊ณผ์ •

๐Ÿ› ๏ธ ๊ตฌํ˜„ ์ดˆ๊ธฐ ํ…Œ์ŠคํŠธ: ๋ฒ„ํŠผ์œผ๋กœ ์คŒ๊ณผ ์ด๋™ ํ…Œ์ŠคํŠธ

1. ๋ฒ„ํŠผ์œผ๋กœ ํ…Œ์ŠคํŠธ

์ฒ˜์Œ์—๋Š” ์Šคํฌ๋กค๊ณผ ๋“œ๋ž˜๊ทธ๋กœ ์คŒ/์ด๋™์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์—, ์บ”๋ฒ„์Šค์— ์ ์„ ์ฐ์œผ๋ฉด ์ง€๋„์˜ ์ขŒํ‘œ ๊ทธ๋Œ€๋กœ ์—ฐ๋™์ด ๋˜๋Š”์ง€ ํ™•์ธ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ง์ ‘์ ์ธ ์คŒ/์ด๋™ ๋Œ€์‹  ๋ฒ„ํŠผ์„ ์ด์šฉํ•œ ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ํ…Œ์ŠคํŠธ ๊ณผ์ •

  1. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ง€๋„์—์„œ ์คŒ ์ธ/์คŒ ์•„์›ƒ ๋˜๋Š” ์ด๋™์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. ์บ”๋ฒ„์Šค์˜ ๊ทธ๋ฆผ๋„ ํ•จ๊ป˜ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œ/ํ™•๋Œ€๋˜๋„๋ก redrawCanvas๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  3. ์บ”๋ฒ„์Šค์— ์ฐํžŒ ์ ๋“ค์ด ์ง€๋„ ์ขŒํ‘œ์™€ ์ •ํ™•ํžˆ ๋งž๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์˜ˆ์‹œ

์คŒ ๊ธฐ๋Šฅ๊ณผ ์ง€๋„ ์ด๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๋ฒ„ํŠผ ํ•ธ๋“ค๋Ÿฌ:

const handleZoomChange = (zoomChange: number) => {
  if (!map) return;
  const currentZoom = map.getZoom();
  map.setZoom(currentZoom + zoomChange);
  redrawCanvas(); // ์บ”๋ฒ„์Šค๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ
};

const handleMapPan = (direction: 'up' | 'down' | 'left' | 'right') => {
  if (!map) return;
  const moveAmount = 100; // ์ง€๋„ ์ด๋™ ๊ฑฐ๋ฆฌ
  let point: naver.maps.Point;

  switch (direction) {
    case 'up':
      point = new naver.maps.Point(0, -moveAmount);
      break;
    case 'down':
      point = new naver.maps.Point(0, moveAmount);
      break;
    case 'left':
      point = new naver.maps.Point(-moveAmount, 0);
      break;
    case 'right':
      point = new naver.maps.Point(moveAmount, 0);
      break;
    default:
      return;
  }

  map.panBy(point); // ์ง€๋„ ์ด๋™
  redrawCanvas(); // ์บ”๋ฒ„์Šค ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ธฐ
};

ํ…Œ์ŠคํŠธ ๋ฒ„ํŠผ UI

<button onClick={() => handleZoomChange(1)} className="rounded bg-green-500 p-2">
  Zoom In
</button>
<button onClick={() => handleZoomChange(-1)} className="rounded bg-red-500 p-2">
  Zoom Out
</button><button onClick={() => handleMapPan('up')} className="rounded bg-blue-500 p-2">
  Up
</button><button onClick={() => handleMapPan('down')} className="rounded bg-blue-500 p-2">
  Down
</button><button onClick={() => handleMapPan('left')} className="rounded bg-blue-500 p-2">
  Left
</button><button onClick={() => handleMapPan('right')} className="rounded bg-blue-500 p-2">
  Right
</button>

๐Ÿ–ผ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ gif

gif ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š๋ผ ์ด๋ฏธ์ง€ ์ž”์ƒ์ด ๋‚จ๋Š” ์ ..... ์–‘ํ•ด ๋ฐ”๋ž๋‹ˆ๋‹ค.......
(๋งŒ์•ฝ ์ด๋ฏธ์ง€๊ฐ€ ๋ฉˆ์ถฐ์žˆ๋‹ค๋ฉด, ์ด๋ฏธ์ง€์—์„œ ์˜ค๋ฅธ์ชฝ ๋งˆ์šฐ์Šค ํด๋ฆญ ํ›„ ์ƒˆ ํƒญ์—์„œ ์ด๋ฏธ์ง€ ์—ด๊ธฐ๋กœ ๋“ค์–ด๊ฐ€์ฃผ์„ธ์š”... ๋ฒจ๋กœ๊ทธ๊ฐ€ gif๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๊ฐ€๋ด์š”....)


๐Ÿค” ํ…Œ์ŠคํŠธ๋กœโ€ฆโ€ฆ.

ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ, ์ด๋Š” ๊ธˆ๋ฐฉ ํ•ด๊ฒฐํ•˜๊ธฐ๋„ ํ–ˆ๊ณ  ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ๊ธ‰๋งŒ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ๋ฌธ์ œ ๋ฐœ๊ฒฌ

๋จผ์ € ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์บ”๋ฒ„์Šค์™€ ์ง€๋„๊ฐ€ ํ•ญ์ƒ ๋™๊ธฐํ™”๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ž€ ์ ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค์— ์ฐ์€ ์ ์ด ์ง€๋„๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์คŒ ์•„์›ƒํ–ˆ์„ ๋•Œ, ์˜ˆ์ƒํ•œ ์ขŒํ‘œ์— ๋จธ๋ฌด๋ฅด์ง€ ์•Š๊ณ  ์—‰๋šฑํ•œ ๊ณณ์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊น…์„ ํ•ด๋ณด๋‹ˆ ์ง€๋„ ์ขŒํ‘œ์™€ ์บ”๋ฒ„์Šค ํ”ฝ์…€ ์ขŒํ‘œ ๊ฐ„ ๋ณ€ํ™˜ ๋กœ์ง์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ํ•ด๊ฒฐ ๋ฐฉํ–ฅ์„ ์„ค์ •

๊ทธ๋ž˜์„œ

  • ์ง€๋„ ์ขŒํ‘œ๋ฅผ ์บ”๋ฒ„์Šค ํ”ฝ์…€ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” latLngToCanvasPoint ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์˜€๊ณ 
  • ์ขŒํ‘œ ๋ณ€ํ™˜ ํ›„, ์ ์˜ ์œ„์น˜๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด ๋””๋ฒ„๊น…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ ๋”์ด์ƒ ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ , ์ดํ›„ ๋ฒ„ํŠผ์ด ์•„๋‹Œ ๋งˆ์šฐ์Šค ํด๋ฆญ๊ณผ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋กœ ์คŒ, ์ด๋™์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ ๊ณผ์ •์—์„œ๋„ ๋งŽ์€ ์–ด๋ ค์›€์ด ์žˆ์—ˆ๊ณ  ํ•˜๋‚˜์˜ ํฌ์ŠคํŒ…์—์„œ ๋ชจ๋‘ ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๊ธธ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„ ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์ž‘์„ฑํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. (๊ฐ€์žฅ ์•„๋ž˜ โ€˜ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…โ€™ ์ฐธ๊ณ )


๐Ÿง‘โ€๐Ÿ’ป ๊ตฌํ˜„ ๋‚ด์šฉ

์•„๋ž˜๋Š” ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ์ฃผ์š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์บ”๋ฒ„์Šค ์ดˆ๊ธฐํ™” ๋ฐ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ

// ์บ”๋ฒ„์Šค ์ดˆ๊ธฐํ™”
const canvas = document.getElementById('canvas-overlay') as HTMLCanvasElement;
const context = canvas.getContext('2d');

// ์ง€๋„ ์ด๋ฒคํŠธ์™€ ์บ”๋ฒ„์Šค ๋™๊ธฐํ™”
map.addListener('zoom_changed', () => renderCanvas());
map.addListener('center_changed', () => renderCanvas());

ํ”ฝ์…€ ์ขŒํ‘œ์™€ ์ง€๋„ ์ขŒํ‘œ ๋ณ€ํ™˜

// ์ง€๋„ ์ขŒํ‘œ โ†’ ์บ”๋ฒ„์Šค ํ”ฝ์…€ ์ขŒํ‘œ
function latLngToCanvasPoint(latLng: google.maps.LatLng): { x: number; y: number } {
  const projection = map.getProjection();
  const point = projection.fromLatLngToPoint(latLng);
  return { x: point.x * scale, y: point.y * scale };
}

// ์บ”๋ฒ„์Šค ํ”ฝ์…€ ์ขŒํ‘œ โ†’ ์ง€๋„ ์ขŒํ‘œ
function canvasPointToLatLng(pixel: { x: number; y: number }): google.maps.LatLng {
  const projection = map.getProjection();
  return projection.fromPointToLatLng(new google.maps.Point(pixel.x / scale, pixel.y / scale));
}

๊ทธ๋ฆผ ๋ Œ๋”๋ง ๋ฐ ๋™๊ธฐํ™”

// ์บ”๋ฒ„์Šค์— ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ
function renderCanvas() {
  context.clearRect(0, 0, canvas.width, canvas.height);

  // ๊ทธ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ง€๋„ ์ขŒํ‘œ๋ฅผ ํ”ฝ์…€ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜
  drawings.forEach(drawing => {
    const { x, y } = latLngToPixel(drawing.latLng);
    context.beginPath();
    context.arc(x, y, drawing.radius, 0, Math.PI * 2);
    context.fillStyle = drawing.color;
    context.fill();
  });
}

๊ฒฐ๋ก ์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜์—ฌ ์ง€๋„์™€ ์บ”๋ฒ„์Šค๋ฅผ ์—ฐ๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์บ”๋ฒ„์Šค๋ฅผ ์ด๋™์‹œํ‚ค๊ฑฐ๋‚˜ ์คŒ์ธ/์คŒ์•„์›ƒ ํ–ˆ์„ ๋•Œ์—๋„ ์บ”๋ฒ„์Šค์— ๊ทธ๋ ค์ ธ ์žˆ๋˜ ๊ทธ๋ฆผ๋“ค์ด ๊ทธ ์ž๋ฆฌ์— ๊ทธ๋Œ€๋กœ ์œ„์น˜ํ•œ ์ฑ„ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ฑ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

์‚ฌ์‹ค ์ด ๋ฌธ์ œ ๋ง๊ณ ๋„ ์บ”๋ฒ„์Šค์™€ ์ง€๋„๋ฅผ ์—ฐ๋™ํ•˜๊ณ  ์„œ๋น„์Šคํ•˜๋Š” ๊ณผ์ •์—์„œ ์ •๋ง ๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ์š”..
๋ชจ๋‘ ํ•œ๋ฒˆ์— ์ž‘์„ฑํ•˜๊ธฐ์—” ์–ด๋ ค์›€์ด ์žˆ์–ด์„œ, ๋‚˜๋ˆ„์–ด์„œ ๋” ์ž‘์„ฑํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
์ง€๋„์™€ ์บ”๋ฒ„์Šค ์—ฐ๋™ ๊ณผ์ •์—์„œ ์ƒ๊ธด ๋‚ด์šฉ๋งŒ ํ•ด๋„ ์ •๋ง ๋งŽ์•„์„œ.....

์ง€๋„-์บ”๋ฒ„์Šค ์—ฐ๋™ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋งํฌ์—์„œ ํ™•์ธํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!!

- ๐Ÿ–ฑ๏ธ ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ ๊ตฌํ˜„ ๊ณผ์ •

- ๐Ÿ“ฑ ํ„ฐ์น˜ ์ด๋ฒคํŠธ๋กœ ์บ”๋ฒ„์Šค์—์„œ ์ง€๋„ ์ด๋™๊ณผ ํ™•๋Œ€/์ถ•์†Œ ๊ตฌํ˜„ํ•˜๊ธฐ: feat. ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ์™€์˜ ์ฐจ์ด

- ๐Ÿ—บ๏ธ ๋ชจ๋ฐ”์ผ์—์„œ ํ™”๋ฉด ํ™•๋Œ€/์ถ•์†Œ, ์Šคํฌ๋กค ๊ธˆ์ง€์‹œํ‚ค๊ธฐ (์ง€๋„ ํ™”๋ฉด ๊ณ ์ •ํ•˜๊ธฐ)

- ๐Ÿ–Œ ์บ”๋ฒ„์Šค ์œ„์—์„œ ์บ๋ฆญํ„ฐ๋ฅผ ํšŒ์ „์‹œํ‚ค๊ณ  ๋„ค์˜จ ํšจ๊ณผ ์ž…ํžˆ๊ธฐ

- ๐Ÿ“ ios์—์„œ ์‚ฌ์šฉ์ž์˜ ์‹ค์‹œ๊ฐ„ ๋ฐฉํ–ฅ ๊ฐ€์ ธ์˜ค๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€