Skip to content

Latest commit

ย 

History

History
189 lines (139 loc) ยท 7.15 KB

backend-mission.md

File metadata and controls

189 lines (139 loc) ยท 7.15 KB

๐Ÿ”™ ๋ฐฑ์—”๋“œ ๋ฏธ์…˜

๋ ˆ๋ฒจ2 ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ์›น ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ATDD ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ๋„ ํ–ˆ๊ณ  ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด๊ธฐ๋„ ํ–ˆ์—ˆ์ฃ .
๊ณผ์ •์„ ์ž˜ ์†Œํ™”ํ–ˆ๋Š”์ง€ ์ ๊ฒ€ํ•ด๋ณด๊ณ  ์Šค์Šค๋กœ๋ฅผ ๋˜๋Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋ ˆ๊ฑฐ์‹œ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฏธ์…˜์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”.


๐ŸŽฏ ์š”๊ตฌ์‚ฌํ•ญ

  • 1. ๊ฒฝ๋กœ ์กฐํšŒ ์‘๋‹ต ๊ฒฐ๊ณผ์— ์š”๊ธˆ ์ •๋ณด ์ถ”๊ฐ€(ํ•„์ˆ˜)
  • 2. ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒฝ๋กœ ๋„์ฐฉ ๊ฒฝ๋กœ ํƒ€์ž… ์ถ”๊ฐ€(์„ ํƒ)

๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

  • 1. ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
  • 2. ๊ฒฝ๋กœ ์กฐํšŒ ๊ธฐ๋Šฅ์˜ ๋ฌธ์„œํ™”๋ฅผ ์ง„ํ–‰ํ•˜์„ธ์š”.
  • 3. ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ TDD๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜์„ธ์š”. (์ปค๋ฐ‹ ๋‹จ์œ„๋ฅผ TDD ์‚ฌ์ดํด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋„ค์š”!)

๐Ÿ“‘ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ์ƒ์„ธ ์„ค๋ช…

1. ๊ฒฝ๋กœ ์กฐํšŒ ์‘๋‹ต ๊ฒฐ๊ณผ์— ์š”๊ธˆ ์ •๋ณด ์ถ”๊ฐ€

ํ˜„์žฌ ๊ฒฝ๋กœ ์กฐํšŒ ๊ธฐ๋Šฅ(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%ํ• 

2. ๊ฐ€์žฅ ๋น ๋ฅธ ๋„์ฐฉ ๊ฒฝ๋กœ ํƒ€์ž… ์ถ”๊ฐ€

ํ˜„์žฌ ๊ฒฝ๋กœ ์กฐํšŒ ๊ธฐ๋Šฅ์€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์™€ ์ตœ์†Œ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๊ฒฝ๋กœ ์กฐํšŒ์˜ ์ƒˆ๋กœ์šด ๊ธฐ์ค€์ธ ํŠน์ • ์‹œ๊ฐ„ ๊ธฐ์ค€ ๊ฐ€์žฅ ๋น ๋ฅธ ๋„์ฐฉ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.
๋ชฉ์ ์ง€์— ๋„์ฐฉํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐ ์ง€ํ•˜์ฒ ์—ญ์— ๋„์ฐฉํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋„์ฐฉํ•˜๋Š” ์‹œ๊ฐ„ ์ดํ›„ ๊ฐ€์žฅ ๋น ๋ฅธ ์ถœ๋ฐœ ์‹œ๊ฐ„์„ ์กฐํšŒํ•˜๋Š” ๋ฐ˜๋ณต ๋กœ์ง์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๊ธฐ๋Šฅ ์ œ์•ฝ์‚ฌํ•ญ

  • ๋…ธ์„ ์˜ ์ฒซ์ฐจ/๋ง‰์ฐจ ์‹œ๊ฐ„์€ 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 ๊ฒฝ๋กœ์˜ ๋„์ฐฉ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋นจ๋ฆฌ ๋„์ฐฉํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์‘๋‹ต

๊ธฐ์กด ์ฝ”๋“œ ์„ค๋ช… - Line(๋…ธ์„ )

  • ๋…ธ์„ ์€ ์‹œ๊ฐ„๊ณผ ๊ด€๋ จ๋œ ์ฒซ์ฐจ ์‹œ๊ฐ„, ๋ง‰์ฐจ ์‹œ๊ฐ„, ๊ฐ„๊ฒฉ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ๊ฐ ๋…ธ์„ ์˜ ์ฒซ ์—ญ์—์„œ ๋งˆ์ง€๋ง‰ ์—ญ์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉํ–ฅ(ํ•˜ํ–‰)๊ณผ ๋งˆ์ง€๋ง‰ ์—ญ์—์„œ ์ฒซ ์—ญ์œผ๋กœ ๊ฐ€๋Š” ๋ฐฉํ–ฅ(์ƒํ–‰)์ด ์กด์žฌํ•จ
  • ์ฒซ์ฐจ ์‹œ๊ฐ„์€ ์ฒซ ์—ญ๊ณผ ๋งˆ์ง€๋ง‰ ์—ญ์—์„œ ํ•˜๋ฃจ ์ค‘ ์ฒ˜์Œ ์ง€ํ•˜์ฒ ์ด ์ถœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธ
  • ๋ง‰์ฐจ ์‹œ๊ฐ„์€ ์ฒซ ์—ญ๊ณผ ๋งˆ์ง€๋ง‰ ์—ญ์—์„œ ํ•˜๋ฃจ ์ค‘ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ง€ํ•˜์ฒ ์ด ์ถœ๋ฐœํ•˜๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธ

ํžŒํŠธ

๊ฐ€์žฅ ๋น ๋ฅธ ๋„์ฐฉ ๊ฒฝ๋กœ ์กฐํšŒ ์‹œ

์ถœ๋ฐœ์—ญ๊ณผ ๋„์ฐฉ์—ญ์˜ ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์กฐํšŒํ•œ ํ›„ ๊ฐ ๊ฒฝ๋กœ์˜ ๋„์ฐฉ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋•Œ, ๋ชจ๋“  ๊ฒฝ๋กœ ์กฐํšŒ๋Š” KShortestPath๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Jgrapht์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Jgrapht์˜ KShortestPaths ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ JgraphTest ๋ฅผ ์ฐธ๊ณ  ํ•˜์„ธ์š”.


๋ฏธ์…˜ ์ˆ˜ํ–‰ ์‚ฌ์ดํด(ATDD)

์š”๊ตฌ์‚ฌํ•ญ์„ ํŒŒ์•… ํ›„ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ์‹œ์ž‘์œผ๋กœ ๋ฏธ์…˜์„ ์ˆ˜ํ–‰ํ•ด์ฃผ์„ธ์š”.
์ธ์ˆ˜ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ํ›„ ๋ฌธ์„œํ™”๋ฅผ ์ง„ํ–‰ํ•˜์‹œ๊ณ  ์ดํ›„ TDD๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•ด์ฃผ์„ธ์š”.


๋กœ๊ทธ์ธ

AuthAcceptanceTest ์˜ ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ์™€ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ํŒŒ์•…ํ•˜์„ธ์š”.


5km ๋งˆ๋‹ค 100์› ์ถ”๊ฐ€

private int calculateOverFare(int distance) {
    if (distance == 0) {
        return 0;
    }
    return (int) ((Math.ceil((distance - 1) / 5) + 1) * 100);
}

JPA ์—”ํ‹ฐํ‹ฐ ํ•„๋“œ ์ถ”๊ฐ€

๋…ธ์„ ๋ณ„ ์ถ”๊ฐ€ ์š”๊ธˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด 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();

    ...
}