Skip to content

[๐Ÿš€ ์‚ฌ์ดํด1 - ๋ฏธ์…˜ (๋ณด๋“œ ์ดˆ๊ธฐํ™” + ๊ธฐ๋ฌผ ์ด๋™)] ํ…Œ๋ฆฌ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#243

Open
Yeji-Kim-Erica wants to merge 45 commits intowoowacourse:yeji-kim-ericafrom
Yeji-Kim-Erica:step1

Conversation

@Yeji-Kim-Erica
Copy link
Copy Markdown

@Yeji-Kim-Erica Yeji-Kim-Erica commented Mar 28, 2026

๐Ÿ’Œ ์ธ์‚ฌ๋ง

์•ˆ๋…•ํ•˜์„ธ์š”, ์ดˆ์ฝ”์นฉ! ๋ฆฌ๋ทฐ์ด ํ…Œ๋ฆฌ์ž…๋‹ˆ๋‹ค.
๊ท€์ค‘ํ•œ ์‹œ๊ฐ„์„ ๋ฆฌ๋ทฐ ์ฐธ์—ฌ์— ํ• ์• ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
๊ฐ€๊ฐ ์—†์ด ๋ถ€์กฑํ•œ ๋ถ€๋ถ„๋“ค์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์„ธ์š”.
์ตœ์„ ์„ ๋‹คํ•ด ๊ฐœ์„ ํ•˜๊ณ  ๊ณต๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‡โ€โ™‚๏ธ

์ฒดํฌ ๋ฆฌ์ŠคํŠธ

  • ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
  • Gradle test๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?

์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”?

๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„

1. ์ƒํƒœ ์†Œ์œ ์™€ ์ฑ…์ž„์˜ ์ผ์น˜: ๊ธฐ๋ฌผ์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋Š” ์ฃผ์ธ์€ ๋ˆ„๊ตฌ์ธ๊ฐ€

'๊ธฐ๋ฌผ์˜ ํ˜„์žฌ ์œ„์น˜(Location)'๋ผ๋Š” ์ƒํƒœ๋ฅผ Piece ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ ธ์•ผ ํ• ์ง€, ์•„๋‹ˆ๋ฉด ๊ธฐ๋ฌผ์„ ๊ด€๋ฆฌํ•˜๋Š” Board๊ฐ€ ๊ฐ€์ ธ์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ๋ฐ˜์˜ํ•˜๋ฉด ๊ธฐ๋ฌผ์ด ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์˜€์ง€๋งŒ, ๋งŒ์•ฝ Piece๊ฐ€ ์œ„์น˜๋ฅผ ๊ฐ€์ง„๋‹ค๋ฉด Board๊ฐ€ ๊ธฐ๋ฌผ์„ ์ด๋™์‹œํ‚ฌ ๋•Œ๋งˆ๋‹ค getter/setter๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ๋ฌป๊ณ  ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์บก์Аํ™”๋ฅผ ์ €ํ•ดํ•œ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ์ฃผ์ฒด์ธ Board๊ฐ€ ์œ„์น˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
"ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ชจ๋ฐฉ"๋ณด๋‹ค "์ฑ…์ž„ ์ฃผ์ฒด์™€ ์ƒํƒœ ์†Œ์œ ์˜ ์ผ์น˜"๋ฅผ ์šฐ์„ ์‹œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ธฐ์ค€์„ ์„ธ์šฐ๊ณ  ์„ค๊ณ„ํ•ด๋ดค๋Š”๋ฐ, ์ด ์„ค๊ณ„ ๋ฐฉํ–ฅ์ด ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ ์ ˆํ•œ์ง€ ์ดˆ์ฝ”์นฉ์˜ ์˜๊ฒฌ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

2. ๊ธฐ๋ฌผ ๋™์  ์ƒ์„ฑ ์‹œ ๋ฆฌํ”Œ๋ ‰์…˜ vs ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค

BoardAssembler์—์„œ ๊ฐ ๊ธฐ๋ฌผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ดˆ๊ธฐ์—๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ํŽ˜์–ด์™€ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๊ณ  ์ •๋ณด๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ณผ์ •์—์„œ ๋ฆฌํ”Œ๋ ‰์…˜์€ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ์ €ํ•ดํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Java 8์˜ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค(Function<Side, Piece>)์™€ ์ƒ์„ฑ์ž ์ฐธ์กฐ๋ฅผ ํ™œ์šฉํ•ด ํŒฉํ† ๋ฆฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด DIP๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ ์œผ๋กœ ๊ธฐ๋ฌผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ๋” ๋‚˜์€ ๊ฐœ์„  ๋ฐฉํ–ฅ์ด ์žˆ์„์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

