Skip to content
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

feat: 버스 교통편 조회 API #1099

Open
wants to merge 16 commits into
base: develop
Choose a base branch
from
Open

Conversation

DHkimgit
Copy link
Contributor

🔥 연관 이슈

image

  • API 요구명세, 피그마
  • 캠퍼스팀 11월 버스 스프린트 - 버스 교통편 조회하기 기능을 구현한 API 입니다.

🚀 작업 내용

  • 출발지, 도착지, 날짜, 시간, 차량 종류에 대응하는 버스 스케줄을 반환하는 API를 작성했습니다.

설계

image

  • 스케줄을 조회하는 메서드에 대한 추상화가 가능하다고 생각해서 이를 적용했습니다.
  • 고속버스의 경우 스케줄 데이터를 가져오는 외부 API가 현재 KEY 만료로 동작하지 않는 상태입니다. redis에 정적으로 저장된 데이터를 가져오는 방법이 있었으나, 추후 리팩토링이 예정되어 있으므로 일단 데이터를 final class에 정적으로 정의하고 이를 이용했습니다.

DataSource

  • 셔틀버스(shuttle, commuting) : MongoDB (collection = "bus_timetable")
  • 시내버스 : MongoDB (collection = "citybus_timetable")
  • 고속버스(대성) : ExpressBusSchedule 클래스

셔틀버스 스케줄 조회 상세 구현 로직

image

  • Stream을 이용해서 데이터를 정제합니다.
public boolean filterDepartAndArriveNode(BusStation departNode, BusStation arriveNode) {
        boolean foundDepart = false;
        for (ArrivalNode node : arrivalInfos) {
            if (!foundDepart && node.getNodeName().contains(departNode.getQueryName())) {
                foundDepart = true;
            }
            else if (foundDepart && node.getNodeName().contains(arriveNode.getQueryName())) {
                return true;
            }
        }
        return false;
    }
  • ArrivalNode 를 순회하면서 depart와 arrive가 순서대로 나온다면 결과에 추가하는데, 혹시 더 좋은 방법 떠오르신다면 알려주세요...

RequestBody

{
	"date": "2024-11-05",
	"time": "00:00",
	"bus_type": "ALL",
	"depart": "KOREATECH",
	"arrival": "TERMINAL"	
}
  • date: 요청하는 날짜 (예: "2024-11-05").
  • time: 요청하는 시간 (예: "00:00").
  • bus_type: 요청할 버스 유형 (ALL, CITY, EXPRESS, SHUTTLE)
  • depart: 출발지 (KOREATECH, TERMINAL, STATION).
  • arrival: 도착지 ( KOREATECH, TERMINAL, STATION).

ResponseBody

{
  "depart": "KOREATECH",
  "arrival": "TERMINAL",
  "depart_date": "2024-11-05",
  "depart_time": "16:00",
  "schedule": [
    {
      "bus_type": "express",
      "route_name": "대성티앤이",
      "depart_time": "16:50"
    },
    {
      "bus_type": "city",
      "route_name": "400",
      "depart_time": "16:56"
    },
    {
      "bus_type": "city",
      "route_name": "402",
      "depart_time": "17:30"
    },
    {
      "bus_type": "shuttle",
      "route_name": "주중(20시 00분)",
      "depart_time": "20:00"
    }
  ]
}

💬 리뷰 중점사항

  • 설계, 구현 다 부족합니다ㅜ 한번씩 읽어보시고 조언 부탁드려요!

Copy link

github-actions bot commented Nov 28, 2024

Unit Test Results

339 tests   338 ✔️  1m 22s ⏱️
  41 suites      1 💤
  41 files        0

Results for commit a8646e4.

♻️ This comment has been updated with latest results.

@DHkimgit DHkimgit added Team Campus 캠퍼스 팀에서 작업할 이슈입니다 기능 새로운 기능을 개발합니다. labels Nov 28, 2024
Copy link
Contributor

@kih1015 kih1015 left a comment

Choose a reason for hiding this comment

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

PR 상세히 작성해주셔서 리뷰하기 편했습니다!

고생많이하셨어요~

Comment on lines +95 to +101
if (!foundDepart && node.getNodeName().contains(departNode.getQueryName())) {
foundDepart = true;
}

else if (foundDepart && node.getNodeName().contains(arriveNode.getQueryName())) {
return true;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

C

출발지를 찾는 로직과 도착지를 찾는 로직을 else로 엮지 않고 분리하면 조금 더 잘 읽힐 것 같습니다!

            if (!foundDepart && node.getNodeName().contains(departNode.getQueryName())) {
                foundDepart = true;
            }
            if (foundDepart && node.getNodeName().contains(arriveNode.getQueryName())) {
                return true;
            }

Copy link
Contributor

@kih1015 kih1015 Nov 29, 2024

Choose a reason for hiding this comment

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

else-if 블록이 실행되는 경우를 살펴보려면, 상위 if문의 조건과, else-if문의 조건을 모두 만족해야하기 때문에 조건을 두번 확인해야하는 수요가 생깁니다.

if 문을 한번만 사용한다면 분기를 한번만 확인하기 때문에 가독성이 높아진다고 생각합니다. 어떻게 생각하시나요?

참조: https://velog.io/@jiwon615/%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-if-else%EB%AC%B8-%EC%9A%B0%EC%95%84%ED%95%98%EA%B2%8C-%EC%A7%80%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95

@DHkimgit DHkimgit self-assigned this Nov 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Team Campus 캠퍼스 팀에서 작업할 이슈입니다 기능 새로운 기능을 개발합니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants