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

[2단계 - 경로 조회 기능] 마코(이규성) 미션 제출합니다. #131

Merged
merged 49 commits into from
May 22, 2023
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
da1f9b1
fix : 쿼리문 오류 수정
aak2075 May 12, 2023
799f15a
fix : 도메인의 id로 db의 id에 해당하는 값 조회하는 오류를 수정, 불필요한 코드 제거
aak2075 May 12, 2023
70a2084
refactor : dao에서 optional 반환
aak2075 May 12, 2023
705ac4f
fix : 실행하지 않는 로직을 stubbing 하는 부분 제거
aak2075 May 12, 2023
8393929
fix : 저장하려는 sections의 departure, arrival에 insert된 stationId를 설정하여 저장하…
aak2075 May 13, 2023
23f26f8
fix : 오류 수정 및 api 설계 변경
aak2075 May 13, 2023
f584034
refactor : 불필요한 코드 제거 및 코드 정렬
aak2075 May 14, 2023
152eef0
refactor : 도메인 구조 변경 후 기능 재구현
aak2075 May 14, 2023
ce997cd
feat : 중간 역 등록 기능 추가
aak2075 May 14, 2023
6fd887e
test : 도메인 테스트 추가
aak2075 May 14, 2023
1c1d2ca
test : dao, repository 테스트 추가
aak2075 May 14, 2023
84c82a6
refactor : 패키지 이름 수정
aak2075 May 15, 2023
06b2a74
test : 컨트롤러 테스트 추가
aak2075 May 15, 2023
5892503
refactor : * import 제거
aak2075 May 15, 2023
ec33374
test : 서비스 테스트 추가
aak2075 May 15, 2023
8652175
feat : 역 구간 삭제, 조회 추가
aak2075 May 16, 2023
552c0e7
fix : 삭제 시 종점인지 검증 추가
aak2075 May 16, 2023
297b802
test : 삭제, 조회 테스트 추가
aak2075 May 16, 2023
4a74cf2
test : 컨트롤러 삭제, 조회 테스트 추가
aak2075 May 16, 2023
3243416
refactor : 쿼리시 컬럼명 명시
aak2075 May 16, 2023
b50eead
refactor : 패키지 수정
aak2075 May 16, 2023
a08e8a9
refactor : save해도 lineId 바뀌지 않도록 수정
aak2075 May 16, 2023
dfc62ea
docs : 문서 업데이트 및 요구사항 추가
aak2075 May 17, 2023
b5a2b07
build : 프로덕션과 테스트 db 분리
aak2075 May 17, 2023
3fb282a
feat : 경로 조회 API 구현
aak2075 May 17, 2023
b81329a
feat : 요금 조회 기능 구현
aak2075 May 17, 2023
947f50e
refactor : final 키워드 적용
aak2075 May 17, 2023
3783bff
refactor : api 스펙 변경
aak2075 May 17, 2023
05bdc99
refactor : 트랜잭션 readOnly 추가
aak2075 May 17, 2023
8966e47
refactor : 컨트롤러 검증 추가
aak2075 May 17, 2023
93cc029
refactor : 코드 정렬
aak2075 May 17, 2023
0cbc447
build : 서버 시작시 테이블 셋팅
aak2075 May 18, 2023
1929032
test : 라인에 역 등록, 삭제, 조회 통합테스트 추가
aak2075 May 18, 2023
4d6934d
refactor : 불필요한 개행 제거
aak2075 May 18, 2023
018909d
refactor : SubwayGraph 빈으로 관리
aak2075 May 19, 2023
7de24fc
refactor : Paths추가하여 Lines를 의존하도록 변경
aak2075 May 19, 2023
0235ffc
refactor : 매직 넘버 상수화
aak2075 May 20, 2023
34fadff
builde: gitigonre http-requests-log
aak2075 May 20, 2023
bd4e927
feat: 로깅 추가 및 개발 환경, 프로덕션 환경 분리
aak2075 May 20, 2023
553d0f2
refactor: Line->dto 의존을 dto->Line으로 변경
aak2075 May 20, 2023
b8cf5a8
refactor: Paths 생성자 private으로 변경
aak2075 May 20, 2023
9bf3930
refactor: api 분리
aak2075 May 20, 2023
1318af1
refactor: StationResponse를 응답하도록 수정
aak2075 May 20, 2023
4e0a2e3
refactor: 요금 계산 로직 수정
aak2075 May 20, 2023
26e31bc
refactor: endpointType 서비스에서 분기
aak2075 May 21, 2023
f0fb8e3
refactor: request에서 EndpointType String으로 가지도록 변경
aak2075 May 21, 2023
5e5a87f
refactor: 중복 제거
aak2075 May 21, 2023
466d62d
refactor: 커스텀 예외 추가
aak2075 May 21, 2023
2ffdf01
refactor: 테스트 초기 데이터 셋팅 및 request 메서드 분리
aak2075 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
635 changes: 635 additions & 0 deletions .idea/httpRequests/http-requests-log.http

