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호선 VIP #14

Open
wants to merge 40 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a4327ac
[1단계 - 지하철 정보 관리 기능] 다즐(최우창) 미션 제출합니다. (#14)
woo-chang May 14, 2023
d95a57e
build: 최단 경로 라이브러리 의존성 추가
woo-chang May 15, 2023
28d5842
docs: 기능 요구사항 추가
woo-chang May 15, 2023
189f140
feat: 거리에 따른 요금 계산 기능 구현
woo-chang May 15, 2023
825bef1
build: 최단 경로 라이브러리 의존성 수정
woo-chang May 15, 2023
2b05c90
refactor: Line에서 필요하지 않은 구간 정보 필터링하도록 수정
woo-chang May 15, 2023
03a2ad7
feat: 출발역과 도착역 사이의 최단 경로, 거리를 구하는 기능 구현
woo-chang May 15, 2023
2bdd661
refactor: 지하철 역을 통해 경로를 조회하도록 수정
woo-chang May 16, 2023
7ffb165
feat: 지하철 노선 기능 추출
woo-chang May 16, 2023
6a4adfa
chore: 메서드명 수정
woo-chang May 16, 2023
085ad8f
feat: 지하철에서 최단 경로 조회 기능 구현
woo-chang May 16, 2023
d3563ff
feat: 최단 경로 조회 API 구현
woo-chang May 16, 2023
9de64b8
feat: 노선에 추가 요금 정보 추가
woo-chang May 17, 2023
d565e54
feat: 노선 추가 요금 구현
woo-chang May 17, 2023
0bba461
feat: 거리별 추가요금 정책 구현
woo-chang May 17, 2023
6e0d4c1
feat: 지하철 맵을 통해 최단 경로, 최단 거리 구하는 기능 구현
woo-chang May 17, 2023
4315242
feat: 거리에 따른 요금을 계산하는 기능 구현
woo-chang May 17, 2023
422ee0d
feat: 노선 추가 요금에 따른 요금을 계산하는 기능 구현
woo-chang May 17, 2023
b86b7bc
feat: 나이에 따른 할인 금액 계산 기능 구현
woo-chang May 17, 2023
2cfc943
feat: 나이에 따른 요금 계산 기능 구현
woo-chang May 17, 2023
5e2c0ad
feat: 복합 요구 정책을 수행하기 위한 기능 구현
woo-chang May 17, 2023
c5a393c
refactor: 노선 정보, 탑승자 정보 추가에 대한 수정
woo-chang May 17, 2023
5721896
refactor: 경로 조회 시 반환하고자 하는 정보 수정
woo-chang May 17, 2023
b9b7435
feat: 경로 조회 기능 구현
woo-chang May 17, 2023
b182c26
test: 경로 조회 API 통합 테스트
woo-chang May 17, 2023
9b7471a
refactor: 사용하지 않는 클래스 제거
woo-chang May 17, 2023
10d83f8
docs: API 명세 문서화
woo-chang May 17, 2023
4539c99
chore: 코드 컨벤션 수정
woo-chang May 17, 2023
b49b926
refactor: 청소년, 어린이인 경우에만 공제가 이루어지도록 수정
woo-chang May 17, 2023
ea0d0cf
chore: 코드 컨벤션 수정
woo-chang May 17, 2023
6f45d17
refactor: 노선에 역 추가하는 기능 리팩토링
woo-chang May 17, 2023
ca69a6a
fix: 다음 노선 번호로 업데이트되지 않는 문제 수정
woo-chang May 17, 2023
b3461b8
feat: 프로덕션과 테스트 데이터베이스 설정 분리
woo-chang May 17, 2023
469118d
docs: 애플리케이션 빠른 실행을 위한 문서화
woo-chang May 18, 2023
ac9382c
refactor: 행위에 대한 의미 부여를 위한 메서드 추출
woo-chang May 19, 2023
bbfecb6
refactor: 요금 정책 생성을 테스트 안에서 수행하도록 수정
woo-chang May 20, 2023
084d6c0
refactor: dto swagger 예시 작성
woo-chang May 20, 2023
50bfbb3
test: 구간 목록 테스트 추가
woo-chang May 20, 2023
8d88f7f
refactor: FareStrategyComposite를 컴포넌트 스캔으로 빈 등록
woo-chang May 22, 2023
1d0e6c3
refactor: 환경에 따른 설정 수정
woo-chang May 22, 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
76 changes: 75 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,75 @@
# jwp-subway-path
# jwp-subway-path

## Quick Start

```text
cd docker

docker-compose -p subway up
```

## API 문서

```text
http://localhost:8080/swagger-ui/index.html#/
```

## 기능 요구사항

### 역

- [x] 역은 고유한 식별자를 가진다.
- [x] 역 이름은 `역`으로 끝나야 한다.
- [x] 역 이름은 2글자에서 11글자까지 가능하다.
- [x] 역 이름은 한글 + 숫자로만 이루어져야 한다.

### 구역

- [x] 구역은 두 역과 역 사이의 거리를 가진다.
- [x] 거리는 양의 정수이고, 단위는 km이다.

### 노선

- [x] 노선 이름은 숫자 + `호선` 이다.
- [x] 숫자는 1 ~ 9까지 가능하다.

- [x] 노선의 색은 `색`으로 끝나야 한다.
- [x] 색 이름은 2글자에서 11글자까지 가능하다.

- [x] 역을 추가할 수 있어야 한다.
-[x] 역을 추가할 때, 상행, 하행 역의 정보와 거리 정보를 입력받는다.
- 최초 등록이 아닐 경우, 상행역 또는 하행역 어느 한 가지도 존재하지 않으면 예외를 던진다.
-[x] 하나의 역은 여러 노선에 등록될 수 있다.
-[x] 두 역의 가운데에 다른 역을 등록할 때, 기존 거리를 고려해야 한다.

- [x] 역이 2개 이상 등록된 노선을 전부 보여주어야 한다.

- [x] 구역은 역 순서대로 저장되어 있어야 한다.
- [x] 노선 번호를 입력받으면, 노선에 포함된 역을 순서대로 보여주어야 한다.

- [x] 역을 제거할 수 있어야 한다.
-[x] 역을 제거하면 남은 역을 재배치 해야 한다.
-[x] 노선에서 역이 제거되면 역과 역 사이의 거리도 재배정되어야 한다.
-[x] 노선에 등록된 역이 2개인 경우 하나의 역을 제거할 때 두 역이 모두 제거되어야 한다.

### 지하철

- [x] 출발역과 도착역 사이의 최단 경로를 구한다.
- [x] 총 거리 정보를 함께 응답한다.

### 요금 정책

- [x] 거리에 따른 요금을 계산한다.
- 기본운임(10㎞ 이내): 기본운임 1,250원
- 이용 거리 초과 시 추가운임 부과
- 10km~50km: 5km 까지 마다 100원 추가
- 50km 초과: 8km 까지 마다 100원 추가

- [x] 노선에 따른 요금을 계산한다.
- 추가 요금이 있는 노선을 이용하면 측정된 요금에 추가한다.
- 경로 중 추가 요금이 있는 노선을 환승하여 이용하면 가장 높은 금액의 추가 요금만 적용한다.

- [x] 연령에 따른 요금 할인을 계산한다.
- 연령에 따른 요금 할인 정책을 반영한다.
- 청소년: 운임에서 350원을 공제한 금액의 20% 할인
- 어린이: 운임에서 350원을 공제한 금액의 50% 할인
29 changes: 16 additions & 13 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 'org.springdoc:springdoc-openapi-ui:1.7.0'
implementation 'org.jgrapht:jgrapht-core:1.5.2'
implementation 'mysql:mysql-connector-java:8.0.33'

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'
}

