Skip to content

[๐Ÿš€ ์‚ฌ์ดํด1 - ๋ฏธ์…˜ (๋ธ”๋ž™์žญ ๊ฒŒ์ž„ ์‹คํ–‰)] ๋ผํ‹ฐ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#1018

Open
kdongsu5509 wants to merge 52 commits intowoowacourse:kdongsu5509from
kdongsu5509:step1

Conversation

@kdongsu5509
Copy link

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

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

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

์ฃผ์ œ 1. Delegate ํŒจํ„ด ๋„์ž…์— ๊ด€ํ•œ ๊ณ ์ฐฐ

ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค‘ ๊ฐ€์žฅ ์น˜์—ดํ•˜๊ฒŒ ๋…ผ์˜ํ•œ ์ง€์ ์€ 'View์™€ Model(Domain) ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ „ํ†ต์ ์ธ Controller๋กœ ์ œํ•œํ•  ๊ฒƒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด Delegate ํŒจํ„ด์„ ๋„์ž…ํ•  ๊ฒƒ์ธ๊ฐ€'**์˜€์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” Delegate๋ฅผ ํ™œ์šฉํ•œ ํ๋ฆ„์„ ๊ตฌํ˜„ํ–ˆ์œผ๋‚˜, ์ด๊ฒƒ์ด Controller ๋ณธ์—ฐ์˜ ์—ญํ• ์„ ์ถฉ๋ถ„ํžˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์˜๊ตฌ์‹ฌ์ด ๋‚จ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Controller๋Š” View์™€ Model์˜ ์ค‘์žฌ์ž ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ ๊ตฌํ˜„์—์„œ๋Š” ๋ณ„๋„์˜ Service ๋ ˆ์ด์–ด ์—†์ด View <-> Controller <-> Game(Domain)์˜ ์ง๊ฒฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Controller๊ฐ€ Domain์˜ ํ๋ฆ„์— ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜๊ฑฐ๋‚˜, Domain ๋‚ด๋ถ€ ๋กœ์ง์— ๊ด€์—ฌํ•˜๊ฒŒ ๋˜๋Š” ๊ตฌ์กฐ์— ๋Œ€ํ•ด "์„ค๊ณ„ ์›์น™์„ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€"๋ผ๋Š” ์ƒ์†Œํ•จ๊ณผ ์šฐ๋ ค๋ฅผ ๋™์‹œ์— ๋А๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์ œ 2. CLI ํ™˜๊ฒฝ์—์„œ์˜ Web ์•„ํ‚คํ…์ฒ˜ ๊ณ ๋ ค ์—ฌ๋ถ€

ํŽ˜์–ด๋Š” 'Web ํ™˜๊ฒฝ์˜ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ, ์ƒํƒœ ์œ ์ง€๊ฐ€ ์ „์ œ๋œ Delegate ๋ฐฉ์‹์€ ๋ถ€์ ์ ˆํ•˜๋‹ค'๋Š” ์˜๊ฒฌ์„ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์›น์˜ ์š”์ฒญ-์‘๋‹ต(Request-Response) ๊ตฌ์กฐ์™€ ์Šค๋ ˆ๋“œ ์ ์œ  ๋ฌธ์ œ๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ํƒ€๋‹นํ•œ ์ง€์ ์ด๋‚˜, ์ด๋ฅผ CLI ํ™˜๊ฒฝ์—๊นŒ์ง€ ๊ฐ•์ œ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์˜๋ฌธ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

๋ชจ๋ฐ”์ผ(Flutter) ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ ID ๊ฐ’ ๋“ฑ์„ ๋„˜๊ฒจ ์ƒํƒœ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฌด์ƒํƒœ์„ฑ(Stateless)์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด CLI๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์œ ์ง€๋˜๋Š” ๋™์•ˆ ์ƒํƒœ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ 1์—์„œ CLI์™€ Web์˜ ๊ตฌ์กฐ์  ์ฐจ์ด(ํŠนํžˆ HTTP์˜ ๋ฌด์ƒํƒœ์„ฑ์œผ๋กœ ์ธํ•œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ๋ฐฉ์‹)๋ฅผ ๊นŠ์ด ์žˆ๊ฒŒ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ์ด ํ–ฅํ›„ ๋ ˆ๋ฒจ 2 ์›น ํ•™์Šต์„ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๊ณผ์ •์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์ดํ•ดํ•œ '์›น์˜ ์ œ์•ฝ ์‚ฌํ•ญ ๋•Œ๋ฌธ์— ์ƒ๊ฒจ๋‚œ ์„ค๊ณ„์˜ ์ฐจ์ด'๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ฃผ์ œ 3. ์„ค๊ณ„์˜ ์ ์ • ๋ฒ”์œ„

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

