Skip to content

Conversation

@hyoinYang
Copy link
Contributor

@hyoinYang hyoinYang commented Aug 28, 2025

✔️ 연관 이슈

📝 작업 내용

  • 메모리 누수를 줄이기 위해 사용이 끝난 객체를 null로 변경
  • 디렉토리 분류
  • 더미 데이터 대신 공공api를 사용하도록 수정
  • 에러코드 다양화: 주변에 정류장이 없을 때를 추가

스크린샷 (선택)

Summary by CodeRabbit

  • 신기능
    • 주변 정류장이 없을 때 명확한 오류 메시지 제공.
    • 버스 정보가 더 이상 더미가 아닌 실제 데이터 기반으로 제공(셔틀버스 여부, 저상버스 여부, 배차간격).
  • 버그 수정
    • 거리 계산 정확도 향상으로 경로 탐색의 신뢰성 개선.
    • 예외 상황 처리 강화로 빈 결과/오류 케이스에서의 안정성 개선.
  • 리팩터링
    • 내부 패키지 구조 정리 및 공통 거리 계산 유틸 도입으로 유지보수성 향상.

@hyoinYang hyoinYang self-assigned this Aug 28, 2025
@hyoinYang hyoinYang added 🔧 refactor 코드 리팩토링 🛠️ fix 기능 오류 및 코드 개선이 필요한 곳 수정 labels Aug 28, 2025
@coderabbitai
Copy link

coderabbitai bot commented Aug 28, 2025

Walkthrough

일부 DTO와 리포지토리를 내부/운송 하위 패키지로 이동하고, BusInfoService의 더미 반환을 실제 조회 흐름으로 대체했으며, TransportationService 전반의 거리 계산을 HaversineUtil로 통일하고 메모리 정리를 추가했습니다. 오류 코드 재배치 및 NO_NEARBY_STATIONS 추가, HaversineUtil에 km 단위 메서드가 추가되었습니다.

Changes

Cohort / File(s) Summary
DTO internalization
src/main/java/com/wayble/server/direction/dto/internal/InternalStep.java, .../dto/internal/NodeRef.java, .../dto/internal/TransportationGraphDto.java
패키지 ...dto...dto.internal로 이동. 공개 타입의 FQN 변경만 발생.
Transportation repositories relocation
src/main/java/com/wayble/server/direction/repository/transportation/EdgeBoundingBoxProjection.java, .../EdgeRepository.java, .../ElevatorRepository.java, .../FacilityRepository.java, .../NodeBoundingBoxProjection.java, .../NodeRepository.java, .../RouteRepository.java, .../WheelchairInfoRepository.java
패키지 ...repository...repository.transportation로 이동. 필요한 import 경로 갱신. 로직 변경 없음.
Service import updates
src/main/java/com/wayble/server/direction/service/FacilityService.java
리포지토리 import를 ...repository.transportation.*로 교체.
Bus info flow update
src/main/java/com/wayble/server/direction/service/BusInfoService.java
더미 반환 제거. 노선명 조회→정류장 검색→최근접 선택→도착정보 필터링/파싱의 실제 흐름으로 교체. 예외/결측 처리 로깅 추가. RouteRepository import 경로 갱신.
Routing/service refactor
src/main/java/com/wayble/server/direction/service/TransportationService.java
거리 계산을 HaversineUtil.haversineKm로 통일. 그래프/경로 탐색 흐름 정리, nearby station 검증 시 NO_NEARBY_STATIONS 사용, try/finally로 컬렉션 및 참조 정리 추가. DTO/리포지토리 import 경로 갱신.
Error codes update
src/main/java/com/wayble/server/direction/exception/DirectionErrorCase.java
에러 코드 재배치 및 NO_NEARBY_STATIONS(400, 4005, ...) 추가. 기존 상수의 errorCode 값 변경.
Util enhancement
src/main/java/com/wayble/server/direction/service/util/HaversineUtil.java
public static double haversineKm(...) 추가. 기존 haversine는 그대로.

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
Loading
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에서 컬렉션/참조 정리
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Assessment against linked issues

Objective Addressed Explanation
메모리 누수 확인 및 고치기 (#180)
디렉토리 분류 (#180)
더미 데이터 대신 공공api를 사용하도록 수정 (#180)
에러코드 다양화(‘주변에 정류장이 없을 때’/‘경로가 없음’ 분리) (#180)

Assessment against linked issues: Out-of-scope changes

(없음)

Possibly related PRs

Suggested reviewers

  • KiSeungMin
  • zyovn
  • seung-in-Yoo
  • wonjun-lee-fcwj245

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 Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/hyoin

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbit in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbit in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbit gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbit read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbit help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbit ignore or @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbit summary or @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbit or @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a 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 메서드에서 몇 가지 개선이 필요합니다:

  1. 정렬 로직에서 중복된 거리 계산이 발생합니다 (Line 260-261)
  2. 상위 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.

📥 Commits

Reviewing files that changed from the base of the PR and between 8f56366 and 8a9cb57.

📒 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(미터) vs haversineKm(킬로미터) 호출부 전수 검토: 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: 패키지 정리 적절합니다.

리포지토리 스캔 경로만 정상인지(예: @EnableJpaRepositories basePackages) 확인 부탁드립니다.

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 메서드의 루프 내에서 newUsedEdgespenalizedWeightMap를 정리하는 것이 좋습니다. 반복적인 경로 탐색 시 메모리 사용량을 줄일 수 있습니다.


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 경로가 올바릅니다.
NodeBoundingBoxProjectioncom.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;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

대량 결과 반환 방지: 페이징 도입 및 정렬 외부화

현재 쿼리는 정렬까지 포함한 전체 리스트를 반환하여 메모리 사용량이 커질 수 있습니다. 페이징을 받아 상한을 두고, 정렬은 PageableSort로 외부화하는 편이 유연하고 안전합니다.

적용 제안:

 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

Copy link
Member

@seung-in-Yoo seung-in-Yoo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리팩토링 엄청 빠르게 하셨네요 수고하셨습니다!!

@hyoinYang hyoinYang merged commit eae2239 into develop Aug 29, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🛠️ fix 기능 오류 및 코드 개선이 필요한 곳 수정 🔧 refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants