DB/MySQL

Spatial Query Index ์ตœ์ ํ™”(๊ณต๊ฐ„ ์ฟผ๋ฆฌ ์ตœ์ ํ™”)

27200 2025. 8. 31. 20:58

๐Ÿค” ๋ฌธ์ œ์˜์‹

๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋‹ˆ ์ขŒํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฝค ์žˆ์—ˆ๋‹ค.

ํ•„์ž์˜ ๊ฒฝ์šฐ ๋Œ€๋‹ค์ˆ˜์˜ ์ƒํ™ฉ์„ ํ”„๋ก ํŠธ๊ฐ€ ์ง€๋„๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๊ณผ์ • ์†์— ๋Œ€๋ถ€๋ถ„ String์œผ๋กœ ์ขŒํ‘œ๊ฐ’๋งŒ ์ €์žฅ ํ›„ ์ „๋‹ฌํ•ด ์ฃผ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ์ž ์œ„์น˜ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€๊ฒŒ๋ฅผ ๊ฑฐ๋ฆฌ๋ณ„๋กœ ํŽ˜์ด์ง• ํ•ด์ฃผ์–ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๊ณ , ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•˜์˜€๋‹ค.

String์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋‹ˆ ์ธ๋ฑ์‹ฑ์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ผ์ •ํ•œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ ์ž ํ•˜๋‹ˆ ํ’€ ํ…Œ์ด๋ธ” ์Šค์บ”์ด ํ•„์—ฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

→ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์ƒ ์œ„๋„ ๊ฒฝ๋„๋ฅผ ์ผ์ • ๋ฒ”์œ„๋กœ ์ œํ•œํ•œ ๋’ค์— ๋‹ค์‹œ ์›ํ˜•์œผ๋กœ ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ–ˆ์ง€๋งŒ ๋” ์ข‹์€ ์ •๋ณด๊ฐ€ ์—†๋‚˜ ์ฐพ์•„๋ณด์•˜๊ณ  Spatial Query๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.


๐Ÿ’กSpatial Query๋ž€?

  • ์ •์˜
    • Spatial Query(๊ณต๊ฐ„ ์ฟผ๋ฆฌ)๋Š” ๋‹จ์ˆœํžˆ ์†์„ฑ(attribute) ๊ฐ’๋งŒ์„ ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์œ„์น˜, ๊ฑฐ๋ฆฌ, ๋ฉด์ , ์ธ์ ‘ ๊ด€๊ณ„ ๋“ฑ ์ง€๋ฆฌ์  ์กฐ๊ฑด์„ ํฌํ•จํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ์˜ˆ์‹œ
    • ์ผ๋ฐ˜ ์ฟผ๋ฆฌ: “๊ฐ€๊ฒฉ์ด 5๋งŒ ์› ์ดํ•˜์ธ ๊ฐ€๊ฒŒ ์ฐพ๊ธฐ”
    • ๊ณต๊ฐ„ ์ฟผ๋ฆฌ: “์‚ฌ์šฉ์ž ์œ„์น˜์—์„œ 1km ์ด๋‚ด์— ์žˆ๊ณ , ๊ฐ€๊ฒฉ์ด 5๋งŒ ์› ์ดํ•˜์ธ ๊ฐ€๊ฒŒ ์ฐพ๊ธฐ”
  • ํ•„์š”์„ฑ
    • ๋ฌธ์ž์—ด ์ขŒํ‘œ๋กœ๋Š” ๋‹จ์ˆœ ์ €์žฅ/์กฐํšŒ๋งŒ ๊ฐ€๋Šฅ → ๊ฑฐ๋ฆฌ ์—ฐ์‚ฐ, ์ธ์ ‘์„ฑ ํŒ๋‹จ ๋ถˆ๊ฐ€
    • Spatial Query๋Š” GIS(Geographic Information System) ๊ธฐ๋Šฅ์„ DB ๋ ˆ๋ฒจ์—์„œ ์ง€์› → ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ, ํฌํ•จ ์—ฌ๋ถ€, ๊ฒน์นจ ์—ฌ๋ถ€ ๋“ฑ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • DB ์ง€์› ๊ธฐ๋Šฅ (๊ฐ„๋žตํ•˜๊ฒŒ)
    • MySQL: ST_Distance, ST_Contains, MBRContains ๋“ฑ
    • PostgreSQL(PostGIS): ST_DWithin, ST_Intersects ๋“ฑ
    • ์ด๋Ÿฐ ํ•จ์ˆ˜๋“ค์ด Spatial Index์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์—์„œ๋„ ๋น ๋ฅธ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ

๐Ÿ‘€ SRID

  • SRID (Spatial Reference System Identifier)๋Š” ์ขŒํ‘œ๊ณ„(Spatial Reference System, SRS)๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋‹ค.
    • ๊ฐ„๋‹จํžˆ ๋งํ•ด, ์ด ์ขŒํ‘œ๊ฐ’์ด ์–ด๋А ๊ธฐ์ค€ ์ขŒํ‘œ๊ณ„์—์„œ ๋‚˜์˜จ ๊ฐ’์ธ์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ID๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ™์€ (127.0, 37.5)์ด๋ผ๋Š” ์ขŒํ‘œ๋ผ๋„,
    • ์–ด๋–ค ์‹œ์Šคํ…œ์€ ์œ„๋„/๊ฒฝ๋„ (๋„ ๋‹จ์œ„, WGS84)๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๊ณ ,
    • ์–ด๋–ค ์‹œ์Šคํ…œ์€ ๋ฏธํ„ฐ ๋‹จ์œ„ ํ‰๋ฉด ์ขŒํ‘œ(UTM)๋กœ ํ•ด์„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋™์ผํ•œ SRID๋ฅผ ๊ฐ€์ง„ ๊ณต๊ฐ„์— ๋Œ€ํ•ด์„œ๋งŒ ์งˆ์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋Œ€ํ‘œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” 4326์˜ ๊ฒฝ์šฐ ๊ตฌ๊ธ€ ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,
    • 0์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌดํ•œํ•œ 2์ฐจ์› ์ขŒํ‘œํ‰๋ฉด๊ณ„๋ฅผ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.

๐Ÿ˜€ ์‚ฌ์šฉ๋ฒ•

JPA ์—”ํ‹ฐํ‹ฐ ๋“ฑ๋ก

@Column(columnDefinition = "POINT SRID 4326")๋ฅผ ํ†ตํ•ด ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ nullable = false ์˜ต์…˜์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๊ณ , SRID๋ฅผ ์„ค์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด 0์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.

DB(Mysql) ๋“ฑ๋ก

CREATE TABLE store (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    -- ์ขŒํ‘œ๋ฅผ POINT ํƒ€์ž…์œผ๋กœ ์ €์žฅ (SRID 4326 : ์œ„๋„/๊ฒฝ๋„)
    location POINT NOT NULL SRID 4326,
    SPATIAL INDEX (location) -- ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ์ƒ์„ฑ
);

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๋“ฑ๋ก ๋ฐ ์ธ๋ฑ์‹ฑ ๋˜ํ•œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ

์ƒํ™ฉ์— ๋”ฐ๋ผ ์œ„๋„์™€ ๊ฒฝ๋„๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์œ„๋„/๊ฒฝ๋„ ์ˆœ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. DB ํ˜น์€ ๋ฉ”์„œ๋“œ์— ๋”ฐ๋ผ ๊ธฐ์ค€์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ผญ ์ฐพ์•„๋ณด๊ณ  ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

'DB > MySQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[MySQL] DATE ์ž๋ฃŒํ˜• ์ •๋ฆฌ  (3) 2024.11.20
[MySQL] ๋‚ ์งœ, ์‹œ๊ฐ„ ํ‘œ๊ธฐ ๋ฐฉ์‹ DATE_FORMAT()  (1) 2024.11.19