์ฃผ์ œ 4. ์ปค๋ฐ‹์˜ ๋‹จ์œ„

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

๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๊ณ , ๊ทธ๋“ค์˜ ๊ณตํ†ต ์กฐ์ƒ์ธ ์ฐธ๊ฐ€์ž๋ฅผ ์ถ”๊ฐ€ํ•จ.
์ดํ›„ ์นด๋“œ์™€ ์นด๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฑ์˜ ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•จ.
- ์‹ ๊ทœ ๋ฑ ์ œ๊ณต ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
- ์นด๋“œ ๋ฝ‘๊ธฐ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€(์ •์ƒ, ์‹คํŒจ)
- ์ƒˆ๋กœ์šด ๋ฑ ์ œ๊ณต ๊ธฐ๋Šฅ
- ์นด๋“œ ์„ ํƒ ๊ธฐ๋Šฅ
์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
Ace ๊ฐ’ ํŒ์ •๊ณผ ์ „์ฒด ์นด๋“œ ์ ์ˆ˜ ํ•ฉ ๊ธฐ๋Šฅ์€ ์ƒํ˜ธ ์˜์กด์„ฑ์„ ๋„๊ธฐ ๋•Œ๋ฌธ์— Ace๋Š” ์ œ์™ธํ•œ ์นด๋“œ ์ ์ˆ˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•จ.
- add card score total sum feature
- add bust discrimination feature
๋”œ๋Ÿฌ ์ƒ์„ฑ ์‹œ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ Deck์˜ ์ธ์Šคํ„ด์Šค ์ข…๋ฅ˜๋ฅผ ๋ช…์‹œํ•จ
๊ณตํ†ต ๋กœ์ง์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด participant ์ถ”๊ฐ€
๋”œ๋Ÿฌ๋งŒ์˜ ๊ณ ์œ ํ•œ ์นด๋“œ ์ถ”๊ฐ€ ๋กœ์ง์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจํ›„ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ addCard ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ํ˜„์žฌ ์„ค๊ณ„์ƒ์œผ๋กœ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— UnsupportedOperationException์„ ๋˜์ง€๋Š” ๊ฒƒ์œผ๋กœ override ํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค
๊ธฐ์กด ๋ณ€์ˆ˜ deck์˜ ๋ชจํ˜ธ์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝ
๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ์นด๋“œ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹จ์ผํ™”ํ•˜์—ฌ ์ฐจํ›„ Participant ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ
- ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ํ•„๋“œ ๋ฉค๋ฒ„๋กœ List ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด
- ์ถ”ํ›„ ์ฐธ๊ฐ€์ž๋“ค์˜ ์ „์ฒด ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ๋งŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์„ ๋‹ค๋ฃฐ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•ด์„œ
BufferedReader ์‚ฌ์šฉ ์‹œ IOException ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ์กด์žฌ. ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ธ๋“ค๋ง ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ์†๋„๊ฐ€ ๋‹ค์†Œ ๋А๋ฆฌ๋”๋ผ๋„ Scanner ์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ธ๋“ค๋ง ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ๋ณ€๊ฒฝํ•จ
ํ…Œ์ŠคํŠธ ๋กœ์ง ์ž‘์„ฑ์˜ ์šฉ์ด์„ฑ์„ ์œ„ํ•ด mockito ์ถ”๊ฐ€
- ๋ถ€๋ชจ ํด๋ž˜์Šค(Participants)๊ฐ€ ์ž์‹ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ตฌ์กฐ์  ๋ชจ์ˆœ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๊ณตํ†ต ํด๋ž˜์Šค ์ œ๊ฑฐ

- ๋‹ค์ˆ˜์˜ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ Players ํด๋ž˜์Šค ์‹ ๊ทœ ์ถ”๊ฐ€

- Game ๋„๋ฉ”์ธ์ด Dealer์™€ Players๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ธ ํ•„๋“œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ฐ์ฒด ๊ตฌ์กฐ ๊ฐœ์„ 