3. View์™€ Domain์˜ ๊ฒฝ๊ณ„ ๋ฐ ํ๋ฆ„ ์ œ์–ด

  • ์˜์กด์„ฑ: ApplicationView๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด์ธ ArrangementStrategy ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋„๋ฉ”์ธ ๊ฒฝ๊ณ„๋ฅผ ํ๋ฆฐ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ View์—๋Š” ์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ์ธ Enum์˜ ์›์‹œ๊ฐ’์ด๋‚˜ String๋งŒ ๋„˜๊ธฐ๋„๋ก ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ๋ฆ„ ์ œ์–ด: ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์žฌ์‹œ๋„ ๋กœ์ง์˜ ์ฑ…์ž„์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ View ๋Š” '์ž…๋ ฅ ํ˜•์‹ ์ž์ฒด(๊ณต๋ฐฑ, ์ˆซ์ž ์—ฌ๋ถ€ ๋“ฑ)'์— ๋Œ€ํ•œ ์˜ˆ์™ธ ๋ฐœ์ƒ์„ ๋‹ด๋‹นํ•˜๊ณ , Controller(JanggiFlow ํด๋ž˜์Šค)๋Š” view์—์„œ ๋ฐœ์ƒ์‹œํ‚จ ์˜ˆ์™ธ์™€ '๋„๋ฉ”์ธ ๋กœ์ง ๊ฒ€์ฆ(์œ ํšจํ•œ ์ „๋žต ๋ฒˆํ˜ธ, ๋ณด๋“œ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๋“ฑ)' ์‹คํŒจ์— ๋Œ€ํ•œ ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ์žฌ์‹œ๋„๋ฅผ ๋‹ด๋‹นํ•˜๋„๋ก ์—ญํ• ์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต ๊ฐ„์˜ ์ฑ…์ž„ ๋ถ„๋ฆฌ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ์ค‘์ ์ ์œผ๋กœ ์‚ดํŽด๋ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„์ง๊นŒ์ง€ ๋„๋ฉ”์ธ๊ณผ ์ž…์ถœ๋ ฅ์˜ ์—ฐ๊ฒฐ ๋‹ค๋ฆฌ์ธ Controller๊ฐ€ ์–ด๋””๊นŒ์ง€ ์ฑ…์ž„์„ ์ ธ์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ธฐ์ค€์ด ๋ชจํ˜ธํ•œ ์ƒํƒœ์ธ๋ฐ ์ง€๊ธˆ์˜ ์—ญํ•  ์ฑ…์ž„ ๋ถ„๋ฆฌ๊ฐ€ ์ ์ ˆํ•œ์ง€๋„ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

- ์ž…๋ ฅ ๊ฒ€์ฆ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
  - ์ž…๋ ฅ์ด ์ •์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ
  - ์ž…๋ ฅ๊ฐ’์— ๋งคํ•‘๋˜๋Š” ์ „๋žต ํŒจํ„ด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
