Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
cd5a53e
docs: 기능 구현 목록 생성
Mingyum-Kim Dec 13, 2023
f088050
feat: 커스텀 예외 처리 생성
Mingyum-Kim Dec 13, 2023
985b76a
feat: 콘솔 입출력을 위한 클래스 생성
Mingyum-Kim Dec 13, 2023
f811214
feat: 초기 설정에 서 역 이름을 모두 저장하는 기능 구현
Mingyum-Kim Dec 13, 2023
70268c7
feat: 초기 설정에서 노선의 정보를 저장하는 기능 구현
Mingyum-Kim Dec 13, 2023
ba70e6e
feat: 노선마다 역의 정보를 등록하는 초기 기능 구현
Mingyum-Kim Dec 13, 2023
a1f3aa8
feat: SubwayManager 클래스 생성 후 초기 정보 입력
Mingyum-Kim Dec 13, 2023
c7ec5b1
feat: 역과 노선을 관리하기 위한 서비스 인터페이스 생성
Mingyum-Kim Dec 13, 2023
cbeaab4
feat: 메인 화면에서 제공하는 기능의 목록을 출력
Mingyum-Kim Dec 13, 2023
31581e6
feat: 기능을 선택하고 주어진 입력이 아닌 경우 오류 반환
Mingyum-Kim Dec 13, 2023
6023eb9
feat: 입력에 따라 분기하여 적절한 기능을 호출
Mingyum-Kim Dec 13, 2023
d039471
refactor: 뷰 클래스를 성격에 맞는 클래스로 분리하여 구현
Mingyum-Kim Dec 13, 2023
9ad37f9
feat: 역 관리 메시지를 출력 후 기능을 입력하는 기능 구현
Mingyum-Kim Dec 13, 2023
aa4c974
feat: 역 이름을 입력하고 검증하는 로직 작성
Mingyum-Kim Dec 13, 2023
f655cc2
feat: 역 이름을 저장하고 메시지를 출력
Mingyum-Kim Dec 13, 2023
d48278d
feat: 노선을 관리하는 화면 출력 후 기능 입력 기능 구현
Mingyum-Kim Dec 13, 2023
7a366b9
feat: 저장된 역을 삭제하는 기능 구현
Mingyum-Kim Dec 13, 2023
8ddcf6b
feat: 역 목록을 출력하는 기능 구현
Mingyum-Kim Dec 13, 2023
c6ee725
feat: 노선 이름을 저장하는 기능 구현
Mingyum-Kim Dec 13, 2023
9d79999
feat: 상행 하행 역을 입력받고 노선을 등록하는 기능 구현
Mingyum-Kim Dec 13, 2023
6b16cbb
feat: 구간 관리 화면을 출력하고 기능을 입력하는 기능 구현
Mingyum-Kim Dec 13, 2023
74d2e96
feat: 지하철 노선도를 출력하는 기능 구현
Mingyum-Kim Dec 13, 2023
d623f94
feat: 노선을 조회하는 기능 구현
Mingyum-Kim Dec 13, 2023
8653192
feat: 노선을 삭제하는 기능 구현
Mingyum-Kim Dec 13, 2023
9c176f9
feat: 구간을 삭제하는 기능 구현
Mingyum-Kim Dec 13, 2023
e0111ed
feat: 구간을 삭제하는 함수 호출
Mingyum-Kim Dec 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 110 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# 💪 프로젝트 개요

지하철 역, 노선, 구간을 관리하고 지하철 노선도를 출력하는 프로젝트를 구현한다.

# 📝 구현 기능 목록

### 초기 설정을 저장하는 기능

- [x] `교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역`을 지하철 역으로 등록한다.
- [x] `2호선, 3호선, 신분당선`을 지하철 노선으로 등록한다.
- [x] 노선마다 역의 정보를 아래와 같이 등록한다.
- `2호선: 교대역 - 강남역 - 역삼역`
- `3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역`
- `신분당선: 강남역 - 양재역 - 양재시민의숲역`

### 메인 화면을 출력하고 원하는 기능을 입력하는 기능

