๐ŸŒ‹ ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜: ์ง€์งˆํ•™ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฒกํ„ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŒ‹ ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜: ์ง€์งˆํ•™ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฒกํ„ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์ง€์งˆํ•™ ์• ํ˜ธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์„ ๋ชจ์…จ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฒกํ„ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๐ŸŽจโœจ ์ด ๊ธ€์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ์ง€์งˆํ•™์˜ ๋ณต์žกํ•œ ๊ฐœ๋…์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฉ‹์ง€๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒ๋‹ˆ๋‹ค. ๋งˆ์น˜ ํ™”์‚ฐ์ด ํญ๋ฐœํ•˜๋“ฏ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐฝ์˜๋ ฅ๋„ ํญ๋ฐœํ•  ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”!

๐Ÿ” ์•Œ์•„๋‘์„ธ์š”: ์ด ๊ธ€์€ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์˜ '์ง€์‹์ธ์˜ ์ˆฒ' ๋ฉ”๋‰ด์— ๋“ฑ๋ก๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์žฌ๋Šฅ๋„ท์€ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•˜๋Š” ํ”Œ๋žซํผ์œผ๋กœ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง€์‹๊ณผ ๊ธฐ์ˆ ์„ ๋‚˜๋ˆ„๊ณ  ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํ›Œ๋ฅญํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

1. ํ™”์‚ฐ ๋ถ„์ถœ์˜ ๊ธฐ์ดˆ: ์ง€์งˆํ•™์  ์ดํ•ด

ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, ๋จผ์ € ํ™”์‚ฐ ๋ถ„์ถœ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™”์‚ฐ์€ ์ง€๊ตฌ ๋‚ด๋ถ€์˜ ๋งˆ๊ทธ๋งˆ๊ฐ€ ์ง€ํ‘œ๋ฉด์œผ๋กœ ๋ถ„์ถœ๋˜๋Š” ํ˜„์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์š”์ธ๋“ค์ด ์ž‘์šฉํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ํ•ต์‹ฌ์ ์ธ ์š”์†Œ๋“ค์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋งˆ๊ทธ๋งˆ์˜ ํ˜•์„ฑ: ์ง€๊ตฌ ๋‚ด๋ถ€์˜ ๊ณ ์˜จ, ๊ณ ์•• ํ™˜๊ฒฝ์—์„œ ์•”์„์ด ๋…น์•„ ํ˜•์„ฑ
  • ๋งˆ๊ทธ๋งˆ์˜ ์ƒ์Šน: ๋ฐ€๋„ ์ฐจ์ด์™€ ์••๋ ฅ์œผ๋กœ ์ธํ•ด ์ง€ํ‘œ๋ฉด์œผ๋กœ ์ƒ์Šน
  • ํ™”์‚ฐ ๋ถ„์ถœ: ๋งˆ๊ทธ๋งˆ๊ฐ€ ์ง€ํ‘œ๋ฉด์— ๋„๋‹ฌํ•˜์—ฌ ๋ถ„์ถœ
  • ํ™”์‚ฐ ๊ตฌ์กฐ ํ˜•์„ฑ: ๋ถ„์ถœ๋œ ๋ฌผ์งˆ์ด ์Œ“์—ฌ ํ™”์‚ฐ์ฒด ํ˜•์„ฑ

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์‹œ๊ฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด, ์šฐ๋ฆฌ๋Š” SVG(Scalable Vector Graphics)๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. SVG๋Š” ๋ฒกํ„ฐ ๊ธฐ๋ฐ˜์˜ ๊ทธ๋ž˜ํ”ฝ์„ ํ‘œํ˜„ํ•˜๋Š” XML ํฌ๋งท์œผ๋กœ, ํ™•๋Œ€ํ•ด๋„ ๊นจ์ง€์ง€ ์•Š๋Š” ์„ ๋ช…ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ๋™์ ์ธ ํ™”์‚ฐ ๋ถ„์ถœ ๊ณผ์ •์„ ํ‘œํ˜„ํ•˜๊ธฐ์— ๋”ฑ ๋งž์ฃ !

ํ™”์‚ฐ ๋ถ„์ถœ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋งˆ๊ทธ๋งˆ ์ฑ”๋ฒ„ ํ™”์‚ฐ ๋ถ„์ถœ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ง€๊ฐ ๋งจํ‹€

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

2. SVG ๊ธฐ์ดˆ: ๋ฒกํ„ฐ ๊ทธ๋ž˜ํ”ฝ์˜ ์„ธ๊ณ„

SVG๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์ „์—, SVG์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์š”์†Œ๋“ค์„ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. SVG๋Š” XML ๊ธฐ๋ฐ˜์˜ ๋ฒกํ„ฐ ์ด๋ฏธ์ง€ ํฌ๋งท์œผ๋กœ, ์›น์—์„œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ทธ๋ž˜ํ”ฝ์„ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

SVG์˜ ์ฃผ์š” ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ํ™•์žฅ์„ฑ: ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ํ’ˆ์งˆ ์†์‹ค์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ ํŽธ์ง‘ ๊ฐ€๋Šฅ: SVG ๋‚ด์˜ ํ…์ŠคํŠธ๋Š” ๊ฒ€์ƒ‰ ์—”์ง„์ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž‘์€ ํŒŒ์ผ ํฌ๊ธฐ: ๋ณต์žกํ•œ ๊ทธ๋ž˜ํ”ฝ๋„ ์ƒ๋Œ€์ ์œผ๋กœ ์ž‘์€ ํŒŒ์ผ ํฌ๊ธฐ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ง€์›: CSS๋‚˜ JavaScript๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SVG์˜ ๊ธฐ๋ณธ ์š”์†Œ๋“ค์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

<svg width="800" height="600" viewBox="0 0 800 600">
  <!-- SVG ๋‚ด์šฉ -->
</svg>

์ด๊ฒƒ์ด SVG์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. width์™€ height๋Š” SVG์˜ ํฌ๊ธฐ๋ฅผ, viewBox๋Š” SVG ์ขŒํ‘œ ์‹œ์Šคํ…œ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” SVG ๋„ํ˜• ์š”์†Œ:

  • <rect>: ์ง์‚ฌ๊ฐํ˜•
  • <circle>: ์›
  • <ellipse>: ํƒ€์›
  • <line>: ์„ 
  • <polyline>: ์—ฐ๊ฒฐ๋œ ์ง์„ ๋“ค
  • <polygon>: ๋‹ค๊ฐํ˜•
  • <path>: ๋ณต์žกํ•œ ๊ฒฝ๋กœ

์ด์ œ ์ด ์š”์†Œ๋“ค์„ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ํ™”์‚ฐ ๋ชจํ˜•์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

๊ฐ„๋‹จํ•œ SVG ํ™”์‚ฐ ๋ชจํ˜• ๊ฐ„๋‹จํ•œ SVG ํ™”์‚ฐ

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์–‘ํ•œ SVG ์š”์†Œ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ํ™”์‚ฐ ๋ชจํ˜•์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. <rect> ์š”์†Œ๋กœ ํ•˜๋Š˜๊ณผ ๋•…์„ ํ‘œํ˜„ํ•˜๊ณ , <polygon>์œผ๋กœ ํ™”์‚ฐ์˜ ํ˜•ํƒœ๋ฅผ, <ellipse>๋กœ ๋ถ„ํ™”๊ตฌ๋ฅผ ๊ทธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ <circle> ์š”์†Œ์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ธฐ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค์—ˆ์ฃ .

์ด์ œ SVG์˜ ๊ธฐ๋ณธ์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ๋” ๋ณต์žกํ•˜๊ณ  ์ƒ์„ธํ•œ ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณผ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

3. ํ™”์‚ฐ ๊ตฌ์กฐ์˜ ์„ธ๋ถ€ ์š”์†Œ ๊ตฌํ˜„

ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋”์šฑ ์ •๊ตํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, ํ™”์‚ฐ์˜ ์„ธ๋ถ€ ๊ตฌ์กฐ๋ฅผ SVG๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋งˆ๊ทธ๋งˆ์˜ ์ด๋™ ๊ฒฝ๋กœ์™€ ๋ถ„์ถœ ๊ณผ์ •์„ ๋” ์ž์„ธํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™”์‚ฐ์˜ ์ฃผ์š” ๊ตฌ์กฐ์  ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋งˆ๊ทธ๋งˆ ์ฑ”๋ฒ„: ์ง€ํ•˜ ๊นŠ์€ ๊ณณ์— ์œ„์น˜ํ•œ ๋งˆ๊ทธ๋งˆ ์ €์žฅ์†Œ
  • ํ™”๋„: ๋งˆ๊ทธ๋งˆ๊ฐ€ ์ง€ํ‘œ๋ฉด์œผ๋กœ ์ƒ์Šนํ•˜๋Š” ํ†ต๋กœ
  • ๋ถ„ํ™”๊ตฌ: ํ™”์‚ฐ ์ •์ƒ๋ถ€์˜ ๊ฐœ๊ตฌ๋ถ€
  • ์ธกํ™”์‚ฐ: ์ฃผ ํ™”์‚ฐ์ฒด ์˜†๋ฉด์— ํ˜•์„ฑ๋œ ์ž‘์€ ํ™”์‚ฐ
  • ํ™”์‚ฐ์•”: ๋ถ„์ถœ๋œ ๋งˆ๊ทธ๋งˆ๊ฐ€ ๊ตณ์–ด ํ˜•์„ฑ๋œ ์•”์„

์ด์ œ ์ด๋Ÿฌํ•œ ์š”์†Œ๋“ค์„ ํฌํ•จํ•œ ๋” ์ƒ์„ธํ•œ ํ™”์‚ฐ ๊ตฌ์กฐ๋ฅผ SVG๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

์ƒ์„ธํ•œ ํ™”์‚ฐ ๊ตฌ์กฐ ๋งˆ๊ทธ๋งˆ ์ฑ”๋ฒ„ ์ƒ์„ธํ•œ ํ™”์‚ฐ ๊ตฌ์กฐ ํ™”๋„ ๋ถ„ํ™”๊ตฌ ์ธกํ™”์‚ฐ ์ธกํ™”์‚ฐ

์ด SVG ๋‹ค์ด์–ด๊ทธ๋žจ์€ ํ™”์‚ฐ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋”์šฑ ์ƒ์„ธํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ฃผ์š” ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋งˆ๊ทธ๋งˆ ์ฑ”๋ฒ„: ํƒ€์› ํ˜•ํƒœ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๋ฐ˜ํˆฌ๋ช…ํ•œ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ™”๋„: ๋งˆ๊ทธ๋งˆ ์ฑ”๋ฒ„์—์„œ ๋ถ„ํ™”๊ตฌ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ๊ตต์€ ์„ ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค.
  • ๋ถ„ํ™”๊ตฌ: ํ™”์‚ฐ ์ •์ƒ๋ถ€์˜ ํƒ€์›ํ˜• ๊ฐœ๊ตฌ๋ถ€์ž…๋‹ˆ๋‹ค.
  • ์ธกํ™”์‚ฐ: ์ฃผ ํ™”์‚ฐ์ฒด ์˜†๋ฉด์— ์ž‘์€ ์‚ผ๊ฐํ˜• ๋ชจ์–‘์œผ๋กœ ํ‘œํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ™”์‚ฐ์•”: ํ™”์‚ฐ ์ฃผ๋ณ€์— ํšŒ์ƒ‰ ์›์œผ๋กœ ํ‘œํ˜„๋œ ์•”์„๋“ค์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋งˆ๊ทธ๋งˆ์˜ ์ด๋™๊ณผ ๋ถ„์ถœ ๊ณผ์ •์„ ๋™์ ์œผ๋กœ ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • ๋งˆ๊ทธ๋งˆ ์ด๋™: ๋งˆ๊ทธ๋งˆ ์ฑ”๋ฒ„์—์„œ ๋ถ„ํ™”๊ตฌ๊นŒ์ง€ ๋นจ๊ฐ„ ์›๋“ค์ด ์ƒ์Šนํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜
  • ๋ถ„์ถœ: ๋ถ„ํ™”๊ตฌ์—์„œ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ์›๋“ค๋กœ ๋ถ„์ถœ ๊ณผ์ •์„ ํ‘œํ˜„

์ด๋Ÿฌํ•œ ์ƒ์„ธํ•œ SVG ๊ตฌํ˜„์„ ํ†ตํ•ด, ์šฐ๋ฆฌ๋Š” ํ™”์‚ฐ์˜ ๋ณต์žกํ•œ ๋‚ด๋ถ€ ๊ตฌ์กฐ์™€ ๋™์ ์ธ ๋ถ„์ถœ ๊ณผ์ •์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ง€์งˆํ•™์  ๊ฐœ๋…์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4. ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์š”์†Œ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ์˜ ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๋ฉด, ํ•™์Šต ํšจ๊ณผ๊ฐ€ ๋”์šฑ ๋†’์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. SVG์™€ JavaScript๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

  • ๋งˆ๊ทธ๋งˆ ์••๋ ฅ ์กฐ์ ˆ
  • ํ™”์‚ฐ ์œ ํ˜• ์„ ํƒ
  • ๋ถ„์ถœ ์‹œ์ž‘/์ •์ง€ ์ œ์–ด

๋จผ์ €, HTML์— ํ•„์š”ํ•œ ์ปจํŠธ๋กค ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

<div id="controls" style="margin: 20px 0;">
  <label for="pressure">๋งˆ๊ทธ๋งˆ ์••๋ ฅ: </label>
  <input type="range" id="pressure" min="1" max="10" value="5">
  
  <label for="volcanoType">ํ™”์‚ฐ ์œ ํ˜•: </label>
  <select id="volcanoType">
    <option value="shield">์ˆœ์ƒํ™”์‚ฐ</option>
    <option value="stratovolcano">์„ฑ์ธตํ™”์‚ฐ</option>
    <option value="caldera">์นผ๋ฐ๋ผ</option>
  </select>
  
  <button id="eruptButton">๋ถ„์ถœ ์‹œ์ž‘/์ •์ง€</button>
</div>

์ด์ œ ์ด ์ปจํŠธ๋กค๋“ค๊ณผ ์—ฐ๋™๋˜๋Š” JavaScript ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

// SVG ์š”์†Œ๋“ค์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
const magmaChamber = document.querySelector('#magmaChamber');
const conduit = document.querySelector('#conduit');
const crater = document.querySelector('#crater');
const eruptionParticles = document.querySelector('#eruptionParticles');

// ์ปจํŠธ๋กค ์š”์†Œ๋“ค์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
const pressureSlider = document.querySelector('#pressure');
const volcanoTypeSelect = document.querySelector('#volcanoType');
const eruptButton = document.querySelector('#eruptButton');

let isErupting = false;

// ๋งˆ๊ทธ๋งˆ ์••๋ ฅ ์กฐ์ ˆ
pressureSlider.addEventListener('input', (e) => {
  const pressure = e.target.value;
  magmaChamber.setAttribute('ry', 80 + pressure * 2);
  conduit.setAttribute('stroke-width', 30 + pressure * 2);
});

// ํ™”์‚ฐ ์œ ํ˜• ๋ณ€๊ฒฝ
volcanoTypeSelect.addEventListener('change', (e) => {
  const type = e.target.value;
  switch(type) {
    case 'shield':
      crater.setAttribute('rx', '100');
      crater.setAttribute('ry', '20');
      break;
    case 'stratovolcano':
      crater.setAttribute('rx', '50');
      crater.setAttribute('ry', '20');
      break;
    case 'caldera':
      crater.setAttribute('rx', '150');
      crater.setAttribute('ry', '50');
      break;
  }
});

// ๋ถ„์ถœ ์‹œ์ž‘/์ •์ง€
eruptButton.addEventListener('click', () => {
  isErupting = !isErupting;
  if (isErupting) {
    eruptionParticles.style.display = 'block';
    eruptButton.textContent = '๋ถ„์ถœ ์ •์ง€';
  } else {
    eruptionParticles.style.display = 'none';
    eruptButton.textContent = '๋ถ„์ถœ ์‹œ์ž‘';
  }
});