- ์ „๋žต ํŒจํ„ด ์‹๋ณ„ ๋ผ๋ฒจ ์ถ”๊ฐ€
- ๋„๋ฉ”์ธ ํŒจํ‚ค์ง€ ๋ถ„๋ฆฌ
- isSameSide ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ Side ์—์„œ Piece๋กœ ์ˆ˜์ •
- BoardAssembler์—๊ฒŒ ์ „๋‹ฌ๋ฐ›์€ 2์ฐจ์› ๋ฐฐ์—ด ์ •๋ณด๋ฅผ ์กฐํ•ฉํ•ด Board ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ
- Board์˜ Map<Location, Piece> ๋‚ด์šฉ์„ 2์ฐจ์› List ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•จ
- ์žฅ๊ธฐ ๊ธฐ๋ฌผ์— ๊ธฐ๋ฌผ๋ช… ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ
- ํŒ€(Side)์˜ ํŒ€๋ช… ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•จ
- ๊ฐ ํŒ€์˜ ์žฅ๊ธฐ ์ดˆ๊ธฐํ™” ์ „๋žต์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ๋ฆ„์„ ์ˆ˜์ •ํ•จ
์–‘ ํŒ€์˜ ๊ธฐ๋ฌผ๋ช…์„ ๋ชจ๋‘ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋ž˜์Šค๋ช…์„ Jol ์—์„œ JolByeong์œผ๋กœ ๋ณ€๊ฒฝํ•จ
- ๊ธฐ๋ฌผ ์ด๋™ ๊ทœ์น™์„ ์ฃผ์š” ๊ฒŒ์ž„ ๊ทœ์น™์œผ๋กœ ์ถ”๊ฐ€
- readInteger๋ฅผ readInt๋กœ ๋ณ€๊ฒฝ: Integer๋Š” ์ฐธ์กฐ ํƒ€์ž… ํด๋ž˜์Šค๋ช…์œผ๋กœ, input ๊ฐ’์œผ๋กœ null์ด ๋“ค์–ด์˜ฌ ์ˆ˜
์žˆ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‚ดํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”์„œ๋“œ์˜ ์‹ค์ œ ๋ฐ˜ํ™˜ ํƒ€์ž…์ธ int๋กœ ์ˆ˜์ •ํ•จ
- ์ด๋™ํ•  ๊ธฐ๋ฌผ์˜ ์œ„์น˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ
- ๊ธฐ๋ฌผ์„ ์ด๋™์‹œํ‚ฌ ์œ„์น˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ
- ํ”„๋กœ๋•์…˜ ํด๋ž˜์Šค ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์™€ ๋™์ผํ•˜๋„๋ก ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ์ˆ˜์ •
- ๊ธฐ๋ฌผ์˜ ์ด๋™ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ์ขŒํ‘œ์— ๋”ํ•ด์ค„ ๊ฐ’์„ ์•Œ๋ ค์ฃผ๋Š” Direction ํด๋ž˜์Šค ์ถ”๊ฐ€
- ๊ธฐ๋ฌผ์ด ํŠน์ • ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ์ง€๋‚˜์ณ์•ผ ํ•˜๋Š” ๊ฒฝ๋กœ์˜ Location ๋ชฉ๋ก์„ ์•Œ๋ ค์ฃผ๋Š” Route ํด๋ž˜์Šค ์ถ”๊ฐ€
- Piece ์ถ”์ƒ ํด๋ž˜์Šค์— calculateRoute ์ถ”์ƒ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
- ์กธ๋ณ‘ ๊ธฐ๋ฌผ์˜ ์ด๋™ ๊ทœ์น™์„ ์ ์šฉํ•œ ๊ธฐ๋ฌผ ์ด๋™ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
- ๋งˆ์™€ ์ƒ์€ ํŒ€์— ๊ด€๊ณ„ ์—†์ด ๊ฒฝ๋กœ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ๋ช…์—์„œ WhenTeamHan, WhenTeamCho ๋ฅผ ์ œ๊ฑฐํ•จ
- ์ด๋™ ๊ฒฝ๋กœ ๊ณ„์‚ฐ ๊ทœ์น™์ด ์ค‘๋ณต๋˜๋Š” ๊ธฐ๋ฌผ์˜ ๊ณ„์‚ฐ ๋กœ์ง์„ RouteRule ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•จ
-  ๊ถ๊ณผ ์‚ฌ๋Š” ๊ถ์„ฑ์ด๋ผ๋Š” ์˜์—ญ ์ œํ•œ ๊ทœ์น™์„ ๋™์ผํ•˜๊ฒŒ ๊ฐ€์ง€๋ฏ€๋กœ GungSeongRouteRule ์ด๋ผ๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก
ํ•จ
- ๊ธฐ๋ฌผ ์ด๋™ ๊ทœ์น™์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€์ž„: ์ด๋™ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ, ๊ฒฝ๋กœ ๋„์ค‘์— ์žฅ์• ๋ฌผ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
- ๊ฐ๊ฐ ๊ฒ€์ฆ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด์„œ '๊ทœ์น™'์˜ ์˜๋ฏธ๊ฐ€ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋กœ ํฉ์–ด์ง€๊ฒŒ ๋˜์—ˆ๋ฏ€๋กœ, ๊ฐ ํด๋ž˜์Šค๊ฐ€ ๊ฒ€์ฆํ•˜๋Š” ๋Œ€์ƒ์— ์ง‘์ค‘ํ•œ ์ด๋ฆ„์œผ๋กœ ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ
- direction์œผ๋กœ ๋˜์–ด์žˆ๋˜ ๊ทœ์น™ ํŒจํ‚ค์ง€๋ช…์„ rule๋กœ ๋ณ€๊ฒฝ
- ๊ฒฝ๋กœ์— ๊ด€ํ•œ ๊ทœ์น™์„ ์ง€๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ํด๋ž˜์Šค๋“ค์„ ํ•˜์œ„ ํŒจํ‚ค์ง€์ธ route ํŒจํ‚ค์ง€๋กœ ์ด๋™
- ํฌ๋ฅผ ์ œ์™ธํ•œ ๊ธฐ๋ฌผ์˜ ์ด๋™ ๊ฒฝ๋กœ์— ๋‹ค๋ฅธ ๊ธฐ๋ฌผ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ํ•จ
- ๋„์ฐฉ์ง€์— ๊ฐ™์€ ํŒ€์˜ ๊ธฐ๋ฌผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋„๋ก ํ•จ
- ์ „์ฒด ์ฝ”๋“œ ํฌ๋งทํŒ…์„ ์ •๋ ฌํ•จ
- ํ…Œ์ŠคํŠธ์šฉ ๊ตฌํ˜„ ํด๋ž˜์Šค๋“ค์„ support ํŒจํ‚ค์ง€์— ๋ชจ์œผ๊ณ  ํด๋ž˜์Šค๋ช…์„ Test๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ํ†ต์ผ
- ํ…Œ์ŠคํŠธ์šฉ ์ „๋žต ํด๋ž˜์Šค ์ถ”๊ฐ€
- ๊ธฐ๋ฌผ ์ด๋™์˜ ์ถœ๋ฐœ ์ขŒํ‘œ์™€ ๋„์ฐฉ ์ขŒํ‘œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” validate ๋ฉ”์„œ๋“œ๋“ค์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝ
- ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด์ด๋ฏ€๋กœ, ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋ณ€๊ฒฝ
- ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด์ด๋ฏ€๋กœ, ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋ณ€๊ฒฝ
- BoardAssemblerTest๊ฐ€ ํ”„๋กœ๋•์…˜ ์ „๋žต์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก, ํ…Œ์ŠคํŠธ ์ „์šฉ ์ „๋žต ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถค
- ์ƒํƒœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด์ด๋ฏ€๋กœ, ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋ณ€๊ฒฝ
- Po ํด๋ž˜์Šค์˜ RouteProvider ์ƒ์ˆ˜๊ฐ€ GungSeongRouteProvider์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹น๋ฐ›๋˜ ๊ฒƒ์„ Po์˜ ์ง์„  ์ด๋™ ๊ทœ์น™์— ๋งž๋„๋ก StraightRouteProvider์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹น๋ฐ›๋„๋ก ํ•จ์œผ๋กœ์จ ๋ฒ„๊ทธ ์ˆ˜์ •
- ๊ธฐ๋ฌผ์˜ ์ข…๋ฅ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” PieceType Enum ํด๋ž˜์Šค ๊ตฌํ˜„
- ๊ฐ ๊ธฐ๋ฌผ๋งˆ๋‹ค ๊ตฌํ˜„ํ•˜๋˜ Piece์˜ isEmpty() ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝ
- isEmpty() ํ˜ธ์ถœ ์‹œ PieceType์ด EMPTY์ธ์ง€ ํ™•์ธํ•˜๋„๋ก ๋กœ์ง์„ ์ž‘์„ฑํ•ด ์‘์ง‘๋„๋ฅผ ๋†’์ž„
- RouteProvider: ์ค‘๋ณต๋˜๋˜ ๊ธธ ์ฐพ๊ธฐ ํ•„ํ„ฐ๋ง ๋กœ์ง์„ static ๋ฉ”์„œ๋“œ(findValidPath)๋กœ ์ถ”์ถœํ•ด ์ผ์›ํ™”ํ•˜๊ณ  ๋‹คํ˜•์„ฑ ๊ตฌ์กฐ ๊ฐœ์„ 
- Piece: ๊ธฐ๋ฌผ ๋‚ด๋ถ€์˜ ๋ถˆํ•„์š”ํ•œ ์˜ˆ์™ธ ๋ฒˆ์—ญ์„ ๊ฑท์–ด๋‚ด๊ณ , ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ PieceType์„ ์ „๋‹ฌํ•ด ์ •ํ™•ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •
- Board: ์ถœ๋ฐœ์ง€ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•ด ์ œ์ž๋ฆฌ ์ด๋™ ๋ฐฉ์ง€ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ž˜ํผ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•ด ์‘์ง‘๋„๋ฅผ ๋†’์ž„
- ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๋„๋ก ๊ฐ์ข… ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ช… ๋ฐ ๋ณ€์ˆ˜๋ช… ๋ณ€๊ฒฝ
- ArrangementStrategy: ๊ธฐ๋ณธ ๊ธฐ๋ฌผ(์ฐจ, ํฌ, ๊ถ ๋“ฑ)์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ณตํ†ต ๋กœ์ง์„ ๋ถ€๋ชจ์˜ public ๋ฉ”์„œ๋“œ(place)๋กœ ๋ฌถ๊ณ , BoardAssembler์— ์œ„์น˜ํ•ด์žˆ๋˜ ๊ธฐ๋ฌผ ์ƒ์„ฑ ๋‚ด๋ถ€ ํด๋ž˜์Šค(DefaultPieceFactory)๋ฅผ ๊ฐ€์ ธ์˜ด
- BoardAssembler: ๊ธฐ๋ฌผ์˜ ๊ตฌ์ฒด์ ์ธ ์œ„์น˜ ์ง€์‹์„ ์ œ๊ฑฐํ•˜๊ณ , ๊ฐ ์ง„์˜์˜ ์ „๋žต ๊ฐ์ฒด์— ๋ณด๋“œํŒ ์กฐ๋ฆฝ์„ ์œ„์ž„ํ•˜๋„๋ก ์ฑ…์ž„ ์ถ•์†Œ
- ํ•˜์œ„ ์ „๋žต ํด๋ž˜์Šค๋Š” placeVariablePieces()๋งŒ ๊ตฌํ˜„ํ•ด ๋ณ€๋™ ๊ธฐ๋ฌผ(๋งˆ, ์ƒ) ๋ฐฐ์น˜๋งŒ ๋‹ด๋‹นํ•˜๋„๋ก ๊ตฌ์กฐ ๊ฐœ์„ 
- ๋ณ€๊ฒฝ๋œ ์ฑ…์ž„์— ๋งž๊ฒŒ BoardAssemblerTest๋Š” ๋นˆ์นธ ์ฑ„์šฐ๊ธฐ๋งŒ ๊ฒ€์ฆํ•˜๋„๋ก ํ•˜๊ณ , ArrangementStrategyTest์— ๊ธฐ๋ณธ ๊ธฐ๋ฌผ ๋ฐฐ์น˜ ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€
- JanggiFlow: ์ž˜๋ชป๋œ ์ž…๋ ฅ(์ „๋žต, ๊ธฐ๋ฌผ ์„ ํƒ, ์ด๋™ ์ขŒํ‘œ)์œผ๋กœ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ •์ƒ ์ž…๋ ฅ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์‹œ ์š”์ฒญํ•˜๋Š” ๋กœ์ง ์ˆ˜์ • ๋ฐ ์ถ”๊ฐ€
- RouteProvider: ๊ธฐ๋ฌผ ์ด๋™ ๊ฒฝ๋กœ ์œ„๋ฐ˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ˆ˜์ •
- ConsoleWriter: ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ›„, ๋ณด๋“œํŒ ์ถœ๋ ฅ ์ „ ๊ฐœํ–‰์„ ์ถ”๊ฐ€ํ•ด ์ฝ˜์†” ํ™”๋ฉด ๊ฐ€๋…์„ฑ ๊ฐœ์„ 
- Application, JanggiFlow: ์ „๋žต ๊ฐ์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋„๋ก ๋ณ€๊ฒฝํ•ด OCP ์ค€์ˆ˜
- JanggiFlow, ApplicationView: ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ ํ›„ ๋ทฐ์— ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •ํ•ด
๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„ ํ•ด์†Œ
- JanggiFlow: ๋ทฐ์™€ ์ปจํŠธ๋กค๋Ÿฌ์— ๋ถ„์‚ฐ๋˜์–ด์žˆ๋˜ ์žฌ์ž…๋ ฅ ๋กœ์ง์„ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ชจ๋‘ ๊ด€๋ฆฌํ•˜๋„๋ก ํ๋ฆ„ ์ œ์–ด ์ฑ…์ž„ ์ผ์›ํ™”
Copy link
Copy Markdown

