๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๊ฐœ๋ฐœ

MySQL๊ณผ MongoDB ๊ณต๊ฐ„ ์ธ๋ฑ์Šค์˜ ์ฐจ์ด

๊ฐœ์š”

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

 

์ด ๊ธ€์—์„œ๋Š” ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ MySQL๊ณผ MongoDB๊ฐ€ ๊ฐ๊ฐ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ธ๋ฑ์‹ฑํ•˜๋Š” ๋ฐฉ์‹์„ ๋น„๊ตํ•˜๋ฉฐ, ๊ทธ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

 

๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๊ธฐํ•˜ํ•™์  ๊ฐœ์ฒด์˜ ๋ฌผ๋ฆฌ์  ์œ„์น˜ ๋ฐ ๋ชจ์–‘์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, GIS ์„œ๋น„์Šค์—์„œ ํ•ต์‹ฌ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จ๋œ ํ‘œ์ค€์€ OGC(Open Geospatial Consortium, ๊ฐœ๋ฐฉํ˜• ๊ณต๊ฐ„ ์ •๋ณด ์ปจ์†Œ์‹œ์—„)์ด๋ผ๋Š” ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์—์„œ ์ง€์ •ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด '๋ถ€์‚ฐ'์ด๋ผ๋Š” ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋„ค์ด๋ฒ„ ์ง€๋„

 

ํ˜„์žฌ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” OGC Simple Features ํ‘œ์ค€์— ๋”ฐ๋ผ ์ •์˜๋œ ๋ช…์„ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ํ•ด๋‹น ํ‘œ์ค€์— ๋”ฐ๋ฅด๋ฉด ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ 3๊ฐ€์ง€์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

  • Point(์ ): ๋‹จ์ผ ์ขŒํ‘œ
    • ์˜ˆ) ์–ด๋А ํŠน์ • ์นดํŽ˜์˜ ์œ„์น˜
  • LineString(์„ ): ์ขŒํ‘œ๋“ค์„ ์ด์€ ์„ 
    • ์˜ˆ) ๋Ÿฌ๋‹ ์ฝ”์Šค, ๋„๋กœ
  • Polygon(๋ฉด): ๋‹ซํžŒ ์„ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฉด
    • ์˜ˆ) ์ง€๋„ ์† ๋ถ€์‚ฐ ๊ด‘์—ญ์‹œ ํ–‰์ • ๊ฒฝ๊ณ„

๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๊ฒฐ๊ตญ ์ขŒํ‘œ๋กœ ํ‘œํ˜„๋œ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ™์€ ์ขŒํ‘œ๋ผ๋„ ์–ด๋–ค ๊ธฐ์ค€ ์œ„์—์„œ ํ•ด์„ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ์‹ค์ œ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ์ค€์„ ์ขŒํ‘œ ์ฐธ์กฐ ์‹œ์Šคํ…œ(CRS, Coordinate Reference System) ์ด๋ผ๊ณ  ํ•˜๋ฉฐ, SRID(Spatial Reference Identifier)๋Š” ํŠน์ • CRS๋ฅผ ์‹๋ณ„ํ•˜๋Š” ID์ด๋‹ค.

 

๊ณต๊ฐ„์˜ ๊ธฐ์ค€์ด ๋˜๋Š” SRID

์ง€๊ตฌ ์ƒ์˜ ์œ„์น˜๋ฅผ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

  1. GCS(Geographic Coordinate System)
  2. PCS(Projected Coordinate System)

 

GCS(Geographic Coordinate System, ์ง€๋ฆฌ ์ขŒํ‘œ๊ณ„)

์ง€๋ฆฌ ์ขŒํ‘œ๊ณ„(GCS)๋Š” ์ง€๊ตฌ๋ฅผ ํšŒ์ „ ํƒ€์›์ฒด๋กœ ๊ฐ„์ฃผํ•˜๊ณ , ๊ทธ ํ‘œ๋ฉด์˜ ์œ„์˜ ์œ„์น˜๋ฅผ ์œ„๋„์™€ ๊ฒฝ๋„๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์ขŒํ‘œ๊ณ„์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ ์ง€๊ตฌ๋Š” ์™„๋ฒฝํ•œ ํƒ€์›์˜ ๋ชจ์–‘์„ ํ•˜์ง€ ์•Š๊ณ , ์šธํ‰๋ถˆํ‰ํ•œ ๋ชจ์–‘์„ ๊ฐ–๊ณ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํšŒ์ „ ํƒ€์›์ฒด๋ฅผ ์ง€๊ตฌ์˜ ์–ด๋А ์ค‘์‹ฌ์— ์œ„์น˜์‹œํ‚ค๋А๋ƒ์— ๋”ฐ๋ผ ๊ฐ™์€ ์œ„๋„/๊ฒฝ๋„๋ผ๋„ ํ‘œํ˜„๋˜๋Š” ์œ„์น˜๋Š” ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ํšŒ์ „ ํƒ€์›์ฒด ๋ชจ์–‘๊ณผ ๊ทธ ์ค‘์‹ฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ GCS๋กœ๋Š” WGS84, GRS80, NAD83 ๋“ฑ์ด ์žˆ๋‹ค. ์ด ์ค‘ WGS84๊ฐ€ GPS์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตญ์ œ ํ‘œ์ค€์— ํ•ด๋‹นํ•œ๋‹ค.

 

