-
Notifications
You must be signed in to change notification settings - Fork 1
[refactor] 대중교통 api 리팩토링 #181
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Walkthrough일부 DTO와 리포지토리를 내부/운송 하위 패키지로 이동하고, BusInfoService의 더미 반환을 실제 조회 흐름으로 대체했으며, TransportationService 전반의 거리 계산을 HaversineUtil로 통일하고 메모리 정리를 추가했습니다. 오류 코드 재배치 및 NO_NEARBY_STATIONS 추가, HaversineUtil에 km 단위 메서드가 추가되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor Client
participant BusInfoService
participant RouteRepository
participant PublicAPI as Station/Arrival Providers
Note over BusInfoService: 버스 정보 조회 (새 흐름)
Client->>BusInfoService: getBusInfo(stationName, busId, x, y)
BusInfoService->>RouteRepository: findRouteNameById(busId)
RouteRepository-->>BusInfoService: routeName
BusInfoService->>PublicAPI: fetchStationByName(stationName)
alt 다중 정류장
BusInfoService->>PublicAPI: findClosestStation(x, y, busId)
else 미존재
BusInfoService-->>Client: 빈 BusInfo 반환
end
BusInfoService->>PublicAPI: fetchArrivals(selectedStation)
alt 매칭되는 노선 존재
Note over BusInfoService: 저상버스 여부/배차간격 파싱
BusInfoService-->>Client: BusInfo(isShuttleBus, isLowFloor, interval)
else 없음/파싱 실패
BusInfoService-->>Client: 기본값 포함 BusInfo
end
sequenceDiagram
autonumber
actor Client
participant TransportationService
participant HaversineUtil
participant Repo as Transportation Repositories
Note over TransportationService: 경로 검색 (거리 검증/정리 포함)
Client->>TransportationService: findRoutes(origin, destination, ...)
TransportationService->>HaversineUtil: haversineKm(origin, destination)
alt 거리 초과
TransportationService-->>Client: 에러(PATH_NOT_FOUND 등)
else 진행
TransportationService->>Repo: 주변 노드/엣지 조회
alt 주변 정류장 없음
TransportationService-->>Client: 에러(NO_NEARBY_STATIONS)
else 경로 탐색
TransportationService->>TransportationService: 그래프 구성 및 탐색
TransportationService-->>Client: TransportationResponseDto
end
end
Note over TransportationService: finally에서 컬렉션/참조 정리
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes(없음) Possibly related PRs
Suggested reviewers
Poem
Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. ✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
src/main/java/com/wayble/server/direction/repository/transportation/EdgeRepository.java (1)
21-46: 대량 데이터 대비: 페이징 지원 메서드 추가 제안현재 프로젝션 조회는 전체 리스트 반환으로 메모리 압박 가능성이 큽니다.
Pageable지원 메서드를 추가해 상위 레이어에서 안전하게 페이지네이션하도록 하세요.package com.wayble.server.direction.repository.transportation; import com.wayble.server.direction.entity.transportation.Edge; import com.wayble.server.direction.repository.transportation.EdgeBoundingBoxProjection; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; ... List<EdgeBoundingBoxProjection> findEdgesInBoundingBox( @Param("minLat") double minLat, @Param("maxLat") double maxLat, @Param("minLon") double minLon, @Param("maxLon") double maxLon ); + + @Query( + value = + "SELECT " + + "e.id as edgeId, " + + "s.id as startNodeId, " + + "en.id as endNodeId, " + + "e.edgeType as edgeType, " + + "s.stationName as startStationName, " + + "s.latitude as startLatitude, " + + "s.longitude as startLongitude, " + + "en.stationName as endStationName, " + + "en.latitude as endLatitude, " + + "en.longitude as endLongitude, " + + "r.routeId as routeId, " + + "r.routeName as routeName " + + "FROM Edge e " + + "JOIN e.startNode s " + + "JOIN e.endNode en " + + "LEFT JOIN e.route r " + + "WHERE (s.latitude BETWEEN :minLat AND :maxLat AND s.longitude BETWEEN :minLon AND :maxLon) OR " + + "(en.latitude BETWEEN :minLat AND :maxLat AND en.longitude BETWEEN :minLon AND :maxLon) " + + "ORDER BY e.id", + countQuery = + "SELECT COUNT(e) " + + "FROM Edge e " + + "JOIN e.startNode s " + + "JOIN e.endNode en " + + "WHERE (s.latitude BETWEEN :minLat AND :maxLat AND s.longitude BETWEEN :minLon AND :maxLon) OR " + + "(en.latitude BETWEEN :minLat AND :maxLat AND en.longitude BETWEEN :minLon AND :maxLon)" + ) + Page<EdgeBoundingBoxProjection> findEdgesInBoundingBoxPaged( + @Param("minLat") double minLat, + @Param("maxLat") double maxLat, + @Param("minLon") double minLon, + @Param("maxLon") double maxLon, + Pageable pageable + );src/main/java/com/wayble/server/direction/dto/internal/TransportationGraphDto.java (1)
3-12: JPA 엔티티 보관으로 인한 메모리/지연로딩 리스크 — 경량화 타입으로 변경 제안내부 DTO에서
Edge엔티티 리스트를 보관하면 그래프가 크거나 트랜잭션 경계를 벗어날 때 메모리 핫스팟/LAZY 문제로 이어지기 쉽습니다. 노드 ID 기반의 인접 리스트로 경량화하세요.-package com.wayble.server.direction.dto.internal; +package com.wayble.server.direction.dto.internal; -import com.wayble.server.direction.entity.transportation.Edge; import org.springframework.data.util.Pair; import java.util.List; import java.util.Map; public record TransportationGraphDto( // 노드별 연결 정보와 엣지별 가중치를 함께 관리하기 위한 dto - Map<Long, List<Edge>> graph, // 노드별 연결 정보 + Map<Long, List<Long>> graph, // 노드별 연결 정보(인접 노드 ID만 보관) Map<Pair<Long, Long>, Integer> weightMap // 엣지별 가중치 ) {}src/main/java/com/wayble/server/direction/service/BusInfoService.java (1)
227-299: 정류소 검색 로직의 성능 문제 가능성
findClosestStation메서드에서 몇 가지 개선이 필요합니다:
- 정렬 로직에서 중복된 거리 계산이 발생합니다 (Line 260-261)
- 상위 3개 정류소마다 API 호출을 하는 것은 성능에 영향을 줄 수 있습니다 (Line 279)
거리 계산 결과를 캐싱하여 중복 계산을 방지하는 것을 권장합니다:
-// 거리순으로 정렬 -sortedStations.sort((s1, s2) -> { - try { - double d1 = Math.sqrt(Math.pow(Double.parseDouble(s1.tmX()) - x, 2) + Math.pow(Double.parseDouble(s1.tmY()) - y, 2)); - double d2 = Math.sqrt(Math.pow(Double.parseDouble(s2.tmX()) - x, 2) + Math.pow(Double.parseDouble(s2.tmY()) - y, 2)); - return Double.compare(d1, d2); - } catch (NumberFormatException e) { - return 0; - } -}); +// 거리 정보를 포함한 Pair로 변환 후 정렬 +List<Pair<Double, StationSearchResponse.StationItem>> stationsWithDistance = new ArrayList<>(); +for (StationSearchResponse.StationItem station : sortedStations) { + try { + double distance = Math.sqrt(Math.pow(Double.parseDouble(station.tmX()) - x, 2) + + Math.pow(Double.parseDouble(station.tmY()) - y, 2)); + stationsWithDistance.add(Pair.of(distance, station)); + } catch (NumberFormatException e) { + // 무시 + } +} +stationsWithDistance.sort(Comparator.comparing(Pair::getFirst)); +sortedStations = stationsWithDistance.stream() + .map(Pair::getSecond) + .collect(Collectors.toList());src/main/java/com/wayble/server/direction/repository/transportation/NodeRepository.java (1)
14-22: 경계값/경도 특이 케이스 검증 미구현 – 서비스 레이어에서 처리 필요
calculateBoundingBox(startTmp, endTmp)후 반환된minLat > maxLat,minLon > maxLon입력에 대한 swap 또는 예외 처리 로직이 빠져 있어 잘못된 바운딩 박스가 그대로 전달됩니다.- 국제 날짜변경선(±180°)을 횡단하는 경우 단일
BETWEEN으로는 조회 불가능하므로(lon >= minLon OR lon <= maxLon)형태의 분기 처리 추가 필요.Location:
- src/main/java/com/wayble/server/direction/service/TransportationService.java –
calculateBoundingBox구현부 및nodeRepository.findNodesInBoundingBox(...)호출부
🧹 Nitpick comments (3)
src/main/java/com/wayble/server/direction/repository/transportation/FacilityRepository.java (1)
13-13: 파생 쿼리 메서드에서 @param 제거하세요Spring Data 파생 쿼리
findByNodeId에는@Param이 불필요합니다. 컴파일 타임/런타임에 영향 없지만 노이즈이므로 제거 권장.-package com.wayble.server.direction.repository.transportation; +package com.wayble.server.direction.repository.transportation; import com.wayble.server.direction.entity.transportation.Facility; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; +import org.springframework.data.jpa.repository.Query; public interface FacilityRepository extends JpaRepository<Facility, Long> { - Optional<Facility> findByNodeId(@Param("nodeId") Long nodeId); + Optional<Facility> findByNodeId(Long nodeId); }src/main/java/com/wayble/server/direction/repository/transportation/EdgeRepository.java (1)
38-39: OR 조건으로 인덱스 효율 저하 가능 — 질의 전략/인덱싱 점검 권장
(s in bbox) OR (en in bbox)는 복합 인덱스 활용을 약화합니다. 두 쿼리(시작/종점)로 분리 후 집합 병합 또는 지리공간 인덱스(예: PostGIS GIST, MySQL SPATIAL) 도입을 고려하세요.src/main/java/com/wayble/server/direction/repository/transportation/NodeRepository.java (1)
12-22: 인덱싱/지오스페이셜로 I/O 비용 절감
latitude,longitude에 대한 범위 조건은 풀스캔 유발 가능성이 큽니다. 다음 중 하나를 권장합니다.
- RDB 인덱스:
- MySQL/MariaDB:
CREATE INDEX idx_node_lat_lon ON node (latitude, longitude);- PostgreSQL:
CREATE INDEX idx_node_lat ON node (latitude);+CREATE INDEX idx_node_lon ON node (longitude);또는 복합 인덱스- 가능하면 PostGIS/지리 타입(geometry/geography) + 공간 인덱스(GIST/SP-GIST)와 사각 범위/반경 쿼리로 전환
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (16)
src/main/java/com/wayble/server/direction/dto/internal/InternalStep.java(1 hunks)src/main/java/com/wayble/server/direction/dto/internal/NodeRef.java(1 hunks)src/main/java/com/wayble/server/direction/dto/internal/TransportationGraphDto.java(1 hunks)src/main/java/com/wayble/server/direction/exception/DirectionErrorCase.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/EdgeBoundingBoxProjection.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/EdgeRepository.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/ElevatorRepository.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/FacilityRepository.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/NodeBoundingBoxProjection.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/NodeRepository.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/RouteRepository.java(1 hunks)src/main/java/com/wayble/server/direction/repository/transportation/WheelchairInfoRepository.java(1 hunks)src/main/java/com/wayble/server/direction/service/BusInfoService.java(1 hunks)src/main/java/com/wayble/server/direction/service/FacilityService.java(1 hunks)src/main/java/com/wayble/server/direction/service/TransportationService.java(18 hunks)src/main/java/com/wayble/server/direction/service/util/HaversineUtil.java(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (16)
src/main/java/com/wayble/server/direction/service/FacilityService.java (3)
src/main/java/com/wayble/server/direction/repository/ElevatorRepository.java (1)
ElevatorRepository(11-14)src/main/java/com/wayble/server/direction/repository/WheelchairInfoRepository.java (1)
WheelchairInfoRepository(11-18)src/main/java/com/wayble/server/direction/repository/FacilityRepository.java (1)
FacilityRepository(12-14)
src/main/java/com/wayble/server/direction/service/util/HaversineUtil.java (3)
src/test/java/com/wayble/server/explore/WaybleFacilityApiIntegrationTest.java (1)
haversine(237-246)src/main/java/com/wayble/server/direction/service/WaybleDijkstraService.java (1)
calculateDistance(122-132)src/main/java/com/wayble/server/direction/service/WalkingService.java (1)
node(59-59)
src/main/java/com/wayble/server/direction/dto/internal/TransportationGraphDto.java (1)
src/main/java/com/wayble/server/direction/entity/transportation/Edge.java (1)
Entity(8-57)
src/main/java/com/wayble/server/direction/repository/transportation/WheelchairInfoRepository.java (3)
src/main/java/com/wayble/server/direction/repository/WheelchairInfoRepository.java (3)
WheelchairInfoRepository(11-18)Query(16-17)Query(13-14)src/main/java/com/wayble/server/direction/entity/transportation/Wheelchair.java (1)
Entity(6-24)src/main/java/com/wayble/server/direction/entity/transportation/Route.java (1)
Entity(12-54)
src/main/java/com/wayble/server/direction/repository/transportation/NodeRepository.java (4)
src/main/java/com/wayble/server/direction/repository/NodeBoundingBoxProjection.java (1)
NodeBoundingBoxProjection(5-11)src/main/java/com/wayble/server/direction/repository/EdgeRepository.java (1)
Repository(12-46)src/main/java/com/wayble/server/direction/entity/transportation/Node.java (1)
Entity(13-79)src/main/java/com/wayble/server/direction/repository/EdgeBoundingBoxProjection.java (1)
EdgeBoundingBoxProjection(5-18)
src/main/java/com/wayble/server/direction/repository/transportation/RouteRepository.java (3)
src/main/java/com/wayble/server/direction/repository/RouteRepository.java (1)
RouteRepository(10-14)src/main/java/com/wayble/server/direction/entity/transportation/Route.java (1)
Entity(12-54)src/main/java/com/wayble/server/direction/repository/WheelchairInfoRepository.java (1)
WheelchairInfoRepository(11-18)
src/main/java/com/wayble/server/direction/repository/transportation/NodeBoundingBoxProjection.java (2)
src/main/java/com/wayble/server/direction/repository/NodeRepository.java (2)
NodeRepository(11-29)Query(13-28)src/main/java/com/wayble/server/direction/repository/EdgeRepository.java (1)
Repository(12-46)
src/main/java/com/wayble/server/direction/dto/internal/NodeRef.java (1)
src/main/java/com/wayble/server/direction/dto/InternalStep.java (1)
InternalStep(9-21)
src/main/java/com/wayble/server/direction/repository/transportation/EdgeRepository.java (3)
src/main/java/com/wayble/server/direction/repository/EdgeRepository.java (2)
Repository(12-46)Query(20-45)src/main/java/com/wayble/server/direction/repository/EdgeBoundingBoxProjection.java (2)
EdgeBoundingBoxProjection(5-18)getEdgeType(9-9)src/main/java/com/wayble/server/direction/entity/transportation/Edge.java (1)
Entity(8-57)
src/main/java/com/wayble/server/direction/repository/transportation/EdgeBoundingBoxProjection.java (3)
src/main/java/com/wayble/server/direction/repository/EdgeBoundingBoxProjection.java (5)
EdgeBoundingBoxProjection(5-18)getEdgeType(9-9)getEdgeId(6-6)getEndStationName(13-13)getRouteName(17-17)src/main/java/com/wayble/server/direction/repository/EdgeRepository.java (1)
Repository(12-46)src/main/java/com/wayble/server/direction/entity/transportation/Edge.java (1)
Entity(8-57)
src/main/java/com/wayble/server/direction/repository/transportation/ElevatorRepository.java (3)
src/main/java/com/wayble/server/direction/entity/transportation/Elevator.java (1)
Entity(6-23)src/main/java/com/wayble/server/direction/repository/ElevatorRepository.java (2)
ElevatorRepository(11-14)Query(12-13)src/main/java/com/wayble/server/direction/entity/transportation/Facility.java (1)
Entity(11-45)
src/main/java/com/wayble/server/direction/repository/transportation/FacilityRepository.java (2)
src/main/java/com/wayble/server/direction/entity/transportation/Facility.java (1)
Entity(11-45)src/main/java/com/wayble/server/direction/repository/FacilityRepository.java (1)
FacilityRepository(12-14)
src/main/java/com/wayble/server/direction/service/BusInfoService.java (1)
src/main/java/com/wayble/server/direction/dto/response/TransportationResponseDto.java (1)
BusInfo(41-45)
src/main/java/com/wayble/server/direction/service/TransportationService.java (1)
src/main/java/com/wayble/server/direction/service/util/HaversineUtil.java (1)
HaversineUtil(3-20)
src/main/java/com/wayble/server/direction/exception/DirectionErrorCase.java (1)
src/main/java/com/wayble/server/common/exception/ErrorCase.java (1)
ErrorCase(3-10)
src/main/java/com/wayble/server/direction/dto/internal/InternalStep.java (1)
src/main/java/com/wayble/server/direction/dto/InternalStep.java (1)
InternalStep(9-21)
🔇 Additional comments (23)
src/main/java/com/wayble/server/direction/service/util/HaversineUtil.java (1)
16-19: 단위 혼용 점검 및 주석 추가
haversine(미터) vshaversineKm(킬로미터) 호출부 전수 검토: km·m 단위 혼용으로 임계값 비교(예: 500 m vs 0.5 km) 시 버그 가능성haversineKm메서드에 반환 단위(킬로미터) 명시하는 Javadoc 주석 추가src/main/java/com/wayble/server/direction/repository/transportation/WheelchairInfoRepository.java (1)
1-1: 패키지 리로케이션 LGTM.의존 서비스/구성의 import 경로 정합성만 CI에서 한 번 더 확인하면 충분합니다.
src/main/java/com/wayble/server/direction/repository/transportation/ElevatorRepository.java (1)
1-1: 패키지 정리 적절합니다.리포지토리 스캔 경로만 정상인지(예:
@EnableJpaRepositoriesbasePackages) 확인 부탁드립니다.src/main/java/com/wayble/server/direction/repository/transportation/NodeBoundingBoxProjection.java (1)
1-1: 프로젝션 인터페이스 이동 문제없음.
NodeRepository.findNodesInBoundingBox의 import가 신규 경로를 가리키는지만 재확인하면 됩니다.src/main/java/com/wayble/server/direction/repository/transportation/RouteRepository.java (1)
1-1: RouteRepository 패키지 이동 OK.공용 FQN 변경에 따른 서비스 레이어(예: BusInfoService, TransportationService) 컴파일·런타임 참조만 점검해 주세요.
src/main/java/com/wayble/server/direction/repository/transportation/EdgeBoundingBoxProjection.java (1)
1-1: 패키지 재배치 LGTM리포지토리 계층의 transportation 하위 패키지로 이동한 방향성 일관되고 적절합니다. 인터페이스 기반 프로젝션의 getter 명도 JPQL alias와 정합합니다.
src/main/java/com/wayble/server/direction/repository/transportation/EdgeRepository.java (2)
1-4: 패키지/임포트 정리 LGTM
EdgeRepository의 위치 및EdgeBoundingBoxProjection임포트 경로 변경이 전체 구조와 일관됩니다.
21-46: 확인: Route 엔티티에routeId,routeName필드가 존재하며 프로젝션 필드명과 일치합니다.src/main/java/com/wayble/server/direction/dto/internal/NodeRef.java (1)
1-8: 내부 DTO로의 이동 적절내부 패키지로 이동해 외부 노출 범위를 축소한 점 좋습니다. 레코드 필드 구성이 단순하고 명확합니다.
src/main/java/com/wayble/server/direction/dto/internal/InternalStep.java (1)
1-1: 패키지 구조 변경이 적절합니다내부용 DTO를
internal하위 패키지로 이동한 것은 코드 구조를 명확하게 개선한 좋은 리팩토링입니다.src/main/java/com/wayble/server/direction/exception/DirectionErrorCase.java (1)
11-16: 오류 코드 재정렬 및 새로운 케이스 추가 확인오류 코드를 재정렬하고
NO_NEARBY_STATIONS케이스를 추가한 것이 적절합니다. PR 목표에 명시된 "주변에 정류장이 없음" 케이스를 분리하는 요구사항을 잘 반영했습니다.src/main/java/com/wayble/server/direction/service/BusInfoService.java (2)
29-37: 더미 데이터를 실제 API 데이터로 교체 완료PR 목표에 따라 더미 데이터를 실제 공공 API 데이터로 성공적으로 교체했습니다. 마포 셔틀버스 여부 확인 로직도 적절합니다.
53-59: 효율적인 정류소 선택 로직정류소가 1개일 때 불필요한 거리 계산을 건너뛰는 최적화가 좋습니다.
src/main/java/com/wayble/server/direction/service/TransportationService.java (7)
57-130: 메모리 누수 방지를 위한 정리 코드 추가 확인PR 목표에 따라 메모리 누수를 방지하기 위한 객체 정리 로직이 적절하게 추가되었습니다.
finally블록에서 사용된 객체들을null로 설정하는 것이 좋습니다.
71-75: HaversineUtil 통합 사용거리 계산 로직을
HaversineUtil.haversineKm으로 통일한 것이 코드 일관성을 향상시켰습니다.
227-229: 예외 처리 범위 확대
OutOfMemoryError만 처리하던 것을 일반Exception으로 확대한 것이 적절합니다. 더 포괄적인 오류 처리가 가능해졌습니다.
351-360: 루프 내 메모리 정리 추가
findAlternativeRoutesEfficiently메서드의 루프 내에서newUsedEdges와penalizedWeightMap를 정리하는 것이 좋습니다. 반복적인 경로 탐색 시 메모리 사용량을 줄일 수 있습니다.
525-527: NO_NEARBY_STATIONS 오류 처리 추가출발지와 도착지 주변에 정류장이 없을 때
NO_NEARBY_STATIONS예외를 던지도록 추가한 것이 PR 목표와 일치합니다.Also applies to: 541-543
610-612: Lambda에서 final 변수 사용
finalDistance변수를 사용하여 람다 표현식에서 거리 값을 안전하게 참조하도록 한 것이 적절합니다.
1015-1018: 필터링 조건 추가로 성능 개선
findNearestNode메서드에서 거리 필터링을 추가하여 1km 이내의 노드만 고려하도록 한 것이 성능 최적화에 도움이 됩니다.src/main/java/com/wayble/server/direction/service/FacilityService.java (1)
11-15: 리포지토리 패키지 경로 업데이트 확인디렉토리 구조 재구성에 따라 리포지토리 import 경로를
transportation하위 패키지로 변경한 것이 적절합니다.src/main/java/com/wayble/server/direction/repository/transportation/NodeRepository.java (2)
4-4: Import 경로가 올바릅니다.
NodeBoundingBoxProjection가com.wayble.server.direction.repository.transportation패키지에 선언돼 있어 현재 import를 그대로 유지해도 됩니다.
1-1: JPA 리포지토리는 스프링 부트 자동 스캔 대상에 포함되므로@EnableJpaRepositories설정 불필요합니다.Likely an incorrect or invalid review comment.
| import com.wayble.server.direction.repository.NodeBoundingBoxProjection; | ||
| import com.wayble.server.direction.repository.transportation.NodeBoundingBoxProjection; | ||
|
|
||
| import org.springframework.data.jpa.repository.JpaRepository; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
대량 결과 반환 방지: 페이징 도입 및 정렬 외부화
현재 쿼리는 정렬까지 포함한 전체 리스트를 반환하여 메모리 사용량이 커질 수 있습니다. 페이징을 받아 상한을 두고, 정렬은 Pageable의 Sort로 외부화하는 편이 유연하고 안전합니다.
적용 제안:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
+import org.springframework.data.domain.Pageable;
@Query("SELECT " +
"n.id as id, " +
"n.stationName as stationName, " +
"n.nodeType as nodeType, " +
"n.latitude as latitude, " +
"n.longitude as longitude " +
"FROM Node n WHERE " +
"n.latitude BETWEEN :minLat AND :maxLat AND " +
- "n.longitude BETWEEN :minLon AND :maxLon " +
- "ORDER BY n.latitude, n.longitude")
+ "n.longitude BETWEEN :minLon AND :maxLon")
List<NodeBoundingBoxProjection> findNodesInBoundingBox(
@Param("minLat") double minLat,
@Param("maxLat") double maxLat,
@Param("minLon") double minLon,
- @Param("maxLon") double maxLon
+ @Param("maxLon") double maxLon,
+ Pageable pageable
);주의: 호출부에서 Pageable을 전달하도록 업데이트가 필요합니다. 정렬(예: 거리순)이 필요하면 서비스 단에서 계산하거나 네이티브/DB 함수로 처리하세요.
Also applies to: 14-23, 24-29
seung-in-Yoo
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
리팩토링 엄청 빠르게 하셨네요 수고하셨습니다!!
✔️ 연관 이슈
📝 작업 내용
스크린샷 (선택)
Summary by CodeRabbit