Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

이번 열차는 하이랄행 하이랄행 열차입니다. #10

Open
wants to merge 38 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
57d9bde
[1단계 - 지하철 정보 관리 기능] 허브(방대의) 미션 제출합니다. (#16)
greeng00se May 15, 2023
ba0e43c
refactor: repository 저장 기능 메서드 분리
greeng00se May 16, 2023
c8c9d70
chore: 테스트 환경 변수 설정
greeng00se May 16, 2023
f1af934
docs: 요구사항 정리
greeng00se May 16, 2023
ee43e6c
refactor: 패키지명 변경
greeng00se May 16, 2023
deb51c2
refactor: StationService 파라미터명 변경
greeng00se May 16, 2023
d41ebd4
refactor: 도메인 패키지 변경
greeng00se May 16, 2023
0f8522c
feat: 모든 구간, 역을 반환하는 메서드 추가
greeng00se May 17, 2023
dea88c1
chore: jgrapht 설정 추가
greeng00se May 17, 2023
d7aeff9
feat: 최단 경로 탐색 기능 구현
greeng00se May 17, 2023
d87d0c6
feat: 요금 정보 추가
greeng00se May 17, 2023
0faa68c
feat: 경로 탐색 결과를 라인 번호 기준으로 묶어서 반환하도록 변경
greeng00se May 17, 2023
2946f62
feat: 기본 운임 정책, 거리 별 운임 정책 추가
greeng00se May 17, 2023
ffb0fba
feat: 노선 별 운임 계산 기능 추가
greeng00se May 17, 2023
6577ddc
feat: 연령대 Enum 추가
greeng00se May 17, 2023
d32bb52
feat: 연령대 Enum 반환하는 정적 팩터리 메서드 추가
greeng00se May 17, 2023
b308581
feat: 사용자의 나이에 따라 금액을 할인하는 정책 추가
greeng00se May 17, 2023
cbfdbe2
feat: 최종 운임을 계산하는 정책 추가
greeng00se May 17, 2023
2ba154f
refactor: 5이하의 경우 잘못 계산되던 문제 수정
greeng00se May 17, 2023
7e7649b
docs: 조회 API 수정
greeng00se May 17, 2023
1d57a55
remove: 경로 상의 구간을 라인 기준으로 반환하는 기능 제거
greeng00se May 17, 2023
8156ed2
test: 잘못된 테스트 수정
greeng00se May 17, 2023
ba52a5c
remove: 사용하지 않는 메서드 제거
greeng00se May 17, 2023
b4c0e53
feat: 경로 조회 서비스 추가
greeng00se May 17, 2023
decd8eb
feat: 경로 조회 컨트롤러 추가
greeng00se May 17, 2023
8ac02f2
test: 경로 조회 테스트 추가
greeng00se May 17, 2023
b1f1b08
docs: README 변경
greeng00se May 17, 2023
166ca4e
feat: 서비스에 Transactional 추가
greeng00se May 17, 2023
46adac9
docs: 3단계 요구사항 추가
greeng00se May 21, 2023
7546b6a
refactor: 최단 경로 검색 GET으로 변경
greeng00se May 21, 2023
c485ecc
refactor: 역 추가 전략명 변경
greeng00se May 21, 2023
ed30188
feat: 경로를 표현하는 Path 클래스 추가
greeng00se May 21, 2023
ec7fcf8
refactor: PathFindResult 제거하고 Path 사용하도록 수정
greeng00se May 21, 2023
ba84f58
remove: 사용하지 않는 Distance 생성자 제거
greeng00se May 21, 2023
32bc91f
refactor: Passenger가 나이 정보를 가지고 있도록, AgeDiscountFarePolicy가 계산의 책임을 가…
greeng00se May 21, 2023
d5bc4a7
refactor: 도메인에 인터페이스를 두고 Jgrapht 의존성 분리
greeng00se May 21, 2023
d94cbd7
refactor: Enum String으로 받도록 수정
greeng00se May 21, 2023
4d42c46
chore: DB 설정
greeng00se May 21, 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
59 changes: 58 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,58 @@
# jwp-subway-path
# jwp-subway-path

### 🚇 도메인 요구사항

- [x] 역 등록
- [x] 라인명, 기준이 되는 역, 등록 할 역, 방향, 거리를 입력받아 역을 등록한다.
- [x] 등록할 역의 위치는 자유롭게 지정할 수 있다.
- [x] 입력한 두 역이 전체 노선에서 이미 연결되어 있으면 안된다.
- [x] 기준이 되는 역은 꼭 존재해야 한다.
- [x] 등록할 역은 같은 노선에는 존재하면 안된다.
- [x] 노선 가운데 역이 등록될 경우 거리 정보를 고려해야 한다.
- [x] A-B-C 노선에서 B 다음에 D 역을 등록하려고 할 때 B-C가 3km, B-D거리가 2km라면 B-D거리는 2km로 등록되어야 하고 D-C 거리는 1km로 등록되어야 한다.
- [x] 위에 해당하는 경우가 아닌 경우 예외가 발생한다.
- [x] 역 제거
- [x] 역을 제거하는 경우 정상 동작을 위해 재배치 되어야 한다.
- [x] 역과 역 사이의 거리도 재배정 되어야 한다.
- [x] 노선에 등록된 역이 2개 인 경우 역을 제거할 때 두 역이 모두 제거되어야 한다.
- [x] 노선 조회
- [x] 노선에 포함된 역을 순서대로 보여줘야 한다.
- [x] 전체 노선 조회
- [x] 전체 노선에 포함된 역을 순서대로 보여줘야 한다.
- [x] 경로 조회
- [x] 경로를 반환한다.
- [x] 요금을 반환한다.
- 기본운임(10㎞ 이내): 기본운임 1,250원
- 이용 거리 초과 시 추가운임 부과
- 10km~50km: 5km 까지 마다 100원 추가
- 50km 초과: 8km 까지 마다 100원 추가
- 노선 별 추가 운임을 부과
- 추가 운임은 가장 높은 금액의 추가 요금만 적용된다.
- 연령 별 요금 할인
- 청소년(13세 이상 19세 미만): 350원을 공제한 금액에서 20%를 할인한다.
- 어린이(6세 이상 13세 미만): 350원을 공제한 금액에서 50%를 할인한다.

### 🚉 역 API

| 기능 | Method | URL |
|-------|--------|----------------|
| 등록 | POST | /stations |
| 초기 등록 | POST | /stations/init |
| 삭제 | DELETE | /stations |

### 🛤️ 노선 API

| 기능 | Method | URL |
|-------|--------|-------------|
| 추가 | POST | /lines |
| 삭제 | DELETE | /lines/{id} |
| 수정 | PATCH | /lines/{id} |
| 조회 | GET | /lines/{id} |
| 전체 조회 | GET | /lines |

### 경로 조회 API

| 기능 | Method | URL |
|-------|--------|----------------|
| 경로 조회 | POST | /shortest-path |

27 changes: 15 additions & 12 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.9'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
id 'java'
id 'org.springframework.boot' version '2.7.9'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

sourceCompatibility = '11'

repositories {
mavenCentral()
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-validation'

implementation 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'
implementation 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'

testImplementation 'io.rest-assured:rest-assured:4.4.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.rest-assured:rest-assured:4.4.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.h2database:h2'

implementation 'org.jgrapht:jgrapht-core:1.5.2'
}

test {
useJUnitPlatform()
}
useJUnitPlatform()
}
74 changes: 74 additions & 0 deletions http-request.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
### 노선 등록

POST http://localhost:8080/lines
Content-Type: application/json

{
"name": "1호선",
"color": "RED"
}

### 노선 수정

PATCH http://localhost:8080/lines/1
Content-Type: application/json

{
"name": "2호선",
"color": "RED"
}

### 노선 삭제

DELETE http://localhost:8080/lines/1
Content-Type: application/json

### 노선 전체 조회

GET http://localhost:8080/lines
Content-Type: application/json

### 노선 단일 조회

GET http://localhost:8080/lines/1
Content-Type: application/json

### 역 초기 등록

POST http://localhost:8080/stations/init
Content-Type: application/json

{
"lineName": "1호선",
"leftStationName": "A",
"rightStationName": "B",
"distance": 3
}

### 역 등록

POST http://localhost:8080/stations
Content-Type: application/json

{
"lineName": "1호선",
"baseStationName": "B",
"additionalStationName": "C",
"direction": "RIGHT",
"distance": 3
}

### 역 제거

DELETE http://localhost:8080/stations
Content-Type: application/json

{
"lineName": "1호선",
"stationName": "B"
}

### 길찾기

GET http://localhost:8080/shortest-path?start=C&end=A&age=19
Content-Type: application/json
53 changes: 0 additions & 53 deletions src/main/java/subway/application/LineService.java

This file was deleted.

44 changes: 0 additions & 44 deletions src/main/java/subway/application/StationService.java

This file was deleted.

23 changes: 23 additions & 0 deletions src/main/java/subway/config/FareConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package subway.config;

import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import subway.domain.fare.AgeDiscountFarePolicy;
import subway.domain.fare.BaseFarePolicy;
import subway.domain.fare.DistanceFarePolicy;
import subway.domain.fare.FarePolicy;
import subway.domain.fare.SubwayFarePolicy;

@Configuration
public class FareConfiguration {

@Bean
public FarePolicy farePolicy() {
return new SubwayFarePolicy(List.of(
new BaseFarePolicy(),
new DistanceFarePolicy(),
new AgeDiscountFarePolicy()
));
}
}
35 changes: 35 additions & 0 deletions src/main/java/subway/config/ProductionDatabaseConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package subway.config;

import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Profile("prod")
@Configuration
public class ProductionDatabaseConfiguration {

@Value("${my.datasource.url}")
private String url;

@Value("${my.datasource.driver-class-name}")
private String driverClassName;

@Value("${my.datasource.username}")
private String userName;

@Value("${my.datasource.password}")
private String password;

@Bean
public DataSource dataSource() {
return DataSourceBuilder.create()
.url(url)
.driverClassName(driverClassName)
.username(userName)
.password(password)
.build();
}
}
22 changes: 22 additions & 0 deletions src/main/java/subway/config/TestDatabaseConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package subway.config;

import javax.sql.DataSource;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Profile("test")
@Configuration
public class TestDatabaseConfiguration {

@Bean
public DataSource dataSource() {
return DataSourceBuilder.create()
.url("jdbc:h2:mem:test")
.driverClassName("org.h2.Driver")
.username("sa")
.password("")
.build();
}
}
Loading