2025. 2. 16. 19:10ใTrouble Shootings/Web
์ํฉ ์ค๋ช
๐ ๏ธํ๊ฒฝ
- SpringBoot 3.4.2
- MySQL 8.0.41
- MyBatis 3.0.4
- Liberica JDK 17 LTS
๋ชจ๋ฐ์ผ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ์ค, ์ขํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ผ์ด ์๊ฒผ์ต๋๋ค. ์ง๋์์ ์ํ๋ ์์น์ ์ฌ๊ฐํ์ ๊ทธ๋ฆฌ๊ณ , ์ฌ์ฉ์๊ฐ ํฐ์ ๋ค๊ณ ํด๋น ์์ญ์ ๋ค์ด๊ฐ๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ์๋๋ก ๋ง๋ค๊ธฐ ์ํจ์ด์์ฃ . (+์ง๋์์ ์๊ฐ์ ์ผ๋ก ํ์)

์ ๋ RDBMS ๊ธฐ์ ์คํ์ผ๋ก MySQL
์ ์ ํํ ์ํฉ์ด์๊ณ , MySQL
์๋ ์ด๋ฌํ ๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ ํ์
(ex. Point, Polygon)์ ์ง์ํ๋ ๊ฑธ๋ก ์๊ณ ์์์ต๋๋ค.
์๊ตฌ์ฌํญ์ ๊ณต๊ฐ์ ๋ํ ๋ณต์กํ ์ฐ์ฐ์ด ํ์ ์์ด์ ๊ทธ๋ฅ ํ
์ด๋ธ ์ปฌ๋ผ์ผ๋ก ๊ฐ๊ฐ ์๋ ๊ฒฝ๋ ์ขํ๋ฅผ ์ ์ฅํ ๊น๋ ์๊ฐํ์ง๋ง, ์ค์์ ์ขํ๊น์ง ์ด 10๊ฐ์ ์ปฌ๋ผ์ด ํ์ํด์ ๊ทธ๋ฅ Polygon
ํ์
์ผ๋ก ์ ์ฅํ๋ ๊ฒ ๋ ๊ด๋ฆฌํ๊ธฐ ์ข๊ฒ ๋ค๋ ํ๋จ์ ํ์์ต๋๋ค.


โํ์ง๋ง ์๋ฐ์๋ ์ด์ ๋์๋๋ ๋ฐ์ดํฐ ํ์ ์ด ์๋ค
Point
์ Polygon
ํ์
๋ฐ์ดํฐ๋ MySQL์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅํ์ต๋๋ค.
-- (๊ฒฝ๋, ์๋)
POINT(126.976997, 37.578562),
-- (๊ฒฝ๋ ์๋),(๊ฒฝ๋ ์๋), ...
-- ์๊ณ๋ฐฉํฅ ๋๋ ๋ฐ์๊ณ ๋ฐฉํฅ ์์ผ๋ก ์ขํ๋ฅผ ๋ฃ์ด์ผ ํจ (์ฌ๊ธฐ์ ์๊ณ๋ฐฉํฅ์ผ๋ก ๋ฃ์)
-- ๋ง์ง๋ง ์ขํ๋ ์ฒซ ์ขํ์ ๋์ผํ๊ฒ(๊ทธ๋์ผ ๋ซํ ๋ค๊ฐํ์ด ๋๋ฏ๋ก)
ST_GeomFromText('POLYGON((126.976712 37.578773,
126.977304 37.578748,
126.977276 37.578246,
126.976673 37.578266,
126.976712 37.578773))')
ํ์ง๋ง ๋ฌธ์ ๊ฐ ์๋ ๊ฒ, ์ ๋ ์ ์ฅํ ๋ฐ์ดํฐ ๊ฐ๋ค๋ง ์ ๊ฐ์ ธ์์ DTO์ ๋ด์ ํ๋ก ํธ๋ก ๋ณด๋ด์ฃผ๊ธธ ์ํ๋๋ฐ, ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋ ๊ฒ ๊ฐ๋๋ผ๊ตฌ์. ๊ทธ๋์ Point, Polygon ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ์ฝ์ด์์ ํ์ฑ(parsing)ํ๋ ํจ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
โ "Point, Polygon" โ "Double" Parser ๋ง๋ค๊ธฐ
SpringBoot
์์๋ Point, Polygon ๊ฐ์ ์ฐ์ ๋ฌธ์์ด(String)๋ก ์ฝ์ด์์ผ ํฉ๋๋ค.
ST_AsText(mp.center_point) as center_point,
ST_AsText(mp.edge_points) as edge_points,

๊ทธ๋ฆฌ๊ณ ํด๋น ๋ฌธ์์ด์์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ขํ ๊ฐ๋ค๋ง ์์ ๋นผ๋ด์ผ ํฉ๋๋ค. Point
๋ฐ์ดํฐ ํ์
์ ๊ฒฝ์ฐ, "POINT(๊ฒฝ๋ ์๋)"
ํ์์ผ๋ก ๋ฌธ์์ด์ด ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ด์ ๋ง์ถฐ์ ๊ฒฝ๋์ ์๋ ์ขํ ๊ฐ์ ๋นผ๋
๋๋ค.
// ์ค์์ ("POINT(๊ฒฝ๋ ์๋)") parsing
private Double[] paresPoint(String pointStr) {
if (pointStr == null) return null;
// 1. ๋ถํ์ํ ๋ฌธ์๋ค์ ์ ๋ถ ์์ ์ฃผ๊ณ ,
String coords = pointStr.replace("POINT(", "").replace(")", "");
// 2. ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ค์ ์ถ์ถ
String[] coordinates = coords.split(" ");
return new Double[] {Double.parseDouble(coordinates[1]),
Double.parseDouble(coordinates[0])};
}
Polygon
ํ์
๋ ์ด์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ํ๋ฉด ๋ฉ๋๋ค.
// ๊ฐ์ฅ์๋ฆฌ ์ ๋ค parsing
private List<Double[]> parsePolygon(String polygonStr) {
if (polygonStr == null) return null;
// "POLYGON((๊ฒฝ๋1 ์๋1,๊ฒฝ๋2 ์๋2,...))" ํ์ ํ์ฑ
String coords = polygonStr.replace("POLYGON((", "").replace("))", "");
List<Double[]> points = Arrays.stream(coords.split(",")).map(String::trim)
.map(pointStr -> { String[] coordinates = pointStr.split(" ");
return new Double[] {Double.parseDouble(coordinates[1]), Double.parseDouble(coordinates[0])};
}).collect(Collectors.toList());
// ๋ง์ง๋ง ์ขํ๋ ๋งจ ์ฒ์๊ณผ ๊ฐ์์ ์ ์ธ
if (!points.isEmpty()) {
points.remove(points.size() - 1);
}
return points;
}
'Trouble Shootings > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot] @RestControllerAdvice์ Swagger ์ถฉ๋ (0) | 2025.02.10 |
---|---|
[MySQL] Error: Data too long for column "์ปฌ๋ผ๋ช " (0) | 2025.02.08 |
[MyBatis] parameterType์ ์ค์ฒฉ ํด๋์ค ํ์ ์ ๋ฃ์ ๊ฒฝ์ฐ (1) | 2025.02.08 |