PCS(Projected Coordinate System, ํˆฌ์˜ ์ขŒํ‘œ๊ณ„)

ํˆฌ์˜ ์ขŒํ‘œ๊ณ„(PCS)๋Š” 3์ฐจ์›์˜ ์ง€๊ตฌ๋ฅผ 2์ฐจ์›์ธ ํ‰๋ฉด์— ํˆฌ์˜ํ•œ ์ขŒํ‘œ๊ณ„์ด๋‹ค. GCS๊ฐ€ ์œ„๋„/๊ฒฝ๋„๋กœ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ˜๋ฉด์— PCS๋Š” ๋ฏธํ„ฐ(m) ๋‹จ์œ„์˜ x, y ์ขŒํ‘œ๋กœ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ง€๊ตฌ๋ฅผ ํ‰๋ฉด์œผ๋กœ ํŽผ์น˜๋ฉด์„œ ํ•„์—ฐ์ ์œผ๋กœ ์™œ๊ณก์ด ๋ฐœ์ƒํ•˜๊ธฐ์—, ์–ด๋–ค ์†์„ฑ(๋ฉด์ , ํ˜•ํƒœ, ๊ฑฐ๋ฆฌ ๋“ฑ)์„ ์–ผ๋งˆ๋‚˜ ๋ณด์กดํ• ์ง€์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํˆฌ์˜ ๋ฐฉ์‹์ด ์กด์žฌํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ UTM์ด ์žˆ์œผ๋ฉฐ, ํ•œ๊ตญ์€ EPSG 5179๋ฅผ ํˆฌ์˜ ์ขŒํ‘œ๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

SRID

์ด์ฒ˜๋Ÿผ ์ง€๊ตฌ ์ƒ์˜ ์œ„์น˜๋ฅผ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์–ด๋–ค ๊ฒƒ๋“ค์ด ์กด์žฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์•˜๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์—ฌ๋Ÿฌ ์ขŒํ‘œ๊ณ„๋“ค์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ SRID๋ผ๋Š” ๊ณ ์œ  ID๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด SRID 4326์€ WGS84 ์ขŒํ‘œ๊ณ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. MongoDB์˜ 2dsphere ์ธ๋ฑ์Šค๋Š” WGS84๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ฐ€์ •ํ•˜๋ฉฐ, MySQL์€ ๊ธฐ๋ณธ๊ฐ’์€ 0์ด์ง€๋งŒ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์‹œ SRID 4326์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

MySQL์—์„œ์˜ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ํŒŒํ—ค์น˜๊ธฐ

์•ž์„œ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ(Point, Polygon ๋“ฑ)์™€ ๊ทธ ๊ธฐ์ค€์ด ๋˜๋Š” ๋„ํ™”์ง€(SRID)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด MySQL์€ ์ด 2์ฐจ์›์˜ ๋„ํ™”์ง€ ์œ„์— ๊ทธ๋ ค์ง„ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ• ๊นŒ?

 

MySQL์€ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋“ค์„ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„ธ ๊ฐ€์ง€ ํฌ๋งท์„ ํ™œ์šฉํ•œ๋‹ค.

  • WKT(Well-Known Text)
    ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ OGC ํ‘œ์ค€์ด๋‹ค. ํ”ํžˆ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํฌ๋งท์ด๋‹ค.
  • WKB(Well-Known Binary)
    ํ•ด๋‹น ํฌ๋งท์€ ์ˆœ์ˆ˜ ์ด์ง„ ํ˜•ํƒœ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ• ๋•Œ ํšจ์œจ์ ์œผ๋กœ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํฌ๋งท์ด๋‹ค. 16์ง„์ˆ˜ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•˜๋ฉฐ ์ด ๋˜ํ•œ OGC ๊ตญ์ œ ํ‘œ์ค€์ด๋‹ค.
  • Internal Geometry Storage
    MySQL์ด ์‹ค์ œ๋กœ ๋””์Šคํฌ์— ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํฌ๋งท์ด๋‹ค. WKB ํฌ๋งท์— 4๋ฐ”์ดํŠธ์˜ SRID ์ˆซ์ž๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.

 

์ฆ‰, ๊ฐœ๋ฐœ์ž๋Š” WKT๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ MySQL ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์€ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ WKB๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, MySQL์€ ์ตœ์ข…์ ์œผ๋กœ SRID + WKB ํ˜•ํƒœ์˜ Internal Geometry Storage๋กœ ๋””์Šคํฌ์— ์ €์žฅํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค. MySQL์€ ์ˆ˜ํ•™์  ๊ณ„์‚ฐ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐ ๋ฐ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ณต๊ฐ„ ์ธ๋ฑ์Šค์™€ ๊ด€๋ จํ•ด์„œ๋Š” ์ด๋ฏธ ์ž‘์„ฑํ•ด๋‘์—ˆ๋˜ ๊ณผ๊ฑฐ ๊ธ€์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

 

MongoDB์—์„œ์˜ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ํŒŒํ—ค์น˜๊ธฐ

์•ž์„œ MySQL์—์„œ๋Š” ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ , ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜๋‹ค. ์ด๋ฒˆ์—๋Š” ๋Ÿฐ์„ธ๊ถŒ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” MongoDB๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ , ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

 

๊ธฐ๋ณธ์ ์œผ๋กœ MongoDB๋Š” BSON์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ ํฌ๋งท์œผ๋กœ ๋ฐ์ดํ„ฐ๋“ค์„ ์ €์žฅํ•˜์ง€๋งŒ, ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ GeoJSON์ด๋ผ๋Š” ํ˜•ํƒœ๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋Š” OGC ํ‘œ์ค€์€ ์•„๋‹ˆ๊ณ  ๊ฐœ๋ฐฉํ˜• ๊ณต๊ฐœ ํ‘œ์ค€ ํ˜•์‹์œผ๋กœ JSON ํ˜•ํƒœ๋กœ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ๋งท์ด๋‹ค.

{
  "type": "Feature",
  "geometry": {
    "type": "LineString",
    "coordinates": [
      [127.0276, 37.4979], // [๊ฒฝ๋„, ์œ„๋„]
      [127.0280, 37.4985],
      [127.0291, 37.5001]
    ]
  },
  "properties": {
    "courseName": "๊ฐ•๋‚จ์—ญ 1km ์™•๋ณต ์ฝ”์Šค",
    "difficulty": "Easy",
    "distance": 1000
  }
}

 

์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š”๋ฐ, ์ด๊ฒŒ ํ•˜๋‚˜์˜ ๋Ÿฌ๋‹ ์ฝ”์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. type์„ ํ†ตํ•ด Feature, FeatureCollection, ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ  geometry๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ properties์— ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ MongoDB์—์„œ๋Š” GeoJSON์˜ Feature ๊ตฌ์กฐ ์ „์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, geometry๋Š” ๋ณ„๋„ ํ•„๋“œ๋กœ, properties์˜ ๋‚ด์šฉ์€ ์ผ๋ฐ˜ ํ•„๋“œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋„ํ๋จผํŠธ ์•ˆ์— ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค.

{
  "courseName": "๊ฐ•๋‚จ์—ญ 1km ์™•๋ณต ์ฝ”์Šค",
  "difficulty": "Easy",
  "distance": 1000,
  "location": {
    "type": "LineString",
    "coordinates": [
      [127.0276, 37.4979], // [๊ฒฝ๋„, ์œ„๋„]
      [127.0280, 37.4985],
      [127.0291, 37.5001]
    ]
  }
}

 

S2 Geometry

MongoDB์—์„œ๋Š” ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ์œ„ํ•ด์„œ ๊ตฌ๊ธ€์—์„œ ๋งŒ๋“  S2 Geometry๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ตฌ๋ฅผ 6๊ฐœ์˜ ๋ฉด์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๋ฉด์„ ์žฌ๊ท€์ ์œผ๋กœ 4๋“ฑ๋ถ„ํ•˜์—ฌ ์ž‘์€ ์…€(Cell) ๋‹จ์œ„๋กœ ์ง€๊ตฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด์ž.

 

1. ์ง€๊ตฌ๋ฅผ ์ •์œก๋ฉด์ฒด๋กœ ๊ฐ์‹ธ๊ธฐ

