8000 [지하철 노선도 미션] 손민성 미션 제출합니다. by bperhaps · Pull Request #102 · woowacourse/java-subway-map-precourse · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

[지하철 노선도 미션] 손민성 미션 제출합니다. #102

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 26 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all co 8000 mmits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e410111
docs(subway): 구현 기능 목록 추가
bperhaps Dec 14, 2020
3f39067
refactor(subway): 도메인, 레포지토리 별로 패키지 분리
bperhaps Dec 14, 2020
2c96e5c
feat(subway): 지하철 역 생성 로직 구현
bperhaps Dec 14, 2020
8eabeb5
refactor(subway): 레포지토리를 인터페이스화 시키고 구현체 생성
bperhaps Dec 14, 2020
1720c99
feat(subway): 지하철 역 등록 로직 구현
bperhaps Dec 14, 2020
9cfbfea
refactor(subway): 지하철 역 생성 및 등록 로직 변경
bperhaps Dec 14, 2020
be0294c
feat(subway): 지하철 노선 생성 로직 구현
bperhaps Dec 14, 2020
1a3dd91
feat(subway): 지하철 역 삭제 로직 구현
bperhaps Dec 14, 2020
db8a9da
refactor(subway): 예외 목록 패키지 분할
bperhaps Dec 14, 2020
cfe35c4
feat(subway): 지하철 역 목록 조회 구현
bperhaps Dec 14, 2020
8ba3059
refactor(subway): 컨벤션에 맞지 않는 클래스 이름 변경
bperhaps Dec 14, 2020
de891c3
fix(subway): Line 의 이름이 String으로 되어있는 버그 수정
bperhaps Dec 14, 2020
6208fa6
feat(subway): 지하철 노선 등록 로직 구현
bperhaps Dec 14, 2020
82265e9
feat(subway): 지하철 노선 삭제 로직 구현
bperhaps Dec 14, 2020
54a6518
feat(subway): 지하철 노선 목록 조회 로직 구현
bperhaps Dec 14, 2020
2761d7c
feat(subway): 지하철 노선에 역 추가 기능 구현
bperhaps Dec 14, 2020
2565e79
feat(subway): 지하철 노선에 역 삭제 기능 구현
bperhaps Dec 14, 2020
f1188c5
feat(subway): 지하철 노선에 등록된 역을 조회 기능 구현
bperhaps Dec 14, 2020
6e48845
docs(subway): 출력 및 입력 요구사항 추가
bperhaps Dec 15, 2020
0a26724
feat(subway): 메인 화면 출력 및 입력 로직
bperhaps Dec 15, 2020
f45a976
feat(subway): 지하철 노선도 구현
bperhaps Dec 15, 2020
8421620
feat(subway): 역 관리 화면 및 입력 구현
bperhaps Dec 15, 2020
2684301
feat(subway): 구간 관리 화면 및 입력 구현
bperhaps Dec 15, 2020
eb1a68c
feat(subway): 노선 관리 화면 및 입력 구현
bperhaps Dec 15, 2020
2ff3449
fix(subway): 자잘한 버그 수정 및 더미데이터 추가
bperhaps Dec 15, 2020
7e1ab97
feat(subway): 에러 메세지 작성
bperhaps Dec 15, 2020
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
209 changes: 209 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
# 지하철 노선도 미션
- 지하철 역과 노선을 관리하는 지하철 노선도 기능을 구현한다.

## 구현 기능 목록

- [x] 프로그램 시작 시 역, 노선 등 필요한 정보를 미리 셋팅한다.
```
1. 지하철역으로 교대역, 강남역, 역삼역, 남부터미널역, 양재역, 양재시민의숲역, 매봉역이 등록되어 있다.
2. 지하철 노선으로 2호선, 3호선, 신분당선이 등록되어 있다.
3. 노선에 역이 아래와 같이 등록되어 있다.(왼쪽 끝이 상행 종점)
- 2호선: 교대역 - 강남역 - 역삼역
- 3호선: 교대역 - 남부터미널역 - 양재역 - 매봉역
- 신분당선: 강남역 - 양재역 - 양재시민의숲역
```
- [x] 지하철 역을 생성 한다
- 에외: 지하철 역 이름 입력 포멧이 ~역 이 아닌 경우
- ~역이 아닌 입력을 허용하고 역을 붙이는 식으로 개발 시, 역이 역 이름의 역인지, station의 역인지 의미를가 불명확 하기 때문에 포멧 통일
- 예외: 역 이름이 2자 이상이 아닌 경우

- [x] 지하철 역을 등록 한다
- 예외: 지하철 역 이름이 중복인 경우

- [x] 지하철 역을 삭제 한다
- 예외: 노선에 등록된 역을 삭제할 경우
- 예외: 존재 하지 않는 역을 삭제할 경우

- [x] 지하철 역의 목록을 조회 한다
- `[INFO]`를 붙여서 출력한다

- [x] 지하철 노선을 생성 한다
- 구현: 상행 종점 역과 하행 종점 역을 입력 받아 노선을 생성 한다
- 예외: 상행 종점과 하행 종점 역이 같은 경우
- 예외: 노선 이름이 2자 이상이 아닌 경우
- 예외: 상행역 및 하행역이 등록된 지하철 역이 아닐 경우
- 에외: 지하철 노선 이름 입력 포멧이 ~선 이 아닌 경우

- [x] 지하철 노선을 등록 한다
- 예외: 지하철 노선의 이름이 중복인 경우

- [x] 지하철 노선을 삭제 한다
- 구현: 지하철 노선을 삭제한다
- 예외: 존재하지 않는 노선 삭제

- [x] 지하철 노선의 목록을 조회 한다
- `[INFO]`를 붙여서 출력한다

- [x] 지하철 노선에 역을 추가 한다 (구간 추가)
- 구현: 하나의 역은 여러개의 노선에 추가될 수 있다
- 구현: 역과 역 사이에 새로운 역이 추가될 수 있다
- 순서는 1부터 시작한다
- 예외: 동일한 노선에 동일한 역이 추가 될 경우
- 예외: 역 등록 위치 입력 시 숫자가 아닌 경우
- 예외: 역 등록 위치 입력 시 구간 범위 를 벗어난 경우
- 1 ~ 구간.size()-1 까지

- [x] 지하철 노선에 역을 삭제 한다 (구간 삭제)
- 구현: 종점을 제거할 경우 다음 역이 종점이 된다
- 예외: 노선에 포함된 역이 2개 이하일 때 역을 제거하려 하는 경우

- [x] 지하철 노선에 등록된 역을 조회할 수 있다
- 구현: 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회한다

- [x] 에러 발생 시 `[ERROR]`를 붙여서 출력한다.

- [x] 메인 화면을 출력한다
- 구현: 메인화면은 다음과 같이 출력한다
```
## 메인 화면
1. 역 관리
2. 노선 관리
3. 구간 관리
4. 지하철 노선도 출력
Q. 종료
```
- 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다.
- [x] 구현: 지하철 노선도를 구현한다.

- [x] 메인 화면 입력을 받는다.
- 구현: 사용자로 부터 기능을 선택 받는다.
- 구현: 올바른 입력인 경우, 해당 기능을 수행한다.
- 예외: 존재하지 않는 기능인 경우
- `[ERROR]` 선택할 수 없는 기능입니다.
- "원하는 기능을 선택하세요." 재 출력 및 재 입력

- 공통사항
- [x] 입력시 에러가 발생한 경우, 기능 선택이 잘못된 경우를 제외하고는 자신의 상위 화면으로 이동한다.
- [x] 기능 선택이 잘못된 경우는 기능 선택 메세지를 다시 출력하고 입력받는다.
- [x] 기능수행 완료 후 메인 화면으로 돌아온다

- [x] 역 관리 화면을 출력한다.
- 구현: 역 관리 화면은 다음과 같이 출력 한다
```
## 역 관리 화면
1. 역 등록
2. 역 삭제
3. 역 조회
B. 돌아가기
```
- 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다.

- [x] 역 관리 화면 입력을 받는다.
- 구현: 사용자로 부터 기능을 선택 받는다.

- 구현: 올바른 입력인 경우 아래와 같이 수행한다
- 1. 역 등록
- `## 등록할 역 이름을 입력하세요.` 출력
- 에러시 에러 메시지 출력
- 성공 시 `[INFO] 지하철 역이 등록되었습니다.` 출력
- 2. 역 삭제
- `## 삭제할 역 이름을 입력하세요.` 출력
- 에러시 에러 메시지 출력
- 성공할 경우 `[INFO] 지하철 역이 삭제되었습니다.` 출력

- 3. 역 조회
- 역 조회시 아래와 같이 출력한다.
```
## 역 목록
$LIST
```

- B. 돌아가기
- 메인 화면으로 돌아간다

- 예외: 존재하지 않는 기능인 경우
- `[ERROR] 선택할 수 없는 기능입니다.` 출력

- [ ] 노선 관리 화면을 출력한다
- 구현: 역 관리 화면은 다음과 같이 출력 한다
```
## 역 관리 화면
1. 역 등록
2. 역 삭제
3. 역 조회
B. 돌아가기
```
- 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다.

- [x] 노선 관리 화면 입력을 받는다.
- 구현: 사용자로 부터 기능을 선택 받는다.

- 구현: 올바른 입력인 경우 아래와 같이 수행한다
- 1. 노선 등록
- `## 등록할 노선 이름을 입력하세요.` 출력 및 입력
- 에러시 에러 메시지 출력
- 성공 시 다음 진행
- `## 등록할 노선의 상행 종점역 이름을 입력하세요.` 출력 및 입력
- 에러시 에러 메시지 출력
- 성공 시 다음 진행
- `## 등록할 노선의 하행 종점역 이름을 입력하세요.` 출력 및 입력
- 에러시 에러 메시지 출력
- 성공 시 `[INFO] 지하철 노선이 등록되었습니다.` 출력
- 2. 역 삭제
- `## 삭제할 역 이름을 입력하세요.` 출력
- 실패할 경우 `[ERROR] $ERROR_MESSAGE` 출력
- 성공할 경우 `[INFO] 지하철 역이 삭제되었습니다.` 출력

- 3. 노선 조회
- 노선 조회시 아래와 같이 출력한다.
```
## 노선 목록
$LIST
```

- B. 돌아가기
- 메인 화면으로 돌아간다

- 예외: 존재하지 않는 기능인 경우
- `[ERROR] 선택할 수 없는 기능입니다.` 출력

- [x] 구간 관리 화면을 출력한다
- 구현: 역 관리 화면은 다음과 같이 출력 한다
```
## 구간 관리 화면
1. 구간 등록
2. 구간 삭제
B. 돌아가기
```
- 구현: 메인 화면이 나온 뒤 "원하는 기능을 선택하세요." 를 출력한다.

- [x] 노선 관리 화면 입력을 받는다.
- 구현: 사용자로 부터 기능을 선택 받는다.

- 구현: 올바른 입력인 경우 아래와 같이 수행한다
- 1. 구간 등록
- `## 노선을 입력하세요.` 출력 및 입력
- 에러시 에러 메시지 출력
- 성공 시 다음 진행
- `## 역이름을 입력하세요.` 출력 및 입력
- 에러시 에러 메시지 출력
- 성공 시 다음 진행
- `## 순서를 입력하세요.` 출력 및 입력
- 에러시 에러 메시지 출력
- 성공 시 `[INFO] 지하철 노선이 등록되었습니다.` 출력
- 2. 구간 삭제
- `## 삭제할 구간의 노선을 입력하세요.` 출력
- 에러시 에러 메시지 출력
- 성공 시 다음 진행
- `## 삭제할 구간의 역을 입력하세요.` 출력
- 에러시 에러 메시지 출력
- 성공 시 `[INFO] 구간이 삭제되었습니다.` 출력
- B. 돌아가기
- 메인 화면으로 돌아간다

- 예외: 존재하지 않는 기능인 경우
- `[ERROR] 선택할 수 없는 기능입니다.` 출력

## 📝 License