- [x] `## 메인 화면`과 기능의 목록을 출력한다.
- [x] `## 원하는 기능을 선택하세요.`를 출력한다.
- [x] 원하는 기능을 숫자 혹은 `Q`로 입력받는다.
- [x] 주어진 입력에 해당하는 입력임을 검증한다.
- [x] 입력에 따라 적절한 기능을 호출한다.

### 역을 관리하는 기능

- [x] `## 역 관리 화면`과 관리 목록을 출력한다.
- [x] `## 원하는 기능을 선택하세요.`를 출력한다.
- [x] 원하는 기능을 숫자 혹은 `B`로 입력받는다.
- [x] 주어진 입력에 해당하는 입력임을 검증한다.
- [x] 역을 등록한다.
- [x] `## 등록할 역 이름을 입력하세요.`를 출력한다.
- [x] 등록할 역 이름을 입력 받는다.
- [x] 빈 문자열이 아님을 검증한다.
- [x] 중복되는 역 이름이 아님을 검증한다.
- [x] 2글자 이상임을 검증한다.
- [x] 역 이름을 저장한다.
- [x] `[INFO] 지하철 역이 등록되었습니다.`를 출력한다.
- [x] 역을 조회한다.
- [x] `## 역 목록`를 출력한다.
- [x] 저장된 역의 내역을 불러와 출력한다.
- [x] 역을 삭제한다.
- [x] `## 삭제할 역 이름을 입력하세요.`를 출력한다.
- [x] 역 이름을 입력받는다.
- [x] 빈 문자열이 아님을 검증한다.
- [x] 존재하는 이름이 아닌 경우 다시 입력받는다.
- [x] 입력된 역을 삭제한다.
- [x] `[INFO] 지하철 역이 삭제되었습니다.`를 출력한다.

### 노선을 관리하는 기능

- [x] `## 노선 관리 화면`과 관리 목록을 출력한다.
- [x] `## 원하는 기능을 선택하세요.`를 출력한다.
- [x] 원하는 기능을 숫자 혹은 `B`로 입력받는다.
- [x] 주어진 입력에 해당하는 입력임을 검증한다.
- [x] 노선을 등록한다.
- [x] `## 등록할 노선 이름을 입력하세요.`를 출력한다.
- [x] 등록할 노선 이름을 입력 받는다.
- [x] 빈 문자열이 아님을 검증한다.
- [x] 중복되는 역 이름이 아님을 검증한다.
- [x] 2글자 이상임을 검증한다.
- [x] `## 등록할 노선의 상행 종점역 이름을 입력하세요.`를 출력한다.
- [x] 상행 종점역 이름을 입력한다.
- [x] 저장된 역이 아닌 경우 다시 입력받는다.
- [x] `## 등록할 노선의 하행 종점역 이름을 입력하세요.`를 출력한다.
- [x] 하행 종점역 이름을 입력한다.
- [x] 저장된 역이 아닌 경우 다시 입력받는다.
- [x] 노선 이름을 저장한다.
- [x] `[INFO] 지하철 노선이 등록되었습니다.`를 출력한다.
- [x] 노선을 조회한다.
- [x] `## 노선 목록`를 출력한다.
- [x] 저장된 노선의 이름 내역을 불러와 출력한다.
- [x] 노선을 삭제한다.
- [x] `## 삭제할 노선 이름을 입력하세요.`를 출력한다.
- [x] 노선 이름을 입력받는다.
- [x] 빈 문자열이 아님을 검증한다.
- [x] 존재하는 이름이 아닌 경우 다시 입력받는다.
- [x] 입력된 노선을 삭제한다.
- [x] `[INFO] 지하철 노선이 삭제되었습니다.`를 출력한다.

### 구간을 관리하는 기능

- [x] `## 구간 관리 화면`과 관리 목록을 출력한다.
- [x] `## 원하는 기능을 선택하세요.`를 출력한다.
- [x] 원하는 기능을 숫자 혹은 `B`로 입력받는다.
- [x] 주어진 입력에 해당하는 입력임을 검증한다.
- [x] 구간을 등록한다.
- [x] `## 등록할 노선 이름을 입력하세요.`를 출력한다.
- [x] 구간을 추가할 노선 이름을 입력 받는다.
- [x] 존재하는 노선이 아닌 경우, 다시 입력 받는다.
- [x] `## 등록할 역 이름을 입력하세요.`를 출력한다.
- [x] 구간에 추가할 역 이름을 입력 받는다.
- [x] 존재하는 역이 아닌 경우, 다시 입력 받는다.
- [x] 역을 추가할 순서를 입력받는다.
- [x] 숫자 입력이 아닌 경우 다시 입력받는다.
- [x] 추가할 수 있는 구간 범위를 넘어간 경우, 다시 입력받는다.
- [x] `[INFO] 구간이 등록되었습니다.`를 출력한다.
- [x] 구간을 삭제한다.
- [x] `## 삭제할 구간의 노선을 입력하세요.`를 출력한다.
- [x] 노선의 이름을 입력한다.
- [x] 존재하는 노선이 아닌 경우, 다시 입력 받는다.
- [x] `## 삭제할 구간의 역을 입력하세요.`를 출력한다.
- [x] 역의 이름을 입력한다.
- [x] 존재하는 역이 아닌 경우, 다시 입력 받는다.
- [x] 해당 노선에 존재하는 역을 삭제한다.
- [x] `[INFO] 구간이 삭제되었습니다.`를 출력한다.

### 지하철 노선도를 출력하는 기능

- [x] `## 지하철 노선도`를 출력한다.
- [x] 노선과 해당 노선이 지나는 역의 정보를 차례로 출력한다.
56 changes: 56 additions & 0 deletions src/main/java/subway/controller/LineController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package subway.controller;

import java.util.List;
import subway.domain.constants.LineCommand;
import subway.service.RouteService;
import subway.service.SubwayService;
import subway.view.LineView;

public class LineController {
private final LineView lineView;
private final SubwayService subwayService;
private final RouteService routeService;

public LineController(LineView lineView, SubwayService subwayService, RouteService routeService) {
this.lineView = lineView;
this.subwayService = subwayService;
this.routeService = routeService;
}

public void run() {
lineView.printFunctions();
LineCommand function = lineView.enterFunction();
if (function.equals(LineCommand.ADD)) {
addLine();
}
if (function.equals(LineCommand.DELETE)) {
deleteLine();
}
if (function.equals(LineCommand.GET)) {
getLines();
}
}

public void addLines(List<String> lines) {
subwayService.addAll(lines);
}

private void addLine() {
String name = lineView.enterLineNameToAdd();
String head = lineView.enterHeadStation();
String tail = lineView.enterTailStation();
routeService.addRoute(name, head, tail);
subwayService.add(name);
lineView.printAddResult();
}

private void deleteLine() {
String name = lineView.enterLineNameToDelete();
subwayService.delete(name);
lineView.printDeleteResult();
}

private void getLines() {
lineView.printAllLines(subwayService.getAll());
}
}
51 changes: 51 additions & 0 deletions src/main/java/subway/controller/RouteController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package subway.controller;

import java.util.List;
import java.util.Map;
import subway.domain.constants.LineCommand;
import subway.domain.constants.RouteCommand;
import subway.service.RouteService;
import subway.view.RouteView;

public class RouteController {
private final RouteService routeService;
private final RouteView routeView;

public RouteController(RouteService routeService, RouteView routeView) {
this.routeService = routeService;
this.routeView = routeView;
}

public void addRoutes(Map<String, List<String>> route) {
routeService.addAll(route);
}

public void run() {
routeView.printFunctions();
RouteCommand function = routeView.enterFunction();
if (function.equals(LineCommand.ADD)) {
addRoute();
}
if (function.equals(LineCommand.DELETE)) {
deleteRoute();
}
}

private void addRoute() {
String line = routeView.enterLineNameToAdd();
String station = routeView.enterStationNameToAdd();
int index = routeView.enterIndexToAdd();
routeService.addStation(line, station, index);
routeView.printAddResult();
}

/**
* 구간을 삭제하는 함수
*/
private void deleteRoute() {
String line = routeView.enterLineNameToDelete();
String station = routeView.enterStationNameToDelete();
routeService.deleteStation(line, station);
routeView.printDeleteResult();
}
}
50 changes: 50 additions & 0 deletions src/main/java/subway/controller/StationController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package subway.controller;