@Chocochip101 Chocochip101 left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š”, ํ…Œ๋ฆฌ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค! ๋ฏธ์…˜ ๋ฆฌ๋ทฐ์–ด๋กœ ํ•จ๊ป˜ํ•˜๊ฒŒ ๋œ ์ดˆ์ฝ”์นฉ์ž…๋‹ˆ๋‹ค ๐Ÿช
๋ฏธ์…˜ ์ž˜ ๊ตฌํ˜„ํ•ด์ฃผ์…จ๋„ค์š” ๐Ÿ‘
์ฝ”๋ฉ˜ํŠธ ๋‚จ๊ฒจ๋‘์—ˆ์œผ๋‹ˆ ํ™•์ธํ•ด๋ณด์‹œ๊ณ  ์žฌ์š”์ฒญ์ฃผ์„ธ์š”!

import java.util.List;
import java.util.Map;

public class JanggiFlow {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Flow๋Š” ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ•˜๋‚˜์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์™œ controller ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋‚˜์š”? controller๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋‚˜์š”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

ํด๋ž˜์Šค์˜ ์—ญํ• ๊ณผ ๋„ค์ด๋ฐ์— ๋Œ€ํ•ด ๋ณธ์งˆ์ ์ธ ๊ณ ๋ฏผ์„ ๋˜์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
๋‘ ์งˆ๋ฌธ์ด ๊ฒฐ๊ตญ '์ด ํด๋ž˜์Šค์˜ ์ •์ฒด์„ฑ'์„ ํ–ฅํ•˜๊ณ  ์žˆ์–ด์„œ ํ•จ๊ป˜ ๋ฌถ์–ด์„œ ๋‹ต๋ณ€์„ ๋‚จ๊ฒจ๋ด…๋‹ˆ๋‹ค.

1. Controller๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๊ณ , ์™œ ์ด ํŒจํ‚ค์ง€์— ์žˆ๋‚˜์š”?

์ œ๊ฐ€ ์ƒ๊ฐํ•œ Controller๋Š” Model๊ณผ View ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ค‘์žฌ์ž์ž…๋‹ˆ๋‹ค. Board, Piece ๋“ฑ์˜ ๋„๋ฉ”์ธ์€ ์ฝ˜์†” ์ž…๋ ฅ/์ถœ๋ ฅ์„ ์ „ํ˜€ ๋ชจ๋ฅธ ์ฑ„ ์ˆœ์ˆ˜ ์žฅ๊ธฐ ๊ทœ์น™๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ , View๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋งŒ ๋ฟŒ๋ฆฌ๋„๋ก ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ด ํด๋ž˜์Šค๋Š” View๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ๋ฐ›๊ณ , ๋„๋ฉ”์ธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉฐ, ๋‹ค์‹œ ๋„๋ฉ”์ธ์˜ ์ƒํƒœ๋ฅผ View๋กœ ์ „๋‹ฌํ•˜๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— controller ํŒจํ‚ค์ง€์— ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. Flow๋Š” ์–ด๋–ค ๊ฒƒ์„ ์˜๋ฏธํ•˜๋‚˜์š”?

'Flow'๋ผ๋Š” ์ด๋ฆ„์€ ์ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žฅ๊ธฐ ๊ฒŒ์ž„์˜ ์ „์ฒด์ ์ธ ์ง„ํ–‰ ํ๋ฆ„์„ ์ œ์–ดํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์ง€์—ˆ์Šต๋‹ˆ๋‹ค.
(๋ฐฐ์น˜ ์ „๋žต ๋ฌป๊ธฐ -> ์ดˆ๊ธฐ ์„ธํŒ… -> ์ŠนํŒจ๊ฐ€ ๋‚  ๋•Œ๊นŒ์ง€ ํ„ด์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๊ธฐ๋ฌผ ์ด๋™ํ•˜๊ธฐ)

๋‹ค๋งŒ ์งˆ๋ฌธ์„ ๋ฐ›๊ณ  ๋‹ค์‹œ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ, 'Flow'๋ผ๋Š” ๋‹จ์–ด๋Š” ์ƒํƒœ๋‚˜ ์—ญํ• ๋ณด๋‹ค๋Š” 'ํ˜„์ƒ ์ž์ฒด'์— ๊ฐ€๊นŒ์šด ์ถ”์ƒ์ ์ธ ๋‹จ์–ด๋ผ,
์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ด ํด๋ž˜์Šค๊ฐ€ MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ผ๋Š” ์ ์ด ์ง๊ด€์ ์œผ๋กœ ์™€๋‹ฟ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
์ด ํด๋ž˜์Šค์˜ ์ค‘์žฌ์ž ์—ญํ• ์ด ๋” ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜๋„๋ก JanggiController ํ˜น์€ ๊ฒŒ์ž„์˜ ์ „์ฒด ํ๋ฆ„์„ ํ†ต์ œํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜ GameController๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๋” ๊ถŒ์žฅํ•˜์‹œ๋Š”์ง€ ์ดˆ์ฝ”์นฉ์˜ ์˜๊ฒฌ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ™‡โ€โ™‚๏ธ

- ApplicationView์˜ ์ž…์ถœ๋ ฅ ๋ฉ”์„œ๋“œ ์ ‘๋‘์‚ฌ๋ฅผ ์˜๋„๊ฐ€ ๋” ๋ช…ํ™•ํ•œ `promptFor`, `show`๋กœ ๋ณ€๊ฒฝํ•ด ๊ฐ€๋…์„ฑ
ํ–ฅ์ƒ
- `convertBoardStatus` ๋‚ด๋ถ€์˜ `boradIn2D` ๋ณ€์ˆ˜๋ช… ์˜คํƒ€๋ฅผ `boardIn2D`๋กœ ์ˆ˜์ •
- `repeatAskLocationToMoveUntilSuccess` ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ถˆํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜(`turnSide`) ์ œ๊ฑฐ
- ๊ธฐ์กด ๋กœ์ง์—์„œ HAN์ด ์•„๋‹ ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด HAN์„ ๋ฐ˜์˜ํ•ด, NONE ๋“ฑ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ˜ธ์ถœ๋  ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”
์ž ์žฌ์  ๋ฒ„๊ทธ ์ฐจ๋‹จ
- CHO ์ƒํƒœ์ผ ๊ฒฝ์šฐ์—๋งŒ ๋ช…์‹œ์ ์œผ๋กœ HAN์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์กฐ๊ฑด ๊ฐœ์„ 
- ์œ ํšจํ•˜์ง€ ์•Š์€ ์ง„์˜์—์„œ ์ƒํƒœ ๋ฐ˜์ „ ์‹œ๋„ ์‹œ UnsupportedOperationException์„ ๋˜์ง€๋„๋ก ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€
- ์ตœ์ƒ์œ„ ArrangementStrategy๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•ด ์—ญํ•  ๋ช…ํ™•ํ™”
- ๋งˆ/์ƒ ๋ฐฐ์น˜๋ฅผ ์ œ์™ธํ•œ ๊ณ ์ • ๊ธฐ๋ฌผ ๋ฐฐ์น˜๋ฅผ ๋‹ด๋‹นํ•˜๋Š” MaSangArrangementTemplate ์ถ”์ƒ ํด๋ž˜์Šค ๋„์ž…: ๊ธฐ๋ฌผ
์ดˆ๊ธฐํ™”์‹œ ๋ฐœ์ƒํ•˜๋˜ ๋ฎ์–ด์“ฐ๊ธฐ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ OCP ํ™•๋ณด
- ๋„๋ฉ”์ธ์ด UI ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค๊ณ  ์žˆ๋˜ StrategyLabel์„ ์‚ญ์ œํ•˜๊ณ , ์ž…๋ ฅ ๋ฒˆํ˜ธ์™€ ์ „๋žต ๊ฐ์ฒด๋ฅผ ๋งคํ•‘ํ•˜๋Š”
ArrangementStrategyResolver ๋„์ž…
- JanggiFlow ๋‚ด๋ถ€์˜ ์ „๋žต ๊ฐ์ฒด ๋งคํ•‘ ๋ฐ ์บ์‹ฑ ๋กœ์ง์„ Resolver๋กœ ์œ„์ž„ํ•ด ์ปจํŠธ๋กค๋Ÿฌ ๋ฌด์ƒํƒœ ์œ ์ง€ ๋ฐ ์ฑ…์ž„ ๋ถ„๋ฆฌ
- ํ•˜์œ„ ์ „๋žต ๊ตฌํ˜„์ฒด๋“ค์˜ ๋„ค์ด๋ฐ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณ€๊ฒฝ (ex. MaSangMaSang -> MaSangMaSangStrategy)
โ–ถ Piece & Movement ๊ตฌ์กฐ ๊ฐœํŽธ
- Piece๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ตฌํ˜„์ฒด๋ฅผ ActivePiece์™€ EmptyPiece๋กœ ์ผ์›ํ™”
- ๊ธฐ์กด ๊ฐœ๋ณ„ ๊ธฐ๋ฌผ ํด๋ž˜์Šค(Cha, Ma, Sang ๋“ฑ)๋ฅผ ์ˆœ์ˆ˜ ์ด๋™ ์ „๋žต์ธ Movement ๊ตฌํ˜„์ฒด(ChaMovement, MaMovement ๋“ฑ)๋กœ ๋ถ„๋ฆฌ
- PieceFactory๋ฅผ ๋„์ž…ํ•ด PieceType๊ณผ Movement ๋งคํ•‘ ๋ฐ ๊ฐ์ฒด ์กฐ๋ฆฝ ์ฑ…์ž„ ์บก์Аํ™”
- Ma, Sang์˜ ๊ฒฝ๋กœ(possibleRoute) static ์ดˆ๊ธฐํ™” ์‹œ์  ๊ผฌ์ž„์œผ๋กœ ์ธํ•œ null ํ• ๋‹น ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ์ž ๋‚ด๋ถ€ ์ดˆ๊ธฐํ™”๋กœ ์ˆ˜์ •

โ–ถ RouteProvider & Collision ๊ฒ€์ฆ ๋กœ์ง ๊ฐœ์„ 
- RouteProvider๊ฐ€ ๊ฒฝ๋กœ ํƒ์ƒ‰ ์‹คํŒจ ์‹œ ์˜ˆ์™ธ ๋Œ€์‹  Optional.empty()๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด ์‹ค์ œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์ง€์ ์„ Piece๋กœ ์„ค์ •. ์ด์— ๋”ฐ๋ผ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€์—์„œ ๊ธฐ๋ฌผ ์ด๋ฆ„์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด PieceType์„ ๋„˜๊ฒจ์ฃผ๋˜ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ์Œ.
- CollisionDetector๊ฐ€ Piece ๊ฐ์ฒด ๋Œ€์‹  Side ์ •๋ณด๋งŒ์œผ๋กœ ์ถฉ๋Œ์„ ํŒ๋ณ„ํ•˜๋„๋ก ๊ฒฐํ•ฉ๋„ ์™„ํ™”

โ–ถ ์ดˆ๊ธฐ ๊ธฐ๋ฌผ ๋ฐฐ์น˜ ๊ตฌ์กฐ ๊ฐœ์„ 
- ArrangementStrategyResolver๋ฅผ ์—ญํ• ์— ๋งž๊ฒŒ ArrangementOption์œผ๋กœ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ์ง๊ด€์ ์ธ ๋ฉ”์„œ๋“œ๋ช… ์ ์šฉ
- Strategy ๊ตฌํ˜„์ฒด๊ฐ€ ์ƒ์„ฑ์ž๋กœ ์ง„์˜์„ ๋ฐ›์•„์™€ ํ•„๋“œ์— ์ €์žฅํ•˜๊ณ  ๋กœ์ง์— ์ ์šฉํ•˜๋„๋ก ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•ด BoardAssembler๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ง„์˜์„ ๋‚ด๋ถ€ ๋กœ์ง์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  List<ArrangementStrategy>๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•จ

โ–ถ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ˜„ํ–‰ํ™” ๋ฐ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- ๋ณ€๊ฒฝ๋œ Optional ๋ฐ˜ํ™˜ ํƒ€์ž…์— ๋งž์ถฐ hasValue(), isEmpty() ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ฆ ๋กœ์ง ์ „๋ฉด ์ˆ˜์ •
- ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ช… ๋ฐ @DisplayName์„ ๊ตฌํ˜„ ์ƒ์„ธ(ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ)๊ฐ€ ์•„๋‹Œ ํ–‰์œ„์™€ ๋„๋ฉ”์ธ ์šฉ์–ด ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ์„ 
- ConsoleWriter๊ฐ€ RuntimeException ๊ฐ์ฒด ๋Œ€์‹  String ํƒ€์ž…์˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋„๋ก ์ˆ˜์ •
- Controller์—์„œ ์˜ˆ์™ธ๋ฅผ ์บ์น˜ํ•ด ๋ฉ”์‹œ์ง€๋งŒ ์ถ”์ถœํ•œ ๋’ค View์— ์ „๋‹ฌํ•˜๋„๋ก ํ๋ฆ„ ๋ณ€๊ฒฝ
- View๊ฐ€ ์˜ˆ์™ธ ๊ฐ์ฒด์˜ ์กด์žฌ๋ฅผ ์•Œ ํ•„์š” ์—†์ด '์ถœ๋ ฅ'์ด๋ผ๋Š” ๋ณธ์—ฐ์˜ ์—ญํ• ์—๋งŒ ์ง‘์ค‘ํ•˜๋„๋ก ๊ฒฐํ•ฉ๋„ ์™„ํ™”
- Board ํด๋ž˜์Šค์—์„œ ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ˆซ์ž 0์„ FIRST_ROW_INDEX ์ƒ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด ๋งค์ง ๋„˜๋ฒ„ ์ œ๊ฑฐ ๋ฐ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- ์ž˜๋ชป๋œ ์ž…๋ ฅ์ด ๋ฐ˜๋ณต๋  ๊ฒฝ์šฐ Call Stack์ด ์Œ“์—ฌ StackOverflowError๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์œ„ํ—˜์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์žฌ๊ท€ ๋Œ€์‹  while ๋ฐ˜๋ณต๋ฌธ ์ ์šฉ
- ์—ฌ๋Ÿฌ ์ž…๋ ฅ ๋กœ์ง์—์„œ ์žฌ์‹œ๋„ ๋กœ์ง์ด ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด, Supplier๋ฅผ ํ™œ์šฉํ•œ ๊ณตํ†ต retry() ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ
- BoardAssembler์˜ ์ดˆ๊ธฐํ™” ์ˆœ์„œ๋ฅผ '๋นˆ์นธ null ์ฒดํฌ' ๋ฐฉ์‹์—์„œ 'EmptyPiece ์„ ๋ฐฐ์น˜ ํ›„ ๋ฎ์–ด์“ฐ๊ธฐ' ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ
- Board ์ดˆ๊ธฐํ™” ์‹œ ํ–‰ ๋‹จ์œ„ ๋งคํ•‘ ๋กœ์ง์„ ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœํ•ด indent depth๋ฅผ 1๋กœ ๊ฐ์†Œ
- Board ์ถœ๋ ฅ์„ ์œ„ํ•œ to2DArray() ๋‚ด๋ถ€์˜ 2์ค‘ for๋ฌธ ์—ญ์‹œ ๋ณ„๋„ ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœํ•ด indent depth๋ฅผ 1๋กœ ๊ฐ์†Œ
- ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ฌผ์˜ ์œ„์น˜๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ConsoleWriter์— ํ–‰/์—ด ์ขŒํ‘œ ์ถœ๋ ฅ ๋กœ์ง ์ถ”๊ฐ€
- ํ•œ๊ธ€ ๊ธฐ๋ฌผ๊ณผ ์ˆซ์ž ๊ฐ„์˜ ์ฝ˜์†” ์ถœ๋ ฅ ๋„ˆ๋น„(์‹œ๊ฐ์  ํฌ๊ธฐ) ์ฐจ์ด๋กœ ์ธํ•œ ์ •๋ ฌ ๊นจ์ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ƒ๋‹จ ์—ด ๋ฒˆํ˜ธ์— ์ „๊ฐ ์ˆซ์ž๋ฅผ ๋„์ž…ํ•ด ์™„๋ฒฝํ•œ ๊ฒฉ์ž ์ •๋ ฌ ๊ตฌํ˜„
- ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ธํ•˜๊ณ  ์ž…๋ ฅํ•˜๋Š” ์ขŒํ‘œ(1~10, 1~9)๋ฅผ ๋‚ด๋ถ€ 2์ฐจ์› ๋ฐฐ์—ด์šฉ ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ฑ…์ž„์„ ๋„๋ฉ”์ธ(Location)์— ์บก์Аํ™”
- Location ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์—ญํ•  ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ, ๊ธฐ์กด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋“ค์˜ Location ์ƒ์„ฑ ๋ฐฉ์‹์„ ์ผ๊ด„ ์ˆ˜์ •
Copy link
Copy Markdown

@Chocochip101 Chocochip101 left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š”, ํ…Œ๋ฆฌ!
์ž˜ ๋ฐ˜์˜ํ•ด์ฃผ์…จ๋„ค์š” ๐Ÿ‘๐Ÿป
๋ช‡ ๊ฐœ์˜ ์ปค๋งจํŠธ ๋‚จ๊ฒผ์œผ๋‹ˆ ํ™•์ธํ•ด์ฃผ์„ธ์š”.


import java.util.List;

public record Location(int x, int y) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ผ๋ฐ˜์ ์œผ๋กœ x๋Š” ์—ด, y๋Š” ํ–‰์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋‚˜์š”?(์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€ ๋•Œ ๊ทธ๋ ‡๊ฒŒ ์ผ๋˜ ๊ธฐ์–ต์ด ์žˆ๋„ค์š” ๐Ÿค”)
์—ฌ๊ธฐ๋Š” ๋ฐ˜๋Œ€๋กœ ์“ฐ์ด๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”. ์•„๋‹ˆ๋ฉด row, col๋กœ ๋” ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค๊ฐ€์š”?

public class ConsoleWriter implements Output {

private static final String BLANK = " ";
private static final List<String> FULL_WIDTH_NUMBERS =
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ƒ์ˆ˜ํ™” ๐Ÿ‘๐Ÿป
BoardAssembler์˜ DEFAULT_ROWS, DEFAULT_COLS๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์—ฌ๊ธฐ๋„


HAN("ํ•œ"),
CHO("์ดˆ"),
NONE("์—†์Œ");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

NONE์ด ํ˜„์žฌ ์“ฐ์ด๋‚˜์š”?


HAN("ํ•œ"),
CHO("์ดˆ"),
NONE("์—†์Œ");
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์•„๋ž˜์™€ ๊ฐ™์ด ์“ฐ๋ฉด, ๋‹ค์Œ ์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ Enum์„ ์ถ”๊ฐ€ํ• ๋•Œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ์•ˆ ์žกํžˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค :)

Suggested change
NONE("์—†์Œ");
NONE("์—†์Œ"),
;

Comment on lines +35 to +36
}).toList();
return List.copyOf(integers);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