Gemini ์ƒ์„ฑ ์ด๋ฏธ์ง€

 

MySQL์˜ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค์˜ MBR์ฒ˜๋Ÿผ ์ง€๊ตฌ๋ฅผ ์ปค๋‹ค๋ž€ ์ง์œก๋ฉด์ฒด ๋ชจ์–‘์˜ MBR๋กœ ๊ฐ์‹ผ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋ฉด์œผ๋กœ ์ง€๊ตฌ๋ฅผ ๋‚˜๋ˆˆ๋‹ค. ๊ฐ ๋ฉด์€ ํ‰๋ฉด์ด๊ธฐ์— ๊ตฌ๋ฉด์„ ํˆฌ์˜ํ•˜๊ฒŒ ๋˜๋ฉด ์™œ๊ณก์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— S2๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ณด์ • ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์…€ ํฌ๊ธฐ ํŽธ์ฐจ๊ฐ€ ์ตœ๋Œ€ 5.2๋ฐฐ ์ด๋‚ด๋กœ ์œ ์ง€๋˜๋„๋ก ํ•œ๋‹ค.

 

2. ๊ณ„์ธต์  ์…€ ๋ถ„ํ• 

์ •์œก๋ฉด์ฒด๋กœ ๊ฐ์‹ธ์ธ 6๊ฐœ์˜ ๋ฉด์€ ๋‹ค์‹œ 4๊ฐœ์˜ ์‚ฌ๊ฐํ˜• ์…€(Cell)๋กœ ์ชผ๊ฐœ์ง„๋‹ค. ์ด ๊ณผ์ •์€ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณต๋˜๋ฉฐ, MongoDB๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” S2 Geometry๋Š” ์ตœ๋Œ€ 30๋‹จ๊ณ„๊นŒ์ง€ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

30 ๋ ˆ๋ฒจ์— ๋‹ค๋‹ค๋ฅด๋ฉด ์•ฝ 0.48cm^2 ๋งŒํผ ์ž‘์€ ํฌ๊ธฐ์˜ ์…€์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

 

3. ํž๋ฒ ๋ฅดํŠธ ๊ณก์„ 

2์ฐจ์› ํ‰๋ฉด(์ •์œก๋ฉด์ฒด์˜ ๋ฉด) ์œ„์— ์ชผ๊ฐœ์ง„ ์ˆ˜๋งŽ์€ ์…€ ์กฐ๊ฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ˆœ์„œ๋กœ ์ •๋ ฌํ• ๊นŒ? ์—ฌ๊ธฐ์„œ ํž๋ฒ ๋ฅดํŠธ ๊ณก์„ ์ด๋ผ๋Š” ๊ณต๊ฐ„ ์ฑ„์›€ ๊ณก์„ ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

ํž๋ฒ ๋ฅดํŠธ ๊ณก์„ ์€ ๋ ˆ๋ฒจ 30์— ํ•ด๋‹นํ•˜๋Š” ์…€๋“ค์— ๋Œ€ํ•ด์„œ ํž๋ฒ ๋ฅดํŠธ ๊ณก์„ ์„ ๋งŒ๋“ ๋‹ค. ์ƒ์œ„์˜ ๋ ˆ๋ฒจ์˜ ์…€์€ ํ•ด๋‹น ๊ณก์„ ์˜ ๋ฒ”์œ„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๊ณก์„  ๊ฒฝ๋กœ๋Š” ํ”„๋ž™ํƒˆ ๊ตฌ์กฐ๋กœ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๊ฐ ์…€์€ ๊ณ ์œ ํ•œ 64๋น„ํŠธ Cell ID๋ฅผ ๋ถ€์—ฌ๋ฐ›์œผ๋ฉฐ, ์ด ID๋ฅผ ํ†ตํ•ด ์…€์˜ ์œ„์น˜์™€ ๋ ˆ๋ฒจ์„ ๋ชจ๋‘ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์…€ ID๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ 64๋น„ํŠธ ์ •์ˆ˜ ํ•˜๋‚˜๋กœ ํ‘œํ˜„๋œ๋‹ค.

 

[ 3๋น„ํŠธ: ๋ฉด(0-5) ][ ๋‚˜๋จธ์ง€: ์œ„์น˜ ][ 1: ๋ ˆ๋ฒจ ํ‘œ์‹œ ][ 0์œผ๋กœ ํŒจ๋”ฉ ]
  • ์ƒ์œ„ 3๋น„ํŠธ๋Š” ์ •์œก๋ฉด์ฒด์˜ ์–ด๋А ๋ฉด์ธ์ง€ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์ค‘๊ฐ„ ๋น„ํŠธ๋Š” ์•„๋ž˜ ์„ค๋ช…ํ•  ํž๋ฒ ๋ฅดํŠธ ๊ณก์„  ์ƒ์˜ ์œ„์น˜์ด๋‹ค.
  • 1๋น„ํŠธ๋กœ ํ˜„์žฌ ์…€์˜ ๋ ˆ๋ฒจ ๊ฒฝ๊ณ„๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. -> 1์˜ ์œ„์น˜๋กœ ๋ ˆ๋ฒจ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

ํž๋ฒ ๋ฅดํŠธ ๊ณก์„ ์˜ ํ•ต์‹ฌ ํŠน์„ฑ์€ ๊ณต๊ฐ„์ ์œผ๋กœ ๊ฐ€๊นŒ์šด ์…€์ผ์ˆ˜๋ก Cell ID๋„ ๊ฐ€๊น๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋•๋ถ„์— ํŠน์ • ์˜์—ญ์„ ๊ฒ€์ƒ‰ํ•  ๋•Œ ํ•ด๋‹น ์˜์—ญ์„ ์ปค๋ฒ„ํ•˜๋Š” ์…€๋“ค์˜ Cell ID๊ฐ€ B-Tree ์ƒ์—์„œ ์—ฐ์†๋œ ๋ฒ”์œ„์— ๋ชฐ๋ ค์žˆ์–ด, ๋ฒ”์œ„ ํƒ์ƒ‰ ํ•œ ๋ฒˆ์œผ๋กœ ํšจ์œจ์ ์œผ๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, R-Tree๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

๊ทธ๋ž˜์„œ MongoDB์˜ 2dsphere ์ธ๋ฑ์Šค๋Š” ๋„ํ˜•์„ ์…€ ID ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  B-Tree์— ์ €์žฅํ•œ๋‹ค. ํƒ์ƒ‰ ์‹œ์—๋Š” ๊ฒ€์ƒ‰ ์˜์—ญ์˜ ์…€ ID ๋ฒ”์œ„์™€ ๋งค์นญ๋˜๋Š” ๋„ํ๋จผํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค.

 

์š”์•ฝํ•˜๋ฉด, ์ง€๊ตฌ๋ฅผ ์ •์œก๋ฉด์ฒด๋กœ ๊ฐ์‹ธ๊ณ (1๋‹จ๊ณ„), ์ด๋ฅผ ์ž‘์€ ์ •์œก๋ฉด์ฒด๋กœ ๊ณ„์† ์ชผ๊ฐœ์–ด(2๋‹จ๊ณ„), ๊ผฌ๋ถˆ๊ผฌ๋ถˆํ•œ ์„ ์œผ๋กœ ์ˆœ์„œ๋ฅผ ๋งค๊ฒจ(3๋‹จ๊ณ„) ๊ฐ ์œ„์น˜์— ๋ฒˆํ˜ธํ‘œ(Cell ID)๋ฅผ ๋ถ™์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์ •๋ฆฌํ•˜๋ฉด

MySQL์˜ R-Tree๋Š” MBR์ด๋ผ๋Š” ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋„ํ˜•์„ ๊ทผ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ธ๋ฑ์Šค ํƒ์ƒ‰ ํ›„ ์‹ค์ œ ๋„ํ˜•์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” 2์ฐจ ํ•„ํ„ฐ๋ง์ด ํ•„์š”ํ•˜๋‹ค. ๋ฐ˜๋ฉด MongoDB์˜ S2 Geometry๋Š” ์—ฌ๋Ÿฌ ์…€์˜ ์กฐํ•ฉ์œผ๋กœ ๋„ํ˜•์„ ๋ณด๋‹ค ์ •๋ฐ€ํ•˜๊ฒŒ ๊ทผ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค„๊ณ , Cell ID ๊ธฐ๋ฐ˜ B-Tree ๋ฒ”์œ„ ํƒ์ƒ‰์œผ๋กœ ํšจ์œจ์ ์ธ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋Ÿฐ์„ธ๊ถŒ ํ”„๋กœ์ ํŠธ์—์„œ MySQL์˜ ๊ณต๊ฐ„ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ฒช์€ ํ›„ MongoDB๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ๋Š”๋ฐ, ์ด ๊ธ€์„ ์ •๋ฆฌํ•˜๋ฉฐ ๊ทธ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋‹จ์ˆœํ•œ DB ์„ ํƒ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค์˜ ๋„ํ˜• ๊ทผ์‚ฌ ๋ฐฉ์‹ ์ฐจ์ด์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ž„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.