- ๋„๋ฉ”์ธ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ๋”ฐ๋ผ Dealer์— getCards() ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , OutputView ์ถœ๋ ฅ ๋กœ์ง ์ˆ˜์ •
๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•จ
@echo724 echo724 self-requested a review March 10, 2026 01:03
Copy link

@echo724 echo724 left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ๋ผํ‹ฐ! ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค! ์ฒซ ๋ฐฑ์—”๋“œ ๋ฏธ์…˜ ํž˜๋“ค์ง„ ์•Š์•˜๋‚˜์š”? ใ…Žใ…Ž,, ์•„๋ฌด๋ž˜๋„ ํŽ˜์–ด์™€ ํ•จ๊ป˜ ์„ค๊ณ„ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์‰ฝ์ง€ ์•Š์•˜์„ํ…๋ฐ, ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค.
ํ”ผ๋“œ๋ฐฑ ๋‚จ๊ธฐ๊ธด ํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” ์ค‘๋ณต ์ด๋ฆ„ ๋ฒ„๊ทธ ์œ„์ฃผ๋กœ ๊ณ ์ณ์ฃผ์‹œ๊ณ , ๋‚˜๋จธ์ง€๋Š” ์ปค๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”! ์•„๋ž˜๋Š” ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์ž…๋‹ˆ๋‹ค. ๋น ๋ฅด๊ฒŒ ๋‚จ๊ฒจ์ฃผ์‹œ๊ณ  ์š”์ฒญ ๋‚จ๊ฒจ์ฃผ์„ธ์š”~ ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค!

์ฃผ์ œ 1. Delegate ํŒจํ„ด ๋„์ž…์— ๊ด€ํ•œ ๊ณ ์ฐฐ
์ด ๋…ผ์˜์€ ์ œ๊ฐ€ ๋ฏธ์…˜ ํ–ˆ์„๋•Œ๋„ ๋งŽ์€ ํฌ๋ฃจ๋“ค ์‚ฌ์ด์— ์žˆ์—ˆ๋˜ ๋…ผ์˜์˜€๋˜ ๊ธฐ์—ญ์ด ์žˆ๋„ค์š” ใ…Žใ…Ž,,
์ผ๋‹จ ๊ทธ๋•Œ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ์ €์—๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์กฐ์–ธ์ด ์žˆ๋‹ค๋ฉด, ํ˜„์žฌ ๋ฏธ์…˜์— ์ถฉ์‹คํ•˜๋ผ๋Š” ๊ฒƒ ๊ทธ๋ฆฌ๊ณ  ์šฉ์–ด์™€ ํŒจํ„ด ์ •์˜๋ฅผ ์ •ํ™•ํžˆ ์•Œ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Controller๋ผ๋Š” ์šฉ์–ด๋Š” ์–ด๋””์„œ ๋‚˜์™”์„๊นŒ์š”? ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž MVC ํŒจํ„ด์ด ๋‚˜์™”์„๊นŒ์š”? ์›น ์„œ๋น„์Šค์—์„œ์˜ Controller๋Š” ์–ด๋–ค ์—ญํ• ์ผ๊นŒ์š”?
CLI ์„œ๋น„์Šค์™€ ์›น ์„œ๋น„์Šค์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? MVC์˜ View๋Š” ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋‚˜์š”?
์ €๋Š” ํŠน์ • ํŒจํ„ด์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ์ดํ•ด๊ฐ€ ์žˆ์„๋•Œ ๋„์ž… ์—ฌ๋ถ€๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ œ ์ž…์žฅ์—์„œ Delegate ํŒจํ„ด์€ MVC ํŒจํ„ด์„ ์–ต์ง€๋กœ ๋งž์ถ”๋ ค๊ณ  ํ•˜๋‹ค๊ฐ€ ๋„์ž…๋œ ํŒจํ„ด์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
์ •๋ง Controller๊ฐ€ ํ•„์š”ํ• ๊นŒ์š”? Delegation์ด ํ•„์š”ํ• ๊นŒ์š”? Game์— InputView, OutputView๋ฅผ ์ฃผ์ž…ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋ ๊นŒ์š”?
์ด๋ฒˆ ๋ฏธ์…˜์˜ UI ๋กœ์ง ๋ถ„๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

- ํ•ต์‹ฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์™€ UI๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•œ๋‹ค.
- UI ๋กœ์ง์„ InputView, ResultView์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ถ„๋ฆฌํ•œ๋‹ค.