.toList()๋Š” ์ด๋ฏธ ๋ถˆ๋ณ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ, copyOf๊ฐ€ ๋ถˆํ•„์š”ํ•ด๋ณด์ด๋„ค์š”.

class RouteTest {

@Test
@DisplayName("ํ˜„์žฌ ์œ„์น˜์—์„œ ์ฃผ์–ด์ง„ Direction ๋“ค์„ ์ ์šฉํ–ˆ์„ ๋•Œ ์ง€๋‚˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.")
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ด๋™ ๋ถˆ๊ฐ€ ๊ฒฝ๋กœ๋กœ ์ด๋™ ์‹œ๋„(์˜ˆ๋ฅผ๋“ค์–ด ์ฐจ๊ฐ€ ๋Œ€๊ฐ์„  ์ด๋™ ์‹œ๋„, ๊ฒฝ๋กœ์— ๊ธฐ๋ฌผ์ด ์žˆ์„ ๋•Œ ๋“ฑ)์— ๋Œ€ํ•œ ์‹คํŒจ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋‚˜์š”? ๐Ÿ‘€

Comment on lines +84 to +88
private Piece createPiece(Side side) {
if (this == JOLBYEONG) {
return FACTORY.createActivePiece(getJolOrByeongBySide(side), side);
}
return FACTORY.createActivePiece(this.pieceType, side);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

DefaultPieceFactory์˜ Enum์œผ๋กœ Piece๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ, createPiece์—์„œ ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ•˜๋„ค์š”.
๊ทธ๋ฆฌ๊ณ  enum์˜ JOLBYEONG์€ PieceType.JOL์„ ๋“ค๊ณ  ์žˆ๋Š”๋ฐ, pieceType ํ•„๋“œ๋ฅผ ์“ฐ์ง€ ์•Š๋„ค์š”.

์•„๋ž˜์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•ด๋ณด๋Š”๊ฑด ์–ด๋–ค๊ฐ€์š”?

JOLBYEONG(3, List.of(0, 2, 4, 6, 8),                                                                                                                                                                        
              side -> side == Side.HAN ? PieceType.BYEONG : PieceType.JOL); 

this.name = name;
}

public Side switchSide() {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

enum์ด ์ž์‹ ์˜ ๋‹ค์Œ ์ƒํƒœ๋ฅผ if/if๋กœ ํŒ๋‹จํ•˜๊ณ  ์žˆ๋„ค์š”.
์ƒ์ˆ˜๊ฐ€ ์ž์‹ ์˜ ๋‹ค์Œ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์•Œ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ์š”?

Comment on lines +11 to +12
protected final PieceType pieceType;
protected final Side side;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

private์œผ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ๋˜๊ฒ ๋„ค์š”.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants