๋ ๋ฒจ2 ๋์ ์ฐ๋ฆฌ๋ ์น ํ๋ก๊ทธ๋๋ฐ์ ATDD ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒฝํ์ ํ์ต๋๋ค.
๊ธฐ๋ฅ์ ์ฒ์๋ถํฐ ๊ตฌํํด๋ณด๊ธฐ๋ ํ๊ณ ๋ ๊ฑฐ์๊ฐ ์๋ ์ํฉ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด๊ธฐ๋ ํ์์ฃ .
๊ณผ์ ์ ์ ์ํํ๋์ง ์ ๊ฒํด๋ณด๊ณ ์ค์ค๋ก๋ฅผ ๋๋์๋ณด๊ธฐ ์ํด ๋ ๊ฑฐ์ ์งํ์ฒ ๋
ธ์ ๋ ์ ํ๋ฆฌ์ผ์ด์
๊ธฐ๋ฅ ์ถ๊ฐ
๋ฏธ์
์ ์ค๋นํ์ต๋๋ค.
์๋์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์.
- 1. ๊ฒฝ๋ก ์กฐํ ์๋ต ๊ฒฐ๊ณผ์
์๊ธ
์ ๋ณด ์ถ๊ฐ(ํ์) - 2.
๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก ๋์ฐฉ
๊ฒฝ๋ก ํ์ ์ถ๊ฐ(์ ํ)
- 1.
์ธ์ ํ ์คํธ
๋ฅผ ์์ฑํ์ธ์. - 2. ๊ฒฝ๋ก ์กฐํ ๊ธฐ๋ฅ์
๋ฌธ์ํ
๋ฅผ ์งํํ์ธ์. - 3. ๊ธฐ๋ฅ ๊ตฌํ ์
TDD
๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐํ์ธ์. (์ปค๋ฐ ๋จ์๋ฅผ TDD ์ฌ์ดํด์ ํ์ธํ ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค์!)
ํ์ฌ ๊ฒฝ๋ก ์กฐํ
๊ธฐ๋ฅ(PathAcceptanceTest )์ด ๊ตฌํ๋์ด ์์ต๋๋ค.
์๊ธ ๊ณ์ฐ ๊ธฐ์ค์ ์ฐธ๊ณ ํ์ฌ ๊ธฐ์กด ์๋ต์ ์๊ธ
์ ๋ณด๋ ํจ๊ป ์๋ต์ด ๋ ์ ์๋๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐ๋ก ๊ตฌํํ์ธ์.
์๋์ ๊ฐ์ด ์๊ธ
์ ๋ณด๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
{
"stations": [
{
"id": 1,
"name": "๊ต๋์ญ"
},
{
"id": 2,
"name": "๊ฐ๋จ์ญ"
},
{
"id": 3,
"name": "์์ฌ์ญ"
}
],
"duration": 3,
"distance": 4,
"fare": 1250
}
## ๊ฑฐ๋ฆฌ๋ณ ์๊ธ
- ๊ธฐ๋ณธ์ด์(10ใ ์ด๋ด) : ๊ธฐ๋ณธ์ด์ 1,250์
- ์ด์ฉ ๊ฑฐ๋ฆฌ์ด๊ณผ ์ ์ถ๊ฐ์ด์ ๋ถ๊ณผ
- 10km์ด๊ณผ โผ 50km๊น์ง(5km๋ง๋ค 100์)
- 50km์ด๊ณผ ์ (8km๋ง๋ค 100์)
## ๋
ธ์ ๋ณ ์ถ๊ฐ ์๊ธ
- ์ถ๊ฐ ์๊ธ์ด ์๋ ๋
ธ์ ์ ์ด์ฉ ํ ๊ฒฝ์ฐ ์ธก์ ๋ ์๊ธ์ ์ถ๊ฐ
- ex) 900์ ์ถ๊ฐ ์๊ธ์ด ์๋ ๋
ธ์ 8km ์ด์ฉ ์ 1,250์ -> 2,150์
- ex) 900์ ์ถ๊ฐ ์๊ธ์ด ์๋ ๋
ธ์ 12km ์ด์ฉ ์ 1,350์ -> 2,250์
- ๊ฐ์ฅ ๋์ ์ถ๊ฐ ์๊ธ๋ง ์ ์ฉ
- ex) 0์, 500์, 900์์ ์ถ๊ฐ ์๊ธ์ด ์๋ ๋
ธ์ ๋ค์ ๊ฒฝ์ ํ์ฌ 8km ์ด์ฉ ์ 1,250์ -> 2,150์
## ์ฐ๋ น๋ณ ํ ์ธ ์ ์ฑ
- ๋ก๊ทธ์ธ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ฐ๋ น๋ณ ์๊ธ์ผ๋ก ๊ณ์ฐ
- ์ฒญ์๋
(13์ธ ์ด์~19์ธ ๋ฏธ๋ง): ์ด์์์ 350์์ ๊ณต์ ํ ๊ธ์ก์ 20%ํ ์ธ
- ์ด๋ฆฐ์ด(6์ธ ์ด์~ 13์ธ ๋ฏธ๋ง): ์ด์์์ 350์์ ๊ณต์ ํ ๊ธ์ก์ 50%ํ
ํ์ฌ ๊ฒฝ๋ก ์กฐํ
๊ธฐ๋ฅ์ ์ต๋จ ๊ฑฐ๋ฆฌ
์ ์ต์ ์๊ฐ
๊ธฐ์ค์ผ๋ก ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
๊ฒฝ๋ก ์กฐํ์ ์๋ก์ด ๊ธฐ์ค์ธ ํน์ ์๊ฐ ๊ธฐ์ค ๊ฐ์ฅ ๋น ๋ฅธ ๋์ฐฉ
์กฐํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ธ์.
๋ชฉ์ ์ง์ ๋์ฐฉํ๋ ์๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด์๋ ๊ฒฝ๋ก์ ๊ฐ ์งํ์ฒ ์ญ์ ๋์ฐฉํ๋ ์๊ฐ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋์ฐฉํ๋ ์๊ฐ ์ดํ ๊ฐ์ฅ ๋น ๋ฅธ ์ถ๋ฐ ์๊ฐ์ ์กฐํํ๋ ๋ฐ๋ณต ๋ก์ง์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค.
- ๋ ธ์ ์ ์ฒซ์ฐจ/๋ง์ฐจ ์๊ฐ์ 24:00์ ๋๊ธฐ์ง ๋ชปํ๋ฉฐ ์ฒซ์ฐจ ์๊ฐ์ ๋ง์ฐจ ์๊ฐ ๋ณด๋ค ํญ์ ์ด๋ฅด๋ค.
- ๋ง์ฐจ๊ฐ ๋๊ธธ ๊ฒฝ์ฐ ๋ค์๋ ์ฒซ์ฐจ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐํ๋ค.
- ์ด๋ ์๊ฐ๊ณผ ์นํ์ฐจ ์๊ฐ์ ๊ณ ๋ คํ์ง ์๋๋ค. 1ํธ์ ๊ณผ 2ํธ์ ์ด ๊ต์ฐจํ๋ C์ญ์์ 1ํธ์ ์์ 2ํธ์ ์ผ๋ก ํ์นํด์ผ ํ๋ ๊ฒฝ์ฐ 1ํธ์ ๋์ฐฉ ์๊ฐ์ด 14:30์ด๊ณ 2ํธ์ ์ถ๋ฐ ์๊ฐ์ด 14:30์ผ ๊ฒฝ์ฐ์๋ ํ์นํ ์ ์์
ex) 14:00์ A์ญ์์ D์ญ์ผ๋ก ์ด๋ํ ๋ A-B-D์ A-C-D ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ
- A-B ๊ตฌ๊ฐ์ ๋ ธ์ ์ ์กฐํํ๊ณ ์ํ/ํํ์ ํ๋จ
- ๋ ธ์ ์ ์ฒซ์ฐจ ์๊ฐ๊ณผ ๊ฐ๊ฒฉ์ ํ์ฉํ์ฌ 14:00 ์ดํ A-B ๋ฐฉํฅ์ผ๋ก A์ญ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ๋์ฐฉํ๋ ์๊ฐ ๊ณ์ฐ
- A-B์ ์์์๊ฐ์ ์กฐํํ์ฌ B์ญ ๋์ฐฉ ์๊ฐ์ ๊ณ์ฐ
- B์ญ ๋์ฐฉ ์๊ฐ ์ดํ B-D ๊ตฌ๊ฐ์ ๋ ธ์ ์ ์กฐํํ๊ณ ์ํ/ํํ์ ํ๋จ
- ๋ ธ์ ์ ์ฒซ์ฐจ ์๊ฐ๊ณผ ๊ฐ๊ฒฉ์ ํ์ฉํ์ฌ B์ญ ๋์ฐฉ ์๊ฐ ์ดํ B-D ๋ฐฉํฅ์ผ๋ก B์ญ์ ๊ฐ์ฅ ๋นจ๋ฆฌ ๋์ฐฉํ๋ ์๊ฐ ๊ณ์ฐ
- B-D์ ์์์๊ฐ์ ์กฐํํ์ฌ D์ญ ๋์ฐฉ ์๊ฐ์ ๊ณ์ฐ
- ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก A-C-D ๊ฒฝ๋ก์ ๋์ฐฉ ์๊ฐ์ ๊ณ์ฐํ์ฌ ๋นจ๋ฆฌ ๋์ฐฉํ๋ ๊ฒฝ๋ก๋ฅผ ์๋ต
- ๋ ธ์ ์ ์๊ฐ๊ณผ ๊ด๋ จ๋ ์ฒซ์ฐจ ์๊ฐ, ๋ง์ฐจ ์๊ฐ, ๊ฐ๊ฒฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์
- ๊ฐ ๋ ธ์ ์ ์ฒซ ์ญ์์ ๋ง์ง๋ง ์ญ์ผ๋ก ๊ฐ๋ ๋ฐฉํฅ(ํํ)๊ณผ ๋ง์ง๋ง ์ญ์์ ์ฒซ ์ญ์ผ๋ก ๊ฐ๋ ๋ฐฉํฅ(์ํ)์ด ์กด์ฌํจ
- ์ฒซ์ฐจ ์๊ฐ์ ์ฒซ ์ญ๊ณผ ๋ง์ง๋ง ์ญ์์ ํ๋ฃจ ์ค ์ฒ์ ์งํ์ฒ ์ด ์ถ๋ฐํ๋ ์๊ฐ์ ์๋ฏธ
- ๋ง์ฐจ ์๊ฐ์ ์ฒซ ์ญ๊ณผ ๋ง์ง๋ง ์ญ์์ ํ๋ฃจ ์ค ๋ง์ง๋ง์ผ๋ก ์งํ์ฒ ์ด ์ถ๋ฐํ๋ ์๊ฐ์ ์๋ฏธ
์ถ๋ฐ์ญ๊ณผ ๋์ฐฉ์ญ์ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์กฐํํ ํ ๊ฐ ๊ฒฝ๋ก์ ๋์ฐฉ ์๊ฐ์ ๊ณ์ฐํ์ฌ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
์ด ๋, ๋ชจ๋ ๊ฒฝ๋ก ์กฐํ๋ KShortestPath๋ฅผ ํ์ฉํ ์ ์์ผ๋ฉฐ Jgrapht์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
Jgrapht์ KShortestPaths ํ์ฉ ๋ฐฉ๋ฒ์ JgraphTest ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์๊ตฌ์ฌํญ์ ํ์
ํ ์ธ์ ํ
์คํธ ์์ฑ์ ์์์ผ๋ก ๋ฏธ์
์ ์ํํด์ฃผ์ธ์.
์ธ์ ํ
์คํธ ์์ฑ ํ ๋ฌธ์ํ๋ฅผ ์งํํ์๊ณ ์ดํ TDD๋ฅผ ํตํด ๊ธฐ๋ฅ ๊ตฌํ์ ํด์ฃผ์ธ์.
AuthAcceptanceTest ์ ์ธ์ ํ ์คํธ์ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ฐธ๊ณ ํ์ฌ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ํ์ ํ์ธ์.
private int calculateOverFare(int distance) {
if (distance == 0) {
return 0;
}
return (int) ((Math.ceil((distance - 1) / 5) + 1) * 100);
}
๋
ธ์ ๋ณ ์ถ๊ฐ ์๊ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด Line ํด๋์ค์ extraFare
ํ๋๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
@Entity
public class Line extends BaseEntity {
...
private LocalTime endTime;
private int intervalTime;
private int extraFare;
@Embedded
private LineStations lineStations = new LineStations();
...
}
๋ฌผ๋ก @Embedded
์ ํ์ฉํ์ฌ ๊ตฌํํด๋ ์ข์ต๋๋ค.
@Entity
public class Line extends BaseEntity {
...
private LocalTime endTime;
private int intervalTime;
@Embedded
private Fare extraFare;
@Embedded
private LineStations lineStations = new LineStations();
...
}