์ด ๋ฏธ์…˜ ์š”๊ตฌ์‚ฌํ•ญ์€ UI๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋ผ์ง€, Controller๋ฅผ ๋„์ž…ํ•ด๋ผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
์ด ๋ถ€๋ถ„ ๊ตฌ๋ถ„ํ•˜์…”์„œ ์ž˜ ์ƒ๊ฐํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

์ฃผ์ œ 2. CLI ํ™˜๊ฒฝ์—์„œ์˜ Web ์•„ํ‚คํ…์ฒ˜ ๊ณ ๋ ค ์—ฌ๋ถ€
ใ…Žใ…Ž,, ์œ„์— ๋‹ต๋ณ€๊ณผ ๋น„์Šทํ•œ๋ฐ์š”, ํ˜„์žฌ ๋ฏธ์…˜์—์„œ๋Š” ๋ฒ—์–ด๋‚œ ๊ณ ๋ฏผ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ๋ฏธ์…˜ ํ•ต์‹ฌ ์ฃผ์ œ๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”๊ฐ€?์ž…๋‹ˆ๋‹ค.
์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” ๊ฐ์ฒด์˜ ์ฑ…์ž„๊ณผ ๋ถ„๋ฆฌ, ํ˜‘์—… ์„ค๊ณ„์— ์ข€ ๋” ํ•™์Šตํ•ด๋ณด์‹œ๊ณ  ์›น์˜ ๊ตฌ์กฐ์™€ ํŒจํ„ด์€ ์ดํ›„ ๋ ˆ๋ฒจ์—์„œ ์ถฉ๋ถ„ํžˆ ํ•™์Šตํ•ด๋ณด์„ธ์š”!
๊ฒฐ๊ตญ ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ ์ด ๋ถ€๋ถ„์„ ์ถฉ๋ถ„ํžˆ ํ•™์Šตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์›น์„ ๋ฐฐ์šฐ๋ฉด์„œ๋„ ์ด ๋ถ€๋ถ„์—์„œ ๋ชจํ˜ธํ•จ์ด ๊ณ„์† ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€๋กœ ์›น๋„ CLI๋„ ๊ฒฐ๊ตญ์—๋Š” ํ‘œํ˜„ ๋ฐฉ์‹ view์˜ ์˜์—ญ์ž…๋‹ˆ๋‹ค.
Redis์—๋„ CLI๋กœ ๋Œ์•„๊ฐ€๋Š” Client ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๊ณ  Server ํ”„๋กœ๊ทธ๋žจ์ด ๋”ฐ๋กœ ์žˆ๋“ฏ์ด, ๊ฐ์ž์˜ ์ฑ…์ž„๊ณผ ์—ญํ• ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ๋˜๋Š” ๊ฑฐ์ฃ .
view์ชฝ ๋‹จ์˜ ๊ณ ๋ฏผ์„ ๋„ˆ๋ฌด ํ•˜์ง€ ๋งˆ์‹œ๊ณ  ๊ฒฐ๊ตญ์—๋Š” ํ•ต์‹ฌ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š” ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ์ง€์ผœ๋‚ผ ์ˆ˜ ์žˆ์„์ง€์— ๊ณ ๋ฏผ์„ ์ถฉ๋ถ„ํžˆ ๋” ํ•ด๋ณด์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ ค์š”!