// ๋ถ„์ถœ ์• ๋‹ˆ๋ฉ”์ด์…˜
function animateEruption() {
  if (!isErupting) return;
  
  const particle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
  particle.setAttribute('cx', 400);
  particle.setAttribute('cy', 100);
  particle.setAttribute('r', 5);
  particle.setAttribute('fill', '#FF4500');
  
  const animX = document.createElementNS("http://www.w3.org/2000/svg", "animate");
  animX.setAttribute('attributeName', 'cx');
  animX.setAttribute('from', '400');
  animX.setAttribute('to', 350 + Math.random() * 100);
  animX.setAttribute('dur', '2s');
  animX.setAttribute('fill', 'freeze');
  
  const animY = document.createElementNS("http://www.w3.org/2000/svg", "animate");
  animY.setAttribute('attributeName', 'cy');
  animY.setAttribute('from', '100');
  animY.setAttribute('to', '0');
  animY.setAttribute('dur', '2s');
  animY.setAttribute('fill', 'freeze');
  
  const animOpacity = document.createElementNS("http://www.w3.org/2000/svg", "animate");
  animOpacity.setAttribute('attributeName', 'opacity');
  animOpacity.setAttribute('from', '1');
  animOpacity.setAttribute('to', '0');
  animOpacity.setAttribute('dur', '2s');
  animOpacity.setAttribute('fill', 'freeze');
  
  particle.appendChild(animX);
  particle.appendChild(animY);
  particle.appendChild(animOpacity);
  
  eruptionParticles.appendChild(particle);
  
  setTimeout(() => {
    eruptionParticles.removeChild(particle);
  }, 2000);
}

setInterval(animateEruption, 100);

์ด JavaScript ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค:

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

์ด๋Ÿฌํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์š”์†Œ๋“ค์„ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ, ์‚ฌ์šฉ์ž๋“ค์€ ํ™”์‚ฐ ๋ถ„์ถœ ๊ณผ์ •์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ณ  ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์ˆœํžˆ ์ •์ ์ธ ์ด๋ฏธ์ง€๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ณด๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํšจ๊ณผ์ ์ธ ํ•™์Šต ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฌ๋Šฅ๋„ท์—์„œ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๊ต์œก ์ฝ˜ํ…์ธ ๋ฅผ ๋งŒ๋“œ๋Š” ์žฌ๋Šฅ์„ ๊ฐ€์ง„ ๋ถ„๋“ค์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ ๊ต์œก ๋ถ„์•ผ์—์„œ ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๊ฒŒ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์žฌ ๋Šฅ๋„ท์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์„ ๊ณต์œ ํ•˜๊ณ  ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”: ์‹ค์ œ ํ™”์‚ฐ ๋ฐ์ดํ„ฐ ํ†ตํ•ฉํ•˜๊ธฐ

์šฐ๋ฆฌ์˜ ํ™”์‚ฐ ๋ถ„์ถœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ „์‹œ์ผœ ์‹ค์ œ ํ™”์‚ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์€ ์‹ค์ œ ํ™”์‚ฐ์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์„ธ๊ณ„์˜ ์ฃผ์š” ํ™”์‚ฐ๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, ๊ฐ€์ƒ์˜ ํ™”์‚ฐ ๋ฐ์ดํ„ฐ์…‹์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

const volcanoes = [
  { name: "๋งˆ์šฐ๋‚˜๋กœ์•„", type: "shield", height: 4169, lastEruption: 1984 },
  { name: "๋ฒ ์ˆ˜๋น„์˜ค", type: "stratovolcano", height: 1281, lastEruption: 1944 },
  { name: "ํฌ๋ผ์นดํƒ€์šฐ", type: "caldera", height: 813, lastEruption: 2018 },
  { name: "ํ›„์ง€์‚ฐ", type: "stratovolcano", height: 3776, lastEruption: 1707 },
  { name: "์˜๋กœ์Šคํ†ค", type: "caldera", height: 2805, lastEruption: -70000 }
];

์ด์ œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค: