From ca506b5a14077f67185c1729be7a091ad99bbc74 Mon Sep 17 00:00:00 2001 From: syyling Date: Mon, 8 Apr 2024 22:23:22 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/dto/request/CctvRequest.java | 2 +- .../dto/response/CctvResponse.java | 2 +- .../cctv/domain/entity/AnCctv.java | 2 +- .../domain/repository/AnCctvRepository.java | 4 +-- .../cctv/domain/service/AnCctvService.java | 31 +++++-------------- .../cctv/presentation/AnCctvController.java | 8 ++--- 6 files changed, 16 insertions(+), 33 deletions(-) rename src/main/java/seouldata/seoul_backend/{ => domain}/cctv/application/dto/request/CctvRequest.java (86%) rename src/main/java/seouldata/seoul_backend/{ => domain}/cctv/application/dto/response/CctvResponse.java (90%) rename src/main/java/seouldata/seoul_backend/{ => domain}/cctv/domain/entity/AnCctv.java (92%) rename src/main/java/seouldata/seoul_backend/{ => domain}/cctv/domain/repository/AnCctvRepository.java (52%) rename src/main/java/seouldata/seoul_backend/{ => domain}/cctv/domain/service/AnCctvService.java (59%) rename src/main/java/seouldata/seoul_backend/{ => domain}/cctv/presentation/AnCctvController.java (70%) diff --git a/src/main/java/seouldata/seoul_backend/cctv/application/dto/request/CctvRequest.java b/src/main/java/seouldata/seoul_backend/domain/cctv/application/dto/request/CctvRequest.java similarity index 86% rename from src/main/java/seouldata/seoul_backend/cctv/application/dto/request/CctvRequest.java rename to src/main/java/seouldata/seoul_backend/domain/cctv/application/dto/request/CctvRequest.java index dbbbe7a..24d3865 100644 --- a/src/main/java/seouldata/seoul_backend/cctv/application/dto/request/CctvRequest.java +++ b/src/main/java/seouldata/seoul_backend/domain/cctv/application/dto/request/CctvRequest.java @@ -1,4 +1,4 @@ -package seouldata.seoul_backend.cctv.application.dto.request; +package seouldata.seoul_backend.domain.cctv.application.dto.request; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/seouldata/seoul_backend/cctv/application/dto/response/CctvResponse.java b/src/main/java/seouldata/seoul_backend/domain/cctv/application/dto/response/CctvResponse.java similarity index 90% rename from src/main/java/seouldata/seoul_backend/cctv/application/dto/response/CctvResponse.java rename to src/main/java/seouldata/seoul_backend/domain/cctv/application/dto/response/CctvResponse.java index c1343a8..d08cb02 100644 --- a/src/main/java/seouldata/seoul_backend/cctv/application/dto/response/CctvResponse.java +++ b/src/main/java/seouldata/seoul_backend/domain/cctv/application/dto/response/CctvResponse.java @@ -1,4 +1,4 @@ -package seouldata.seoul_backend.cctv.application.dto.response; +package seouldata.seoul_backend.domain.cctv.application.dto.response; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/seouldata/seoul_backend/cctv/domain/entity/AnCctv.java b/src/main/java/seouldata/seoul_backend/domain/cctv/domain/entity/AnCctv.java similarity index 92% rename from src/main/java/seouldata/seoul_backend/cctv/domain/entity/AnCctv.java rename to src/main/java/seouldata/seoul_backend/domain/cctv/domain/entity/AnCctv.java index f59ffa3..fa64902 100644 --- a/src/main/java/seouldata/seoul_backend/cctv/domain/entity/AnCctv.java +++ b/src/main/java/seouldata/seoul_backend/domain/cctv/domain/entity/AnCctv.java @@ -1,4 +1,4 @@ -package seouldata.seoul_backend.cctv.domain.entity; +package seouldata.seoul_backend.domain.cctv.domain.entity; import jakarta.persistence.Entity; import jakarta.persistence.Id; diff --git a/src/main/java/seouldata/seoul_backend/cctv/domain/repository/AnCctvRepository.java b/src/main/java/seouldata/seoul_backend/domain/cctv/domain/repository/AnCctvRepository.java similarity index 52% rename from src/main/java/seouldata/seoul_backend/cctv/domain/repository/AnCctvRepository.java rename to src/main/java/seouldata/seoul_backend/domain/cctv/domain/repository/AnCctvRepository.java index a7234e7..97b52b5 100644 --- a/src/main/java/seouldata/seoul_backend/cctv/domain/repository/AnCctvRepository.java +++ b/src/main/java/seouldata/seoul_backend/domain/cctv/domain/repository/AnCctvRepository.java @@ -1,7 +1,7 @@ -package seouldata.seoul_backend.cctv.domain.repository; +package seouldata.seoul_backend.domain.cctv.domain.repository; import org.springframework.data.jpa.repository.JpaRepository; -import seouldata.seoul_backend.cctv.domain.entity.AnCctv; +import seouldata.seoul_backend.domain.cctv.domain.entity.AnCctv; public interface AnCctvRepository extends JpaRepository { diff --git a/src/main/java/seouldata/seoul_backend/cctv/domain/service/AnCctvService.java b/src/main/java/seouldata/seoul_backend/domain/cctv/domain/service/AnCctvService.java similarity index 59% rename from src/main/java/seouldata/seoul_backend/cctv/domain/service/AnCctvService.java rename to src/main/java/seouldata/seoul_backend/domain/cctv/domain/service/AnCctvService.java index 3d148cd..1d64f40 100644 --- a/src/main/java/seouldata/seoul_backend/cctv/domain/service/AnCctvService.java +++ b/src/main/java/seouldata/seoul_backend/domain/cctv/domain/service/AnCctvService.java @@ -1,16 +1,16 @@ -package seouldata.seoul_backend.cctv.domain.service; +package seouldata.seoul_backend.domain.cctv.domain.service; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import seouldata.seoul_backend.cctv.application.dto.request.CctvRequest; -import seouldata.seoul_backend.cctv.application.dto.response.CctvResponse; -import seouldata.seoul_backend.cctv.domain.entity.AnCctv; -import seouldata.seoul_backend.cctv.domain.repository.AnCctvRepository; +import seouldata.seoul_backend.domain.cctv.application.dto.request.CctvRequest; +import seouldata.seoul_backend.domain.cctv.application.dto.response.CctvResponse; +import seouldata.seoul_backend.domain.cctv.domain.entity.AnCctv; +import seouldata.seoul_backend.domain.cctv.domain.repository.AnCctvRepository; +import seouldata.seoul_backend.common.DistanceUtils; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -38,7 +38,7 @@ public List getCctvNear(CctvRequest.CctvNearReque double lon = cctv.getLon(); double lat = cctv.getLat(); - double distance = calculationDistance(userLon, userLat, lon, lat); + double distance = DistanceUtils.calculateDistance(userLon, userLat, lon, lat); if(distance <= 500) { CctvResponse.CctvNearResponse nearCctv = CctvResponse.CctvNearResponse.builder() @@ -55,21 +55,4 @@ public List getCctvNear(CctvRequest.CctvNearReque return nearCctvs; } - - // 하버 사인 적용하여 두 점 사이 거리 구하기 - public double calculationDistance(double userLon, double userLat, double lon, double lat) { - double earthRadius = 6371000; // 지구 반지름(미터) - - double dLat = Math.toRadians(lat - userLat); - double dLon = Math.toRadians(lon - userLon); - - double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) - + Math.cos(Math.toRadians(userLat)) * Math.cos(Math.toRadians(lat)) - * Math.sin(dLon / 2) * Math.sin(dLon / 2); - - double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); - return earthRadius * c; - } - - } diff --git a/src/main/java/seouldata/seoul_backend/cctv/presentation/AnCctvController.java b/src/main/java/seouldata/seoul_backend/domain/cctv/presentation/AnCctvController.java similarity index 70% rename from src/main/java/seouldata/seoul_backend/cctv/presentation/AnCctvController.java rename to src/main/java/seouldata/seoul_backend/domain/cctv/presentation/AnCctvController.java index aa8fb43..8989183 100644 --- a/src/main/java/seouldata/seoul_backend/cctv/presentation/AnCctvController.java +++ b/src/main/java/seouldata/seoul_backend/domain/cctv/presentation/AnCctvController.java @@ -1,13 +1,13 @@ -package seouldata.seoul_backend.cctv.presentation; +package seouldata.seoul_backend.domain.cctv.presentation; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; -import seouldata.seoul_backend.cctv.application.dto.request.CctvRequest; -import seouldata.seoul_backend.cctv.application.dto.response.CctvResponse; -import seouldata.seoul_backend.cctv.domain.service.AnCctvService; +import seouldata.seoul_backend.domain.cctv.application.dto.request.CctvRequest; +import seouldata.seoul_backend.domain.cctv.application.dto.response.CctvResponse; +import seouldata.seoul_backend.domain.cctv.domain.service.AnCctvService; import java.util.List; From eebd9535d9e5a48f92a4bf8daf011876bd443dd9 Mon Sep 17 00:00:00 2001 From: syyling Date: Mon, 8 Apr 2024 22:23:47 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=ED=95=98=EB=B2=84=EC=82=AC?= =?UTF-8?q?=EC=9D=B8=20=EA=B3=B5=EC=8B=9D=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20?= =?UTF-8?q?=EA=B1=B0=EB=A6=AC=20=EA=B5=AC=ED=95=98=EB=8A=94=20utils=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seoul_backend/common/DistanceUtils.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/seouldata/seoul_backend/common/DistanceUtils.java diff --git a/src/main/java/seouldata/seoul_backend/common/DistanceUtils.java b/src/main/java/seouldata/seoul_backend/common/DistanceUtils.java new file mode 100644 index 0000000..9ddaba8 --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/common/DistanceUtils.java @@ -0,0 +1,27 @@ +package seouldata.seoul_backend.common; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class DistanceUtils { + + /** + * 하버사인 공식을 이용하여 두 지점간의 거리를 계산 + */ + public static double calculateDistance(double userLon, double userLat, double lon, double lat) { + + double earthRadius = 6371000; // 지구 반지름(미터) + + double dLat = Math.toRadians(lat - userLat); + double dLon = Math.toRadians(lon - userLon); + + double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + + Math.cos(Math.toRadians(userLat)) * Math.cos(Math.toRadians(lat)) + * Math.sin(dLon / 2) * Math.sin(dLon / 2); + + double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + return earthRadius * c; + } +} From c41a0f7fbd6afeb9e98e46caff775c62b55e273a Mon Sep 17 00:00:00 2001 From: syyling Date: Mon, 8 Apr 2024 22:24:39 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20HeatShelter=20entity,=20repository?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/HeatShelter.java | 36 +++++++++++++++++++ .../repository/HeatShelterRepository.java | 7 ++++ 2 files changed, 43 insertions(+) create mode 100644 src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/entity/HeatShelter.java create mode 100644 src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/repository/HeatShelterRepository.java diff --git a/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/entity/HeatShelter.java b/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/entity/HeatShelter.java new file mode 100644 index 0000000..6d4c928 --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/entity/HeatShelter.java @@ -0,0 +1,36 @@ +package seouldata.seoul_backend.domain.heatshelter.domain.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "an_heat_shelter") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class HeatShelter { + + @Id @Column(name = "shelter_name") + private String name; + + private String address; + + @Column(name = "lon") + private double longitude; + + @Column(name = "lat") + private double latitude; + + @Builder + public HeatShelter(String name, String address, double longitude, double latitude) { + this.name = name; + this.address = address; + this.longitude = longitude; + this.latitude = latitude; + } +} diff --git a/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/repository/HeatShelterRepository.java b/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/repository/HeatShelterRepository.java new file mode 100644 index 0000000..dd06434 --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/repository/HeatShelterRepository.java @@ -0,0 +1,7 @@ +package seouldata.seoul_backend.domain.heatshelter.domain.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import seouldata.seoul_backend.domain.heatshelter.domain.entity.HeatShelter; + +public interface HeatShelterRepository extends JpaRepository { +} From 71a9ed955d2046fb41c60a66c3a7a01b40f48120 Mon Sep 17 00:00:00 2001 From: syyling Date: Mon, 8 Apr 2024 22:25:29 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20HeatShelter=20500m=20=EC=9D=B4?= =?UTF-8?q?=EB=82=B4=20=EC=A0=95=EB=B3=B4=20=EB=B0=98=ED=99=98=20api=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/HeatShelterRequest.java | 21 +++++++++ .../dto/response/HeatShelterResponse.java | 27 +++++++++++ .../service/HeatShelterGetService.java | 46 +++++++++++++++++++ .../service/HeatShelterQueryService.java | 21 +++++++++ .../presentation/HeatShelterController.java | 25 ++++++++++ 5 files changed, 140 insertions(+) create mode 100644 src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/request/HeatShelterRequest.java create mode 100644 src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/response/HeatShelterResponse.java create mode 100644 src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/service/HeatShelterGetService.java create mode 100644 src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/service/HeatShelterQueryService.java create mode 100644 src/main/java/seouldata/seoul_backend/domain/heatshelter/presentation/HeatShelterController.java diff --git a/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/request/HeatShelterRequest.java b/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/request/HeatShelterRequest.java new file mode 100644 index 0000000..7530803 --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/request/HeatShelterRequest.java @@ -0,0 +1,21 @@ +package seouldata.seoul_backend.domain.heatshelter.appplication.dto.request; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class HeatShelterRequest { + + @Getter + @NoArgsConstructor + public static class HeatShelterNearRequest { + private double userLongitude; + private double userLatitude; + + @Builder + public HeatShelterNearRequest(double userLongitude, double userLatitude) { + this.userLongitude = userLongitude; + this.userLatitude = userLatitude; + } + } +} diff --git a/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/response/HeatShelterResponse.java b/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/response/HeatShelterResponse.java new file mode 100644 index 0000000..f34d08e --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/dto/response/HeatShelterResponse.java @@ -0,0 +1,27 @@ +package seouldata.seoul_backend.domain.heatshelter.appplication.dto.response; + +import jakarta.persistence.Column; +import jakarta.persistence.Id; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class HeatShelterResponse { + + @Getter + @NoArgsConstructor + public static class HeatShelterNearResponse { + private String name; + private String address; + private double longitude; + private double latitude; + + @Builder + public HeatShelterNearResponse(String name, String address, double longitude, double latitude) { + this.name = name; + this.address = address; + this.longitude = longitude; + this.latitude = latitude; + } + } +} diff --git a/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/service/HeatShelterGetService.java b/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/service/HeatShelterGetService.java new file mode 100644 index 0000000..8550454 --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/domain/heatshelter/appplication/service/HeatShelterGetService.java @@ -0,0 +1,46 @@ +package seouldata.seoul_backend.domain.heatshelter.appplication.service; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import seouldata.seoul_backend.common.DistanceUtils; +import seouldata.seoul_backend.domain.heatshelter.domain.entity.HeatShelter; +import seouldata.seoul_backend.domain.heatshelter.domain.service.HeatShelterQueryService; +import seouldata.seoul_backend.domain.heatshelter.appplication.dto.request.HeatShelterRequest; +import seouldata.seoul_backend.domain.heatshelter.appplication.dto.response.HeatShelterResponse; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional +public class HeatShelterGetService { + + private final HeatShelterQueryService heatShelterQueryService; + + public List getHeatShelterNear(HeatShelterRequest.HeatShelterNearRequest heatShelterNearRequest) { + + List heatShelters = heatShelterQueryService.findAll(); + double userLatitude = heatShelterNearRequest.getUserLatitude(); + double userLongitude = heatShelterNearRequest.getUserLongitude(); + System.out.println("userLatitude: " + userLatitude); + + List heatShelterNearList = new ArrayList<>(); + for (HeatShelter heatShelter : heatShelters) { + double longitude = heatShelter.getLongitude(); + double latitude = heatShelter.getLatitude(); + double distance = DistanceUtils.calculateDistance(userLongitude, userLatitude, longitude, latitude); + if (distance < 500) { + HeatShelterResponse.HeatShelterNearResponse heatShelterNearResponse = HeatShelterResponse.HeatShelterNearResponse.builder() + .name(heatShelter.getName()) + .address(heatShelter.getAddress()) + .longitude(heatShelter.getLongitude()) + .latitude(heatShelter.getLatitude()) + .build(); + heatShelterNearList.add(heatShelterNearResponse); + } + } + return heatShelterNearList; + } +} diff --git a/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/service/HeatShelterQueryService.java b/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/service/HeatShelterQueryService.java new file mode 100644 index 0000000..e2cff2a --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/domain/heatshelter/domain/service/HeatShelterQueryService.java @@ -0,0 +1,21 @@ +package seouldata.seoul_backend.domain.heatshelter.domain.service; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import seouldata.seoul_backend.domain.heatshelter.domain.entity.HeatShelter; +import seouldata.seoul_backend.domain.heatshelter.domain.repository.HeatShelterRepository; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional +public class HeatShelterQueryService { + + private final HeatShelterRepository heatShelterRepository; + + public List findAll() { + return heatShelterRepository.findAll(); + } +} diff --git a/src/main/java/seouldata/seoul_backend/domain/heatshelter/presentation/HeatShelterController.java b/src/main/java/seouldata/seoul_backend/domain/heatshelter/presentation/HeatShelterController.java new file mode 100644 index 0000000..1eb5871 --- /dev/null +++ b/src/main/java/seouldata/seoul_backend/domain/heatshelter/presentation/HeatShelterController.java @@ -0,0 +1,25 @@ +package seouldata.seoul_backend.domain.heatshelter.presentation; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; +import seouldata.seoul_backend.domain.heatshelter.appplication.dto.request.HeatShelterRequest; +import seouldata.seoul_backend.domain.heatshelter.appplication.dto.response.HeatShelterResponse; +import seouldata.seoul_backend.domain.heatshelter.appplication.service.HeatShelterGetService; + + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class HeatShelterController { + + private final HeatShelterGetService heatShelterGetService; + + @GetMapping("/api/heatshelter") + public List getHeatShelterNear(@RequestBody HeatShelterRequest.HeatShelterNearRequest heatShelterNearRequest) { + return heatShelterGetService.getHeatShelterNear(heatShelterNearRequest); + } + +}