From bfa3cbcc03f5524f47e23db17820c6beeacb39f1 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 16:22:07 +0900 Subject: [PATCH 01/16] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 579 +++++++++++------------------------------------------- 1 file changed, 112 insertions(+), 467 deletions(-) diff --git a/README.md b/README.md index 450e7753a..ce22402a0 100644 --- a/README.md +++ b/README.md @@ -1,469 +1,114 @@ # 지하철 노선도 미션 -- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다. -
- -## 🚀 기능 요구사항 - -### 초기 설정 -- 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅할 수 있다. - -> 아래의 사전 등록 정보로 반드시 초기 설정을 하기 -> -``` - 1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다. - 2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다. - 3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점) - - 2호선: 교대역 - 강남역 - 역삼역 - - 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역 - - 신분당선: 강남역 - 양재역 - 양재시민의숲역 - ``` - - - -### 지하철 역 관련 기능 -- 지하철 역을 등록하고 삭제할 수 있다. (단, 노선에 등록된 역은 삭제할 수 없다) -- 중복된 지하철 역 이름이 등록될 수 없다. -- 지하철 역 이름은 2글자 이상이어야 한다. -- 지하철 역의 목록을 조회할 수 있다. - -### 지하철 노선 관련 기능 -- 지하철 노선을 등록하고 삭제할 수 있다. -- 중복된 지하철 노선 이름이 등록될 수 없다. -- 지하철 노선 이름은 2글자 이상이어야 한다. -- 노선 등록 시 상행 종점역과 하행 종점역을 입력받는다. -- 지하철 노선의 목록을 조회할 수 있다. - -### 지하철 구간 추가 기능 -- 지하철 노선에 구간을 추가하는 기능은 노선에 역을 추가하는 기능이라고도 할 수 있다. - - 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다. -- 하나의 역은 여러개의 노선에 추가될 수 있다. -- 역과 역 사이에 새로운 역이 추가 될 수 있다. -- 노선에서 갈래길은 생길 수 없다. - - - -### 지하철 구간 삭제 기능 -- 노선에 등록된 역을 제거할 수 있다. -- 종점을 제거할 경우 다음 역이 종점이 된다. -- 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다. - - - -### 지하철 노선에 등록된 역 조회 기능 -- 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다. - -
- -## ✍🏻 입출력 요구사항 -- `프로그래밍 실행 결과 예시`를 참고하여 입출력을 구현한다. -- 기대하는 출력 결과는 `[INFO]`를 붙여서 출력한다. 출력값의 형식은 예시와 동일하게 한다. -- 에러 발생 시 `[ERROR]`를 붙여서 출력한다. (에러의 문구는 자유롭게 작성한다.) - -### 💻 프로그래밍 실행 결과 -#### 역 관리 -``` -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 등록할 역 이름을 입력하세요. -잠실역 - -[INFO] 지하철 역이 등록되었습니다. - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -3 - -## 역 목록 -[INFO] 교대역 -[INFO] 강남역 -[INFO] 역삼역 -[INFO] 남부터미널역 -[INFO] 양재역 -[INFO] 양재시민의숲역 -[INFO] 매봉역 -[INFO] 잠실역 - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -2 - -## 삭제할 역 이름을 입력하세요. -잠실역 - -[INFO] 지하철 역이 삭제되었습니다. - -... -``` - -### 노선 관리 - -``` - -... - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -2 - -## 노선 관리 화면 -1. 노선 등록 -2. 노선 삭제 -3. 노선 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 등록할 노선 이름을 입력하세요. -1호선 - -## 등록할 노선의 상행 종점역 이름을 입력하세요. -강남역 - -## 등록할 노선의 하행 종점역 이름을 입력하세요. -잠실역 - -[INFO] 지하철 노선이 등록되었습니다. - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -2 - -## 노선 관리 화면 -1. 노선 등록 -2. 노선 삭제 -3. 노선 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -3 - -## 노선 목록 -[INFO] 2호선 -[INFO] 3호선 -[INFO] 신분당선 -[INFO] 1호선 - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -2 - -## 노선 관리 화면 -1. 노선 등록 -2. 노선 삭제 -3. 노선 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -2 - -## 삭제할 노선 이름을 입력하세요. -1호선 - -[INFO] 지하철 노선이 삭제되었습니다. - -... - -``` - -### 구간 관리 -- 순서는 1부터 시작한다. - -``` -... - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -3 - -## 구간 관리 화면 -1. 구간 등록 -2. 구간 삭제 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 노선을 입력하세요. -2호선 - -## 역이름을 입력하세요. -잠실역 - -## 순서를 입력하세요. -2 - -[INFO] 구간이 등록되었습니다. - -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -3 - -## 구간 관리 화면 -1. 구간 등록 -2. 구간 삭제 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -2 - -## 삭제할 구간의 노선을 입력하세요. -2호선 - -## 삭제할 구간의 역을 입력하세요. -잠실역 - -[INFO] 구간이 삭제되었습니다. - -... - -``` - -### 지하철 노선도 출력 - -``` -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -4 - -## 지하철 노선도 -[INFO] 2호선 -[INFO] --- -[INFO] 교대역 -[INFO] 강남역 -[INFO] 역삼역 - -[INFO] 3호선 -[INFO] --- -[INFO] 교대역 -[INFO] 남부터미널역 -[INFO] 양재역 -[INFO] 매봉역 - -[INFO] 신분당선 -[INFO] --- -[INFO] 강남역 -[INFO] 양재역 -[INFO] 양재시민의숲역 - -``` - -#### 에러 출력 예시 - -``` -## 메인 화면 -1. 역 관리 -2. 노선 관리 -3. 구간 관리 -4. 지하철 노선도 출력 -Q. 종료 - -## 원하는 기능을 선택하세요. -5 - -[ERROR] 선택할 수 없는 기능입니다. - -## 원하는 기능을 선택하세요. -1 - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. -1 - -## 등록할 역 이름을 입력하세요. -강남역 - -[ERROR] 이미 등록된 역 이름입니다. - -## 역 관리 화면 -1. 역 등록 -2. 역 삭제 -3. 역 조회 -B. 돌아가기 - -## 원하는 기능을 선택하세요. - -... - -``` - -
- -## 🎱 프로그래밍 요구사항 -- 자바 코드 컨벤션을 지키면서 프로그래밍한다. - - 기본적으로 [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html)을 원칙으로 한다. - - 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. -- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. - - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다. -- 3항 연산자를 쓰지 않는다. -- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다. - - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다. -- else 예약어를 쓰지 않는다. - - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. - - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. -- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다. -- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 `[ERROR]` 로 시작해야 한다. - -### 프로그래밍 요구사항 - Application -- Application 클래스를 활용해 구현해야 한다. -- Application의 패키지 구조는 변경하지 않는다. -```java -public class Application { - public static void main(String[] args) { - ... - } -} -``` - -### 프로그래밍 요구사항 - Station, Line -- Station, Line 클래스를 활용하여 지하철역과 노선을 구현해야 한다. -- 제공하는 각 클래스의 기본 생성자를 추가할 수 없다. -- 필드(인스턴스 변수)인 name의 접근 제어자 private을 변경할 수 없다. -- 가능하면 setter 메소드(ex. setXXX)를 추가하지 않고 구현한다. - -```java -public class Station { - private String name; - - public Station(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - // 추가 기능 구현 -} - -``` - -### 프로그래밍 요구사항 - StationRepository, LineRepository -- Station과 Line의 상태를 저장할 수 있는 StationRepository, LineRepository를 제공한다. -- 필요 시 StationRepository, LineRepository 이 외 추가로 Repository를 만들 수 있다. -- 추가로 생성되는 객체에 대해서 XXXRepository 네이밍으로 저장 클래스를 추가할 수 있다. -- 객체들의 상태를 관리하기 위해서 XXXRepository 클래스를 활용해 저장 로직을 구현해야 한다. -- 필요에 따라 자유롭게 수정이 가능하다. - -```java -public class StationRepository { - private static final List stations = new ArrayList<>(); - - public static List stations() { - return Collections.unmodifiableList(stations); - } - - public static void addStation(Station station) { - stations.add(station); - } - - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); - } -} -``` - -
- -## 📈 진행 요구사항 -- 미션은 [java-subway-map-precourse 저장소](https://github.com/woowacourse/java-subway-map-precourse) 를 fork/clone해 시작한다. -- 기능을 구현하기 전에 java-subway-map-precourse/docs/README.md 파일에 구현할 기능 목록을 정리해 추가한다. -- git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가한다. - - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. -- [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 절차를 따라 미션을 제출한다. - - [프리코스 과제 FAQ](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse/faq) 문서를 참고하여 진행할 수 있다. -
- -## 📝 License - -This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed. +## 기능 구현 목록 +> 기능 작동 순서대로 작성 + +1. 초기 역 및 노선 등록 +2. 메인 화면 출력 및 기능 선택 + - 예외 사항 + 1. 1,2,3,4,Q가 아니면 예외 발생 + - “선택할 수 없는 기능입니다.” +3. 역 관리 + 1. 역 관리 화면 출력 및 기능 선택 + - 예외 사항 + 1. 1,2,3,B가 아니면 예외 발생 + - “선택할 수 없는 기능입니다.” + 2. 역 등록 + 1. 등록할 역 이름 입력 + - 예외 사항 + - ’역’을 포함해서 2글자 미만이면 예외 발생 + - “역 이름은 2글자 이상이어야 합니다.” + - 기존에 이미 존재하는 역 이름이면 예외 발생 + - “이미 등록된 역 이름입니다.” + 2. 역 등록 후 메시지 출력 + - 지하철 역이 등록되었습니다. + 3. 역 삭제 + 1. 삭제할 역 이름 입력 + - 예외 사항 + - 존재하지 않는 역이면 예외 발생 + - “존재하지 않는 역입니다.” + - 노선에 등록된 역이면 예외 발생 + - “노선에 등록된 역은 삭제할 수 없습니다.” + 2. 역 삭제 후 메시지 출력 + - 지하철 역이 삭제되었습니다. + 4. 역 조회 + 1. 역 목록 출력 + 5. 돌아가기 + 1. 메인 화면으로 이동 +4. 노선 관리 + 1. 노선 관리 화면 출력 및 기능 선택 + - 예외 사항 + 1. 1,2,3,B가 아니면 예외 발생 + - “선택할 수 없는 기능입니다.” + 2. 노선 등록 + 1. 등록할 노선 이름 입력 + - 예외 사항 + - ’선’을 포함해서 2글자 미만이면 예외 발생 + - “노선 이름은 2글자 이상이어야 합니다.” + - 기존에 이미 존재하는 노선 이름이면 예외 발생 + - “이미 등록된 노선 이름입니다.” + 2. 등록할 노선의 상행 종점역 이름 입력 + - 예외 사항 + - 존재하지 않는 역이면 예외 발생 + - “존재하지 않는 역입니다.” + 3. 등록할 노선의 하행 종점역 이름 입력 + - 예외 사항 + - 존재하지 않는 역이면 예외 발생 + - “존재하지 않는 역입니다.” + - 상행 종점역과 같은 역이면 예외 발생 + - “하행 종점역과 같은 역입니다.” + 4. 노선 등록 후 메시지 출력 + - 지하철 노선이 등록되었습니다. + 3. 노선 삭제 + 1. 삭제할 노선 이름 입력 + - 예외 사항 + - 존재하지 않는 노선이면 예외 발생 + - “존재하지 않는 노선입니다.” + 2. 노선 삭제 후 메시지 출력 + - 지하철 노선이 삭제되었습니다. + 4. 노선 조회 + 1. 노선 목록 출력 + 5. 돌아가기 + 1. 메인 화면으로 이동 +5. 구간 관리 + 1. 구간 관리 화면 출력 및 기능 선택 + - 예외 사항 + 1. 1,2,B가 아니면 예외 발생 + - “선택할 수 없는 기능입니다.” + 2. 구간 등록 + 1. 노선 입력 + - 예외 사항 + - 존재하지 않는 노선이면 예외 발생 + - “존재하지 않는 노선입니다.” + 2. 역 입력 + - 예외 사항 + - 존재하지 않는 역이면 예외 발생 + - “존재하지 않는 역입니다.” + - 해당 노선에 이미 존재하는 역이면 예외 발생 + - “해당 노선에 이미 존재하는 역입니다.” + 3. 순서 입력 + - 예외 사항 + - 0을 입력하거나 숫자가 아니면 예외 발생 + - “1 이상의 숫자를 입력해야합니다.” + - `현재 노선의 길이 + 1` 보다 큰 순서이면 예외 발생 + - “`현재 노선의 길이 + 1`이하의 순서를 입력해야합니다.” + 4. 구간 등록 후 메시지 출력 + - 구간이 등록되었습니다. + 3. 구간 삭제 + 1. 삭제할 구간의 노선 입력 + - 예외 사항 + - 존재하지 않는 노선이면 예외 발생 + - “존재하지 않는 노선입니다.” + - 노선에 포함된 역이 두개 이하이면 예외 발생 + - “해당 노선의 역은 더이상 삭제할 수 없습니다.” + 2. 삭제할 구간의 역 입력 + - 예외 사항 + - 존재하지 않는 역이면 예외 발생 + - “존재하지 않는 역입니다.” + 3. 구간 삭제 후 메시지 출력 + - 구간이 삭제되었습니다. + 4. 돌아가기 + 1. 메인 화면으로 이동 +6. 지하철 노선도 출력 + - 노선 순서대로 역 목록 출력 +7. 종료 \ No newline at end of file From 3b1425229a3ef95894300f412f622710d5ae3884 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 17:31:09 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20=EC=B4=88=EA=B8=B0=20=EC=97=AD=20?= =?UTF-8?q?=EB=B0=8F=20=EB=85=B8=EC=84=A0=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 ++ gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/java/subway/Application.java | 15 +++- src/main/java/subway/command/Command.java | 5 ++ .../command/line/LineMenuCommandRegistry.java | 33 +++++++++ .../subway/command/line/LineMenuOption.java | 25 +++++++ .../command/line/impl/LineDeleteCommand.java | 19 ++++++ .../command/line/impl/LineQueryCommand.java | 19 ++++++ .../line/impl/LineRegistrationCommand.java | 19 ++++++ .../command/main/MainMenuCommandRegistry.java | 31 +++++++++ .../subway/command/main/MainMenuOption.java | 26 +++++++ .../subway/command/main/impl/LineCommand.java | 19 ++++++ .../command/main/impl/RouteCommand.java | 19 ++++++ .../command/main/impl/SectionCommand.java | 19 ++++++ .../command/main/impl/StationCommand.java | 19 ++++++ .../section/SectionMenuCommandRegistry.java | 27 ++++++++ .../command/section/SectionMenuOption.java | 24 +++++++ .../section/impl/SectionDeleteCommand.java | 19 ++++++ .../impl/SectionRegistrationCommand.java | 19 ++++++ .../station/StationMenuCommandRegistry.java | 30 ++++++++ .../command/station/StationMenuOption.java | 25 +++++++ .../station/impl/StationDeleteCommand.java | 19 ++++++ .../station/impl/StationQueryCommand.java | 19 ++++++ .../impl/StationRegistrationCommand.java | 19 ++++++ src/main/java/subway/constant/Constant.java | 31 +++++++++ .../java/subway/constant/ErrorMessage.java | 27 ++++++++ .../subway/controller/SubwayController.java | 68 +++++++++++++++++++ src/main/java/subway/domain/Line.java | 30 +++++++- .../java/subway/domain/LineRepository.java | 4 ++ .../java/subway/domain/RouteRepository.java | 14 ++++ src/main/java/subway/domain/Station.java | 30 +++++++- .../java/subway/domain/StationRepository.java | 11 +++ .../java/subway/service/SubwayService.java | 36 ++++++++++ src/main/java/subway/util/InputParser.java | 17 +++++ .../java/subway/util/NumberConvertor.java | 14 ++++ src/main/java/subway/util/Retry.java | 30 ++++++++ src/main/java/subway/util/Validator.java | 16 +++++ src/main/java/subway/view/InputView.java | 13 ++++ src/main/java/subway/view/OutputView.java | 26 +++++++ 39 files changed, 839 insertions(+), 5 deletions(-) create mode 100644 src/main/java/subway/command/Command.java create mode 100644 src/main/java/subway/command/line/LineMenuCommandRegistry.java create mode 100644 src/main/java/subway/command/line/LineMenuOption.java create mode 100644 src/main/java/subway/command/line/impl/LineDeleteCommand.java create mode 100644 src/main/java/subway/command/line/impl/LineQueryCommand.java create mode 100644 src/main/java/subway/command/line/impl/LineRegistrationCommand.java create mode 100644 src/main/java/subway/command/main/MainMenuCommandRegistry.java create mode 100644 src/main/java/subway/command/main/MainMenuOption.java create mode 100644 src/main/java/subway/command/main/impl/LineCommand.java create mode 100644 src/main/java/subway/command/main/impl/RouteCommand.java create mode 100644 src/main/java/subway/command/main/impl/SectionCommand.java create mode 100644 src/main/java/subway/command/main/impl/StationCommand.java create mode 100644 src/main/java/subway/command/section/SectionMenuCommandRegistry.java create mode 100644 src/main/java/subway/command/section/SectionMenuOption.java create mode 100644 src/main/java/subway/command/section/impl/SectionDeleteCommand.java create mode 100644 src/main/java/subway/command/section/impl/SectionRegistrationCommand.java create mode 100644 src/main/java/subway/command/station/StationMenuCommandRegistry.java create mode 100644 src/main/java/subway/command/station/StationMenuOption.java create mode 100644 src/main/java/subway/command/station/impl/StationDeleteCommand.java create mode 100644 src/main/java/subway/command/station/impl/StationQueryCommand.java create mode 100644 src/main/java/subway/command/station/impl/StationRegistrationCommand.java create mode 100644 src/main/java/subway/constant/Constant.java create mode 100644 src/main/java/subway/constant/ErrorMessage.java create mode 100644 src/main/java/subway/controller/SubwayController.java create mode 100644 src/main/java/subway/domain/RouteRepository.java create mode 100644 src/main/java/subway/service/SubwayService.java create mode 100644 src/main/java/subway/util/InputParser.java create mode 100644 src/main/java/subway/util/NumberConvertor.java create mode 100644 src/main/java/subway/util/Retry.java create mode 100644 src/main/java/subway/util/Validator.java create mode 100644 src/main/java/subway/view/InputView.java create mode 100644 src/main/java/subway/view/OutputView.java diff --git a/build.gradle b/build.gradle index d226001ca..3de213d33 100644 --- a/build.gradle +++ b/build.gradle @@ -18,3 +18,9 @@ dependencies { test { useJUnitPlatform() } + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dcf98e9d0..8c06312e5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists \ No newline at end of file diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index 0bcf786cc..fd3133245 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -1,10 +1,21 @@ package subway; import java.util.Scanner; +import subway.command.line.LineMenuCommandRegistry; +import subway.command.main.MainMenuCommandRegistry; +import subway.command.section.SectionMenuCommandRegistry; +import subway.command.station.StationMenuCommandRegistry; +import subway.controller.SubwayController; +import subway.service.SubwayService; public class Application { public static void main(String[] args) { - final Scanner scanner = new Scanner(System.in); - // TODO: 프로그램 구현 + SubwayService service = new SubwayService(); + MainMenuCommandRegistry mainRegistry = MainMenuCommandRegistry.from(service); + StationMenuCommandRegistry stationRegistry = StationMenuCommandRegistry.from(service); + LineMenuCommandRegistry lineRegistry = LineMenuCommandRegistry.from(service); + SectionMenuCommandRegistry sectionRegistry = SectionMenuCommandRegistry.from(service); + SubwayController controller = new SubwayController(mainRegistry, stationRegistry, lineRegistry, sectionRegistry, service); + controller.run(); } } diff --git a/src/main/java/subway/command/Command.java b/src/main/java/subway/command/Command.java new file mode 100644 index 000000000..a25f0a800 --- /dev/null +++ b/src/main/java/subway/command/Command.java @@ -0,0 +1,5 @@ +package subway.command; + +public interface Command { + void execute(); +} diff --git a/src/main/java/subway/command/line/LineMenuCommandRegistry.java b/src/main/java/subway/command/line/LineMenuCommandRegistry.java new file mode 100644 index 000000000..0695173b7 --- /dev/null +++ b/src/main/java/subway/command/line/LineMenuCommandRegistry.java @@ -0,0 +1,33 @@ +package subway.command.line; + +import java.util.EnumMap; +import subway.command.Command; +import subway.command.line.impl.LineDeleteCommand; +import subway.command.line.impl.LineQueryCommand; +import subway.command.line.impl.LineRegistrationCommand; +import subway.command.main.impl.LineCommand; +import subway.command.main.impl.RouteCommand; +import subway.command.main.impl.SectionCommand; +import subway.command.main.impl.StationCommand; +import subway.service.SubwayService; + +public class LineMenuCommandRegistry { + + private final EnumMap commands; + + private LineMenuCommandRegistry(EnumMap commands) { + this.commands = commands; + } + + public static LineMenuCommandRegistry from(SubwayService service) { + EnumMap map = new EnumMap<>(LineMenuOption.class); + map.put(LineMenuOption.A, new LineRegistrationCommand(service)); + map.put(LineMenuOption.B, new LineDeleteCommand(service)); + map.put(LineMenuOption.C, new LineQueryCommand(service)); + return new LineMenuCommandRegistry(map); + } + + public void execute(LineMenuOption option) { + commands.get(option).execute(); + } +} diff --git a/src/main/java/subway/command/line/LineMenuOption.java b/src/main/java/subway/command/line/LineMenuOption.java new file mode 100644 index 000000000..54a404d84 --- /dev/null +++ b/src/main/java/subway/command/line/LineMenuOption.java @@ -0,0 +1,25 @@ +package subway.command.line; + +import java.util.Arrays; +import subway.constant.ErrorMessage; + +public enum LineMenuOption { + A("1"), + B("2"), + C("3"), + BACK("B"); + + private final String code; + + LineMenuOption(String code) { + this.code = code; + } + + public static LineMenuOption from(String command) { + String normalized = command.trim(); + return Arrays.stream(values()) + .filter(opt -> opt.code.equals(normalized)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_OPTION.getErrorMessage())); + } +} diff --git a/src/main/java/subway/command/line/impl/LineDeleteCommand.java b/src/main/java/subway/command/line/impl/LineDeleteCommand.java new file mode 100644 index 000000000..b8ea0d1d3 --- /dev/null +++ b/src/main/java/subway/command/line/impl/LineDeleteCommand.java @@ -0,0 +1,19 @@ +package subway.command.line.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class LineDeleteCommand implements Command { + + private final SubwayService service; + + public LineDeleteCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/line/impl/LineQueryCommand.java b/src/main/java/subway/command/line/impl/LineQueryCommand.java new file mode 100644 index 000000000..6ec812ce4 --- /dev/null +++ b/src/main/java/subway/command/line/impl/LineQueryCommand.java @@ -0,0 +1,19 @@ +package subway.command.line.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class LineQueryCommand implements Command { + + private final SubwayService service; + + public LineQueryCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/line/impl/LineRegistrationCommand.java b/src/main/java/subway/command/line/impl/LineRegistrationCommand.java new file mode 100644 index 000000000..8713b5a14 --- /dev/null +++ b/src/main/java/subway/command/line/impl/LineRegistrationCommand.java @@ -0,0 +1,19 @@ +package subway.command.line.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class LineRegistrationCommand implements Command { + + private final SubwayService service; + + public LineRegistrationCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/main/MainMenuCommandRegistry.java b/src/main/java/subway/command/main/MainMenuCommandRegistry.java new file mode 100644 index 000000000..c2f32bfcb --- /dev/null +++ b/src/main/java/subway/command/main/MainMenuCommandRegistry.java @@ -0,0 +1,31 @@ +package subway.command.main; + +import java.util.EnumMap; +import subway.command.Command; +import subway.command.main.impl.LineCommand; +import subway.command.main.impl.RouteCommand; +import subway.command.main.impl.SectionCommand; +import subway.command.main.impl.StationCommand; +import subway.service.SubwayService; + +public class MainMenuCommandRegistry { + + private final EnumMap commands; + + private MainMenuCommandRegistry(EnumMap commands) { + this.commands = commands; + } + + public static MainMenuCommandRegistry from(SubwayService service) { + EnumMap map = new EnumMap<>(MainMenuOption.class); + map.put(MainMenuOption.A, new StationCommand(service)); + map.put(MainMenuOption.B, new LineCommand(service)); + map.put(MainMenuOption.C, new SectionCommand(service)); + map.put(MainMenuOption.D, new RouteCommand(service)); + return new MainMenuCommandRegistry(map); + } + + public void execute(MainMenuOption option) { + commands.get(option).execute(); + } +} diff --git a/src/main/java/subway/command/main/MainMenuOption.java b/src/main/java/subway/command/main/MainMenuOption.java new file mode 100644 index 000000000..1eda65b28 --- /dev/null +++ b/src/main/java/subway/command/main/MainMenuOption.java @@ -0,0 +1,26 @@ +package subway.command.main; + +import java.util.Arrays; +import subway.constant.ErrorMessage; + +public enum MainMenuOption { + A("1"), + B("2"), + C("3"), + D("4"), + QUIT("Q"); + + private final String code; + + MainMenuOption(String code) { + this.code = code; + } + + public static MainMenuOption from(String command) { + String normalized = command.trim(); + return Arrays.stream(values()) + .filter(opt -> opt.code.equals(normalized)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_OPTION.getErrorMessage())); + } +} diff --git a/src/main/java/subway/command/main/impl/LineCommand.java b/src/main/java/subway/command/main/impl/LineCommand.java new file mode 100644 index 000000000..aa5b4bba7 --- /dev/null +++ b/src/main/java/subway/command/main/impl/LineCommand.java @@ -0,0 +1,19 @@ +package subway.command.main.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class LineCommand implements Command { + + private final SubwayService service; + + public LineCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/main/impl/RouteCommand.java b/src/main/java/subway/command/main/impl/RouteCommand.java new file mode 100644 index 000000000..d8bb558b5 --- /dev/null +++ b/src/main/java/subway/command/main/impl/RouteCommand.java @@ -0,0 +1,19 @@ +package subway.command.main.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class RouteCommand implements Command { + + private final SubwayService service; + + public RouteCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/main/impl/SectionCommand.java b/src/main/java/subway/command/main/impl/SectionCommand.java new file mode 100644 index 000000000..dce2a5d49 --- /dev/null +++ b/src/main/java/subway/command/main/impl/SectionCommand.java @@ -0,0 +1,19 @@ +package subway.command.main.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class SectionCommand implements Command { + + private final SubwayService service; + + public SectionCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/main/impl/StationCommand.java b/src/main/java/subway/command/main/impl/StationCommand.java new file mode 100644 index 000000000..12a1509a3 --- /dev/null +++ b/src/main/java/subway/command/main/impl/StationCommand.java @@ -0,0 +1,19 @@ +package subway.command.main.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class StationCommand implements Command { + + private final SubwayService service; + + public StationCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/section/SectionMenuCommandRegistry.java b/src/main/java/subway/command/section/SectionMenuCommandRegistry.java new file mode 100644 index 000000000..178a38c30 --- /dev/null +++ b/src/main/java/subway/command/section/SectionMenuCommandRegistry.java @@ -0,0 +1,27 @@ +package subway.command.section; + +import java.util.EnumMap; +import subway.command.Command; +import subway.command.section.impl.SectionDeleteCommand; +import subway.command.section.impl.SectionRegistrationCommand; +import subway.service.SubwayService; + +public class SectionMenuCommandRegistry { + + private final EnumMap commands; + + private SectionMenuCommandRegistry(EnumMap commands) { + this.commands = commands; + } + + public static SectionMenuCommandRegistry from(SubwayService service) { + EnumMap map = new EnumMap<>(SectionMenuOption.class); + map.put(SectionMenuOption.A, new SectionRegistrationCommand(service)); + map.put(SectionMenuOption.B, new SectionDeleteCommand(service)); + return new SectionMenuCommandRegistry(map); + } + + public void execute(SectionMenuOption option) { + commands.get(option).execute(); + } +} diff --git a/src/main/java/subway/command/section/SectionMenuOption.java b/src/main/java/subway/command/section/SectionMenuOption.java new file mode 100644 index 000000000..caba82f08 --- /dev/null +++ b/src/main/java/subway/command/section/SectionMenuOption.java @@ -0,0 +1,24 @@ +package subway.command.section; + +import java.util.Arrays; +import subway.constant.ErrorMessage; + +public enum SectionMenuOption { + A("1"), + B("2"), + BACK("B"); + + private final String code; + + SectionMenuOption(String code) { + this.code = code; + } + + public static SectionMenuOption from(String command) { + String normalized = command.trim(); + return Arrays.stream(values()) + .filter(opt -> opt.code.equals(normalized)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_OPTION.getErrorMessage())); + } +} diff --git a/src/main/java/subway/command/section/impl/SectionDeleteCommand.java b/src/main/java/subway/command/section/impl/SectionDeleteCommand.java new file mode 100644 index 000000000..c56d8f008 --- /dev/null +++ b/src/main/java/subway/command/section/impl/SectionDeleteCommand.java @@ -0,0 +1,19 @@ +package subway.command.section.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class SectionDeleteCommand implements Command { + + private final SubwayService service; + + public SectionDeleteCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/section/impl/SectionRegistrationCommand.java b/src/main/java/subway/command/section/impl/SectionRegistrationCommand.java new file mode 100644 index 000000000..9475ef7ac --- /dev/null +++ b/src/main/java/subway/command/section/impl/SectionRegistrationCommand.java @@ -0,0 +1,19 @@ +package subway.command.section.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class SectionRegistrationCommand implements Command { + + private final SubwayService service; + + public SectionRegistrationCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/station/StationMenuCommandRegistry.java b/src/main/java/subway/command/station/StationMenuCommandRegistry.java new file mode 100644 index 000000000..67217a53b --- /dev/null +++ b/src/main/java/subway/command/station/StationMenuCommandRegistry.java @@ -0,0 +1,30 @@ +package subway.command.station; + +import java.util.EnumMap; +import subway.command.Command; +import subway.command.main.impl.StationCommand; +import subway.command.station.impl.StationDeleteCommand; +import subway.command.station.impl.StationQueryCommand; +import subway.command.station.impl.StationRegistrationCommand; +import subway.service.SubwayService; + +public class StationMenuCommandRegistry { + + private final EnumMap commands; + + private StationMenuCommandRegistry(EnumMap commands) { + this.commands = commands; + } + + public static StationMenuCommandRegistry from(SubwayService service) { + EnumMap map = new EnumMap<>(StationMenuOption.class); + map.put(StationMenuOption.A, new StationRegistrationCommand(service)); + map.put(StationMenuOption.B, new StationDeleteCommand(service)); + map.put(StationMenuOption.C, new StationQueryCommand(service)); + return new StationMenuCommandRegistry(map); + } + + public void execute(StationMenuOption option) { + commands.get(option).execute(); + } +} diff --git a/src/main/java/subway/command/station/StationMenuOption.java b/src/main/java/subway/command/station/StationMenuOption.java new file mode 100644 index 000000000..6c57dec78 --- /dev/null +++ b/src/main/java/subway/command/station/StationMenuOption.java @@ -0,0 +1,25 @@ +package subway.command.station; + +import java.util.Arrays; +import subway.constant.ErrorMessage; + +public enum StationMenuOption { + A("1"), + B("2"), + C("3"), + BACK("B"); + + private final String code; + + StationMenuOption(String code) { + this.code = code; + } + + public static StationMenuOption from(String command) { + String normalized = command.trim(); + return Arrays.stream(values()) + .filter(opt -> opt.code.equals(normalized)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.INVALID_OPTION.getErrorMessage())); + } +} diff --git a/src/main/java/subway/command/station/impl/StationDeleteCommand.java b/src/main/java/subway/command/station/impl/StationDeleteCommand.java new file mode 100644 index 000000000..fa58d7f94 --- /dev/null +++ b/src/main/java/subway/command/station/impl/StationDeleteCommand.java @@ -0,0 +1,19 @@ +package subway.command.station.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class StationDeleteCommand implements Command { + + private final SubwayService service; + + public StationDeleteCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/station/impl/StationQueryCommand.java b/src/main/java/subway/command/station/impl/StationQueryCommand.java new file mode 100644 index 000000000..fdaeb05f8 --- /dev/null +++ b/src/main/java/subway/command/station/impl/StationQueryCommand.java @@ -0,0 +1,19 @@ +package subway.command.station.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class StationQueryCommand implements Command { + + private final SubwayService service; + + public StationQueryCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/command/station/impl/StationRegistrationCommand.java b/src/main/java/subway/command/station/impl/StationRegistrationCommand.java new file mode 100644 index 000000000..c23ac46d8 --- /dev/null +++ b/src/main/java/subway/command/station/impl/StationRegistrationCommand.java @@ -0,0 +1,19 @@ +package subway.command.station.impl; + +import subway.command.Command; +import subway.service.SubwayService; +import subway.view.OutputView; + +public class StationRegistrationCommand implements Command { + + private final SubwayService service; + + public StationRegistrationCommand(SubwayService service) { + this.service = service; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/subway/constant/Constant.java b/src/main/java/subway/constant/Constant.java new file mode 100644 index 000000000..8b22ac91c --- /dev/null +++ b/src/main/java/subway/constant/Constant.java @@ -0,0 +1,31 @@ +package subway.constant; + +import java.util.Arrays; + +public enum Constant { + + NAME(1, ""), + ; + + private final int x1; + private final String x2; + + Constant(int x1, String x2) { + this.x1 = x1; + this.x2 = x2; + } + + /*public static Constant fromX1(int x1) { + return Arrays.stream(values()) + .filter(constant -> constant.x1 == x1) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage..getErrorMessage())); + } + + public static Constant fromX2(String x2) { + return Arrays.stream(values()) + .filter(constant -> constant.x2.equals(x2)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage..getErrorMessage())); + }*/ +} diff --git a/src/main/java/subway/constant/ErrorMessage.java b/src/main/java/subway/constant/ErrorMessage.java new file mode 100644 index 000000000..955161bd3 --- /dev/null +++ b/src/main/java/subway/constant/ErrorMessage.java @@ -0,0 +1,27 @@ +package subway.constant; + +public enum ErrorMessage { + + NUMBER_FORMAT_ERROR("숫자를 입려해야 합니다."), + + INVALID_OPTION("선택할 수 없는 기능입니다."), + + STATION_NAME_SIZE_ERROR("역 이름은 2글자 이상이어야 합니다."), + ALREADY_EXIST_STATION("이미 등록된 역 이름입니다."), + NO_EXIST_STATION("존재하지 않는 역입니다."), + + LINE_NAME_SIZE_ERROR("노선 이름은 2글자 이상이어야 합니다."), + ALREADY_EXIST_LINE("이미 등록된 노선 이름입니다"), + NO_EXIST_LINE("존재하지 않는 노선입니다."); + + private static final String ERROR_MESSAGE_PREFIX = "[ERROR] "; + private final String errorMessage; + + ErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public String getErrorMessage(Object... args) { + return ERROR_MESSAGE_PREFIX + String.format(errorMessage, args); + } +} diff --git a/src/main/java/subway/controller/SubwayController.java b/src/main/java/subway/controller/SubwayController.java new file mode 100644 index 000000000..286af6ea5 --- /dev/null +++ b/src/main/java/subway/controller/SubwayController.java @@ -0,0 +1,68 @@ +package subway.controller; + +import java.util.List; +import java.util.Map; +import subway.command.line.LineMenuCommandRegistry; +import subway.command.main.MainMenuCommandRegistry; +import subway.command.main.MainMenuOption; +import subway.command.section.SectionMenuCommandRegistry; +import subway.command.station.StationMenuCommandRegistry; +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.Station; +import subway.domain.StationRepository; +import subway.service.SubwayService; +import subway.util.Retry; +import subway.view.InputView; + +public class SubwayController { + + private final MainMenuCommandRegistry mainRegistry; + private final StationMenuCommandRegistry stationRegistry; + private final LineMenuCommandRegistry lineRegistry; + private final SectionMenuCommandRegistry sectionRegistry; + private final SubwayService service; + + public SubwayController(MainMenuCommandRegistry mainRegistry, StationMenuCommandRegistry stationRegistry, + LineMenuCommandRegistry lineRegistry, SectionMenuCommandRegistry sectionRegistry, + SubwayService service) { + this.mainRegistry = mainRegistry; + this.stationRegistry = stationRegistry; + this.lineRegistry = lineRegistry; + this.sectionRegistry = sectionRegistry; + this.service = service; + } + + public void run() { + setInit(); + + while (true) { + MainMenuOption option = readMainOption(); + + if (option.equals(MainMenuOption.QUIT)) { + return; + } + + mainRegistry.execute(option); + } + } + + private MainMenuOption readMainOption() { + return Retry.retryUntilSuccess(() -> { + String selection = InputView.readMenuSelection(); + return MainMenuOption.from(selection); + }); + } + + private void setInit() { + List stations = List.of("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"); + Map> lines = Map.of( + "2호선", List.of("교대역", "강남역", "역삼역"), + "3호선", List.of("교대역", "남부터미널역", "양재역", "매봉역"), + "신분당선", List.of("강남역", "양재역", "양재시민의숲역") + ); + + service.setStations(stations); + service.setLines(lines); + } +} diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index f4d738d5a..6dd90cd6f 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -1,15 +1,43 @@ package subway.domain; +import java.util.Objects; +import subway.constant.ErrorMessage; + public class Line { - private String name; + private final String name; public Line(String name) { this.name = name; } + public static Line from(String name) { + validate(name); + return new Line(name); + } + + private static void validate(String name) { + if (name.length() < 2) { + throw new IllegalArgumentException(ErrorMessage.LINE_NAME_SIZE_ERROR.getErrorMessage()); + } + } + public String getName() { return name; } // 추가 기능 구현 + + @Override + public boolean equals(Object object) { + if (object == null || getClass() != object.getClass()) { + return false; + } + Line line = (Line) object; + return Objects.equals(name, line.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } } diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 49132ddb6..37e75ca40 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import subway.constant.ErrorMessage; public class LineRepository { private static final List lines = new ArrayList<>(); @@ -13,6 +14,9 @@ public static List lines() { } public static void addLine(Line line) { + if (lines().contains(line)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_LINE.getErrorMessage()); + } lines.add(line); } diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java new file mode 100644 index 000000000..246a7a4dd --- /dev/null +++ b/src/main/java/subway/domain/RouteRepository.java @@ -0,0 +1,14 @@ +package subway.domain; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RouteRepository { + + private static final Map> routes = new HashMap<>(); + + public static void addLine(Line line, List stations) { + routes.put(line, stations); + } +} diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index bdb142590..aba86cc53 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -1,15 +1,43 @@ package subway.domain; +import java.util.Objects; +import subway.constant.ErrorMessage; + public class Station { - private String name; + private final String name; public Station(String name) { this.name = name; } + public static Station from(String name) { + validate(name); + return new Station(name); + } + + private static void validate(String name) { + if (name.length() < 2) { + throw new IllegalArgumentException(ErrorMessage.STATION_NAME_SIZE_ERROR.getErrorMessage()); + } + } + public String getName() { return name; } // 추가 기능 구현 + + @Override + public boolean equals(Object object) { + if (object == null || getClass() != object.getClass()) { + return false; + } + Station station = (Station) object; + return Objects.equals(name, station.name); + } + + @Override + public int hashCode() { + return Objects.hashCode(name); + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index b7245c0f3..e4bd227e9 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -4,6 +4,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import subway.constant.ErrorMessage; public class StationRepository { private static final List stations = new ArrayList<>(); @@ -13,10 +14,20 @@ public static List stations() { } public static void addStation(Station station) { + if (stations.contains(station)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION.getErrorMessage()); + } stations.add(station); } public static boolean deleteStation(String name) { return stations.removeIf(station -> Objects.equals(station.getName(), name)); } + + public static Station getStation(String stationName) { + return stations.stream() + .filter(station -> station.getName().equals(stationName)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.NO_EXIST_STATION.getErrorMessage())); + } } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java new file mode 100644 index 000000000..c9b2cc5b8 --- /dev/null +++ b/src/main/java/subway/service/SubwayService.java @@ -0,0 +1,36 @@ +package subway.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import subway.domain.Line; +import subway.domain.LineRepository; +import subway.domain.RouteRepository; +import subway.domain.Station; +import subway.domain.StationRepository; + +public class SubwayService { + + public void setStations(List stations) { + for (String stationName : stations) { + StationRepository.addStation(Station.from(stationName)); + } + } + + public void setLines(Map> lines) { + for (String lineName : lines.keySet()) { + Line line = Line.from(lineName); + LineRepository.addLine(line); + + List stations = new ArrayList<>(); + for (String stationName : lines.get(lineName)) { + stations.add(StationRepository.getStation(stationName)); + } + RouteRepository.addLine(line, stations); + } + } + + // 도메인 객체 인스턴스 변수로 저장 + + // 메서드 +} diff --git a/src/main/java/subway/util/InputParser.java b/src/main/java/subway/util/InputParser.java new file mode 100644 index 000000000..cd8a8572d --- /dev/null +++ b/src/main/java/subway/util/InputParser.java @@ -0,0 +1,17 @@ +package subway.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +public final class InputParser { + + private InputParser() { + } + + public static Integer parseXxx(String rawInput) { + rawInput = rawInput.strip(); + + return NumberConvertor.convertToNumber(rawInput); + } +} diff --git a/src/main/java/subway/util/NumberConvertor.java b/src/main/java/subway/util/NumberConvertor.java new file mode 100644 index 000000000..2a40d6d4a --- /dev/null +++ b/src/main/java/subway/util/NumberConvertor.java @@ -0,0 +1,14 @@ +package subway.util; + +import subway.constant.ErrorMessage; + +public final class NumberConvertor { + + public static Integer convertToNumber(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(ErrorMessage.NUMBER_FORMAT_ERROR.getErrorMessage()); + } + } +} diff --git a/src/main/java/subway/util/Retry.java b/src/main/java/subway/util/Retry.java new file mode 100644 index 000000000..a20c019af --- /dev/null +++ b/src/main/java/subway/util/Retry.java @@ -0,0 +1,30 @@ +package subway.util; + +import java.util.function.Supplier; +import subway.view.OutputView; + +public final class Retry { + + private Retry() {} + + public static T retryUntilSuccess(Supplier action) { + while (true) { + try { + return action.get(); + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e); + } + } + } + + public static void retryUntilSuccess(Runnable action) { + while (true) { + try { + action.run(); + return; + } catch (IllegalArgumentException e) { + OutputView.printErrorMessage(e); + } + } + } +} diff --git a/src/main/java/subway/util/Validator.java b/src/main/java/subway/util/Validator.java new file mode 100644 index 000000000..231f252d0 --- /dev/null +++ b/src/main/java/subway/util/Validator.java @@ -0,0 +1,16 @@ +package subway.util; + +public final class Validator { + + private static final String NUMBER_FORMAT = "\\d+"; + + private Validator() {} + + public static void validateXxx(String input) { + input = input.strip(); + } + + public static void validateCsvFormat(String input) { + input = input.strip(); + } +} diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java new file mode 100644 index 000000000..3d0c9969c --- /dev/null +++ b/src/main/java/subway/view/InputView.java @@ -0,0 +1,13 @@ +package subway.view; + +import java.util.Scanner; + +public class InputView { + + private static final Scanner scanner = new Scanner(System.in); + + public static String readMenuSelection() { + System.out.println("## 원하는 기능을 선택하세요."); + return scanner.nextLine(); + } +} diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java new file mode 100644 index 000000000..198acaccb --- /dev/null +++ b/src/main/java/subway/view/OutputView.java @@ -0,0 +1,26 @@ +package subway.view; + +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +public class OutputView { + + private OutputView() { + } + + public static void printRegistration() { + + } + + public static void printDelete() { + + } + + public static void printQuery() { + + } + + public static void printErrorMessage(IllegalArgumentException e) { + System.out.println(e.getMessage()); + } +} From b3bc76dbe49a56a4fa8681b21d7d57658d79f341 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 17:34:49 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=84=A0=ED=83=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/controller/SubwayController.java | 6 +-- src/main/java/subway/view/InputView.java | 37 ++++++++++++++++++- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/controller/SubwayController.java b/src/main/java/subway/controller/SubwayController.java index 286af6ea5..638b0376f 100644 --- a/src/main/java/subway/controller/SubwayController.java +++ b/src/main/java/subway/controller/SubwayController.java @@ -7,10 +7,6 @@ import subway.command.main.MainMenuOption; import subway.command.section.SectionMenuCommandRegistry; import subway.command.station.StationMenuCommandRegistry; -import subway.domain.Line; -import subway.domain.LineRepository; -import subway.domain.Station; -import subway.domain.StationRepository; import subway.service.SubwayService; import subway.util.Retry; import subway.view.InputView; @@ -49,7 +45,7 @@ public void run() { private MainMenuOption readMainOption() { return Retry.retryUntilSuccess(() -> { - String selection = InputView.readMenuSelection(); + String selection = InputView.readMainMenuSelection(); return MainMenuOption.from(selection); }); } diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 3d0c9969c..aef1a40af 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -6,7 +6,42 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); - public static String readMenuSelection() { + public static String readMainMenuSelection() { + System.out.println("## 메인 화면\n" + + "1. 역 관리\n" + + "2. 노선 관리\n" + + "3. 구간 관리\n" + + "4. 지하철 노선도 출력\n" + + "Q. 종료\n"); + System.out.println("## 원하는 기능을 선택하세요."); + return scanner.nextLine(); + } + + public static String readStationMenuSelection() { + System.out.println("## 역 관리 화면\n" + + "1. 역 등록\n" + + "2. 역 삭제\n" + + "3. 역 조회\n" + + "B. 돌아가기\n"); + System.out.println("## 원하는 기능을 선택하세요."); + return scanner.nextLine(); + } + + public static String readLineMenuSelection() { + System.out.println("## 노선 관리 화면\n" + + "1. 노선 등록\n" + + "2. 노선 삭제\n" + + "3. 노선 조회\n" + + "B. 돌아가기\n"); + System.out.println("## 원하는 기능을 선택하세요."); + return scanner.nextLine(); + } + + public static String readSectionMenuSelection() { + System.out.println("## 구간 관리 화면\n" + + "1. 구간 등록\n" + + "2. 구간 삭제\n" + + "B. 돌아가기\n"); System.out.println("## 원하는 기능을 선택하세요."); return scanner.nextLine(); } From 29367b708b91818115b527d243512be7765069be Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 17:52:23 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20=EC=97=AD=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/main/impl/StationCommand.java | 25 ++++++++++++++++ .../java/subway/constant/ErrorMessage.java | 4 ++- .../java/subway/service/SubwayService.java | 4 +++ src/main/java/subway/util/InputParser.java | 7 +++-- src/main/java/subway/util/Validator.java | 19 +++++++++++- src/main/java/subway/view/InputView.java | 29 +++++++++++-------- src/main/java/subway/view/OutputView.java | 4 +-- 7 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/main/java/subway/command/main/impl/StationCommand.java b/src/main/java/subway/command/main/impl/StationCommand.java index 12a1509a3..cac2c2e45 100644 --- a/src/main/java/subway/command/main/impl/StationCommand.java +++ b/src/main/java/subway/command/main/impl/StationCommand.java @@ -1,11 +1,17 @@ package subway.command.main.impl; import subway.command.Command; +import subway.command.station.StationMenuOption; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class StationCommand implements Command { + private static final String STATION = "지하철 역"; + private final SubwayService service; public StationCommand(SubwayService service) { @@ -14,6 +20,25 @@ public StationCommand(SubwayService service) { @Override public void execute() { + StationMenuOption option = getOption(); + + if (option.equals(StationMenuOption.BACK)) { + return; + } + + Retry.retryUntilSuccess(() -> { + String readStation = InputView.readStationForRegistration(); + String stationName = InputParser.parseStation(readStation); + service.registerStation(stationName); + }); + + OutputView.printRegistration(STATION); + } + private static StationMenuOption getOption() { + return Retry.retryUntilSuccess(() -> { + String selection = InputView.readStationMenuSelection(); + return StationMenuOption.from(selection); + }); } } diff --git a/src/main/java/subway/constant/ErrorMessage.java b/src/main/java/subway/constant/ErrorMessage.java index 955161bd3..b6d46badd 100644 --- a/src/main/java/subway/constant/ErrorMessage.java +++ b/src/main/java/subway/constant/ErrorMessage.java @@ -9,10 +9,12 @@ public enum ErrorMessage { STATION_NAME_SIZE_ERROR("역 이름은 2글자 이상이어야 합니다."), ALREADY_EXIST_STATION("이미 등록된 역 이름입니다."), NO_EXIST_STATION("존재하지 않는 역입니다."), + STATION_FORMAT_ERROR("역 이름은 \"역\"으로 끝나야 합니다."), LINE_NAME_SIZE_ERROR("노선 이름은 2글자 이상이어야 합니다."), ALREADY_EXIST_LINE("이미 등록된 노선 이름입니다"), - NO_EXIST_LINE("존재하지 않는 노선입니다."); + NO_EXIST_LINE("존재하지 않는 노선입니다."), + LINE_FORMAT_ERROR("노선 이름은 \"선\"으로 끝나야 합니다."); private static final String ERROR_MESSAGE_PREFIX = "[ERROR] "; private final String errorMessage; diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index c9b2cc5b8..687187945 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -30,6 +30,10 @@ public void setLines(Map> lines) { } } + public void registerStation(String stationName) { + StationRepository.addStation(Station.from(stationName)); + } + // 도메인 객체 인스턴스 변수로 저장 // 메서드 diff --git a/src/main/java/subway/util/InputParser.java b/src/main/java/subway/util/InputParser.java index cd8a8572d..10d925b96 100644 --- a/src/main/java/subway/util/InputParser.java +++ b/src/main/java/subway/util/InputParser.java @@ -9,9 +9,10 @@ public final class InputParser { private InputParser() { } - public static Integer parseXxx(String rawInput) { - rawInput = rawInput.strip(); + public static String parseStation(String station) { + station = station.strip(); - return NumberConvertor.convertToNumber(rawInput); + Validator.validateStationFormat(station); + return station; } } diff --git a/src/main/java/subway/util/Validator.java b/src/main/java/subway/util/Validator.java index 231f252d0..9b4b27884 100644 --- a/src/main/java/subway/util/Validator.java +++ b/src/main/java/subway/util/Validator.java @@ -1,10 +1,15 @@ package subway.util; +import subway.constant.ErrorMessage; + public final class Validator { private static final String NUMBER_FORMAT = "\\d+"; + private static final String STATION_FORMAT = ".*역$"; + private static final String LINE_FORMAT = ".*선$"; - private Validator() {} + private Validator() { + } public static void validateXxx(String input) { input = input.strip(); @@ -13,4 +18,16 @@ public static void validateXxx(String input) { public static void validateCsvFormat(String input) { input = input.strip(); } + + public static void validateStationFormat(String station) { + if (!station.matches(STATION_FORMAT)) { + throw new IllegalArgumentException(ErrorMessage.STATION_FORMAT_ERROR.getErrorMessage()); + } + } + + public static void validateLineFormat(String line) { + if (!line.matches(LINE_FORMAT)) { + throw new IllegalArgumentException(ErrorMessage.LINE_FORMAT_ERROR.getErrorMessage()); + } + } } diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index aef1a40af..5964abdb2 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -7,42 +7,47 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); public static String readMainMenuSelection() { - System.out.println("## 메인 화면\n" + System.out.println("\n## 메인 화면\n" + "1. 역 관리\n" + "2. 노선 관리\n" + "3. 구간 관리\n" + "4. 지하철 노선도 출력\n" - + "Q. 종료\n"); - System.out.println("## 원하는 기능을 선택하세요."); + + "Q. 종료"); + System.out.println("\n## 원하는 기능을 선택하세요."); return scanner.nextLine(); } public static String readStationMenuSelection() { - System.out.println("## 역 관리 화면\n" + System.out.println("\n## 역 관리 화면\n" + "1. 역 등록\n" + "2. 역 삭제\n" + "3. 역 조회\n" - + "B. 돌아가기\n"); - System.out.println("## 원하는 기능을 선택하세요."); + + "B. 돌아가기"); + System.out.println("\n## 원하는 기능을 선택하세요."); return scanner.nextLine(); } public static String readLineMenuSelection() { - System.out.println("## 노선 관리 화면\n" + System.out.println("\n## 노선 관리 화면\n" + "1. 노선 등록\n" + "2. 노선 삭제\n" + "3. 노선 조회\n" - + "B. 돌아가기\n"); - System.out.println("## 원하는 기능을 선택하세요."); + + "B. 돌아가기"); + System.out.println("\n## 원하는 기능을 선택하세요."); return scanner.nextLine(); } public static String readSectionMenuSelection() { - System.out.println("## 구간 관리 화면\n" + System.out.println("\n## 구간 관리 화면\n" + "1. 구간 등록\n" + "2. 구간 삭제\n" - + "B. 돌아가기\n"); - System.out.println("## 원하는 기능을 선택하세요."); + + "B. 돌아가기"); + System.out.println("\n## 원하는 기능을 선택하세요."); + return scanner.nextLine(); + } + + public static String readStationForRegistration() { + System.out.println("\n## 등록할 역 이름을 입력하세요."); return scanner.nextLine(); } } diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java index 198acaccb..809244a52 100644 --- a/src/main/java/subway/view/OutputView.java +++ b/src/main/java/subway/view/OutputView.java @@ -8,8 +8,8 @@ public class OutputView { private OutputView() { } - public static void printRegistration() { - + public static void printRegistration(String name) { + System.out.printf("\n[INFO] %s이 등록되었습니다.\n", name); } public static void printDelete() { From f70d66085e92b084c4e9c9c5349ffe188fa5fa40 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 18:02:25 +0900 Subject: [PATCH 05/16] =?UTF-8?q?refactor:=20=EC=97=AD=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/Application.java | 4 +-- .../command/main/MainMenuCommandRegistry.java | 13 ++++++--- .../subway/command/main/impl/LineCommand.java | 5 +++- .../command/main/impl/SectionCommand.java | 5 +++- .../command/main/impl/StationCommand.java | 18 ++++-------- .../impl/StationRegistrationCommand.java | 10 +++++++ src/main/java/subway/constant/Constant.java | 28 ++++++------------- .../subway/controller/SubwayController.java | 11 +------- 8 files changed, 43 insertions(+), 51 deletions(-) diff --git a/src/main/java/subway/Application.java b/src/main/java/subway/Application.java index fd3133245..ed53c6558 100644 --- a/src/main/java/subway/Application.java +++ b/src/main/java/subway/Application.java @@ -11,11 +11,11 @@ public class Application { public static void main(String[] args) { SubwayService service = new SubwayService(); - MainMenuCommandRegistry mainRegistry = MainMenuCommandRegistry.from(service); StationMenuCommandRegistry stationRegistry = StationMenuCommandRegistry.from(service); LineMenuCommandRegistry lineRegistry = LineMenuCommandRegistry.from(service); SectionMenuCommandRegistry sectionRegistry = SectionMenuCommandRegistry.from(service); - SubwayController controller = new SubwayController(mainRegistry, stationRegistry, lineRegistry, sectionRegistry, service); + MainMenuCommandRegistry mainRegistry = MainMenuCommandRegistry.from(service, stationRegistry, lineRegistry, sectionRegistry); + SubwayController controller = new SubwayController(mainRegistry, service); controller.run(); } } diff --git a/src/main/java/subway/command/main/MainMenuCommandRegistry.java b/src/main/java/subway/command/main/MainMenuCommandRegistry.java index c2f32bfcb..2b3e6e07b 100644 --- a/src/main/java/subway/command/main/MainMenuCommandRegistry.java +++ b/src/main/java/subway/command/main/MainMenuCommandRegistry.java @@ -2,10 +2,13 @@ import java.util.EnumMap; import subway.command.Command; +import subway.command.line.LineMenuCommandRegistry; import subway.command.main.impl.LineCommand; import subway.command.main.impl.RouteCommand; import subway.command.main.impl.SectionCommand; import subway.command.main.impl.StationCommand; +import subway.command.section.SectionMenuCommandRegistry; +import subway.command.station.StationMenuCommandRegistry; import subway.service.SubwayService; public class MainMenuCommandRegistry { @@ -16,11 +19,13 @@ private MainMenuCommandRegistry(EnumMap commands) { this.commands = commands; } - public static MainMenuCommandRegistry from(SubwayService service) { + public static MainMenuCommandRegistry from(SubwayService service, StationMenuCommandRegistry stationRegistry, + LineMenuCommandRegistry lineRegistry, + SectionMenuCommandRegistry sectionRegistry) { EnumMap map = new EnumMap<>(MainMenuOption.class); - map.put(MainMenuOption.A, new StationCommand(service)); - map.put(MainMenuOption.B, new LineCommand(service)); - map.put(MainMenuOption.C, new SectionCommand(service)); + map.put(MainMenuOption.A, new StationCommand(stationRegistry)); + map.put(MainMenuOption.B, new LineCommand(service, lineRegistry)); + map.put(MainMenuOption.C, new SectionCommand(service, sectionRegistry)); map.put(MainMenuOption.D, new RouteCommand(service)); return new MainMenuCommandRegistry(map); } diff --git a/src/main/java/subway/command/main/impl/LineCommand.java b/src/main/java/subway/command/main/impl/LineCommand.java index aa5b4bba7..e945e55ba 100644 --- a/src/main/java/subway/command/main/impl/LineCommand.java +++ b/src/main/java/subway/command/main/impl/LineCommand.java @@ -1,15 +1,18 @@ package subway.command.main.impl; import subway.command.Command; +import subway.command.line.LineMenuCommandRegistry; import subway.service.SubwayService; import subway.view.OutputView; public class LineCommand implements Command { private final SubwayService service; + private final LineMenuCommandRegistry lineRegistry; - public LineCommand(SubwayService service) { + public LineCommand(SubwayService service, LineMenuCommandRegistry lineRegistry) { this.service = service; + this.lineRegistry = lineRegistry; } @Override diff --git a/src/main/java/subway/command/main/impl/SectionCommand.java b/src/main/java/subway/command/main/impl/SectionCommand.java index dce2a5d49..33ce18cf8 100644 --- a/src/main/java/subway/command/main/impl/SectionCommand.java +++ b/src/main/java/subway/command/main/impl/SectionCommand.java @@ -1,15 +1,18 @@ package subway.command.main.impl; import subway.command.Command; +import subway.command.section.SectionMenuCommandRegistry; import subway.service.SubwayService; import subway.view.OutputView; public class SectionCommand implements Command { private final SubwayService service; + private final SectionMenuCommandRegistry sectionRegistry; - public SectionCommand(SubwayService service) { + public SectionCommand(SubwayService service, SectionMenuCommandRegistry sectionRegistry) { this.service = service; + this.sectionRegistry = sectionRegistry; } @Override diff --git a/src/main/java/subway/command/main/impl/StationCommand.java b/src/main/java/subway/command/main/impl/StationCommand.java index cac2c2e45..c45811594 100644 --- a/src/main/java/subway/command/main/impl/StationCommand.java +++ b/src/main/java/subway/command/main/impl/StationCommand.java @@ -1,21 +1,19 @@ package subway.command.main.impl; import subway.command.Command; +import subway.command.station.StationMenuCommandRegistry; import subway.command.station.StationMenuOption; import subway.service.SubwayService; import subway.util.InputParser; import subway.util.Retry; import subway.view.InputView; -import subway.view.OutputView; public class StationCommand implements Command { - private static final String STATION = "지하철 역"; + private final StationMenuCommandRegistry stationRegistry; - private final SubwayService service; - - public StationCommand(SubwayService service) { - this.service = service; + public StationCommand(StationMenuCommandRegistry stationRegistry) { + this.stationRegistry = stationRegistry; } @Override @@ -26,13 +24,7 @@ public void execute() { return; } - Retry.retryUntilSuccess(() -> { - String readStation = InputView.readStationForRegistration(); - String stationName = InputParser.parseStation(readStation); - service.registerStation(stationName); - }); - - OutputView.printRegistration(STATION); + stationRegistry.execute(option); } private static StationMenuOption getOption() { diff --git a/src/main/java/subway/command/station/impl/StationRegistrationCommand.java b/src/main/java/subway/command/station/impl/StationRegistrationCommand.java index c23ac46d8..bc4ee9108 100644 --- a/src/main/java/subway/command/station/impl/StationRegistrationCommand.java +++ b/src/main/java/subway/command/station/impl/StationRegistrationCommand.java @@ -1,7 +1,11 @@ package subway.command.station.impl; import subway.command.Command; +import subway.constant.Constant; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class StationRegistrationCommand implements Command { @@ -14,6 +18,12 @@ public StationRegistrationCommand(SubwayService service) { @Override public void execute() { + Retry.retryUntilSuccess(() -> { + String readStation = InputView.readStationForRegistration(); + String stationName = InputParser.parseStation(readStation); + service.registerStation(stationName); + }); + OutputView.printRegistration(Constant.STATION.getMessage()); } } diff --git a/src/main/java/subway/constant/Constant.java b/src/main/java/subway/constant/Constant.java index 8b22ac91c..43e322ff1 100644 --- a/src/main/java/subway/constant/Constant.java +++ b/src/main/java/subway/constant/Constant.java @@ -1,31 +1,19 @@ package subway.constant; -import java.util.Arrays; - public enum Constant { - NAME(1, ""), + STATION("지하철 역"), + LINE("노선"), + SECTION("구간"), ; - private final int x1; - private final String x2; + private final String message; - Constant(int x1, String x2) { - this.x1 = x1; - this.x2 = x2; + Constant(String message) { + this.message = message; } - /*public static Constant fromX1(int x1) { - return Arrays.stream(values()) - .filter(constant -> constant.x1 == x1) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(ErrorMessage..getErrorMessage())); + public String getMessage() { + return message; } - - public static Constant fromX2(String x2) { - return Arrays.stream(values()) - .filter(constant -> constant.x2.equals(x2)) - .findFirst() - .orElseThrow(() -> new IllegalArgumentException(ErrorMessage..getErrorMessage())); - }*/ } diff --git a/src/main/java/subway/controller/SubwayController.java b/src/main/java/subway/controller/SubwayController.java index 638b0376f..7b8ed0dd3 100644 --- a/src/main/java/subway/controller/SubwayController.java +++ b/src/main/java/subway/controller/SubwayController.java @@ -6,7 +6,6 @@ import subway.command.main.MainMenuCommandRegistry; import subway.command.main.MainMenuOption; import subway.command.section.SectionMenuCommandRegistry; -import subway.command.station.StationMenuCommandRegistry; import subway.service.SubwayService; import subway.util.Retry; import subway.view.InputView; @@ -14,18 +13,10 @@ public class SubwayController { private final MainMenuCommandRegistry mainRegistry; - private final StationMenuCommandRegistry stationRegistry; - private final LineMenuCommandRegistry lineRegistry; - private final SectionMenuCommandRegistry sectionRegistry; private final SubwayService service; - public SubwayController(MainMenuCommandRegistry mainRegistry, StationMenuCommandRegistry stationRegistry, - LineMenuCommandRegistry lineRegistry, SectionMenuCommandRegistry sectionRegistry, - SubwayService service) { + public SubwayController(MainMenuCommandRegistry mainRegistry, SubwayService service) { this.mainRegistry = mainRegistry; - this.stationRegistry = stationRegistry; - this.lineRegistry = lineRegistry; - this.sectionRegistry = sectionRegistry; this.service = service; } From 8720dda4fdb723cf01e64fe47186ec666ae2e9f1 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 18:18:16 +0900 Subject: [PATCH 06/16] =?UTF-8?q?refactor:=20=EC=97=AD=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../station/impl/StationDeleteCommand.java | 10 ++++++++++ src/main/java/subway/constant/ErrorMessage.java | 1 + src/main/java/subway/domain/RouteRepository.java | 9 +++++++++ .../java/subway/domain/StationRepository.java | 8 ++++++-- src/main/java/subway/service/SubwayService.java | 5 +++++ src/main/java/subway/view/InputView.java | 5 +++++ src/main/java/subway/view/OutputView.java | 15 +++++++++++---- 7 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/command/station/impl/StationDeleteCommand.java b/src/main/java/subway/command/station/impl/StationDeleteCommand.java index fa58d7f94..0823bc178 100644 --- a/src/main/java/subway/command/station/impl/StationDeleteCommand.java +++ b/src/main/java/subway/command/station/impl/StationDeleteCommand.java @@ -1,7 +1,11 @@ package subway.command.station.impl; import subway.command.Command; +import subway.constant.Constant; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class StationDeleteCommand implements Command { @@ -14,6 +18,12 @@ public StationDeleteCommand(SubwayService service) { @Override public void execute() { + Retry.retryUntilSuccess(() -> { + String readStation = InputView.readStationForDelete(); + String stationName = InputParser.parseStation(readStation); + service.deleteStation(stationName); + }); + OutputView.printDelete(Constant.STATION.getMessage()); } } diff --git a/src/main/java/subway/constant/ErrorMessage.java b/src/main/java/subway/constant/ErrorMessage.java index b6d46badd..831452ef2 100644 --- a/src/main/java/subway/constant/ErrorMessage.java +++ b/src/main/java/subway/constant/ErrorMessage.java @@ -10,6 +10,7 @@ public enum ErrorMessage { ALREADY_EXIST_STATION("이미 등록된 역 이름입니다."), NO_EXIST_STATION("존재하지 않는 역입니다."), STATION_FORMAT_ERROR("역 이름은 \"역\"으로 끝나야 합니다."), + IMPOSSIBLE_DELETE_STATION("노선에 등록된 역은 삭제할 수 없습니다."), LINE_NAME_SIZE_ERROR("노선 이름은 2글자 이상이어야 합니다."), ALREADY_EXIST_LINE("이미 등록된 노선 이름입니다"), diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index 246a7a4dd..101e3b87c 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -11,4 +11,13 @@ public class RouteRepository { public static void addLine(Line line, List stations) { routes.put(line, stations); } + + public static boolean contains(Station station) { + for (List value : routes.values()) { + if (value.contains(station)) { + return true; + } + } + return false; + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index e4bd227e9..644b72b3d 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -20,8 +20,12 @@ public static void addStation(Station station) { stations.add(station); } - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); + public static void deleteStation(Station deleteStation) { + if (RouteRepository.contains(deleteStation)) { + throw new IllegalArgumentException(ErrorMessage.IMPOSSIBLE_DELETE_STATION.getErrorMessage()); + } + + stations.removeIf(station -> station.equals(deleteStation)); } public static Station getStation(String stationName) { diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 687187945..30a95dccf 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -34,6 +34,11 @@ public void registerStation(String stationName) { StationRepository.addStation(Station.from(stationName)); } + public void deleteStation(String stationName) { + Station station = StationRepository.getStation(stationName); + StationRepository.deleteStation(station); + } + // 도메인 객체 인스턴스 변수로 저장 // 메서드 diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 5964abdb2..5928c882e 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -50,4 +50,9 @@ public static String readStationForRegistration() { System.out.println("\n## 등록할 역 이름을 입력하세요."); return scanner.nextLine(); } + + public static String readStationForDelete() { + System.out.println("\n## 삭제할 역 이름을 입력하세요."); + return scanner.nextLine(); + } } diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java index 809244a52..19c77ee43 100644 --- a/src/main/java/subway/view/OutputView.java +++ b/src/main/java/subway/view/OutputView.java @@ -1,7 +1,6 @@ package subway.view; -import java.time.format.DateTimeFormatter; -import java.util.Locale; +import subway.constant.Constant; public class OutputView { @@ -12,11 +11,19 @@ public static void printRegistration(String name) { System.out.printf("\n[INFO] %s이 등록되었습니다.\n", name); } - public static void printDelete() { + public static void printDelete(String name) { + System.out.printf("\n[INFO] %s이 삭제되었습니다.\n", name); + } + + public static void printStations() { + + } + + public static void printLines() { } - public static void printQuery() { + public static void printRoutes() { } From c99ab282c370a68b510fead8309aa63b23535731 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 18:18:16 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../station/impl/StationDeleteCommand.java | 10 ++++++++++ src/main/java/subway/constant/ErrorMessage.java | 1 + src/main/java/subway/domain/RouteRepository.java | 9 +++++++++ .../java/subway/domain/StationRepository.java | 8 ++++++-- src/main/java/subway/service/SubwayService.java | 5 +++++ src/main/java/subway/view/InputView.java | 5 +++++ src/main/java/subway/view/OutputView.java | 15 +++++++++++---- 7 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/main/java/subway/command/station/impl/StationDeleteCommand.java b/src/main/java/subway/command/station/impl/StationDeleteCommand.java index fa58d7f94..0823bc178 100644 --- a/src/main/java/subway/command/station/impl/StationDeleteCommand.java +++ b/src/main/java/subway/command/station/impl/StationDeleteCommand.java @@ -1,7 +1,11 @@ package subway.command.station.impl; import subway.command.Command; +import subway.constant.Constant; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class StationDeleteCommand implements Command { @@ -14,6 +18,12 @@ public StationDeleteCommand(SubwayService service) { @Override public void execute() { + Retry.retryUntilSuccess(() -> { + String readStation = InputView.readStationForDelete(); + String stationName = InputParser.parseStation(readStation); + service.deleteStation(stationName); + }); + OutputView.printDelete(Constant.STATION.getMessage()); } } diff --git a/src/main/java/subway/constant/ErrorMessage.java b/src/main/java/subway/constant/ErrorMessage.java index b6d46badd..831452ef2 100644 --- a/src/main/java/subway/constant/ErrorMessage.java +++ b/src/main/java/subway/constant/ErrorMessage.java @@ -10,6 +10,7 @@ public enum ErrorMessage { ALREADY_EXIST_STATION("이미 등록된 역 이름입니다."), NO_EXIST_STATION("존재하지 않는 역입니다."), STATION_FORMAT_ERROR("역 이름은 \"역\"으로 끝나야 합니다."), + IMPOSSIBLE_DELETE_STATION("노선에 등록된 역은 삭제할 수 없습니다."), LINE_NAME_SIZE_ERROR("노선 이름은 2글자 이상이어야 합니다."), ALREADY_EXIST_LINE("이미 등록된 노선 이름입니다"), diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index 246a7a4dd..101e3b87c 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -11,4 +11,13 @@ public class RouteRepository { public static void addLine(Line line, List stations) { routes.put(line, stations); } + + public static boolean contains(Station station) { + for (List value : routes.values()) { + if (value.contains(station)) { + return true; + } + } + return false; + } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index e4bd227e9..644b72b3d 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -20,8 +20,12 @@ public static void addStation(Station station) { stations.add(station); } - public static boolean deleteStation(String name) { - return stations.removeIf(station -> Objects.equals(station.getName(), name)); + public static void deleteStation(Station deleteStation) { + if (RouteRepository.contains(deleteStation)) { + throw new IllegalArgumentException(ErrorMessage.IMPOSSIBLE_DELETE_STATION.getErrorMessage()); + } + + stations.removeIf(station -> station.equals(deleteStation)); } public static Station getStation(String stationName) { diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 687187945..30a95dccf 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -34,6 +34,11 @@ public void registerStation(String stationName) { StationRepository.addStation(Station.from(stationName)); } + public void deleteStation(String stationName) { + Station station = StationRepository.getStation(stationName); + StationRepository.deleteStation(station); + } + // 도메인 객체 인스턴스 변수로 저장 // 메서드 diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 5964abdb2..5928c882e 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -50,4 +50,9 @@ public static String readStationForRegistration() { System.out.println("\n## 등록할 역 이름을 입력하세요."); return scanner.nextLine(); } + + public static String readStationForDelete() { + System.out.println("\n## 삭제할 역 이름을 입력하세요."); + return scanner.nextLine(); + } } diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java index 809244a52..19c77ee43 100644 --- a/src/main/java/subway/view/OutputView.java +++ b/src/main/java/subway/view/OutputView.java @@ -1,7 +1,6 @@ package subway.view; -import java.time.format.DateTimeFormatter; -import java.util.Locale; +import subway.constant.Constant; public class OutputView { @@ -12,11 +11,19 @@ public static void printRegistration(String name) { System.out.printf("\n[INFO] %s이 등록되었습니다.\n", name); } - public static void printDelete() { + public static void printDelete(String name) { + System.out.printf("\n[INFO] %s이 삭제되었습니다.\n", name); + } + + public static void printStations() { + + } + + public static void printLines() { } - public static void printQuery() { + public static void printRoutes() { } From eeb65f23e203193d5fedf53389023305080a7276 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 18:23:31 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subway/command/station/impl/StationQueryCommand.java | 3 +++ src/main/java/subway/service/SubwayService.java | 6 ++++++ src/main/java/subway/view/OutputView.java | 9 ++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/subway/command/station/impl/StationQueryCommand.java b/src/main/java/subway/command/station/impl/StationQueryCommand.java index fdaeb05f8..ebcc30e09 100644 --- a/src/main/java/subway/command/station/impl/StationQueryCommand.java +++ b/src/main/java/subway/command/station/impl/StationQueryCommand.java @@ -1,5 +1,6 @@ package subway.command.station.impl; +import java.util.List; import subway.command.Command; import subway.service.SubwayService; import subway.view.OutputView; @@ -14,6 +15,8 @@ public StationQueryCommand(SubwayService service) { @Override public void execute() { + List stations = service.getStations(); + OutputView.printStations(stations); } } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 30a95dccf..11948a7b1 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -39,6 +39,12 @@ public void deleteStation(String stationName) { StationRepository.deleteStation(station); } + public List getStations() { + return StationRepository.stations().stream() + .map(Station::getName) + .toList(); + } + // 도메인 객체 인스턴스 변수로 저장 // 메서드 diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java index 19c77ee43..ea8979149 100644 --- a/src/main/java/subway/view/OutputView.java +++ b/src/main/java/subway/view/OutputView.java @@ -1,6 +1,6 @@ package subway.view; -import subway.constant.Constant; +import java.util.List; public class OutputView { @@ -15,8 +15,11 @@ public static void printDelete(String name) { System.out.printf("\n[INFO] %s이 삭제되었습니다.\n", name); } - public static void printStations() { - + public static void printStations(List stations) { + System.out.println("\n## 역 목록"); + for (String station : stations) { + System.out.println("[INFO] " + station); + } } public static void printLines() { From f3d3c4649adc014af50fd0bed1c8c1564e35a3d7 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 18:32:34 +0900 Subject: [PATCH 09/16] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index ce22402a0..4faf32e1c 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ 2. 역 등록 1. 등록할 역 이름 입력 - 예외 사항 + - 이름 마지막 글자가 "역"이 아니면 예외 발생 + - “역 이름은 "역"으로 끝나야 합니다.” - ’역’을 포함해서 2글자 미만이면 예외 발생 - “역 이름은 2글자 이상이어야 합니다.” - 기존에 이미 존재하는 역 이름이면 예외 발생 @@ -25,6 +27,8 @@ 3. 역 삭제 1. 삭제할 역 이름 입력 - 예외 사항 + - 이름 마지막 글자가 "역"이 아니면 예외 발생 + - “역 이름은 "역"으로 끝나야 합니다.” - 존재하지 않는 역이면 예외 발생 - “존재하지 않는 역입니다.” - 노선에 등록된 역이면 예외 발생 @@ -43,6 +47,8 @@ 2. 노선 등록 1. 등록할 노선 이름 입력 - 예외 사항 + - 이름 마지막 글자가 "선"이 아니면 예외 발생 + - “노선 이름은 "선"으로 끝나야 합니다.” - ’선’을 포함해서 2글자 미만이면 예외 발생 - “노선 이름은 2글자 이상이어야 합니다.” - 기존에 이미 존재하는 노선 이름이면 예외 발생 @@ -62,6 +68,8 @@ 3. 노선 삭제 1. 삭제할 노선 이름 입력 - 예외 사항 + - 이름 마지막 글자가 "선"이 아니면 예외 발생 + - “노선 이름은 "선"으로 끝나야 합니다.” - 존재하지 않는 노선이면 예외 발생 - “존재하지 않는 노선입니다.” 2. 노선 삭제 후 메시지 출력 From cf064bfeae8b494ebf66fa028c449183dbe0107b Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 19:07:12 +0900 Subject: [PATCH 10/16] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../line/impl/LineRegistrationCommand.java | 34 +++++++++++++++++++ .../subway/command/main/impl/LineCommand.java | 17 ++++++++++ src/main/java/subway/constant/Constant.java | 2 +- .../java/subway/constant/ErrorMessage.java | 3 +- .../java/subway/domain/LineRepository.java | 5 +-- .../java/subway/domain/RouteRepository.java | 27 ++++++++++++++- .../java/subway/service/SubwayService.java | 14 ++++++-- src/main/java/subway/util/InputParser.java | 7 ++++ src/main/java/subway/view/InputView.java | 15 ++++++++ 10 files changed, 117 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 4faf32e1c..b6367c20b 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ - 존재하지 않는 역이면 예외 발생 - “존재하지 않는 역입니다.” - 상행 종점역과 같은 역이면 예외 발생 - - “하행 종점역과 같은 역입니다.” + - “해당 노선에 이미 존재하는 역입니다.” 4. 노선 등록 후 메시지 출력 - 지하철 노선이 등록되었습니다. 3. 노선 삭제 diff --git a/src/main/java/subway/command/line/impl/LineRegistrationCommand.java b/src/main/java/subway/command/line/impl/LineRegistrationCommand.java index 8713b5a14..83534c4ca 100644 --- a/src/main/java/subway/command/line/impl/LineRegistrationCommand.java +++ b/src/main/java/subway/command/line/impl/LineRegistrationCommand.java @@ -1,7 +1,12 @@ package subway.command.line.impl; import subway.command.Command; +import subway.constant.Constant; +import subway.domain.Line; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class LineRegistrationCommand implements Command { @@ -14,6 +19,35 @@ public LineRegistrationCommand(SubwayService service) { @Override public void execute() { + Line line = getLine(); + registerFirstStationName(line); + registerLastStationName(line); + + OutputView.printRegistration(Constant.LINE.getMessage()); + } + + private Line getLine() { + return Retry.retryUntilSuccess(() -> { + String readLine = InputView.readLineForRegistration(); + String lineName = InputParser.parseLine(readLine); + return service.registerLine(lineName); + }); + } + + private void registerFirstStationName(Line line) { + Retry.retryUntilSuccess(() -> { + String readStation = InputView.readFirstStationForRegistration(); + String firstStationName = InputParser.parseStation(readStation); + service.registerLineWithStation(line, firstStationName); + }); + } + + private void registerLastStationName(Line line) { + Retry.retryUntilSuccess(() -> { + String readStation = InputView.readLastStationForRegistration(); + String lastStationName = InputParser.parseStation(readStation); + service.registerLineWithStation(line, lastStationName); + }); } } diff --git a/src/main/java/subway/command/main/impl/LineCommand.java b/src/main/java/subway/command/main/impl/LineCommand.java index e945e55ba..715220e1f 100644 --- a/src/main/java/subway/command/main/impl/LineCommand.java +++ b/src/main/java/subway/command/main/impl/LineCommand.java @@ -2,7 +2,11 @@ import subway.command.Command; import subway.command.line.LineMenuCommandRegistry; +import subway.command.line.LineMenuOption; +import subway.command.station.StationMenuOption; import subway.service.SubwayService; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class LineCommand implements Command { @@ -17,6 +21,19 @@ public LineCommand(SubwayService service, LineMenuCommandRegistry lineRegistry) @Override public void execute() { + LineMenuOption option = getOption(); + if (option.equals(LineMenuOption.BACK)) { + return; + } + + lineRegistry.execute(option); + } + + private static LineMenuOption getOption() { + return Retry.retryUntilSuccess(() -> { + String selection = InputView.readLineMenuSelection(); + return LineMenuOption.from(selection); + }); } } diff --git a/src/main/java/subway/constant/Constant.java b/src/main/java/subway/constant/Constant.java index 43e322ff1..60d3fbc69 100644 --- a/src/main/java/subway/constant/Constant.java +++ b/src/main/java/subway/constant/Constant.java @@ -3,7 +3,7 @@ public enum Constant { STATION("지하철 역"), - LINE("노선"), + LINE("지하철 노선"), SECTION("구간"), ; diff --git a/src/main/java/subway/constant/ErrorMessage.java b/src/main/java/subway/constant/ErrorMessage.java index 831452ef2..33afbc1ff 100644 --- a/src/main/java/subway/constant/ErrorMessage.java +++ b/src/main/java/subway/constant/ErrorMessage.java @@ -15,7 +15,8 @@ public enum ErrorMessage { LINE_NAME_SIZE_ERROR("노선 이름은 2글자 이상이어야 합니다."), ALREADY_EXIST_LINE("이미 등록된 노선 이름입니다"), NO_EXIST_LINE("존재하지 않는 노선입니다."), - LINE_FORMAT_ERROR("노선 이름은 \"선\"으로 끝나야 합니다."); + LINE_FORMAT_ERROR("노선 이름은 \"선\"으로 끝나야 합니다."), + ALREADY_EXIST_STATION_IN_LINE("해당 노선에 이미 존재하는 역입니다."); private static final String ERROR_MESSAGE_PREFIX = "[ERROR] "; private final String errorMessage; diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 37e75ca40..d507fcc9e 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -20,7 +20,8 @@ public static void addLine(Line line) { lines.add(line); } - public static boolean deleteLineByName(String name) { - return lines.removeIf(line -> Objects.equals(line.getName(), name)); + public static void deleteLine(Line deletedLine) { + + lines.removeIf(line -> line.equals(deletedLine)); } } diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index 101e3b87c..9403fe3d7 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -1,17 +1,26 @@ package subway.domain; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import subway.constant.ErrorMessage; public class RouteRepository { private static final Map> routes = new HashMap<>(); - public static void addLine(Line line, List stations) { + public static void addStations(Line line, List stations) { + if (routes.containsKey(line)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_LINE.getErrorMessage()); + } routes.put(line, stations); } + public static void addLine(Line line) { + routes.put(line, new ArrayList<>()); + } + public static boolean contains(Station station) { for (List value : routes.values()) { if (value.contains(station)) { @@ -20,4 +29,20 @@ public static boolean contains(Station station) { } return false; } + + public static void addStation(Line line, Station station) { + List stations = routes.get(line); + if (stations.contains(station)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION_IN_LINE.getErrorMessage()); + } + stations.add(station); + } + + public static void addStation(Line line, Station station, int index) { + List stations = routes.get(line); + if (stations.contains(station)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION_IN_LINE.getErrorMessage()); + } + stations.add(index - 1, station); + } } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 11948a7b1..c5ee1cc62 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -26,7 +26,7 @@ public void setLines(Map> lines) { for (String stationName : lines.get(lineName)) { stations.add(StationRepository.getStation(stationName)); } - RouteRepository.addLine(line, stations); + RouteRepository.addStations(line, stations); } } @@ -45,7 +45,15 @@ public List getStations() { .toList(); } - // 도메인 객체 인스턴스 변수로 저장 + public Line registerLine(String lineName) { + Line line = Line.from(lineName); + LineRepository.addLine(line); + RouteRepository.addLine(line); + return line; + } - // 메서드 + public void registerLineWithStation(Line line, String stationName) { + Station station = StationRepository.getStation(stationName); + RouteRepository.addStation(line, station); + } } diff --git a/src/main/java/subway/util/InputParser.java b/src/main/java/subway/util/InputParser.java index 10d925b96..36c4cdbce 100644 --- a/src/main/java/subway/util/InputParser.java +++ b/src/main/java/subway/util/InputParser.java @@ -15,4 +15,11 @@ public static String parseStation(String station) { Validator.validateStationFormat(station); return station; } + + public static String parseLine(String line) { + line = line.strip(); + + Validator.validateLineFormat(line); + return line; + } } diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 5928c882e..41a79f601 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -51,8 +51,23 @@ public static String readStationForRegistration() { return scanner.nextLine(); } + public static String readFirstStationForRegistration() { + System.out.println("\n## 등록할 상행 종점역 이름을 입력하세요."); + return scanner.nextLine(); + } + + public static String readLastStationForRegistration() { + System.out.println("\n## 등록할 하행 종점역 이름을 입력하세요."); + return scanner.nextLine(); + } + public static String readStationForDelete() { System.out.println("\n## 삭제할 역 이름을 입력하세요."); return scanner.nextLine(); } + + public static String readLineForRegistration() { + System.out.println("\n## 등록할 노선 이름을 입력하세요."); + return scanner.nextLine(); + } } From d19019b8576b9dcc5f1b1a3ccd426e0ce94f19ca Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 19:16:02 +0900 Subject: [PATCH 11/16] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/subway/domain/RouteRepository.java | 30 ++++++++++++++++++- .../java/subway/service/SubwayService.java | 16 +++++++++- src/main/java/subway/view/InputView.java | 15 ++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index 101e3b87c..5bb7df225 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -1,17 +1,29 @@ package subway.domain; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import subway.constant.ErrorMessage; public class RouteRepository { private static final Map> routes = new HashMap<>(); - public static void addLine(Line line, List stations) { + public static void addStations(Line line, List stations) { + if (routes.containsKey(line)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_LINE.getErrorMessage()); + } routes.put(line, stations); } + public static void addLine(Line line) { + if (routes.containsKey(line)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_LINE.getErrorMessage()); + } + routes.put(line, new ArrayList<>()); + } + public static boolean contains(Station station) { for (List value : routes.values()) { if (value.contains(station)) { @@ -20,4 +32,20 @@ public static boolean contains(Station station) { } return false; } + + public static void addStation(Line line, Station station) { + List stations = routes.get(line); + if (stations.contains(station)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION_IN_LINE.getErrorMessage()); + } + stations.add(station); + } + + public static void addStation(Line line, Station station, int index) { + List stations = routes.get(line); + if (stations.contains(station)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION_IN_LINE.getErrorMessage()); + } + stations.add(index - 1, station); + } } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 30a95dccf..db6de91d9 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -26,7 +26,7 @@ public void setLines(Map> lines) { for (String stationName : lines.get(lineName)) { stations.add(StationRepository.getStation(stationName)); } - RouteRepository.addLine(line, stations); + RouteRepository.addStations(line, stations); } } @@ -39,6 +39,20 @@ public void deleteStation(String stationName) { StationRepository.deleteStation(station); } + public Line registerLine(String lineName) { + Line line = Line.from(lineName); + + LineRepository.addLine(line); + RouteRepository.addLine(line); + + return line; + } + + public void registerLineWithStation(Line line, String stationName) { + Station station = Station.from(stationName); + RouteRepository.addStation(line, station); + } + // 도메인 객체 인스턴스 변수로 저장 // 메서드 diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 5928c882e..bf4264af7 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -55,4 +55,19 @@ public static String readStationForDelete() { System.out.println("\n## 삭제할 역 이름을 입력하세요."); return scanner.nextLine(); } + + public static String readLineForRegistration() { + System.out.println("\n## 등록할 노선 이름을 입력하세요."); + return scanner.nextLine(); + } + + public static String readFirstStationForRegistration() { + System.out.println("\n## 등록할 노선의 상행 종점역 이름을 입력하세요."); + return scanner.nextLine(); + } + + public static String readLastStationForRegistration() { + System.out.println("\n## 등록할 노선의 하행 종점역 이름을 입력하세요."); + return scanner.nextLine(); + } } From ff2481296e2fbad4849d3dab089823044277a993 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 19:32:59 +0900 Subject: [PATCH 12/16] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/line/impl/LineDeleteCommand.java | 10 ++++++++++ .../command/line/impl/LineQueryCommand.java | 3 +++ .../subway/controller/SubwayController.java | 10 +++++----- .../java/subway/domain/LineRepository.java | 6 ++++-- .../java/subway/domain/RouteRepository.java | 9 +++++++++ .../java/subway/service/SubwayService.java | 18 ++++++++++++++++-- src/main/java/subway/view/InputView.java | 5 +++++ src/main/java/subway/view/OutputView.java | 16 +++++++++++----- 8 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/main/java/subway/command/line/impl/LineDeleteCommand.java b/src/main/java/subway/command/line/impl/LineDeleteCommand.java index b8ea0d1d3..50ed32ee9 100644 --- a/src/main/java/subway/command/line/impl/LineDeleteCommand.java +++ b/src/main/java/subway/command/line/impl/LineDeleteCommand.java @@ -1,7 +1,11 @@ package subway.command.line.impl; import subway.command.Command; +import subway.constant.Constant; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class LineDeleteCommand implements Command { @@ -14,6 +18,12 @@ public LineDeleteCommand(SubwayService service) { @Override public void execute() { + Retry.retryUntilSuccess(() -> { + String readLine = InputView.readLineForDelete(); + String lineName = InputParser.parseLine(readLine); + service.deleteLine(lineName); + }); + OutputView.printDelete(Constant.LINE.getMessage()); } } diff --git a/src/main/java/subway/command/line/impl/LineQueryCommand.java b/src/main/java/subway/command/line/impl/LineQueryCommand.java index 6ec812ce4..dce4aea0f 100644 --- a/src/main/java/subway/command/line/impl/LineQueryCommand.java +++ b/src/main/java/subway/command/line/impl/LineQueryCommand.java @@ -1,5 +1,6 @@ package subway.command.line.impl; +import java.util.List; import subway.command.Command; import subway.service.SubwayService; import subway.view.OutputView; @@ -14,6 +15,8 @@ public LineQueryCommand(SubwayService service) { @Override public void execute() { + List lines = service.getLines(); + OutputView.printLines(lines); } } diff --git a/src/main/java/subway/controller/SubwayController.java b/src/main/java/subway/controller/SubwayController.java index 7b8ed0dd3..64cbecb58 100644 --- a/src/main/java/subway/controller/SubwayController.java +++ b/src/main/java/subway/controller/SubwayController.java @@ -1,5 +1,6 @@ package subway.controller; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import subway.command.line.LineMenuCommandRegistry; @@ -43,11 +44,10 @@ private MainMenuOption readMainOption() { private void setInit() { List stations = List.of("교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"); - Map> lines = Map.of( - "2호선", List.of("교대역", "강남역", "역삼역"), - "3호선", List.of("교대역", "남부터미널역", "양재역", "매봉역"), - "신분당선", List.of("강남역", "양재역", "양재시민의숲역") - ); + Map> lines = new LinkedHashMap<>(); + lines.put("2호선", List.of("교대역", "강남역", "역삼역")); + lines.put("3호선", List.of("교대역", "남부터미널역", "양재역", "매봉역")); + lines.put("신분당선", List.of("강남역", "양재역", "양재시민의숲역")); service.setStations(stations); service.setLines(lines); diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index d507fcc9e..8c5d7c008 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -21,7 +21,9 @@ public static void addLine(Line line) { } public static void deleteLine(Line deletedLine) { - - lines.removeIf(line -> line.equals(deletedLine)); + if (!lines().contains(deletedLine)) { + throw new IllegalArgumentException(ErrorMessage.NO_EXIST_LINE.getErrorMessage()); + } + lines.remove(deletedLine); } } diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index 5bb7df225..e47b1eb9e 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import subway.constant.ErrorMessage; public class RouteRepository { @@ -48,4 +49,12 @@ public static void addStation(Line line, Station station, int index) { } stations.add(index - 1, station); } + + public static void deleteLine(Line line) { + Set lines = routes.keySet(); + if (!lines.contains(line)) { + throw new IllegalArgumentException(ErrorMessage.NO_EXIST_LINE.getErrorMessage()); + } + routes.remove(line); + } } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index db6de91d9..9e42f5a29 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -53,7 +53,21 @@ public void registerLineWithStation(Line line, String stationName) { RouteRepository.addStation(line, station); } - // 도메인 객체 인스턴스 변수로 저장 + public void deleteLine(String lineName) { + Line line = Line.from(lineName); + LineRepository.deleteLine(line); + RouteRepository.deleteLine(line); + } - // 메서드 + public List getStations() { + return StationRepository.stations().stream() + .map(Station::getName) + .toList(); + } + + public List getLines() { + return LineRepository.lines().stream() + .map(Line::getName) + .toList(); + } } diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index bf4264af7..9a4dad99b 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -70,4 +70,9 @@ public static String readLastStationForRegistration() { System.out.println("\n## 등록할 노선의 하행 종점역 이름을 입력하세요."); return scanner.nextLine(); } + + public static String readLineForDelete() { + System.out.println("\n## 삭제할 노선 이름을 입력하세요."); + return scanner.nextLine(); + } } diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java index 19c77ee43..b6879ceec 100644 --- a/src/main/java/subway/view/OutputView.java +++ b/src/main/java/subway/view/OutputView.java @@ -1,6 +1,6 @@ package subway.view; -import subway.constant.Constant; +import java.util.List; public class OutputView { @@ -15,12 +15,18 @@ public static void printDelete(String name) { System.out.printf("\n[INFO] %s이 삭제되었습니다.\n", name); } - public static void printStations() { - + public static void printStations(List stations) { + System.out.println("\n## 역 목록"); + for (String station : stations) { + System.out.println("[INFO] " + station); + } } - public static void printLines() { - + public static void printLines(List lines) { + System.out.println("\n## 노선 목록"); + for (String line : lines) { + System.out.println("[INFO] " + line); + } } public static void printRoutes() { From 50ed949e5265f5fbb144627a65995ced1d0ec2f2 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 19:52:28 +0900 Subject: [PATCH 13/16] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/main/MainMenuCommandRegistry.java | 4 ++-- .../subway/command/main/impl/LineCommand.java | 4 +--- .../command/main/impl/SectionCommand.java | 21 +++++++++++++--- .../impl/SectionRegistrationCommand.java | 24 +++++++++++++++++++ .../java/subway/constant/ErrorMessage.java | 5 +++- .../java/subway/domain/RouteRepository.java | 10 ++++++++ .../java/subway/service/SubwayService.java | 17 +++++++++++++ src/main/java/subway/util/InputParser.java | 8 +++++++ src/main/java/subway/util/Validator.java | 6 +++++ src/main/java/subway/view/InputView.java | 15 ++++++++++++ 10 files changed, 105 insertions(+), 9 deletions(-) diff --git a/src/main/java/subway/command/main/MainMenuCommandRegistry.java b/src/main/java/subway/command/main/MainMenuCommandRegistry.java index 2b3e6e07b..ad2923704 100644 --- a/src/main/java/subway/command/main/MainMenuCommandRegistry.java +++ b/src/main/java/subway/command/main/MainMenuCommandRegistry.java @@ -24,8 +24,8 @@ public static MainMenuCommandRegistry from(SubwayService service, StationMenuCom SectionMenuCommandRegistry sectionRegistry) { EnumMap map = new EnumMap<>(MainMenuOption.class); map.put(MainMenuOption.A, new StationCommand(stationRegistry)); - map.put(MainMenuOption.B, new LineCommand(service, lineRegistry)); - map.put(MainMenuOption.C, new SectionCommand(service, sectionRegistry)); + map.put(MainMenuOption.B, new LineCommand(lineRegistry)); + map.put(MainMenuOption.C, new SectionCommand(sectionRegistry)); map.put(MainMenuOption.D, new RouteCommand(service)); return new MainMenuCommandRegistry(map); } diff --git a/src/main/java/subway/command/main/impl/LineCommand.java b/src/main/java/subway/command/main/impl/LineCommand.java index 715220e1f..f14aef69f 100644 --- a/src/main/java/subway/command/main/impl/LineCommand.java +++ b/src/main/java/subway/command/main/impl/LineCommand.java @@ -11,11 +11,9 @@ public class LineCommand implements Command { - private final SubwayService service; private final LineMenuCommandRegistry lineRegistry; - public LineCommand(SubwayService service, LineMenuCommandRegistry lineRegistry) { - this.service = service; + public LineCommand(LineMenuCommandRegistry lineRegistry) { this.lineRegistry = lineRegistry; } diff --git a/src/main/java/subway/command/main/impl/SectionCommand.java b/src/main/java/subway/command/main/impl/SectionCommand.java index 33ce18cf8..f21cceed4 100644 --- a/src/main/java/subway/command/main/impl/SectionCommand.java +++ b/src/main/java/subway/command/main/impl/SectionCommand.java @@ -1,22 +1,37 @@ package subway.command.main.impl; import subway.command.Command; +import subway.command.line.LineMenuOption; import subway.command.section.SectionMenuCommandRegistry; +import subway.command.section.SectionMenuOption; import subway.service.SubwayService; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class SectionCommand implements Command { - private final SubwayService service; private final SectionMenuCommandRegistry sectionRegistry; - public SectionCommand(SubwayService service, SectionMenuCommandRegistry sectionRegistry) { - this.service = service; + public SectionCommand(SectionMenuCommandRegistry sectionRegistry) { this.sectionRegistry = sectionRegistry; } @Override public void execute() { + SectionMenuOption option = getOption(); + if (option.equals(SectionMenuOption.BACK)) { + return; + } + + sectionRegistry.execute(option); + } + + private static SectionMenuOption getOption() { + return Retry.retryUntilSuccess(() -> { + String selection = InputView.readSectionMenuSelection(); + return SectionMenuOption.from(selection); + }); } } diff --git a/src/main/java/subway/command/section/impl/SectionRegistrationCommand.java b/src/main/java/subway/command/section/impl/SectionRegistrationCommand.java index 9475ef7ac..e23def1d7 100644 --- a/src/main/java/subway/command/section/impl/SectionRegistrationCommand.java +++ b/src/main/java/subway/command/section/impl/SectionRegistrationCommand.java @@ -1,7 +1,13 @@ package subway.command.section.impl; import subway.command.Command; +import subway.constant.Constant; +import subway.domain.Line; +import subway.domain.Station; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class SectionRegistrationCommand implements Command { @@ -14,6 +20,24 @@ public SectionRegistrationCommand(SubwayService service) { @Override public void execute() { + Line line = Retry.retryUntilSuccess(() -> { + String readLine = InputView.readLineForSectionRegistration(); + String lineName = InputParser.parseLine(readLine); + return service.registerSectionWithLine(lineName); + }); + Station station = Retry.retryUntilSuccess(() -> { + String readStation = InputView.readStationForSectionRegistration(); + String stationName = InputParser.parseStation(readStation); + return service.validatePossibleAddStation(line, stationName); + }); + + Retry.retryUntilSuccess(() -> { + String readIndex = InputView.readIndexForSectionRegistration(); + int index = InputParser.parseIndex(readIndex); + service.registerRoute(line, station, index); + }); + + OutputView.printRegistration(Constant.SECTION.getMessage()); } } diff --git a/src/main/java/subway/constant/ErrorMessage.java b/src/main/java/subway/constant/ErrorMessage.java index 33afbc1ff..e623f16db 100644 --- a/src/main/java/subway/constant/ErrorMessage.java +++ b/src/main/java/subway/constant/ErrorMessage.java @@ -16,7 +16,10 @@ public enum ErrorMessage { ALREADY_EXIST_LINE("이미 등록된 노선 이름입니다"), NO_EXIST_LINE("존재하지 않는 노선입니다."), LINE_FORMAT_ERROR("노선 이름은 \"선\"으로 끝나야 합니다."), - ALREADY_EXIST_STATION_IN_LINE("해당 노선에 이미 존재하는 역입니다."); + ALREADY_EXIST_STATION_IN_LINE("해당 노선에 이미 존재하는 역입니다."), + + INDEX_FORMAT_ERROR("1 이상의 숫자를 입력해야합니다."), + MAX_INDEX_ERROR("%d 이하의 순서를 입력해야합니다."); private static final String ERROR_MESSAGE_PREFIX = "[ERROR] "; private final String errorMessage; diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index e47b1eb9e..bea85194e 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -34,6 +34,10 @@ public static boolean contains(Station station) { return false; } + public static boolean contains(Line line, Station station) { + return routes.get(line).contains(station); + } + public static void addStation(Line line, Station station) { List stations = routes.get(line); if (stations.contains(station)) { @@ -44,9 +48,15 @@ public static void addStation(Line line, Station station) { public static void addStation(Line line, Station station, int index) { List stations = routes.get(line); + + if (index > stations.size()) { + throw new IllegalArgumentException(ErrorMessage.MAX_INDEX_ERROR.getErrorMessage(stations.size())); + } + if (stations.contains(station)) { throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION_IN_LINE.getErrorMessage()); } + stations.add(index - 1, station); } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 9e42f5a29..4a7a4018e 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import subway.constant.ErrorMessage; import subway.domain.Line; import subway.domain.LineRepository; import subway.domain.RouteRepository; @@ -70,4 +71,20 @@ public List getLines() { .map(Line::getName) .toList(); } + + public Line registerSectionWithLine(String lineName) { + return Line.from(lineName); + } + + public Station validatePossibleAddStation(Line line, String stationName) { + Station station = Station.from(stationName); + if (RouteRepository.contains(line, station)) { + throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION_IN_LINE.getErrorMessage()); + } + return station; + } + + public void registerRoute(Line line, Station station, int index) { + RouteRepository.addStation(line, station, index); + } } diff --git a/src/main/java/subway/util/InputParser.java b/src/main/java/subway/util/InputParser.java index 36c4cdbce..aa95e244c 100644 --- a/src/main/java/subway/util/InputParser.java +++ b/src/main/java/subway/util/InputParser.java @@ -22,4 +22,12 @@ public static String parseLine(String line) { Validator.validateLineFormat(line); return line; } + + public static int parseIndex(String readIndex) { + readIndex = readIndex.strip(); + + Validator.validateIndexFormat(readIndex); + + return NumberConvertor.convertToNumber(readIndex); + } } diff --git a/src/main/java/subway/util/Validator.java b/src/main/java/subway/util/Validator.java index 9b4b27884..3c3ff7d89 100644 --- a/src/main/java/subway/util/Validator.java +++ b/src/main/java/subway/util/Validator.java @@ -30,4 +30,10 @@ public static void validateLineFormat(String line) { throw new IllegalArgumentException(ErrorMessage.LINE_FORMAT_ERROR.getErrorMessage()); } } + + public static void validateIndexFormat(String readIndex) { + if (readIndex.matches("0") || !readIndex.matches(NUMBER_FORMAT)) { + throw new IllegalArgumentException(ErrorMessage.INDEX_FORMAT_ERROR.getErrorMessage()); + } + } } diff --git a/src/main/java/subway/view/InputView.java b/src/main/java/subway/view/InputView.java index 9a4dad99b..091c192d5 100644 --- a/src/main/java/subway/view/InputView.java +++ b/src/main/java/subway/view/InputView.java @@ -75,4 +75,19 @@ public static String readLineForDelete() { System.out.println("\n## 삭제할 노선 이름을 입력하세요."); return scanner.nextLine(); } + + public static String readLineForSectionRegistration() { + System.out.println("\n## 노선을 입력하세요."); + return scanner.nextLine(); + } + + public static String readStationForSectionRegistration() { + System.out.println("\n## 역이름을 입력하세요."); + return scanner.nextLine(); + } + + public static String readIndexForSectionRegistration() { + System.out.println("\n## 순서를 입력하세요."); + return scanner.nextLine(); + } } From 7cffc0ab92a598d7e5d6e1a68cd15f218cc6b444 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 20:10:47 +0900 Subject: [PATCH 14/16] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EB=B0=8F=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=EB=8F=84=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ .../command/main/impl/RouteCommand.java | 4 +++ .../section/impl/SectionDeleteCommand.java | 17 +++++++++++ .../java/subway/constant/ErrorMessage.java | 4 ++- .../java/subway/domain/LineRepository.java | 7 +++++ .../java/subway/domain/RouteRepository.java | 29 ++++++++++++++++++- .../java/subway/service/SubwayService.java | 15 ++++++++++ src/main/java/subway/view/OutputView.java | 13 +++++++-- 8 files changed, 87 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b6367c20b..76f9126ef 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,8 @@ - 예외 사항 - 존재하지 않는 역이면 예외 발생 - “존재하지 않는 역입니다.” + - 해당 노선에 존재하지 않는 역이면 예외 발생 + - “해당 노선에 존재하지 않는 역입니다.” 3. 구간 삭제 후 메시지 출력 - 구간이 삭제되었습니다. 4. 돌아가기 diff --git a/src/main/java/subway/command/main/impl/RouteCommand.java b/src/main/java/subway/command/main/impl/RouteCommand.java index d8bb558b5..a4103eb98 100644 --- a/src/main/java/subway/command/main/impl/RouteCommand.java +++ b/src/main/java/subway/command/main/impl/RouteCommand.java @@ -1,5 +1,7 @@ package subway.command.main.impl; +import java.util.List; +import java.util.Map; import subway.command.Command; import subway.service.SubwayService; import subway.view.OutputView; @@ -14,6 +16,8 @@ public RouteCommand(SubwayService service) { @Override public void execute() { + Map> routes = service.getRoutes(); + OutputView.printRoutes(routes); } } diff --git a/src/main/java/subway/command/section/impl/SectionDeleteCommand.java b/src/main/java/subway/command/section/impl/SectionDeleteCommand.java index c56d8f008..38a5af9a9 100644 --- a/src/main/java/subway/command/section/impl/SectionDeleteCommand.java +++ b/src/main/java/subway/command/section/impl/SectionDeleteCommand.java @@ -1,7 +1,12 @@ package subway.command.section.impl; import subway.command.Command; +import subway.constant.Constant; +import subway.domain.Line; import subway.service.SubwayService; +import subway.util.InputParser; +import subway.util.Retry; +import subway.view.InputView; import subway.view.OutputView; public class SectionDeleteCommand implements Command { @@ -14,6 +19,18 @@ public SectionDeleteCommand(SubwayService service) { @Override public void execute() { + Line line = Retry.retryUntilSuccess(() -> { + String readLine = InputView.readLineForSectionRegistration(); + String lineName = InputParser.parseLine(readLine); + return service.deleteSectionWithLine(lineName); + }); + Retry.retryUntilSuccess(() -> { + String readStation = InputView.readStationForSectionRegistration(); + String stationName = InputParser.parseStation(readStation); + service.deleteSection(line, stationName); + }); + + OutputView.printDelete(Constant.SECTION.getMessage()); } } diff --git a/src/main/java/subway/constant/ErrorMessage.java b/src/main/java/subway/constant/ErrorMessage.java index e623f16db..0ac47de46 100644 --- a/src/main/java/subway/constant/ErrorMessage.java +++ b/src/main/java/subway/constant/ErrorMessage.java @@ -19,7 +19,9 @@ public enum ErrorMessage { ALREADY_EXIST_STATION_IN_LINE("해당 노선에 이미 존재하는 역입니다."), INDEX_FORMAT_ERROR("1 이상의 숫자를 입력해야합니다."), - MAX_INDEX_ERROR("%d 이하의 순서를 입력해야합니다."); + MAX_INDEX_ERROR("%d 이하의 순서를 입력해야합니다."), + IMPOSSIBLE_DELETE_SECTION("해당 노선의 역은 더이상 삭제할 수 없습니다."), + NO_EXIST_STATION_IN_LINE("해당 노선에 존재하지 않는 역입니다."); private static final String ERROR_MESSAGE_PREFIX = "[ERROR] "; private final String errorMessage; diff --git a/src/main/java/subway/domain/LineRepository.java b/src/main/java/subway/domain/LineRepository.java index 8c5d7c008..14de1bce5 100644 --- a/src/main/java/subway/domain/LineRepository.java +++ b/src/main/java/subway/domain/LineRepository.java @@ -26,4 +26,11 @@ public static void deleteLine(Line deletedLine) { } lines.remove(deletedLine); } + + public static Line getLine(Line deletedLine) { + return lines.stream() + .filter(line -> line.equals(deletedLine)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.NO_EXIST_LINE.getErrorMessage())); + } } diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index bea85194e..fcd4196fa 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -9,7 +10,7 @@ public class RouteRepository { - private static final Map> routes = new HashMap<>(); + private static final Map> routes = new LinkedHashMap<>(); public static void addStations(Line line, List stations) { if (routes.containsKey(line)) { @@ -67,4 +68,30 @@ public static void deleteLine(Line line) { } routes.remove(line); } + + public static void validateDeleteLine(Line line) { + List stations = routes.get(line); + if (stations.size()<=2) { + throw new IllegalArgumentException(ErrorMessage.IMPOSSIBLE_DELETE_SECTION.getErrorMessage()); + } + } + + public static void deleteSection(Line line, Station station) { + List stations = routes.get(line); + if (!stations.contains(station)) { + throw new IllegalArgumentException(ErrorMessage.NO_EXIST_STATION_IN_LINE.getErrorMessage()); + } + stations.remove(station); + } + + public static Map> getRoutes() { + Map> resultRoutes = new LinkedHashMap<>(); + for (Line line : routes.keySet()) { + List stations = routes.get(line).stream() + .map(Station::getName) + .toList(); + resultRoutes.put(line.getName(), stations); + } + return resultRoutes; + } } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 4a7a4018e..366e9b963 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -87,4 +87,19 @@ public Station validatePossibleAddStation(Line line, String stationName) { public void registerRoute(Line line, Station station, int index) { RouteRepository.addStation(line, station, index); } + + public Line deleteSectionWithLine(String lineName) { + Line line = LineRepository.getLine(Line.from(lineName)); + RouteRepository.validateDeleteLine(line); + return line; + } + + public void deleteSection(Line line, String stationName) { + Station station = Station.from(stationName); + RouteRepository.deleteSection(line, station); + } + + public Map> getRoutes() { + return RouteRepository.getRoutes(); + } } diff --git a/src/main/java/subway/view/OutputView.java b/src/main/java/subway/view/OutputView.java index b6879ceec..547d06d6d 100644 --- a/src/main/java/subway/view/OutputView.java +++ b/src/main/java/subway/view/OutputView.java @@ -1,6 +1,7 @@ package subway.view; import java.util.List; +import java.util.Map; public class OutputView { @@ -29,8 +30,16 @@ public static void printLines(List lines) { } } - public static void printRoutes() { - + public static void printRoutes(Map> routes) { + System.out.println("\n## 지하철 노선도"); + for (String line : routes.keySet()) { + System.out.println("[INFO] " + line); + System.out.println("[INFO] ---"); + for (String station : routes.get(line)) { + System.out.println("[INFO] " + station); + } + System.out.println(); + } } public static void printErrorMessage(IllegalArgumentException e) { From 5f5dfaef350bbc11d40266c015f50ffa6792c06d Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 20:14:37 +0900 Subject: [PATCH 15/16] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/line/LineMenuCommandRegistry.java | 4 ---- .../subway/command/main/impl/LineCommand.java | 3 --- .../command/main/impl/SectionCommand.java | 3 --- .../command/main/impl/StationCommand.java | 2 -- .../subway/controller/SubwayController.java | 2 -- src/main/java/subway/domain/Line.java | 17 +---------------- .../java/subway/domain/RouteRepository.java | 5 ++--- src/main/java/subway/domain/Station.java | 15 +-------------- .../java/subway/domain/StationRepository.java | 3 +-- src/main/java/subway/service/SubwayService.java | 4 ++-- src/main/java/subway/util/InputParser.java | 4 ---- src/main/java/subway/util/Validator.java | 8 -------- 12 files changed, 7 insertions(+), 63 deletions(-) diff --git a/src/main/java/subway/command/line/LineMenuCommandRegistry.java b/src/main/java/subway/command/line/LineMenuCommandRegistry.java index 0695173b7..db17420fa 100644 --- a/src/main/java/subway/command/line/LineMenuCommandRegistry.java +++ b/src/main/java/subway/command/line/LineMenuCommandRegistry.java @@ -5,10 +5,6 @@ import subway.command.line.impl.LineDeleteCommand; import subway.command.line.impl.LineQueryCommand; import subway.command.line.impl.LineRegistrationCommand; -import subway.command.main.impl.LineCommand; -import subway.command.main.impl.RouteCommand; -import subway.command.main.impl.SectionCommand; -import subway.command.main.impl.StationCommand; import subway.service.SubwayService; public class LineMenuCommandRegistry { diff --git a/src/main/java/subway/command/main/impl/LineCommand.java b/src/main/java/subway/command/main/impl/LineCommand.java index f14aef69f..9d3849215 100644 --- a/src/main/java/subway/command/main/impl/LineCommand.java +++ b/src/main/java/subway/command/main/impl/LineCommand.java @@ -3,11 +3,8 @@ import subway.command.Command; import subway.command.line.LineMenuCommandRegistry; import subway.command.line.LineMenuOption; -import subway.command.station.StationMenuOption; -import subway.service.SubwayService; import subway.util.Retry; import subway.view.InputView; -import subway.view.OutputView; public class LineCommand implements Command { diff --git a/src/main/java/subway/command/main/impl/SectionCommand.java b/src/main/java/subway/command/main/impl/SectionCommand.java index f21cceed4..76b67c8da 100644 --- a/src/main/java/subway/command/main/impl/SectionCommand.java +++ b/src/main/java/subway/command/main/impl/SectionCommand.java @@ -1,13 +1,10 @@ package subway.command.main.impl; import subway.command.Command; -import subway.command.line.LineMenuOption; import subway.command.section.SectionMenuCommandRegistry; import subway.command.section.SectionMenuOption; -import subway.service.SubwayService; import subway.util.Retry; import subway.view.InputView; -import subway.view.OutputView; public class SectionCommand implements Command { diff --git a/src/main/java/subway/command/main/impl/StationCommand.java b/src/main/java/subway/command/main/impl/StationCommand.java index c45811594..aa5be3209 100644 --- a/src/main/java/subway/command/main/impl/StationCommand.java +++ b/src/main/java/subway/command/main/impl/StationCommand.java @@ -3,8 +3,6 @@ import subway.command.Command; import subway.command.station.StationMenuCommandRegistry; import subway.command.station.StationMenuOption; -import subway.service.SubwayService; -import subway.util.InputParser; import subway.util.Retry; import subway.view.InputView; diff --git a/src/main/java/subway/controller/SubwayController.java b/src/main/java/subway/controller/SubwayController.java index 64cbecb58..2c3ff08fb 100644 --- a/src/main/java/subway/controller/SubwayController.java +++ b/src/main/java/subway/controller/SubwayController.java @@ -3,10 +3,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import subway.command.line.LineMenuCommandRegistry; import subway.command.main.MainMenuCommandRegistry; import subway.command.main.MainMenuOption; -import subway.command.section.SectionMenuCommandRegistry; import subway.service.SubwayService; import subway.util.Retry; import subway.view.InputView; diff --git a/src/main/java/subway/domain/Line.java b/src/main/java/subway/domain/Line.java index 6dd90cd6f..d091dbb02 100644 --- a/src/main/java/subway/domain/Line.java +++ b/src/main/java/subway/domain/Line.java @@ -3,12 +3,7 @@ import java.util.Objects; import subway.constant.ErrorMessage; -public class Line { - private final String name; - - public Line(String name) { - this.name = name; - } +public record Line(String name) { public static Line from(String name) { validate(name); @@ -21,12 +16,6 @@ private static void validate(String name) { } } - public String getName() { - return name; - } - - // 추가 기능 구현 - @Override public boolean equals(Object object) { if (object == null || getClass() != object.getClass()) { @@ -36,8 +25,4 @@ public boolean equals(Object object) { return Objects.equals(name, line.name); } - @Override - public int hashCode() { - return Objects.hashCode(name); - } } diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index fcd4196fa..b175f0300 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -1,7 +1,6 @@ package subway.domain; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -88,9 +87,9 @@ public static Map> getRoutes() { Map> resultRoutes = new LinkedHashMap<>(); for (Line line : routes.keySet()) { List stations = routes.get(line).stream() - .map(Station::getName) + .map(Station::name) .toList(); - resultRoutes.put(line.getName(), stations); + resultRoutes.put(line.name(), stations); } return resultRoutes; } diff --git a/src/main/java/subway/domain/Station.java b/src/main/java/subway/domain/Station.java index aba86cc53..5695c43b9 100644 --- a/src/main/java/subway/domain/Station.java +++ b/src/main/java/subway/domain/Station.java @@ -3,12 +3,7 @@ import java.util.Objects; import subway.constant.ErrorMessage; -public class Station { - private final String name; - - public Station(String name) { - this.name = name; - } +public record Station(String name) { public static Station from(String name) { validate(name); @@ -21,10 +16,6 @@ private static void validate(String name) { } } - public String getName() { - return name; - } - // 추가 기능 구현 @Override @@ -36,8 +27,4 @@ public boolean equals(Object object) { return Objects.equals(name, station.name); } - @Override - public int hashCode() { - return Objects.hashCode(name); - } } diff --git a/src/main/java/subway/domain/StationRepository.java b/src/main/java/subway/domain/StationRepository.java index 644b72b3d..197c6943f 100644 --- a/src/main/java/subway/domain/StationRepository.java +++ b/src/main/java/subway/domain/StationRepository.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; import subway.constant.ErrorMessage; public class StationRepository { @@ -30,7 +29,7 @@ public static void deleteStation(Station deleteStation) { public static Station getStation(String stationName) { return stations.stream() - .filter(station -> station.getName().equals(stationName)) + .filter(station -> station.name().equals(stationName)) .findFirst() .orElseThrow(() -> new IllegalArgumentException(ErrorMessage.NO_EXIST_STATION.getErrorMessage())); } diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 366e9b963..42b4ddd58 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -62,13 +62,13 @@ public void deleteLine(String lineName) { public List getStations() { return StationRepository.stations().stream() - .map(Station::getName) + .map(Station::name) .toList(); } public List getLines() { return LineRepository.lines().stream() - .map(Line::getName) + .map(Line::name) .toList(); } diff --git a/src/main/java/subway/util/InputParser.java b/src/main/java/subway/util/InputParser.java index aa95e244c..e488add04 100644 --- a/src/main/java/subway/util/InputParser.java +++ b/src/main/java/subway/util/InputParser.java @@ -1,9 +1,5 @@ package subway.util; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - public final class InputParser { private InputParser() { diff --git a/src/main/java/subway/util/Validator.java b/src/main/java/subway/util/Validator.java index 3c3ff7d89..0a4c43eb4 100644 --- a/src/main/java/subway/util/Validator.java +++ b/src/main/java/subway/util/Validator.java @@ -11,14 +11,6 @@ public final class Validator { private Validator() { } - public static void validateXxx(String input) { - input = input.strip(); - } - - public static void validateCsvFormat(String input) { - input = input.strip(); - } - public static void validateStationFormat(String station) { if (!station.matches(STATION_FORMAT)) { throw new IllegalArgumentException(ErrorMessage.STATION_FORMAT_ERROR.getErrorMessage()); From ae763b19c83c8d4f2fb598a908ce825a43f13579 Mon Sep 17 00:00:00 2001 From: khcho96 Date: Tue, 30 Dec 2025 23:10:34 +0900 Subject: [PATCH 16/16] =?UTF-8?q?fix:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/subway/domain/RouteRepository.java | 8 ++++++-- src/main/java/subway/service/SubwayService.java | 10 +++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/subway/domain/RouteRepository.java b/src/main/java/subway/domain/RouteRepository.java index b175f0300..460e5842b 100644 --- a/src/main/java/subway/domain/RouteRepository.java +++ b/src/main/java/subway/domain/RouteRepository.java @@ -34,6 +34,10 @@ public static boolean contains(Station station) { return false; } + public static boolean contains(Line line) { + return routes.containsKey(line); + } + public static boolean contains(Line line, Station station) { return routes.get(line).contains(station); } @@ -49,8 +53,8 @@ public static void addStation(Line line, Station station) { public static void addStation(Line line, Station station, int index) { List stations = routes.get(line); - if (index > stations.size()) { - throw new IllegalArgumentException(ErrorMessage.MAX_INDEX_ERROR.getErrorMessage(stations.size())); + if (index > stations.size() + 1) { + throw new IllegalArgumentException(ErrorMessage.MAX_INDEX_ERROR.getErrorMessage(stations.size() + 1)); } if (stations.contains(station)) { diff --git a/src/main/java/subway/service/SubwayService.java b/src/main/java/subway/service/SubwayService.java index 42b4ddd58..a840412ae 100644 --- a/src/main/java/subway/service/SubwayService.java +++ b/src/main/java/subway/service/SubwayService.java @@ -73,11 +73,15 @@ public List getLines() { } public Line registerSectionWithLine(String lineName) { - return Line.from(lineName); + Line line = Line.from(lineName); + if (!RouteRepository.contains(line)) { + throw new IllegalArgumentException(ErrorMessage.NO_EXIST_LINE.getErrorMessage()); + } + return line; } public Station validatePossibleAddStation(Line line, String stationName) { - Station station = Station.from(stationName); + Station station = StationRepository.getStation(stationName); if (RouteRepository.contains(line, station)) { throw new IllegalArgumentException(ErrorMessage.ALREADY_EXIST_STATION_IN_LINE.getErrorMessage()); } @@ -95,7 +99,7 @@ public Line deleteSectionWithLine(String lineName) { } public void deleteSection(Line line, String stationName) { - Station station = Station.from(stationName); + Station station = StationRepository.getStation(stationName); RouteRepository.deleteSection(line, station); }