diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java b/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java index c9e1fa2..a527b23 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java @@ -1,8 +1,10 @@ package com.seoultech.sanEseo.post.application.service; +import com.fasterxml.jackson.annotation.JsonProperty; import com.seoultech.sanEseo.post.domain.Category; import com.seoultech.sanEseo.image.PostImage; -import com.seoultech.sanEseo.public_api.GetCoordinateResponse; +import com.seoultech.sanEseo.public_api.CoordinateRequest; + import com.seoultech.sanEseo.public_api.GetGeometryResponse; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -43,11 +45,22 @@ public class AddPostRequest { private Long districtId; @NotNull(message = "좌표 정보는 필수입니다.") - private GetGeometryResponse geometry; + private CoordinateRequest geometry; // 생성자, 게터, 세터 등 추가 필요 - public AddPostRequest(Category category, String title, String subTitle, String description, String level, String time, String distance, String courseDetail, String transportation, Long districtId, GetGeometryResponse geometry) { + // 생성자에 @JsonProperty 어노테이션 추가 + public AddPostRequest(@JsonProperty("category") Category category, + @JsonProperty("title") String title, + @JsonProperty("subTitle") String subTitle, + @JsonProperty("description") String description, + @JsonProperty("level") String level, + @JsonProperty("time") String time, + @JsonProperty("distance") String distance, + @JsonProperty("courseDetail") String courseDetail, + @JsonProperty("transportation") String transportation, + @JsonProperty("districtId") Long districtId, + @JsonProperty("geometry") CoordinateRequest geometry) { this.category = category; this.title = title; this.subTitle = subTitle; @@ -60,4 +73,8 @@ public AddPostRequest(Category category, String title, String subTitle, String d this.districtId = districtId; this.geometry = geometry; } + + + + } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java b/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java index 9ac640e..033a76c 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java @@ -6,10 +6,7 @@ import com.seoultech.sanEseo.post.domain.Post; import com.seoultech.sanEseo.post_district.domain.PostDistrict; import com.seoultech.sanEseo.post_district.application.port.PostDistrictPort; -import com.seoultech.sanEseo.public_api.Coordinate; -import com.seoultech.sanEseo.public_api.CoordinateService; -import com.seoultech.sanEseo.public_api.GetCoordinateResponse; -import com.seoultech.sanEseo.public_api.GetGeometryResponse; +import com.seoultech.sanEseo.public_api.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -46,7 +43,7 @@ public Post addPost(AddPostRequest request) { request.getLevel(), request.getTime(), request.getDistance(), request.getCourseDetail(), request.getTransportation()); - GetGeometryResponse geometry = request.getGeometry(); + CoordinateRequest geometry = request.getGeometry(); coordinateService.saveCoordinate(geometry, post); postPort.save(post); // Post 저장 @@ -82,7 +79,7 @@ public void updatePost(Long postId, UpdatePostRequest request) { // 좌표 정보 업데이트 Coordinate coordinate = coordinateService.findCoordinate(post); - coordinate.update(request.getGeometry().getName(), request.getGeometry().getType(), request.getGeometry()); + coordinate.update(request.getGeometry().getName(), request.getGeometry().getType(), request.getGeometry().getCoordinates()); // 게시글 정보 업데이트 post.update( diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java b/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java index 3dad015..4faa019 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java @@ -2,7 +2,7 @@ import com.seoultech.sanEseo.post.domain.Category; import com.seoultech.sanEseo.image.PostImage; -import com.seoultech.sanEseo.public_api.GetGeometryResponse; +import com.seoultech.sanEseo.public_api.CoordinateRequest; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -44,9 +44,9 @@ public class UpdatePostRequest { private Long districtId; @NotNull(message = "좌표 정보는 필수입니다.") - private GetGeometryResponse geometry; + private CoordinateRequest geometry; - public UpdatePostRequest(Category category, String title, String subTitle, String description, String level, String time, String distance, String courseDetail, String transportation, List images, Long districtId, GetGeometryResponse geometry) { + public UpdatePostRequest(Category category, String title, String subTitle, String description, String level, String time, String distance, String courseDetail, String transportation, List images, Long districtId, CoordinateRequest geometry) { this.category = category; this.title = title; this.subTitle = subTitle; diff --git a/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java b/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java index 6b29cff..c8acd51 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java @@ -22,32 +22,25 @@ public class Coordinate { private String name; private String type; - @ElementCollection - @CollectionTable(name = "coordinate_points", joinColumns = @JoinColumn(name = "coordinate_id")) - private List coordinates; + + @Convert(converter = CoordinatesConverter.class) + @Column(columnDefinition = "TEXT") + private List> coordinates; @OneToOne @JoinColumn(name = "post_id") private Post post; - public Coordinate(String name, String type, List coordinates, Post post) { + public Coordinate(String name, String type, List> coordinates, Post post) { this.name = name; this.type = type; this.coordinates = coordinates; this.post = post; } - public void update(String name, String type, GetGeometryResponse geometry) { + public void update(String name, String type, List> coordinates) { this.name = name; this.type = type; - this.coordinates = convertGeometryToLatLngList(geometry); + this.coordinates = coordinates; } - private List convertGeometryToLatLngList(GetGeometryResponse geometry) { - // geometry의 coordinates를 List로 변환하는 로직 - List newCoordinates = new ArrayList<>(); - for (LatLng coordinatePair : geometry.getCoordinates()) { - newCoordinates.add(new LatLng(coordinatePair.getLat(), coordinatePair.getLng())); - } - return newCoordinates; - } } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinateRequest.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateRequest.java new file mode 100644 index 0000000..a644b5f --- /dev/null +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateRequest.java @@ -0,0 +1,18 @@ +package com.seoultech.sanEseo.public_api; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@AllArgsConstructor +@Getter +public class CoordinateRequest { + + private String name; + private String type; + + private List> coordinates; + +} diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java index 4ae1878..f4054c0 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java @@ -12,7 +12,7 @@ public class CoordinateService { private CoordinateRepository coordinateRepository; @Transactional - public void saveCoordinate(GetGeometryResponse geometryResponse, Post post) { + public void saveCoordinate(CoordinateRequest geometryResponse, Post post) { Coordinate coordinate = new Coordinate( geometryResponse.getName(), geometryResponse.getType(), diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java index 004620e..dfd51b6 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java @@ -9,11 +9,11 @@ import java.util.List; @Converter -public class CoordinatesConverter implements AttributeConverter, String> { +public class CoordinatesConverter implements AttributeConverter>, String> { private final static ObjectMapper objectMapper = new ObjectMapper(); @Override - public String convertToDatabaseColumn(List attribute) { + public String convertToDatabaseColumn(List> attribute) { try { return objectMapper.writeValueAsString(attribute); } catch (IOException e) { @@ -22,9 +22,9 @@ public String convertToDatabaseColumn(List attribute) { } @Override - public List convertToEntityAttribute(String dbData) { + public List> convertToEntityAttribute(String dbData) { try { - return objectMapper.readValue(dbData, new TypeReference>() {}); + return objectMapper.readValue(dbData, new TypeReference>>() {}); } catch (IOException e) { throw new RuntimeException("Conversion error", e); } diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesDeserializer.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesDeserializer.java new file mode 100644 index 0000000..735480b --- /dev/null +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesDeserializer.java @@ -0,0 +1,29 @@ +package com.seoultech.sanEseo.public_api; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class CoordinatesDeserializer extends JsonDeserializer>> { + @Override + public List> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { + List> coordinates = new ArrayList<>(); + while (p.nextToken() != JsonToken.END_ARRAY) { + JsonNode node = p.getCodec().readTree(p); + double lat = node.get("lat").asDouble(); + double lng = node.get("lng").asDouble(); + List coordPair = new ArrayList<>(); + coordPair.add(lat); + coordPair.add(lng); + coordinates.add(coordPair); + } + return coordinates; + } +} \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesSerializer.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesSerializer.java new file mode 100644 index 0000000..b3fe30e --- /dev/null +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesSerializer.java @@ -0,0 +1,21 @@ +package com.seoultech.sanEseo.public_api; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import java.io.IOException; +import java.util.List; + +public class CoordinatesSerializer extends JsonSerializer>> { + @Override + public void serialize(List> value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + gen.writeStartArray(); + for (List coord : value) { + gen.writeStartObject(); + gen.writeNumberField("lat", coord.get(0)); + gen.writeNumberField("lng", coord.get(1)); + gen.writeEndObject(); + } + gen.writeEndArray(); + } +} diff --git a/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java b/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java index e9a435c..7d5aa0b 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java @@ -1,6 +1,7 @@ package com.seoultech.sanEseo.public_api; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.AllArgsConstructor; import lombok.Getter; @@ -11,5 +12,7 @@ public class GetCoordinateResponse { String type; - List coordinates; + + @JsonSerialize(using = CoordinatesSerializer.class) + List> coordinates; } diff --git a/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java b/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java index 2e8e709..b1e19a4 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java @@ -12,5 +12,5 @@ public class GetGeometryResponse { private String type; private String name; - private List coordinates; + private List> coordinates; } diff --git a/src/main/java/com/seoultech/sanEseo/public_api/LatLng.java b/src/main/java/com/seoultech/sanEseo/public_api/LatLng.java deleted file mode 100644 index 917d4d2..0000000 --- a/src/main/java/com/seoultech/sanEseo/public_api/LatLng.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.seoultech.sanEseo.public_api; - -import jakarta.persistence.Embeddable; - -@Embeddable -public class LatLng { - private double lat; - private double lng; - - public LatLng() {} - - public LatLng(double lat, double lng) { - this.lat = lat; - this.lng = lng; - } - - // Getter and Setter - public double getLat() { - return lat; - } - - public void setLat(double lat) { - this.lat = lat; - } - - public double getLng() { - return lng; - } - - public void setLng(double lng) { - this.lng = lng; - } -} \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java b/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java index cfc3700..ff280be 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java @@ -113,14 +113,16 @@ public List parsingCoordinate(int dataIndex) { for (Feature feature : featureCollection.getFeatures()) { MultiLineString multiLineString = (MultiLineString) feature.getGeometry(); String name = feature.getProperty("NAME"); + List> coordinate_list = new ArrayList<>(); for (List coordinates : multiLineString.getCoordinates()) { - List latLngList = new ArrayList<>(); for (LngLatAlt lngLatAlt : coordinates) { + double latitude = lngLatAlt.getLatitude(); double longitude = lngLatAlt.getLongitude(); - latLngList.add(new LatLng(latitude, longitude)); + coordinate_list.add(List.of(latitude, longitude)); + } - responses.add(new GetGeometryResponse("polyline", name, latLngList)); + responses.add(new GetGeometryResponse("polyline", name, coordinate_list)); } } } catch (IOException e) { @@ -166,7 +168,7 @@ public void addPublicData(int dataIndex){ safeSubstring(getCourseResponse.getDescription(), 0, 255), getCourseResponse.getLevel(), getCourseResponse.getTime(), getCourseResponse.getDistance(), safeSubstring(getCourseResponse.getCourseDetail(), 0 ,255), - getCourseResponse.getTransportation(), id, getGeometryResponse)); + getCourseResponse.getTransportation(), id, convertToCoordinateRequest(getGeometryResponse))); } @@ -198,6 +200,11 @@ public boolean isNameSimilar(String name1, String name2) { return score > 0.95; // 유사도 점수가 0.85 이상이면 유사하다고 판단 } + public CoordinateRequest convertToCoordinateRequest(GetGeometryResponse geometry){ + return new CoordinateRequest(geometry.getName(), geometry.getType(), geometry.getCoordinates()); + + } + }