test {
useJUnitPlatform()
}
useJUnitPlatform()
}
4 changes: 4 additions & 0 deletions docker/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
MYSQL_DATABASE=subway
MYSQL_ROOT_PASSWORD=1234
MYSQL_USER=subway
MYSQL_PASSWORD=1234
37 changes: 37 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
version: "3"
services:
app:
container_name: app
image: arm64v8/amazoncorretto:11-alpine-jdk
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/${MYSQL_DATABASE}?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ../src:/app/src
- ../gradle:/app/gradle
- ../build.gradle:/app/build.gradle
- ../gradlew:/app/gradlew
- ../gradlew.bat:/app/gradlew.bat
working_dir: /app
command: [ "./gradlew", "bootrun" ]
depends_on:
- db
restart: always

db:
container_name: db
image: mysql:8.0.33
ports:
- "3307:3306"
environment:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- ../src/main/resources/data.sql:/docker-entrypoint-initdb.d/init.sql
- ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf
restart: always
44 changes: 44 additions & 0 deletions docker/mysql.cnf
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Copyright (c) 2015, 2021, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

#
# The MySQL Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[client]
default-character-set=utf8mb4

[mysqld]
character-set-client-handshake=FALSE
init_connect="SET collation_connection=utf8mb4_unicode_ci"
init_connect="SET NAMES utf8mb4"
character-set-server=utf8mb4
default_time_zone=Asia/Seoul
lower_case_table_names=1

[mysql]
default-character-set=utf8mb4

[mysqldump]
default-character-set=utf8mb4
6 changes: 3 additions & 3 deletions src/main/java/subway/SubwayApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
@SpringBootApplication
public class SubwayApplication {

public static void main(String[] args) {
SpringApplication.run(SubwayApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(SubwayApplication.class, args);
}

}
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.

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

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SwaggerConfiguration {

@Bean
public OpenAPI openAPI() {
final Info info = new Info()
.title("지하철 API Document")
.version("v0.0.1")
.description("지하철 API 명세서입니다.");
return new OpenAPI()
.components(new Components())
Comment on lines +12 to +19
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Swagger 👍

.info(info);
}
}
Loading