Skydive ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ Skydive ํ† ํด๋กœ์ง€์— ๋…ธ๋“œ ์ถ”๊ฐ€

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

์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์„ ๋Œ๊ธฐ ์œ„ํ•ด ์Šค์นด์ด๋‹ค์ด๋ธŒ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์Šคํฌ๋ฆฐ์ƒท์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—๋Š” ์Šค์นด์ด๋‹ค์ด๋ธŒ ์†Œ๊ฐœ ํฌ์ŠคํŒ…์ด ์žˆ์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Skydive ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ Skydive ํ† ํด๋กœ์ง€์— ๋…ธ๋“œ ์ถ”๊ฐ€

Skydive ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ Skydive ํ† ํด๋กœ์ง€์— ๋…ธ๋“œ ์ถ”๊ฐ€

์šฐํŽธ "skydive.network ์†Œ๊ฐœยป ์•„๋ธŒ๋ ˆ์—์„œ.

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

๋ฒ„์ „ 0.20๋ถ€ํ„ฐ Skydive๋Š” ์ƒˆ ๋…ธ๋“œ์™€ ์—์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด ๋…ธ๋“œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ๊ทœ์น™ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ทœ์น™ API๋Š” ๋…ธ๋“œ ๊ทœ์น™ API์™€ ์—์ง€ ๊ทœ์น™ API์˜ ๋‘ ๊ฐ€์ง€ API๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ทœ์น™ API๋Š” ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ์กด ๋…ธ๋“œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Edge Rule API๋Š” ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์— ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์Šค์นด์ด๋‹ค์ด๋น™ ๋„คํŠธ์›Œํฌ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์€ ๋น„๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ „์— Topology Rules API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šค์นด์ด๋‹ค์ด๋น™ ๋…ธ๋“œ ์ƒ์„ฑ

๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๊ณ ์œ ํ•œ ๋…ธ๋“œ ์ด๋ฆ„๊ณผ ์œ ํšจํ•œ ๋…ธ๋“œ ์œ ํ˜•์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์˜ต์…˜์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

skydive client node-rule create --action="create" --node-name="node1" --node-type="fabric" --name="node rule1"
{
  "UUID": "ea21c30f-cfaa-4f2d-693d-95159acb71ed",
  "Name": "node rule1",
  "Description": "",
  "Metadata": {
    "Name": "node1",
    "Type": "fabric"
  },
  "Action": "create",
  "Query": ""
}

์Šค์นด์ด๋‹ค์ด๋น™ ๋…ธ๋“œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ

๊ธฐ์กด ๋…ธ๋“œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด Gremlin ์ฟผ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์— ๋”ฐ๋ผ ๋‹จ์ผ ๋…ธ๋“œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

skydive client node-rule create --action="update" --name="update rule" --query="G.V().Has('Name', 'node1')" --metadata="key1=val1, key2=val2"
{
  "UUID": "3e6c0e15-a863-4583-6345-715053ac47ce",
  "Name": "update rule",
  "Description": "",
  "Metadata": {
    "key1": "val1",
    "key2": "val2"
  },
  "Action": "update",
  "Query": "G.V().Has('Name', 'node1')"
}

์Šค์นด์ด๋‹ค์ด๋ธŒ ์—ฃ์ง€ ์ƒ์„ฑ

์—ฃ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋…ธ๋“œ์™€ ์—ฃ์ง€์˜ ๋งํฌ ์œ ํ˜•์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์œ„ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋งํฌ ์œ ํ˜• ๊ฐ’์ด ์†Œ์œ ๊ถŒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งํฌ ์œ ํ˜• layer2๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋งํฌ ์œ ํ˜• ๊ฐ’์ด ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด2. ๋‘ ๋…ธ๋“œ ์‚ฌ์ด์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งํฌ ์œ ํ˜•์€ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

skydive client edge-rule create --name="edge" --src="G.v().has('TID', '2f6f9b99-82ef-5507-76b6-cbab28bda9cb')" --dst="G.V().Has('TID', 'd6ec6e2f-362e-51e5-4bb5-6ade37c2ca5c')" --relationtype="both"
{
  "UUID": "50fec124-c6d0-40c7-42a3-2ed8d5fbd410",
  "Name": "edge",
  "Description": "",
  "Src": "G.v().has('TID', '2f6f9b99-82ef-5507-76b6-cbab28bda9cb')",
  "Dst": "G.V().Has('TID', 'd6ec6e2f-362e-51e5-4bb5-6ade37c2ca5c')",
  "Metadata": {
    "RelationType": "both"
  }
}

์ฒซ ๋ฒˆ์งธ ์‚ฌ์šฉ ์‚ฌ๋ก€

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