import java.util.List;
import subway.domain.constants.StationCommand;
import subway.service.SubwayService;
import subway.view.StationView;

public class StationController {
private final SubwayService subwayService;
private final StationView stationView;

public StationController(SubwayService subwayService, StationView stationView) {
this.subwayService = subwayService;
this.stationView = stationView;
}

public void run() {
stationView.printFunctions();
StationCommand function = stationView.enterFunction();
if (function.equals(StationCommand.ADD)) {
addStation();
}
if (function.equals(StationCommand.DELETE)) {
deleteStation();
}
if (function.equals(StationCommand.GET)) {
getStation();
}
}

public void addStations(List<String> stations) {
subwayService.addAll(stations);
}

private void addStation() {
String name = stationView.enterStationNameToAdd();
subwayService.add(name);
stationView.printAddResult();
}

private void deleteStation() {
String name = stationView.enterStationNameToDelete();
subwayService.delete(name);
stationView.printDeleteResult();
}

private void getStation() {
stationView.printAllStation(subwayService.getAll());
}
}
64 changes: 64 additions & 0 deletions src/main/java/subway/controller/SubwayManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package subway.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import subway.domain.constants.FunctionCommand;
import subway.view.MainView;

public class SubwayManager {
private final MainView mainView;
private final LineController lineController;
private final StationController stationController;
private final RouteController routeController;

public SubwayManager(MainView mainView,
LineController lineController,
StationController stationController,
RouteController routeController
) {
this.mainView = mainView;
this.lineController = lineController;
this.stationController = stationController;
this.routeController = routeController;
preprocess();
}

public void preprocess() {
List<String> stations = List.of(
"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"
);
stationController.addStations(stations);
List<String> lines = List.of(
"2호선", "3호선", "신분당선"
);
lineController.addLines(lines);
Map<String, List<String>> route = new HashMap<>();
route.put("2호선", List.of("교대역", "강남역", "역삼역"));
route.put("3호선", List.of("교대역", "남부터미널역", "양재역", "매봉역"));
route.put("신분당선", List.of("강남역", "양재역", "양재시민의숲역"));
routeController.addRoutes(route);
}

public void run() {
while (true) {
mainView.printMainScreen();
FunctionCommand function = mainView.enterFunction();
if (function.equals(FunctionCommand.STATION)) {
stationController.run();
}
if (function.equals(FunctionCommand.LINE)) {
lineController.run();
}
if (function.equals(FunctionCommand.ROUTE)) {
routeController.run();
}
if (function.equals(FunctionCommand.PRINT)) {
routeController.print();
}
if (function.equals(FunctionCommand.QUIT)) {
break;
}
}
}
}
6 changes: 4 additions & 2 deletions src/main/java/subway/domain/Line.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package subway.domain;

import subway.global.validator.Validator;

public class Line {
private static final int MIN_LENGTH = 2;
private String name;

public Line(String name) {
Validator.validateMinLength(name, MIN_LENGTH);
this.name = name;
}

public String getName() {
return name;
}

// 추가 기능 구현
}
7 changes: 7 additions & 0 deletions src/main/java/subway/domain/LineRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

public class LineRepository {
private static final List<Line> lines = new ArrayList<>();
Expand All @@ -19,4 +20,10 @@ public static void addLine(Line line) {
public static boolean deleteLineByName(String name) {
return lines.removeIf(line -> Objects.equals(line.getName(), name));
}

public Optional<Line> findByName(String line) {
return lines.stream()
.filter(name -> name.getName().equals(line))
.findFirst();
}
}
Loading