From 535807ad34fe02c16407f43c73c64c754d2d6c06 Mon Sep 17 00:00:00 2001 From: MinUk Date: Thu, 1 Aug 2024 23:06:01 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Refactor=20:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hongik/graduationproject/enums/MainCategory.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/com/hongik/graduationproject/enums/MainCategory.java b/src/main/java/com/hongik/graduationproject/enums/MainCategory.java index 28290fb..fbaeac1 100644 --- a/src/main/java/com/hongik/graduationproject/enums/MainCategory.java +++ b/src/main/java/com/hongik/graduationproject/enums/MainCategory.java @@ -28,12 +28,5 @@ public static MainCategory find(String name) { } } return OTHER; -// if (name == null) { -// return MainCategory.OTHER; -// } -// return Arrays.stream(values()) -// .filter(accountStatus -> accountStatus.name.equals(name)) -// .findAny() -// .orElseThrow(RuntimeException::new); } } From b86b579a07f13cdaf72382ca858077314c0d942a Mon Sep 17 00:00:00 2001 From: MinUk Date: Fri, 2 Aug 2024 00:34:55 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Feat=20:=20=EC=98=81=EC=83=81=20=EC=86=8D?= =?UTF-8?q?=20=EC=9E=A5=EC=86=8C=EC=9D=98=20=EC=A3=BC=EC=86=8C=EB=A5=BC=20?= =?UTF-8?q?=EC=95=8C=20=EC=88=98=20=EC=9E=88=EC=9D=84=20=EB=95=8C,=20?= =?UTF-8?q?=EC=9C=84=EA=B2=BD=EB=8F=84=EB=A5=BC=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/RestClientConfig.java | 13 +++ .../domain/dto/geocode/Address.java | 19 ++++ .../dto/geocode/NaverGeocodeResponse.java | 19 ++++ .../domain/dto/video/Coordinate.java | 11 +++ .../domain/dto/video/VideoSummaryDto.java | 95 ++++++++++--------- .../domain/entity/VideoSummary.java | 10 ++ .../service/GeocodeService.java | 43 +++++++++ .../service/MessageService.java | 11 ++- .../service/VideoSummaryService.java | 1 - src/main/resources/application.yml | 6 ++ 10 files changed, 181 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/hongik/graduationproject/config/RestClientConfig.java create mode 100644 src/main/java/com/hongik/graduationproject/domain/dto/geocode/Address.java create mode 100644 src/main/java/com/hongik/graduationproject/domain/dto/geocode/NaverGeocodeResponse.java create mode 100644 src/main/java/com/hongik/graduationproject/domain/dto/video/Coordinate.java create mode 100644 src/main/java/com/hongik/graduationproject/service/GeocodeService.java diff --git a/src/main/java/com/hongik/graduationproject/config/RestClientConfig.java b/src/main/java/com/hongik/graduationproject/config/RestClientConfig.java new file mode 100644 index 0000000..6865fdf --- /dev/null +++ b/src/main/java/com/hongik/graduationproject/config/RestClientConfig.java @@ -0,0 +1,13 @@ +package com.hongik.graduationproject.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestClient; + +@Configuration +public class RestClientConfig { + @Bean + public RestClient restClient(RestClient.Builder builder) { + return builder.build(); + } +} diff --git a/src/main/java/com/hongik/graduationproject/domain/dto/geocode/Address.java b/src/main/java/com/hongik/graduationproject/domain/dto/geocode/Address.java new file mode 100644 index 0000000..2d4b6a3 --- /dev/null +++ b/src/main/java/com/hongik/graduationproject/domain/dto/geocode/Address.java @@ -0,0 +1,19 @@ +package com.hongik.graduationproject.domain.dto.geocode; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@JsonIgnoreProperties(ignoreUnknown = true) +@AllArgsConstructor +@NoArgsConstructor +public class Address { + @JsonProperty("x") + String x; + @JsonProperty("y") + String y; +} diff --git a/src/main/java/com/hongik/graduationproject/domain/dto/geocode/NaverGeocodeResponse.java b/src/main/java/com/hongik/graduationproject/domain/dto/geocode/NaverGeocodeResponse.java new file mode 100644 index 0000000..5c7d354 --- /dev/null +++ b/src/main/java/com/hongik/graduationproject/domain/dto/geocode/NaverGeocodeResponse.java @@ -0,0 +1,19 @@ +package com.hongik.graduationproject.domain.dto.geocode; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@JsonIgnoreProperties(ignoreUnknown = true) +@AllArgsConstructor +@NoArgsConstructor +public class NaverGeocodeResponse { + @JsonProperty("addresses") + private List
addresses; +} diff --git a/src/main/java/com/hongik/graduationproject/domain/dto/video/Coordinate.java b/src/main/java/com/hongik/graduationproject/domain/dto/video/Coordinate.java new file mode 100644 index 0000000..f685865 --- /dev/null +++ b/src/main/java/com/hongik/graduationproject/domain/dto/video/Coordinate.java @@ -0,0 +1,11 @@ +package com.hongik.graduationproject.domain.dto.video; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class Coordinate { + private Double latitude; + private Double longitude; +} diff --git a/src/main/java/com/hongik/graduationproject/domain/dto/video/VideoSummaryDto.java b/src/main/java/com/hongik/graduationproject/domain/dto/video/VideoSummaryDto.java index f59958e..0267cee 100644 --- a/src/main/java/com/hongik/graduationproject/domain/dto/video/VideoSummaryDto.java +++ b/src/main/java/com/hongik/graduationproject/domain/dto/video/VideoSummaryDto.java @@ -4,6 +4,7 @@ import com.hongik.graduationproject.domain.entity.VideoSummary; import com.hongik.graduationproject.domain.entity.VideoSummaryCategory; import com.hongik.graduationproject.enums.Platform; + import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -18,51 +19,55 @@ @NoArgsConstructor @Builder public class VideoSummaryDto { - @JsonProperty("video_code") - String videoCode; - String title; - String description; - List keywords; - String url; - String summary; - String address; - LocalDateTime createdAt; - Platform platform; - String mainCategory; - int mainCategoryIndex; - String subCategory; - Long subCategoryId; + @JsonProperty("video_code") + String videoCode; + String title; + String description; + List keywords; + String url; + String summary; + String address; + LocalDateTime createdAt; + Platform platform; + String mainCategory; + int mainCategoryIndex; + String subCategory; + Long subCategoryId; + Double latitude; + Double longitude; - public static VideoSummaryDto from(VideoSummary videoSummary) { - return VideoSummaryDto.builder() - .videoCode(videoSummary.getVideoCode()) - .title(videoSummary.getTitle()) - .description(videoSummary.getDescription()) - .keywords(Arrays.stream(videoSummary.getKeywords().split(",")).toList()) - .url(videoSummary.getUrl()) - .summary(videoSummary.getSummary()) - .address(videoSummary.getAddress()) - .createdAt(videoSummary.getCreatedAt().minusHours(9)) - .platform(videoSummary.getPlatform()) - .mainCategory(videoSummary.getGeneratedMainCategory().getName()) - .build(); - } + public static VideoSummaryDto from(VideoSummary videoSummary) { + return VideoSummaryDto.builder() + .videoCode(videoSummary.getVideoCode()) + .title(videoSummary.getTitle()) + .description(videoSummary.getDescription()) + .keywords(Arrays.stream(videoSummary.getKeywords().split(",")).toList()) + .url(videoSummary.getUrl()) + .summary(videoSummary.getSummary()) + .address(videoSummary.getAddress()) + .createdAt(videoSummary.getCreatedAt().minusHours(9)) + .platform(videoSummary.getPlatform()) + .mainCategory(videoSummary.getGeneratedMainCategory().getName()) + .build(); + } - public static VideoSummaryDto from(VideoSummaryCategory videoSummaryCategory) { - return VideoSummaryDto.builder() - .videoCode(videoSummaryCategory.getVideoSummary().getVideoCode()) - .title(videoSummaryCategory.getVideoSummary().getTitle()) - .description(videoSummaryCategory.getVideoSummary().getDescription()) - .keywords(Arrays.stream(videoSummaryCategory.getVideoSummary().getKeywords().split(",")).toList()) - .url(videoSummaryCategory.getVideoSummary().getUrl()) - .summary(videoSummaryCategory.getVideoSummary().getSummary()) - .address(videoSummaryCategory.getVideoSummary().getAddress()) - .createdAt(videoSummaryCategory.getVideoSummary().getCreatedAt().minusHours(9)) - .platform(videoSummaryCategory.getVideoSummary().getPlatform()) - .mainCategory(videoSummaryCategory.getVideoSummary().getGeneratedMainCategory().getName()) - .mainCategoryIndex(videoSummaryCategory.getVideoSummary().getGeneratedMainCategory().getIndex()) - .subCategory(videoSummaryCategory.getCategory().getSubCategory()) - .subCategoryId(videoSummaryCategory.getCategory().getId()) - .build(); - } + public static VideoSummaryDto from(VideoSummaryCategory videoSummaryCategory) { + return VideoSummaryDto.builder() + .videoCode(videoSummaryCategory.getVideoSummary().getVideoCode()) + .title(videoSummaryCategory.getVideoSummary().getTitle()) + .description(videoSummaryCategory.getVideoSummary().getDescription()) + .keywords(Arrays.stream(videoSummaryCategory.getVideoSummary().getKeywords().split(",")).toList()) + .url(videoSummaryCategory.getVideoSummary().getUrl()) + .summary(videoSummaryCategory.getVideoSummary().getSummary()) + .address(videoSummaryCategory.getVideoSummary().getAddress()) + .createdAt(videoSummaryCategory.getVideoSummary().getCreatedAt().minusHours(9)) + .platform(videoSummaryCategory.getVideoSummary().getPlatform()) + .mainCategory(videoSummaryCategory.getVideoSummary().getGeneratedMainCategory().getName()) + .mainCategoryIndex(videoSummaryCategory.getVideoSummary().getGeneratedMainCategory().getIndex()) + .subCategory(videoSummaryCategory.getCategory().getSubCategory()) + .subCategoryId(videoSummaryCategory.getCategory().getId()) + .latitude(videoSummaryCategory.getVideoSummary().getLatitude()) + .longitude(videoSummaryCategory.getVideoSummary().getLongitude()) + .build(); + } } diff --git a/src/main/java/com/hongik/graduationproject/domain/entity/VideoSummary.java b/src/main/java/com/hongik/graduationproject/domain/entity/VideoSummary.java index 4f8cc33..5d09ddd 100644 --- a/src/main/java/com/hongik/graduationproject/domain/entity/VideoSummary.java +++ b/src/main/java/com/hongik/graduationproject/domain/entity/VideoSummary.java @@ -38,6 +38,8 @@ public class VideoSummary extends BaseTimeEntity { private boolean isDeleted = false; @Column(name = "deleted_at") private LocalDateTime deletedAt; + private Double latitude; + private Double longitude; public static VideoSummary of(VideoSummaryMessage videoSummaryMessage) { return VideoSummary @@ -75,4 +77,12 @@ public void restore() { this.isDeleted = false; this.deletedAt = null; } + + public void updateLatitude(Double latitude) { + this.latitude = latitude; + } + + public void updateLongitude(Double longitude) { + this.longitude = longitude; + } } diff --git a/src/main/java/com/hongik/graduationproject/service/GeocodeService.java b/src/main/java/com/hongik/graduationproject/service/GeocodeService.java new file mode 100644 index 0000000..a4a5330 --- /dev/null +++ b/src/main/java/com/hongik/graduationproject/service/GeocodeService.java @@ -0,0 +1,43 @@ +package com.hongik.graduationproject.service; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; + +import com.hongik.graduationproject.domain.dto.geocode.NaverGeocodeResponse; +import com.hongik.graduationproject.domain.dto.video.Coordinate; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Service +public class GeocodeService { + private final RestClient restClient; + + @Value("${naver.geocode.url}") + private String naverGeocodeUrl; + @Value("${naver.geocode.id}") + private String naverGeocodeId; + @Value("${naver.geocode.secret}") + private String naverGeocodeSecret; + + public Coordinate getCoordinateByAddress(String address) { + NaverGeocodeResponse result = restClient.get() + .uri(naverGeocodeUrl + "?query=" + address) + .header("X-NCP-APIGW-API-KEY-ID", naverGeocodeId) + .header("X-NCP-APIGW-API-KEY", naverGeocodeSecret) + .retrieve() + .body(NaverGeocodeResponse.class); + + System.out.println("result = " + result); + + if (result.getAddresses() == null || result.getAddresses().isEmpty()) { + return null; + } + + return new Coordinate( + Double.valueOf(result.getAddresses().get(0).getY()), + Double.valueOf(result.getAddresses().get(0).getX()) + ); + } +} diff --git a/src/main/java/com/hongik/graduationproject/service/MessageService.java b/src/main/java/com/hongik/graduationproject/service/MessageService.java index 38663d0..5d477bf 100644 --- a/src/main/java/com/hongik/graduationproject/service/MessageService.java +++ b/src/main/java/com/hongik/graduationproject/service/MessageService.java @@ -1,8 +1,8 @@ package com.hongik.graduationproject.service; +import com.hongik.graduationproject.domain.dto.video.Coordinate; import com.hongik.graduationproject.domain.dto.video.VideoSummaryInitiateMessage; import com.hongik.graduationproject.domain.dto.video.VideoSummaryMessage; -import com.hongik.graduationproject.domain.entity.Category; import com.hongik.graduationproject.domain.entity.VideoSummary; import com.hongik.graduationproject.domain.entity.cache.VideoSummaryStatusCache; import com.hongik.graduationproject.enums.MainCategory; @@ -29,6 +29,7 @@ public class MessageService { private final RabbitTemplate rabbitTemplate; private final VideoSummaryStatusCacheRepository videoSummaryStatusCacheRepository; private final VideoSummaryRepository videoSummaryRepository; + private final GeocodeService geocodeService; public void sendVideoUrlToQueue(VideoSummaryInitiateMessage videoSummaryInitiateMessage) { log.info("Sent url: {}, videoCode: {}", videoSummaryInitiateMessage.getUrl(), videoSummaryInitiateMessage.getVideoCode()); @@ -42,6 +43,14 @@ public void receiveVideoUrlFromQueue(VideoSummaryMessage videoSummaryMessage) { VideoSummary savedVideoSummary = videoSummaryRepository.save(VideoSummary.of(videoSummaryMessage)); + Coordinate coordinate = null; + if (savedVideoSummary.getAddress() != null && !savedVideoSummary.getAddress().isEmpty()) { + coordinate = geocodeService.getCoordinateByAddress(savedVideoSummary.getAddress()); + System.out.println("savedVideoSummary = " + savedVideoSummary.getAddress()); + } + savedVideoSummary.updateLatitude(coordinate.getLatitude()); + savedVideoSummary.updateLongitude(coordinate.getLongitude()); + updateStatusCache(videoSummaryMessage, savedVideoSummary); } diff --git a/src/main/java/com/hongik/graduationproject/service/VideoSummaryService.java b/src/main/java/com/hongik/graduationproject/service/VideoSummaryService.java index eeb9a8f..aa95694 100644 --- a/src/main/java/com/hongik/graduationproject/service/VideoSummaryService.java +++ b/src/main/java/com/hongik/graduationproject/service/VideoSummaryService.java @@ -65,7 +65,6 @@ private boolean checkDuplicateSummarizing(String videoCode, Long userId) { summaryStatusCacheRepository.existsByVideoCodeAndUserId(videoCode, userId); } - // 무조건 중복허용이 안되는 로직 public VideoSummaryDto getSummaryByVideoSummaryId(Long videoSummaryId, Long userId) { VideoSummary videoSummary = videoSummaryRepository.getReferenceById(videoSummaryId); User user = userRepository.getReferenceById(userId); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b2bbd62..3ec57d0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -46,3 +46,9 @@ rabbitmq: url.routing.key: url.key summary.queue.name: summary.queue summary.routing.key: summary.key + +naver: + geocode: + url: https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode + id: ${X-NCP-APIGW-API-KEY-ID} + secret: ${X-NCP-APIGW-API-KEY} \ No newline at end of file