Large diffs are not rendered by default.

89 changes: 49 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,53 +17,62 @@
- [X] 다음 역과 이전 역 사이에 삽입 가능한 거리인지 검증한다
- [X] 다음 역과 이전 역의 연결을 변경한다
- [X] 다음 역과 이전 역 까지의 거리를 변경한다
- [ ] 역 제거
- [ ] 상행 종점인 경우
- [ ] 다음 역의 이전 역을 삭제한다
- [ ] 하행 종점이 경우
- [ ] 이전 역의 다음 역을 삭제 한다
- [ ] 중간 역인 경우
- [ ] 이전 역과 다음 역을 연결한다
- [ ] 이전 역과 다음 역 사이의 거리를 변경한다
- [ ] 마지막 두 역인 경우
- [ ] 두 역을 모두 삭제한다
- [ ] 노선 조회 개선
- [ ] 특정 노선의 역 목록을 조회한다
- [ ] 상행 종점을 찾는다
- [ ] 상행 종점부터 다음 역을 탐색한다
- [ ] 하행 종점에 도달하면 종료한다
- [ ] 노선 목록 조회 개선
- [ ] 전체 노선의 역 목록을 조회한다
- [ ] 상행 종점을 찾는다
- [ ] 상행 종점부터 다음 역을 탐색한다
- [ ] 하행 종점에 도달하면 종료한다
- [X] 역 제거
- [X] 상행 종점인 경우
- [X] 다음 역의 이전 역을 삭제한다
- [X] 하행 종점이 경우
- [X] 이전 역의 다음 역을 삭제 한다
- [X] 중간 역인 경우
- [X] 이전 역과 다음 역을 연결한다
- [X] 이전 역과 다음 역 사이의 거리를 변경한다
- [X] 마지막 두 역인 경우
- [X] 두 역을 모두 삭제한다
- [X] 노선 조회 개선
- [X] 특정 노선의 역 목록을 조회한다
- [X] 상행 종점을 찾는다
- [X] 상행 종점부터 다음 역을 탐색한다
- [X] 하행 종점에 도달하면 종료한다
- [X] 노선 목록 조회 개선
- [X] 전체 노선의 역 목록을 조회한다
- [X] 상행 종점을 찾는다
- [X] 상행 종점부터 다음 역을 탐색한다
- [X] 하행 종점에 도달하면 종료한다

## 🎯 추가된 기능 요구사항

- [X] 경로 조회 API 구현
- [X] 요금 조회 기능 추가
- [X] 10km 까지 기본 요금 1250원
- [X] 11km ~ 50km 까지 5km 마다 100원 추가 (11km는 1350원)
- [X] 51km ~ 8km 마다 100원 추가


## 🛠️설계

### DB

- Line
**station** :

| column | type | |
|----------------|--------------|--------------------|
| id | BIGINT | PK, AUTO INCREMENT |
| name | VARCHAR(255) | UNIQUE |
| color | VARCHAR(20) | |
| up_endpoint_id | BIGINT | |
| Column | Type | Constraints |
| ------------- | --------------------- |------------------|
| station_id | BIGINT AUTO_INCREMENT | NOT NULL, PK |
| name | VARCHAR(255) | NOT NULL, UNIQUE |

- Station
**line** :

| column | type | |
|--------|--------------|--------------------|
| id | BIGINT | PK, AUTO INCREMENT |
| name | VARCHAR(255) | UNIQUE |
| Column | Type | Constraints |
| ------------- | --------------------- |------------------|
| line_id | BIGINT AUTO_INCREMENT | NOT NULL, PK |
| name | VARCHAR(255) | NOT NULL, UNIQUE |
| color | VARCHAR(20) | NOT NULL |

- Section
**section** :

| column | type | |
|--------------|--------|--------------------|
| id | BIGINT | PK, AUTO INCREMENT |
| departure_id | BIGINT | NOT NULL |
| arrival_id | BIGINT | NOT NULL |
| distance | INT | NOT NULL |
| line_id | BIGINT | NOT NULL |
| Column | Type | Constraints |
| -------------- | --------------------- |--------------|
| section_id | BIGINT AUTO_INCREMENT | NOT NULL, PK |
| up_station_id | BIGINT | NOT NULL |
| down_station_id| BIGINT | NOT NULL |
| distance | INT | NOT NULL |
| line_id | BIGINT | NOT NULL |
| list_order | INT | NOT NULL |
25 changes: 14 additions & 11 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.jgrapht:jgrapht-core:1.0.1'

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'
implementation 'org.springframework.boot:spring-boot-starter-validation'

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 'mysql:mysql-connector-java:8.0.28'
runtimeOnly 'com.h2database:h2'
}

test {
useJUnitPlatform()
useJUnitPlatform()
}
19 changes: 19 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
version: "3.9"
services:
db:
image: mysql:8.0.28
platform: linux/x86_64
restart: always
ports:
- "13306:3306"
environment:
MYSQL_ROOT_PASSWORD: maco
MYSQL_DATABASE: subway
MYSQL_USER: maco
MYSQL_PASSWORD: maco
TZ: Asia/Seoul
volumes:
- ./db/mysql/data:/var/lib/mysql
- ./db/mysql/config:/etc/mysql/conf.d
- ./db/mysql/init:/docker-entrypoint-initdb.d
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
9 changes: 9 additions & 0 deletions http/Line.http
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@ Content-Type: application/json
"color": "green"
}

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

{
"name": "3호선",
"color": "green"
}

#########################

###
Expand Down
44 changes: 44 additions & 0 deletions http/LineStations.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
### 초기 두 역 등록
PATCH http://localhost:8080/lines/1/stations/1?type=init
Content-Type: application/json

{
"nextStationId": "2",
"distance": "3"
}

### 상행 종점 등록
PATCH http://localhost:8080/lines/1/stations/3?type=up
Content-Type: application/json

{
"distance": "1"
}


### 하행 종점 등록
PATCH http://localhost:8080/lines/1/stations/4?type=down
Content-Type: application/json

{
"distance": "1"
}

### 중간역 등록
PATCH http://localhost:8080/lines/1/stations/3?type=mid
Content-Type: application/json

{
"distance": "2",
"prevStationId": "1"
}


### 라인에 등록된 역 정보 삭제
DELETE http://localhost:8080/lines/1/stations/2

### 라인에 해당하는 모든 역 조회
GET http://localhost:8080/lines/4/stations

### 모든 역 조회
GET http://localhost:8080/lines/stations
109 changes: 29 additions & 80 deletions http/Station.http
Original file line number Diff line number Diff line change
@@ -1,98 +1,47 @@

### 한 노선에서 첫 등록인 경우 (역이 두개 입력), type: 'init'
POST http://localhost:8080/stations/
###
POST http://localhost:8080/stations
Content-Type: application/json

[
{
"name": "잠실역",
"create_type": "INIT",
"line": "2호선",
"up_endpoint": true,
"down_endpoint": false,
"previous_station": null,
"previous_distance": null,
"next_station": "잠실나루역",
"next_distance": 1
},
{
"name": "잠실나루역",
"create_type": "INIT",
"line": "2호선",
"up_endpoint": false,
"down_endpoint": true,
"previous_station": "잠실역",
"previous_distance": 1,
"next_station": null,
"next_distance": null
}
]
{
"name": "강남역"
}


### 상행 종점인 경우
POST http://localhost:8080/stations/
###
POST http://localhost:8080/stations
Content-Type: application/json

[
{
"name": "잠실역",
"create_type": "UP",
"line": "2호선",
"up_endpoint": true,
"down_endpoint": false,
"previous_station": null,
"previous_distance": null,
"next_station": "잠실나루역",
"next_distance": 1
}
]
{
"name": "잠실역"
}


### 중간 역인 경우
POST http://localhost:8080/stations/
###
POST http://localhost:8080/stations
Content-Type: application/json

[
{
"name": "잠실역",
"create_type": "MID",
"line": "2호선",
"up_endpoint": false,
"down_endpoint": false,
"previous_station": "잠실새내역",
"previous_distance": 1,
"next_station": "잠실나루역",
"next_distance": 1
}
]

{
"name": "선릉역"
}

### 하행 종점인 경우
POST http://localhost:8080/stations/
###
POST http://localhost:8080/stations
Content-Type: application/json

[
{
"name": "잠실역",
"create_type": "DOWN",
"line": "2호선",
"up_endpoint": false,
"down_endpoint": true,
"previous_station": "잠실새내역",
"previous_distance": 1,
"next_station": null,
"next_distance": null
}
]
{
"name": "건대입구역"
}


#########################

###
DELETE http://localhost:8080/stations/{id}
POST http://localhost:8080/stations
Content-Type: application/json

###
GET http://localhost:8080/stations/
{
"name": "구의역"
}


### 역, 라인에 등록된 역 정보 삭제
DELETE http://localhost:8080/stations/2

###
GET http://localhost:8080/stations/lines/{id}
39 changes: 0 additions & 39 deletions http/test.http

This file was deleted.

Loading