์ฃผ์ œ 3. ์„ค๊ณ„์˜ ์ ์ • ๋ฒ”์œ„
์ €๋Š” ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ์ถฉ๋ถ„ํžˆ ๋ณ€๊ฒฝ ๋  ์ˆ˜ ๋„ ์žˆ๊ณ  ๋ณ€๊ฒฝ ๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์ด ์ตœ์†Œํ™” ๋˜์•ผํ•˜๋Š” ํ•˜๋Š” ๋•Œ๋Š” ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐฐํฌ ๋˜์–ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์„ ๋•Œ์ด๊ตฌ์š”.
๋ฐฐํฌ ์ดํ›„์— ์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ๊ธฐ์กด ์„ค๊ณ„๊ฐ€ ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ์ด๋Š” ์ž˜๋ชป๋œ ์„ค๊ณ„์ผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ฃ .
๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ์ถฉ๋ถ„ํžˆ ์‹œ๊ฐ„์„ ๋“ค์—ฌ ๋ณ€ํ™”์—๋„ ๋‚ด์„ฑ์ด ์žˆ๋Š”, ์ฆ‰ ๊ตฌ์กฐ๊ฐ€ ํฌ๊ฒŒ ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉด์„œ ์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“œ์‹ ๋‹ค๋ฉด, ์•„๋ฌด๋ž˜๋„ ์‹ค์ œ ๊ตฌํ˜„์„ ํ•˜๋ฉด์„œ ์„ค๊ณ„ ๋•Œ ๋†“์นœ ์š”๊ตฌ์‚ฌํ•ญ์ด๋‚˜ ์ œ์•ฝ๋“ค์ด ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ €๋Š” ์ฒ ์ €ํ•œ ์‚ฌ์ „ ์„ค๊ณ„๋ณด๋‹ค๋Š”, ์ฒ ์ €ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„๊ณผ ์ œ์•ฝ์„ ๋‚˜์—ดํ•ด๋ณด๊ณ  ์‹œ์ž‘ํ•˜์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ ๋“œ๋ ค์š”.
๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋„ ์–˜๊ธฐํ•ด์ฃผ์…จ๋Š”๋ฐ, ๊ฒฝํ—˜์ƒ ์ž‘์€ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ƒ์œ„ ๋ ˆ์ด์–ด์—์„œ ์„ค๊ณ„ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๊ฒฝ์šฐ์— ๋” ๊ทธ๋Ÿด๊บผ๊ฐ™์•„์š”? ๋งž์„๊นŒ์š”?
๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” out->in ๋ฐฉ์‹์œผ๋กœ ํฐ ๋ถ€๋ถ„์„ TDD๋กœ ๊ตฌํ˜„ํ•ด์„œ ํ‹€์„ ์žก๊ณ , ๋‚ด๋ถ€ ๋ถ€ํ’ˆ๋“ค์„ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ, ๋‚ด๋ถ€ ์„ค๊ณ„๊ฐ€ ๋ณ€๊ฒฝ ๋˜๋”๋‹ค๋„ ์ „์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง„ ์•Š์„ํ…Œ๋‹ˆ๊นŒ์š”.

์ฃผ์ œ 4. ์ปค๋ฐ‹์˜ ๋‹จ์œ„
์•„๋ฌด๋ž˜๋„ ์‚ฌ๋žŒ๋งˆ๋‹ค ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ๋กค๋ฐฑ(revert)ํ•˜๊ธฐ ์ข‹์€ ๋‹จ์œ„๋ฅผ ์ €๋Š” ์ด์ƒ์ ์ธ ์ปค๋ฐ‹ ๋‹จ์œ„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์•„๋ฌด๋ž˜๋„ ๊ธฐ๋Šฅ์— 100์ค„ ์ด์ƒ์ด๋ผ๋ฉด ๋ถ„๋ช… ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ ์ž‘์—…์ด ๊ฐ™์ด ํฌํ•จ๋˜์–ด์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?
๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์—์„œ๋„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋Ÿฌ๋ฉด ์ „์ฒด ๊ธฐ๋Šฅ์„ ๋กค๋ฐฑํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊น๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ๋กค๋ฐฑ์ด ์ž˜ ๋˜๋Š” ์ปค๋ฐ‹์€ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ์ž‘์€ ์ปค๋ฐ‹์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ํ˜‘์—…์„ ์ƒ๊ฐํ•ด์„œ ์ปค๋ฐ‹ ๋‹จ์œ„๋ฅผ ์ •ํ•˜์‹œ๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋‚ด๊ฐ€ ์ด ์ปค๋ฐ‹์„ ์‰ฝ๊ฒŒ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์„๊นŒ?๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด์‹œ๋Š” ๊ฒƒ๋„ ์ถ”์ฒœ๋“œ๋ ค์š”!