ํ† ํด๋กœ์ง€์— ์žฅ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋…ธ๋“œ ๊ทœ์น™์„ ์ƒ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. create ๋ช…๋ น์˜ ์ผ๋ถ€๋กœ ์žฅ์น˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์—…๋ฐ์ดํŠธ ๋…ธ๋“œ ๊ทœ์น™ ๋ช…๋ น์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ† ํด๋กœ์ง€ ๋‹ค์ด์–ด๊ทธ๋žจ์— ์Šคํ† ๋ฆฌ์ง€ ๋””๋ฐ”์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ํ˜ธ์ŠคํŠธ ๊ทœ์น™ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

skydive client node-rule create --action="create" --node-name="sda" --node-type="persistentvolume" --metadata="DEVNAME=/dev/sda,DEVTYPE=disk,ID.MODEL=SD_MMC, ID.MODEL ID=0316, ID.PATH TAG=pci-0000_00_14_0-usb-0_3_1_0-scsi-0_0_0_0, ID.SERIAL SHORT=20120501030900000, ID.VENDOR=Generic-, ID.VENDOR ID=0bda, MAJOR=8, MINOR=0, SUBSYSTEM=block, USEC_INITIALIZED=104393719727"

Edge ๊ทœ์น™ ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ ํ˜ธ์ŠคํŠธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

skydive client edge-rule create --src="G.V().Has('Name', 'node1')" --dst="G.V().Has('Name', 'sda')" --relationtype="ownership"

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

Skydive ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ Skydive ํ† ํด๋กœ์ง€์— ๋…ธ๋“œ ์ถ”๊ฐ€

๋‘ ๋ฒˆ์งธ ์‚ฌ์šฉ ์‚ฌ๋ก€

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

TOR ์Šค์œ„์น˜๊ฐ€ ์—†์œผ๋ฉด ์•„๋ž˜ ์ด๋ฏธ์ง€์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋‘ ์—์ด์ „ํŠธ๊ฐ€ ๋งํฌ ์—†์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Skydive ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ Skydive ํ† ํด๋กœ์ง€์— ๋…ธ๋“œ ์ถ”๊ฐ€

์ด์ œ ๋‹ค์Œ ํ˜ธ์ŠคํŠธ ๊ทœ์น™ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ TOR ์Šค์œ„์น˜์™€ ํฌํŠธ๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.

skydive client node-rule create --node-name="TOR" --node-type="fabric" --action="create"
skydive client node-rule create --node-name="port1" --node-type="port" --action="create"
skydive client node-rule create --node-name="port2" --node-type="port" --action="create"

๋ณด์‹œ๋‹ค์‹œํ”ผ TOR ์Šค์œ„์น˜์™€ ํฌํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์Šค์นด์ด๋‹ค์ด๋ธŒ ํ† ํด๋กœ์ง€์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ ํ† ํด๋กœ์ง€๋Š” ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Skydive ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ Skydive ํ† ํด๋กœ์ง€์— ๋…ธ๋“œ ์ถ”๊ฐ€

์ด์ œ ๋‹ค์Œ Edge Rule ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ TOR ์Šค์œ„์น˜, ํฌํŠธ 1 ๋ฐ ํ˜ธ์ŠคํŠธ 1์˜ ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port1')" --relationtype="ownership"
skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port1')" --relationtype="layer2"
skydive client edge-rule create --src="G.V().Has('TID', '372c254d-bac9-50c2-4ca9-86dcc6ce8a57')" --dst="G.V().Has('Name', 'port1')" --relationtype="layer2"

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ TOR ์Šค์œ„์น˜ ํฌํŠธ 2์™€ ํ˜ธ์ŠคํŠธ 2 ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐ„์˜ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.

skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port2')" --relationtype="layer2"
skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port2')" --relationtype="ownership"
skydive client edge-rule create --src="G.V().Has('TID', '50037073-7862-5234-4996-e58cc067c69c')" --dst="G.V().Has('Name', 'port2')" --relationtype="layer2"

์ด์ œ TOR ์Šค์œ„์น˜์™€ ํฌํŠธ ์‚ฌ์ด์— ์†Œ์œ ๊ถŒ ๋ฐ ๋ ˆ์ด์–ด 2 ์—ฐ๊ฒฐ์ด ์ƒ์„ฑ๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—์ด์ „ํŠธ์™€ ํฌํŠธ ์‚ฌ์ด์— ๋ ˆ์ด์–ด 2 ์—ฐ๊ฒฐ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ตœ์ข… ํ† ํด๋กœ์ง€๋Š” ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Skydive ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ Skydive ํ† ํด๋กœ์ง€์— ๋…ธ๋“œ ์ถ”๊ฐ€

์ด์ œ ๋‘ ํ˜ธ์ŠคํŠธ/์—์ด์ „ํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜์—ˆ์œผ๋ฉฐ ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ๋‘ ํ˜ธ์ŠคํŠธ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ์บก์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PS ๋งํฌ ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ

์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์Šค์นด์ด๋‹ค์ด๋น™ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ…”๋ ˆ๊ทธ๋žจ ์ฑ„ํŒ… skydive.network๋ฅผ ํ†ตํ•ด.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€