From 4dfc6b25a4649537a60b6e81354f77deecff6e85 Mon Sep 17 00:00:00 2001 From: eedo_y Date: Sun, 28 Dec 2025 20:32:23 +0900 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8Frefactor=20:=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EC=A1=B0=ED=9A=8C=EC=8B=9C,=20=EA=B1=B0=EB=A6=AC=20?= =?UTF-8?q?=ED=91=9C=ED=98=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ComplexDetailResponse.java | 11 ++++--- .../dto/response/TransitInfoResponse.java | 29 +++++++++++++++++++ .../application/service/ComplexService.java | 18 +++++++++--- .../util/TransitResponseMapper.java | 25 ++++++++++++++++ 4 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/TransitInfoResponse.java diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/ComplexDetailResponse.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/ComplexDetailResponse.java index 9484cb8..2c4ae53 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/ComplexDetailResponse.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/ComplexDetailResponse.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.pinHouse.server.core.util.TimeFormatter; -import com.pinHouse.server.platform.housing.complex.application.dto.response.TransitRoutesResponse.SegmentResponse; import com.pinHouse.server.platform.housing.complex.domain.entity.ComplexDocument; import com.pinHouse.server.platform.housing.complex.domain.entity.UnitType; import com.pinHouse.server.platform.housing.facility.application.dto.NoticeFacilityListResponse; @@ -47,11 +46,11 @@ public record ComplexDetailResponse( String totalTime, @Schema(description = "전체 대중교통 정보 (임대주택 상세조회용)") - List distance + TransitInfoResponse distance ) { - /// 정적 팩토리 메서드 - 임대주택 상세조회용 (SegmentResponse 리스트 포함) - public static ComplexDetailResponse from(ComplexDocument document, NoticeFacilityListResponse facilities, List distance) { + /// 정적 팩토리 메서드 - 임대주택 상세조회용 (TransitInfoResponse 포함) + public static ComplexDetailResponse from(ComplexDocument document, NoticeFacilityListResponse facilities, TransitInfoResponse transitInfo) { return ComplexDetailResponse.builder() .id(document.getId()) @@ -59,7 +58,7 @@ public static ComplexDetailResponse from(ComplexDocument document, NoticeFacilit .address(extractRegion(document.getAddress().getFull())) .heating(document.getHeating()) .totalHouseholds( - document.getTotalHouseholds() == null || document.getTotalHouseholds().equals("") + document.getTotalHouseholds() == null || document.getTotalHouseholds().isEmpty() ? 0 : Integer.parseInt(document.getTotalHouseholds()) ) @@ -70,7 +69,7 @@ public static ComplexDetailResponse from(ComplexDocument document, NoticeFacilit .map(UnitType::getTypeCode) .toList()) .totalTime(null) - .distance(distance) + .distance(transitInfo) .build(); } diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/TransitInfoResponse.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/TransitInfoResponse.java new file mode 100644 index 0000000..5e58e39 --- /dev/null +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/dto/response/TransitInfoResponse.java @@ -0,0 +1,29 @@ +package com.pinHouse.server.platform.housing.complex.application.dto.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; + +import java.util.List; + +/** + * 대중교통 경로 전체 정보 (총 시간/거리 + 구간별 정보) + */ +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(name = "[응답][대중교통] 경로 전체 정보", description = "대중교통 경로의 총 시간/거리와 구간별 세부 정보") +public record TransitInfoResponse( + + @Schema(description = "총 소요 시간 (텍스트)", example = "약 1시간 23분") + String totalTime, + + @Schema(description = "총 소요 시간 (분)", example = "83") + Integer totalTimeMinutes, + + @Schema(description = "총 거리 (km)", example = "39.6") + Double totalDistance, + + @Schema(description = "구간별 세부 정보") + List segments +) { +} diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java index 0cf48ae..b0a7449 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/service/ComplexService.java @@ -69,11 +69,11 @@ public ComplexDetailResponse getComplex(String id, String pinPointId) throws Uns /// 주변 인프라 조회 NoticeFacilityListResponse nearFacilities = facilityService.getNearFacilities(complex.getId()); - /// 거리 계산 - Segment 리스트로 변환 - List segments = getSegments(id, pinPointId); + /// 거리 계산 - TransitInfo 생성 + TransitInfoResponse transitInfo = getTransitInfo(id, pinPointId); /// 리턴 - return ComplexDetailResponse.from(complex, nearFacilities, segments); + return ComplexDetailResponse.from(complex, nearFacilities, transitInfo); } @@ -466,7 +466,17 @@ private T calculateTransitRoute( return pathMapper.apply(pathResult); } - /// Segment 리스트 조회 (임대주택 상세조회용) + /// TransitInfo 조회 (임대주택 상세조회용) + @Transactional(readOnly = true) + public TransitInfoResponse getTransitInfo(String id, String pinPointId) throws UnsupportedEncodingException { + return calculateTransitRoute(id, pinPointId, pathResult -> { + RootResult rootResult = mapper.selectBest(pathResult); + return mapper.toTransitInfoResponse(rootResult); + }); + } + + /// Segment 리스트 조회 (임대주택 상세조회용) - Deprecated, use getTransitInfo instead + @Deprecated @Transactional(readOnly = true) public List getSegments(String id, String pinPointId) throws UnsupportedEncodingException { return calculateTransitRoute(id, pinPointId, pathResult -> { diff --git a/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java b/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java index 218c333..445db64 100644 --- a/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java +++ b/src/main/java/com/pinHouse/server/platform/housing/complex/application/util/TransitResponseMapper.java @@ -3,6 +3,7 @@ import com.pinHouse.server.core.util.TimeFormatter; import com.pinHouse.server.platform.housing.complex.application.dto.response.ChipType; import com.pinHouse.server.platform.housing.complex.application.dto.response.DistanceResponse; +import com.pinHouse.server.platform.housing.complex.application.dto.response.TransitInfoResponse; import com.pinHouse.server.platform.housing.complex.application.dto.response.TransitRoutesResponse; import com.pinHouse.server.platform.housing.complex.application.dto.result.PathResult; import com.pinHouse.server.platform.housing.complex.application.dto.result.RootResult; @@ -237,6 +238,30 @@ private int countTransfers(RootResult route) { return (int) Math.max(0, transportCount - 1); } + /** + * TransitInfoResponse 생성 (전체 경로 정보 + 구간별 정보) + */ + public TransitInfoResponse toTransitInfoResponse(RootResult route) { + if (route == null) { + return null; + } + + // 전체 경로의 총 시간, 거리 계산 + int totalMinutes = route.totalTime(); + String totalTimeText = TimeFormatter.formatTime(totalMinutes); + double totalDistanceKm = Math.round(route.totalDistance() / 100.0) / 10.0; + + // 구간별 정보 생성 + List segments = toSegmentResponses(route); + + return TransitInfoResponse.builder() + .totalTime(totalTimeText) + .totalTimeMinutes(totalMinutes) + .totalDistance(totalDistanceKm) + .segments(segments) + .build(); + } + /** * Segments 생성 (색 막대용) */