public Optional<Card> addCard(Deck totalDeck) {
Card newCard = totalDeck.drawCard();
this.deck.addCard(newCard);
return Optional.of(newCard);
Copy link

Choose a reason for hiding this comment

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

newCard๊ฐ€ Null์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‚˜์š”? Optional์„ ์™œ ์‚ฌ์šฉํ•˜์‹  ๊ฑฐ์ฃ ?

Copy link

Choose a reason for hiding this comment

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

์•„ Dealer๊ฐ€ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์„ ์ˆ˜ ์žˆ์„์ง€ ์—†์„์ง€์— ๋Œ€ํ•ด ํŒ๋‹จ์„ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ํ•˜๊ณ , ์ด๋ฅผ ์œ„ํ•ด ๋ฆฌํ„ด ํƒ€์ž…์„ Participant์—์„œ ๋งž์ถฐ์ค€ ๊ฑฐ๊ตฐ์š”?

์ฆ‰, ๋ถ€๋ชจ ํƒ€์ž…์ธ Participant๊ฐ€ ์ž์‹ ํƒ€์ž…์ธ Dealer์˜ ์นด๋“œ ๋“œ๋กœ์šฐ ๋กœ์ง์„ ์œ„ํ•ด ๋ฆฌํ„ด ํƒ€์ž…์ด ๋งž์ถฐ์ง„ ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ํ˜„์žฌ Optional๋กœ ๊ฐ์‹ธ์ง„ ํ˜•ํƒœ๋ผ ๊ดœ์ฐฎ๊ธด ํ•œ๋ฐ, ์ด์ƒ์ ์œผ๋กœ๋Š” ์ƒ์œ„ ํƒ€์ž…์€ ํ•˜์œ„ ํƒ€์ž… ๊ตฌํ˜„์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ํ•˜์œ„ ํƒ€์ž…์„ ์ƒ์„ฑํ• ๋•Œ, ๋‹ค๋ฅธ ํ•˜์œ„ ํƒ€์ž…์˜ ๊ตฌํ˜„ ๋””ํ…Œ์ผ์„ ์•Œ์•„์•ผํ•˜๊ณ , ์ƒ์œ„ ํƒ€์ž…์˜ ๋กœ์ง์ด ๋ฐ”๋€” ๊ฒฝ์šฐ ํ•˜์œ„ ํƒ€์ž…์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ˜น์‹œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

return new Game(totalDeck, dealer, players);
}

public void play(GameDelegate observer) {
Copy link

Choose a reason for hiding this comment

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

delegate, observer ๋‘ ์šฉ์–ด๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋„ค์š”. play ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ์ด์ƒ ํ†ต์ผ ํ•˜์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

Comment on lines +94 to +101
Map<Result, Integer> dealerWinLossResults = new HashMap<>();
List<Player> playingPlayers = playerWinLossResults.keySet().stream().toList();
for (Player player : playingPlayers) {
Result dealerResult = playerWinLossResults.get(player).reverse();
int currentValue = dealerWinLossResults.getOrDefault(dealerResult, 0);
dealerWinLossResults.put(dealerResult, currentValue + 1);
}
return dealerWinLossResults;
Copy link

Choose a reason for hiding this comment

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

for (Result playerWinLossResult : playerWinLossResults.values()) {
    Result dealerResult = playerWinLossResult.reverse();
    int currentValue = dealerWinLossResults.getOrDefault(dealerResult, 0);
    dealerWinLossResults.put(dealerResult, currentValue + 1);
}

์ด ๋ถ€๋ถ„, values๋งŒ ์žˆ์œผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ์š”?

import java.util.regex.Pattern;

public abstract class Participant {
private final Deck deck;
Copy link

Choose a reason for hiding this comment

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

Participant๊ฐ€ Deck์„ ๊ฐ–๊ณ  ์žˆ๋Š”๊ฒŒ ์ €๋Š” ์กฐ๊ธˆ ์–ด์ƒ‰ํ•ด๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ isBurst()์™€ calculateCardScoreSum() ๊ฐ™์ด ํ”Œ๋ ˆ์ด์–ด ํ•ธ๋“œ์—๋งŒ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ/๋กœ์ง ๋“ค์ด Deck์— ๋“ค์–ด๊ฐ€๊ณ , ๋ฐ˜๋Œ€๋กœ Participant์—์„œ๋Š” ๋ฑ ์ƒ์„ฑ ๋กœ์ง์ด๋‚˜ ๋ฑ๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง๋“ค์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์ง€์ฃ ? ๊ฐ„๋‹จํ•œ ์˜ˆ๋กœ, ๋งŒ์•ฝ 2๋…„ ๋’ค์— ์–ด๋–ค ๊ฐœ๋ฐœ์ž๊ฐ€ Participant์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ• ๋•Œ, Participant์— Deck์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์ด๊ฒŒ ๊ฒŒ์ž„์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์นด๋“œ์˜ ๋ฑ์ธ์ง€, ์•„๋‹ˆ๋ฉด 2์žฅ๋งŒ ์žˆ๋Š” ์นด๋“œ ๋ฑ์ธ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”?

Copy link
Author

Choose a reason for hiding this comment

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

๋ฆฌ๋ทฐ์–ด๋‹˜์ด ๋‚จ๊ฒจ์ฃผ์‹  ๋ฌธ์ œ ์ƒํ™ฉ์€ ํ˜„์žฌ Deck์— 2๊ฐ€์ง€ ์—ญํ• ์ด ํ˜ผ์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋ถ„ํžˆ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์—ญํ• ์€ ์ „์ฒด ์นด๋“œ๋ฅผ ์ƒ์„ฑ, ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์ด๊ณ  ๋‘ ๋ฒˆ์งธ ์—ญํ• ์€ Player ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ ์ƒ์„ฑ๋˜์–ด ์‚ฌ์šฉ์ž๋“ค์˜ ์นด๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์ด๋ผ๊ณ  ํŒ๋‹จ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋‘ ๊ฐ€์ง€ ์—ญํ• ์˜ ํ˜ผ์žฌ๋กœ ์ธํ•œ ํ˜ผ๋ž€์ธ ๋งŒํผ ํด๋ž˜์Šค๋ฅผ ์—ญํ•  ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ์•ผ ํ•  ๊ฒƒ ๊ฐ™์Œ์„ ์ธ์ง€ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

Comment on lines +19 to +21
Pattern NAME_PATTERN = Pattern.compile("^[a-zA-Z๊ฐ€-ํžฃ]+$");
validateIsNotBlank(name);
validateKoreanAndEnglish(name, NAME_PATTERN);
Copy link

Choose a reason for hiding this comment

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

์‚ฌ์†Œํ•  ์ˆ˜ ์žˆ๊ธด ํ•œ๋ฐ, NAME_PATTERN์„ validateKoreanAndEnglish ๋ฐ–์œผ๋กœ ๋บ€ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”? ํ•ด๋‹น ๋„ค์ž„ ํŒจํ„ด์€ ํ•œ๊ตญ์–ด์™€ ์˜์–ด์ธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ํŒจํ„ด ์•„๋‹Œ๊ฐ€์š”? ๊ทธ๋Ÿฌ๋ฉด validateKoreanAndEnglish ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์— ์žˆ๋Š”๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ด๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? ํ˜น์‹œ ์ด ํŒจํ„ด์ด ์ด ๋ฉ”์„œ๋“œ ์™ธ์— ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์„๊นŒ์š”?

Copy link
Author

@kdongsu5509 kdongsu5509 Mar 10, 2026

Choose a reason for hiding this comment

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

NAME_PATTERN ์„ ๋ฐ–์œผ๋กœ ๋นผ๋‚ธ ํŠน๋ณ„ํ•œ ์ด์œ ๋Š” ์—†์Šต๋‹ˆ๋‹ค. Ctrl + Alt + M ์„ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ ์ถ”์ถœ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ถ€๋ถ„์„ ๊ฐ„๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.

return calculateCardScoreSum() > BUST_CRITERIA;
}

public int calculateCardScoreSum() {
Copy link

Choose a reason for hiding this comment

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

๋‹ค๋ฅธ ์ปค๋ฉ˜ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ๋กœ์ง์ด Deck์— ํ•„์š”ํ•œ ๋กœ์ง์ผ๊นŒ์š”? ๊ฒŒ์ž„ ๋ฑ๊ณผ ์ฐธ์—ฌ์ž ํ•ธ๋“œ๊ฐ€ ๋‘˜๋‹ค Card ์ปฌ๋ ‰์…˜์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ๋งž์ง€๋งŒ ๋‘˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ(LifeCycle)๋„ ๋‹ค๋ฅด๊ณ  ์—ญํ• ๊ณผ ์ฑ…์ž„๋„ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

Copy link
Author

Choose a reason for hiding this comment

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

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


public int calculateCardScoreSum() {
int sumExceptAce = calculateCardScoreSumExceptAce();
int sumAce = new AceScoreDiscriminator().calculateAceCardsSum(cards, sumExceptAce);
Copy link

Choose a reason for hiding this comment

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

์ด ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ, ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ์—†์–ด๋ณด์ด๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๊ณ„์‚ฐํ• ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑํ•˜๋Š”๊ฒŒ ๋งž์„๊นŒ์š”?

Copy link
Author

Choose a reason for hiding this comment

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

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์—๋งŒ ์ดˆ์ ์„ ๋‘๊ณ  ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋น„์šฉ์— ๋Œ€ํ•œ ๊ณ ๋ ค๋ฅผ ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ static ํ•œ ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ตœ์ดˆ์˜ ํ”„๋กœ๊ทธ๋žจ์ด jvm ์œ„์—์„œ ๋กœ๋”ฉ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import view.OutputView;

@ExtendWith(MockitoExtension.class)
class BlackJackControllerTest {
Copy link

Choose a reason for hiding this comment

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

BlackJackControllerTest๋ฅผ ๋ณผ๋•Œ, Game run ๊ด€๋ จ ๋กœ์ง์€ ํ•ด๋‹น Controller ํ…Œ์ŠคํŠธ๋กœ ์ปค๋ฒ„๊ฐ€ ์•ˆ๋˜๊ณ  ์žˆ์ฃ ? ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค๋ฉด ์ด๋Š” ๊ทธ ๋กœ์ง์ด ํ•ด๋‹น ๊ฐ์ฒด์˜ ์—ญํ• ์— ๋งž์ง€ ์•Š์„ ์ˆ˜ ๋„ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

return new Players(createPlayers(playerNames, totalDeck));
}

private static List<Player> createPlayers(List<String> playerNames, Deck totalDeck) {
Copy link

Choose a reason for hiding this comment

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

์ค‘๋ณต ์ด๋ฆ„ ๊ด€๋ จ ์ƒ์„ฑ ๋ฐฉ์–ด ๋กœ์ง์ด ๋น ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ค‘๋ณต ์ด๋ฆ„์˜ ๊ฒฝ์šฐ, ํ”Œ๋ ˆ์ด๋Š” ๋˜๋Š”๋ฐ ๊ฒฐ๊ณผ ์ฐฝ์—์„œ ํ•œ ๋ช…์˜ ์ฐธ์—ฌ์ž ๊ฒฐ๊ณผ๋งŒ ๋ณด์ด๋”๋ผ๊ตฌ์š”. ํ™•์ธํ•ด๋ณด์„ธ์š”!

๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)
ee,ee

๋”œ๋Ÿฌ์™€ ee, ee์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค.
๋”œ๋Ÿฌ์นด๋“œ: Aํ•˜ํŠธ
ee์นด๋“œ: 10ํด๋กœ๋ฒ„, J๋‹ค์ด์•„๋ชฌ๋“œ
ee์นด๋“œ: 3์ŠคํŽ˜์ด๋“œ, K๋‹ค์ด์•„๋ชฌ๋“œ

ee๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n)
y
ee์นด๋“œ: 10ํด๋กœ๋ฒ„, J๋‹ค์ด์•„๋ชฌ๋“œ, 4์ŠคํŽ˜์ด๋“œ

ee๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n)
n

๋”œ๋Ÿฌ์นด๋“œ: Aํ•˜ํŠธ, 9ํ•˜ํŠธ - ๊ฒฐ๊ณผ: 20
ee์นด๋“œ: 10ํด๋กœ๋ฒ„, J๋‹ค์ด์•„๋ชฌ๋“œ, 4์ŠคํŽ˜์ด๋“œ - ๊ฒฐ๊ณผ: 24
ee์นด๋“œ: 3์ŠคํŽ˜์ด๋“œ, K๋‹ค์ด์•„๋ชฌ๋“œ - ๊ฒฐ๊ณผ: 13

## ์ตœ์ข… ์ŠนํŒจ
๋”œ๋Ÿฌ: 2์Šน
ee: ํŒจ

@ExtendWith(MockitoExtension.class)
class GameTest {
private static final List<String> TEST_PLAYER_NAMES = List.of("pobi", "terry", "rati", "gump");
private static final CardCreationStrategy STRATEGY = GameTest::createSampleCards;
Copy link

Choose a reason for hiding this comment

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

random์„ CreationStrategy๋กœ ๋นผ์…”์„œ ์ž˜ ํ…Œ์ŠคํŠธ ํ•˜์…จ๊ตฐ์š”๐Ÿ‘

Copy link
Author

Choose a reason for hiding this comment

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

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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.

3 participants