This project is [MIT](https://github.com/woowacourse/java-subway-map-precourse/blob/master/LICENSE.md) licensed.
22 changes: 19 additions & 3 deletions src/main/java/subway/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
package subway;

import java.util.Scanner;
import subway.controller.ControllerContainer;
import subway.controller.main.MainMenuController;
import subway.domain.line.Line;
import subway.domain.station.Station;
import subway.domain.station.StationName;
import subway.repository.line.LineRepository;
import subway.repository.line.LineRepositoryImpl;
import subway.repository.station.StationRepository;
import subway.repository.station.StationRepositoryImpl;
import subway.service.*;

import java.util.Arrays;

public class Application {

public static void main(String[] args) {
final Scanner scanner = new Scanner(System.in);
// TODO: 프로그램 구현
LineRepository lineRepository = ControllerContainer.getLineRepository();
StationRepository stationRepository = ControllerContainer.getStationRepository();

DummyData.init();

new MainMenuController(stationRepository, lineRepository).run();
}
}
51 changes: 51 additions & 0 deletions src/main/java/subway/DummyData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package subway;

import subway.controller.ControllerContainer;
import subway.domain.line.Line;
import subway.domain.station.Station;
import subway.repository.line.LineRepository;
import subway.repository.station.StationRepository;
import subway.service.*;

import java.util.Arrays;
import java.util.Objects;

public class DummyData {

private static StationRepository stationRepository = ControllerContainer.getStationRepository();
private static LineRepository lineRepository = ControllerContainer.getLineRepository();

private static String[] stationNames = {
"교대역", "강남역", "역삼역", "남부터미널역", "양재역", "양재시민의숲역", "매봉역"
};

private static Station[] stations;

private static Station from(String name) {
return Arrays.stream(stations)
.filter(station -> Objects.equals(station.getName().toString(), name))
.findAny()
.orElse(null);
}

public static void init() {
stations = Arrays.stream(stationNames)
.map(station -> new StationGenerateService().generate(station))
.toArray(Station[]::new);

Arrays.stream(stations).forEach(station -> new StationRegisterService(stationRepository).register(station));

Line line = new LineGenerateService(stationRepository).generate("2호선", from("교대역"), from("역삼역"));
new LineRegisterService(lineRepository).register(line);
new SectionRegisterService(stationRepository, lineRepository).add("2호선", "강남역", "1");

Line line3 = new LineGenerateService(stationRepository).generate("3호선", from("교대역"), from("매봉역"));
new LineRegisterService(lineRepository).register(line3);
new SectionRegisterService(stationRepository, lineRepository).add("3호선", "양재역", "1");
new SectionRegisterService(stationRepository, lineRepository).add("3호선", "남부터미널역", "1");

Line shin = new LineGenerateService(stationRepository).generate("신분당선", from("강남역"), from("양재시민의숲역"));
new LineRegisterService(lineRepository).register(shin);
new SectionRegisterService(stationRepository, lineRepository).add("신분당선", "양재역", "1");
}
}
50 changes: 50 additions & 0 deletions src/main/java/subway/controller/ControllerContainer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package subway.controller;

import subway.controller.line.LineManagementController;
import subway.controller.main.MainMenuController;
import subway.controller.section.SectionManagementController;
import subway.controller.station.StationManagementController;
import subway.domain.station.Station;
import subway.repository.line.LineRepository;
import subway.repository.line.LineRepositoryImpl;
import subway.repository.station.StationRepository;
import subway.repository.station.StationRepositoryImpl;

public class ControllerContainer {

private static LineRepository lineRepository = new LineRepositoryImpl();
private static StationRepository stationRepository = new StationRepositoryImpl();

private static MainMenuController mainMenuController =
new MainMenuController(stationRepository, lineRepository);
private static LineManagementController lineManagementController =
new LineManagementController(stationRepository, lineRepository);
private static StationManagementController stationManagementController =
new StationManagementController(stationRepository, lineRepository);
private static SectionManagementController sectionManagementController =
new SectionManagementController(stationRepository, lineRepository);

public static MainMenuController getMainMenuController() {
return mainMenuController;
}

public static LineManagementController getLineManagementController() {
return lineManagementController;
}

public static StationManagementController getStationManagementController() {
return stationManagementController;
}

public static SectionManagementController getSectionManagementController() {
return sectionManagementController;
}

public static LineRepository getLineRepository() {
return lineRepository;
}

public static StationRepository getStationRepository() {
return stationRepository;
}
}
Loading
0