๐ค ๋ฌธ์ ์์
๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ ์ขํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ์์๋ค.
ํ์์ ๊ฒฝ์ฐ ๋๋ค์์ ์ํฉ์ ํ๋ก ํธ๊ฐ ์ง๋๋ฅผ ์ฐ๋ํ๋ ๊ณผ์ ์์ ๋๋ถ๋ถ 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 |