Skip to content

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

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

Conversation

@Yeji-Kim-Erica
Copy link

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

๋“ค์–ด๊ฐ€๋ฉฐ..

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

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

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

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

์ด๋ฒˆ ๋ฏธ์…˜์€ ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณผ์ •์—์„œ ์น˜์—ดํ•œ ์„ค๊ณ„ ํ† ๋ก ์ด ์˜ค๊ฐ”์Šต๋‹ˆ๋‹ค.
๊ทธ ๊ณผ์ •์—์„œ ์ œ๊ฐ€ ๊ฒช์—ˆ๋˜ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ถฉ๋Œ๊ณผ ๊ณ ๋ฏผ์— ๋Œ€ํ•ด PK์˜ ์กฐ์–ธ์„ ๊ตฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

  • ๋””์ž์ธ ํŒจํ„ด์˜ ์ ์šฉ, ์–ด๋””๊นŒ์ง€๊ฐ€ ์ ์ ˆํ•œ ์„ ํƒ์ธ๊ฐ€?

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

    FacadeํŒจํ„ด์˜ ๊ฒฝ์šฐ, ํŽ˜์–ด๊ฐ€ ์ฃผ์žฅํ–ˆ๋˜ ์„œ๋น„์Šค ํด๋ž˜์Šค๋“ค์„ ํ•œ ๋ฐ๋กœ ๋ฌถ๋Š” GameServiceFacade์™€
    ์ œ๊ฐ€ ์ฃผ์žฅํ–ˆ๋˜ Deck, Players ๋“ฑ์„ ํ•œ ๋ฐ๋กœ ๋ฌถ๋Š” Game ํด๋ž˜์Šค๊ฐ€ ์ง€ํ–ฅํ•˜๋Š” ๋ฐ”๊ฐ€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋˜ํ•œ, ์„œ๋น„์Šค ๊ณ„์ธต์˜ ๊ฒฝ์šฐ, ์‹ค์ œ๋กœ ์ถ”ํ›„ ์Šคํ”„๋ง์—์„œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ,
    GameService ๋“ฑ์˜ ์„œ๋น„์Šค์—์„œ Deck, Players๋“ฑ์„ ํ•„๋“œ๋ฉค๋ฒ„๋กœ ๊ฐ€์ง€๋Š” ๊ฒƒ์€ ์ „์—ญ ์ž์›์˜ ์œ„ํ—˜์„ฑ ๋•Œ๋ฌธ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๊ฒŒ์ž„์˜ ๋กœ์ง ๋ฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ Game ๋„๋ฉ”์ธ ํด๋ž˜์Šค๊ฐ€ ๋งก๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•  ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๊ทธ๋ ‡๊ฒŒ ์ฝ”๋“œ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

    Observer ํŒจํ„ด์˜ ๊ฒฝ์šฐ, ์ฒ˜์Œ์—” ์ˆœ์ฐจ ๋กœ์ง์ธ ๋ธ”๋ž™์žญ ๋ฏธ์…˜์—์„œ ํ•„์š”ํ•œ ๋‚ด์šฉ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ๋ฐ˜๋Œ€ํ–ˆ๋‹ค๊ฐ€,
    ์—ด๋ฆฐ ๋งˆ์Œ์œผ๋กœ ์ƒˆ๋กœ์šด ์˜์—ญ์— ๋„์ „ํ•ด๋ณด๋Š” ๊ฒƒ์ด ๋ฐฐ์›€์„ ๋ชฉ์ ์œผ๋กœ ํ•œ ์šฐํ…Œ์ฝ” ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ํƒœ๋„๋ผ๊ณ  ํŒ๋‹จํ•ด
    ํ•ด๋‹น ํŒจํ„ด์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐฉ์•ˆ์— ํ•ฉ์˜ํ•ด ๊ตฌํ˜„์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๊ตฌํ˜„ ๊ณผ์ •์—์„œ Controller์™€ Observer์˜ ๊ฒฝ๊ณ„๊ฐ€ ๋ชจํ˜ธํ•ด์ง€๋Š” ์ง€์ ์ด ์ƒ๊ฒผ๊ณ , ์ €์˜ ์˜๋ฌธ์— ํŽ˜์–ด๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜๋ฉด์„œ Delegate ํŒจํ„ด์„ ๋˜ ์ƒˆ๋กญ๊ฒŒ ์ ‘ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ์ฒ˜์Œ์— ObserverImpl๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ ๋ฉ”์„œ๋“œ๋ฅผ Controller๋กœ ์˜ฎ๊ธฐ๋ฉด์„œ Controller๊ฐ€ ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๊ณ , Observer๋ฅผ Delegate์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ช…์„ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ, ์ตœ์ข…์ ์œผ๋กœ ์œ„์ž„(Delegate) ํŒจํ„ด์„ ๊ฐ€์ง„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋””์ž์ธํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

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

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

    ๋””์ž์ธ ํŒจํ„ด์€ ์–ด๋””๊นŒ์ง€ ์ ์šฉํ•ด๋ณด๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•œ ์„ ํƒ์ผ๊นŒ์š”?
    ์ฝ˜์†” ํ™˜๊ฒฝ์—์„œ ์›น์„ ๊ณ ๋ คํ•˜๋ฉด์„œ ์›น ํ™˜๊ฒฝ์œผ๋กœ ์ธํ•ด ์ƒ๊ฒจ๋‚œ ๊ด€๋ก€์™€ ๊ทœ์น™๋“ค๊นŒ์ง€ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ๋งž๋Š” ์„ ํƒ์ผ๊นŒ์š”?

    ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ PK์˜ ์ƒ๊ฐ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

  • ๋ฆฌํŒฉํ† ๋ง ๋•Œ ์‹œ๋„ํ•˜๊ณ ์ž ํ•˜๋Š” ์„ ํƒ๋“ค, ์ ํ•ฉํ•œ๊ฐ€?

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

    • AceScoreDiscriminator ์ฃผ์ž… ๋ฐ›์•„์˜ค๊ธฐ:
      ํ˜„์žฌ Deck ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ AceScoreDiscriminator์˜ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, ํ•ด๋‹น ๋ถ€๋ถ„์„ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
      ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ, Deck์˜ ํ•„๋“œ ๋ฉค๋ฒ„๋กœ AceScoreDiscriminator ๊ตฌํ˜„์ฒด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์‹์ธ๋ฐ
      ํ˜„์žฌ Deck์ด Card์˜ ์ผ๊ธ‰์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค์™€ ๊ฐ™์ด ์“ฐ์ด๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด๋ผ,
      ์ผ๊ธ‰์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค ๋‚ด์— List๋ฅผ ์ œ์™ธํ•œ ๋˜ ๋‹ค๋ฅธ ํ•„๋“œ๋ฉค๋ฒ„๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ๋งž๋Š”์ง€ ๋ง์„ค์—ฌ์ง‘๋‹ˆ๋‹ค.
      ๋ฉ”์„œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›์•„์˜ค๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ๋˜ํ•œ ๊ฒฐ๊ตญ์—” Deck์˜ ๋ฉ”์„œ๋“œ๋“ค์„ ํ˜ธ์ถœํ•˜๋Š” Game์—์„œ AceScoreDiscriminator๋ฅผ ์ฃผ์ž…๋ฐ›์•„์˜ค๋„๋ก ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋น„์Šทํ•œ ์ด์œ ๋กœ ๋ฐ˜๋ ค๋˜์—ˆ๋Š”๋ฐ์š”.
      AceScoreDiscriminator๋ฅผ ์ฃผ์ž…๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด Deck, ๋ฆฌํŒฉํ† ๋ง ํ›„๋ผ๋ฉด Cards์—ฌ๋„ ๊ดœ์ฐฎ์€ ๊ฑด๊ฐ€์š”?

  • DTO์˜ ๋„์ž…, ์ ์ ˆํ•œ ์„ ํƒ์ธ๊ฐ€?

    ์™ ์ง€ ๋„๋ฉ”์ธ ์ด๊ณณ์ €๊ณณ์— getter ํ˜ธ์ถœ์ด ์ •ํ•ด์ง„ Depth๊ฐ€ ์—†์ด ํฉ์–ด์ ธ์žˆ๋Š” ํ˜•์ƒ์ด ๋ถˆํŽธํ•˜๊ณ  ๊ด€๋ฆฌ๊ฐ€ ์•ˆ๋œ๋‹ค๊ณ  ๋А๊ปด์ ธ์„œ
    ์ฐจ๋ผ๋ฆฌ DTO๋ฅผ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•˜์ž๋Š” ์ œ์•ˆ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ์š”.
    ์•ž์„œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ž๋Š” ์ œ์•ˆ ๋˜ํ•œ ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ๊ฒฝ๊ณ„ํ–ˆ๋˜ ๋งŒํผ, ์Šค์Šค๋กœ๊ฐ€ ๋ถˆํŽธ์„ ๋А๋ผ๋Š” ๋ถ€๋ถ„ ๋˜ํ•œ ๊ฐœ์„ ์„ ํ•˜๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ์ •๋‹นํ•œ์ง€ ๊ณ ๋ฏผ์ด ๋งŽ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•œ ์ด๋ก ์ /ํ•™์ˆ ์ ์ธ ์ด์œ  ์—†์ด, ๋‹จ์ง€ 'ํฉ์–ด์ ธ ์žˆ๋Š” ๊ฒƒ์ด ๋ณด๊ธฐ์— ์ข‹์ง€ ์•Š๋‹ค, ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ๋ถˆํŽธํ•  ๊ฑฐ ๊ฐ™๋‹ค' ๋ผ๋Š” ๊ฐ๋งŒ์œผ๋กœ DTO๋ฅผ ๋งŒ๋“ค์ž๋Š” ์ œ์•ˆ์„ ํ•œ ์„ ํƒ์ด ์˜ณ์€ ๊ฒƒ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
    ํ‰์†Œ ๊ฐœ๋ฐœํ•˜์‹œ๋Š” ๊ณผ์ •์—์„œ '์™ ์ง€ ์ด๋Ÿฌ๋ฉด ์•ˆ ๋  ๊ฑฐ ๊ฐ™์€๋ฐ' ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ๊ตฌ์กฐ์˜ ๋ณ€๊ฒฝ์ด๋‚˜ ๋ถ„๋ฆฌ๋ฅผ ๊ฒฐ์ •ํ•˜์‹œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‚˜์š”?
    DTO๊นŒ์ง€ ๊ตฌ์„ฑํ•œ ๊ฒƒ์ด ์˜ค๋ฒ„ ์—”์ง€๋‹ˆ์–ด๋ง์ธ์ง€ ์•„๋‹Œ์ง€ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜๊ธฐ ํž˜๋“ค์—ˆ๋˜ ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ์š”?
    ๊ณ„์†ํ•ด์„œ ๊ฐœ๋…์˜ ๊ธฐ์ดˆ์™€ ๊ทผ๋ณธ์„ ๋‹ค์ง€๋‹ค ๋ณด๋ฉด ์Šค์Šค๋กœ์˜ ์„ ํƒ์— ์ž์‹ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋ ๊นŒ์š”?
    ํ˜„์žฌ ์•„ํ‚คํ…์ฒ˜์—์„œ DTO์˜ ๋„์ž…์€ ์ ์ ˆํ•œ ์„ ํƒ์ด ๋งž์„๊นŒ์š”?

๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๊ณ , ๊ทธ๋“ค์˜ ๊ณตํ†ต ์กฐ์ƒ์ธ ์ฐธ๊ฐ€์ž๋ฅผ ์ถ”๊ฐ€ํ•จ.
์ดํ›„ ์นด๋“œ์™€ ์นด๋“œ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฑ์˜ ์ •์˜๋ฅผ ์ถ”๊ฐ€ํ•จ.
- ์‹ ๊ทœ ๋ฑ ์ œ๊ณต ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
- ์นด๋“œ ๋ฝ‘๊ธฐ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€(์ •์ƒ, ์‹คํŒจ)
- ์ƒˆ๋กœ์šด ๋ฑ ์ œ๊ณต ๊ธฐ๋Šฅ
- ์นด๋“œ ์„ ํƒ ๊ธฐ๋Šฅ
์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
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 ์ถœ๋ ฅ ๋กœ์ง ์ˆ˜์ •
๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•จ
- ์‚ฌ์šฉ์ž์˜ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ ๋ชฉ๋ก ์œ„์ฃผ๋กœ ์ฒดํฌ ๋ฆฌ์ŠคํŠธ ๋ณ€๊ฒฝ.
- ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์ถ”๊ฐ€.
Copy link

@pkeugine pkeugine left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ํ…Œ๋ฆฌ,
๋ฏธ์…˜ ์ง„ํ–‰ํ•˜์‹œ๋А๋ผ ๊ณ ์ƒ ๋งŽ์œผ์…จ์–ด์š”.

์ •๋ง ์น˜์—ดํ•œ ํ† ๋ก ์„ ํ–ˆ๋‹ค๋Š” ๋А๋‚Œ์ด ๋ฆฌ๋ทฐํ•˜๋ฉด์„œ ์ €๋„ ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

ํ…Œ๋ฆฌ๊ฐ€ ๋‚จ๊ฒจ์ฃผ์‹  ์งˆ๋ฌธ๊ณผ ์ƒ๊ฐ ๋ชจ๋‘ ๊ผผ๊ผผํ•˜๊ฒŒ ์ฝ์–ด๋ดค๊ณ ,
์ง„ํ–‰ํ•˜์‹œ๋ฉด์„œ ๋А๊ผˆ๋˜ ๊ฒƒ๋“ค, ๊ณ ๋ฏผํ•œ ๊ฒƒ๋“ค ๋“ฑ๋“ฑ ๋‹ค ํŒŒ์•…ํ–ˆ์–ด์š”.

๊ทธ๋ž˜๋„ ๋ฆฌ๋ทฐ๋Š” ๋ฆฌ๋ทฐ์ด๋‹ˆ, ์ œ ์†”์งํ•œ ์ƒ๊ฐ๊ณผ ์˜๊ฒฌ์„ ๋‚จ๊ฒจ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„ ,
๋ฆฌ๋ทฐ๊ฐ€ ์ œ ๊ธฐ์ค€์—์„œ ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ ธ๋Š”๋ฐ, ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ด์œ ์—์„œ ์˜€์Šต๋‹ˆ๋‹ค :

  • ์ฝ”๋“œ๊ฐ€ ๋”ฐ๋ผ๊ฐ€๊ธฐ ํž˜๋“  ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋Œ€๋น„ ๋ณต์žก๋„๊ฐ€ ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”.
  • ํ…Œ๋ฆฌ์™€ ํŽ˜์–ด์˜ ์ƒ๊ฐ์„ ๋”ฐ๋ผ๊ฐ€๊ธฐ๊ฐ€ ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๋„ ์ œ๊ฐ€ ๋‹ค ์ดํ•ดํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€๋Š” ์•Š์•„์š”.

์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•ด๋ณด์ž๋ฉด ์ƒ๊ฐ์ด ๋งŽ์•˜๋‹ค ์ธ ๋“ฏ ํ•œ๋ฐ์š”,
ํ…Œ๋ฆฌ๊ฐ€ ๋งํ•ด์ฃผ์‹  ์ƒํ™ฉ์€ ์ œ๊ฐ€ ์–ด๋А์ •๋„ ์ดํ•ดํ•œ ๋“ฏ ํ•ด์„œ,
๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋ฉด์„œ ์ด ๋ถ€๋ถ„์€ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

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

๊ทธ๋ ‡๋‹ค๋ฉด ํ…Œ๋ฆฌ์˜ ์งˆ๋ฌธ์ธ ์ƒ๊ฐ์ด ๋งŽ์•„์ง€๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋А์ •๋„ ์—ด๋ฆฐ ๋งˆ์Œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋‚˜...

์–ด๋ ค์šด ๋ฌธ์ œ์˜ˆ์š”.
๊ทธ๋ฆฌ๊ณ  ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜คํžˆ๋ ค ์ง€๊ธˆ ์ด ๋ฏธ์…˜, ์ œ ๋ฆฌ๋ทฐ์— ๋„ˆ๋ฌด ๋ฌด๊ฒŒ๋ฅผ ๋‘์ง€ ๋ง๊ณ  ์ „์ฒด๋ฅผ
๋‹ค์–‘ํ•œ ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ํ๋ฆ„์ด๋ผ๊ณ  ๋ณด๋ฉด ์ข€ ๋” ์—ด๋ฆฐ ๋งˆ์Œ์œผ๋กœ ์ƒˆ๋กœ์šด ์˜์—ญ์— ๋„์ „ํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋„ค์š”.

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋Œ€๋กœ, ํŽ˜์–ด์˜ ์˜๊ฒฌ์„ ์กด์ค‘ํ–ˆ๋‹ค๋ฉด
ํ…Œ๋ฆฌ์˜ ์˜๊ฒฌ ์—ญ์‹œ ์กด์ค‘๋ฐ›์•„์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ์•Š์œผ์…จ์œผ๋ฉด ํ•˜๊ณ ์š”.

์‹ค์ œ๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๊ธฐ์ˆ ์˜ ์„ ํƒ, ํŽ˜์–ด์™€์˜ ํ˜‘์—…์—์„œ ์˜๊ฒฌ์ด ์ฑ„ํƒ๋  ๋•Œ,
๊ธฐ์ˆ ์ ์ธ ์ด์œ ๊ฐ€ ์•„๋‹Œ ์‚ฌํšŒ์ ์ธ ์ด์œ  ๊ฐ€ ์ค‘์š”์‹œ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ (์ƒ๊ฐ๋ณด๋‹ค) ๋งŽ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋ฐ˜๋Œ€๋กœ ์–˜๊ธฐํ•˜๋ฉด, ์•ž์„œ ๋งํ–ˆ๋“ฏ ํ…Œ๋ฆฌ์˜ ์˜๊ฒฌ ์—ญ์‹œ ๊ทธ๋งŒํผ ์ค‘์š”ํ•˜๋‹ค๋Š”๊ฑฐ์ฃ .

ํ˜‘์—… ํ•  ๋•Œ ์„œ๋กœ ์˜๊ฒฌ์ด ๋งŽ์ด ๋‹ค๋ฅด๋‹ค๋ฉด, ํ•œ ๋ฐœ ๋ฌผ๋Ÿฌ์„ค ์ค„๋„ ์•Œ๊ณ , ํ•œ ํŽธ์œผ๋กœ๋Š” ๊ฐ•ํ•˜๊ฒŒ ์–ดํ•„ํ•˜๋Š” ์ˆœ๊ฐ„๋„ ๊ฒฝํ—˜ํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ผ๋‹จ request changes ํ•˜๊ณ , ๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๋Œ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)
ํ•ดํ”ผํ•ดํ‚นํ•˜์„ธ์š”!!! ๐Ÿ”ฅ ๐Ÿ”ฅ ๐Ÿ”ฅ

Comment on lines +39 to +50
public void play(GameDelegate observer) {
List<Player> individualPlayers = players.getPlayers();
for (Player player : individualPlayers) {
while (!player.isBust() && observer.askDrawCard(player.getName())) {
player.addCard(totalDeck);
observer.showPlayerCards(ParticipantDto.from(player));
}
}
while (dealer.addCard(totalDeck).isPresent()) {
observer.showDealerOneMoreCardMessage();
}
}
Copy link

Choose a reason for hiding this comment

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

play()๋Š” ํ˜„์žฌ for -> while ๊ตฌ์กฐ๋ผ indent depth 1 ์ œ์•ฝ์„ ์ง€ํ‚ค์ง€ ๋ชปํ•˜๊ณ  ์žˆ์–ด์š”.

์ด๋ฒˆ PR์€ ์„ค๊ณ„ ๊ณ ๋ฏผ์ด ์ •๋ง ๋งŽ์•˜๋Š”๋ฐ,
๊ทธ ์ „์— ์šฐ์„  ๋ช…์‹œ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋จผ์ € ๋งž์ถ”๋Š” ๊ฒŒ ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.

๊ฐ€๋Šฅํ•˜๋ฉด ํ”Œ๋ ˆ์ด์–ด ์ˆœํšŒ์™€ ํ•œ ์‚ฌ๋žŒ์˜ ํ„ด ์ง„ํ–‰์„ ๋ถ„๋ฆฌํ•ด์„œ
๊นŠ์ด๋ฅผ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜๋ˆ ๋ณด์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค๋„ ๊นŠ์ด, ๊ทธ๋ฆฌ๊ณ  10์ค„ ์š”๊ตฌ์‚ฌํ•ญ ํ•œ ๋ฒˆ ํ™•์ธํ•ด์ฃผ์„ธ์š”!

this.deck.addCard(newCard);
return Optional.of(newCard);
}
} No newline at end of file
Copy link

Choose a reason for hiding this comment

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

ํŒŒ์ผ ๋์— ๋นˆ ์ค„(trailing newline)์ด ์—†์–ด์š”.

POSIX ํ‘œ์ค€์—์„œ๋Š” ํ…์ŠคํŠธ ํŒŒ์ผ์ด ๊ฐœํ–‰ ๋ฌธ์ž๋กœ ๋๋‚˜์•ผ ํ•˜๊ณ , Git diff์—์„œ \\ No newline at end of file ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋ฉด์„œ diff๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ ธ์š”.

IntelliJ ์„ค์ •์—์„œ Editor โ†’ General โ†’ Ensure every saved file ends with a line break๋ฅผ ์ผœ๋‘๋ฉด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋ผ์š” ๐Ÿ‘

Copy link
Author

Choose a reason for hiding this comment

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

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

Comment on lines +3 to +5
import controller.GameDelegate;
import dto.GameResultDto;
import dto.ParticipantDto;
Copy link

Choose a reason for hiding this comment

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

์ด๋ฒˆ PR์˜ ํ•ต์‹ฌ ๋ณต์žก๋„๋Š” ์ด import ๋“ค๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”.
์ด๋ฆ„๋งŒ ๋ณด๋ฉด Controller -> Game -> View์ฒ˜๋Ÿผ ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅผ ๊ฒƒ ๊ฐ™์€๋ฐ,
์‹ค์ œ๋กœ๋Š” Game์ด ๋‹ค์‹œ controller ์ชฝ ์ธํ„ฐํŽ˜์ด์Šค์™€ DTO๋ฅผ ๋ถ™์žก๊ณ  ์ž…๋ ฅ/์ถœ๋ ฅ ํ๋ฆ„๊นŒ์ง€ ์•Œ๊ณ  ์žˆ๋„ค์š”.

์ €๋Š” ์—ฌ๊ธฐ์„œ Game์ด controller ์ธํ„ฐํŽ˜์ด์Šค์™€ DTO๋ฅผ ์•„์˜ˆ ๋ชจ๋ฅด๋„๋ก ๋ฐ”๊พธ๋Š” ์ชฝ์„ ๋จผ์ € ์ถ”์ฒœ๋“œ๋ ค์š”.
Game์€ ์ƒํƒœ์™€ ๊ทœ์น™๋งŒ ๊ด€๋ฆฌํ•˜๊ณ ,
์ž…๋ ฅ/์ถœ๋ ฅ ํ๋ฆ„๊ณผ ๋ณ€ํ™˜์€ Controller๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์กฐ๋ฆฝํ•˜๊ฒŒ ํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?

์ด์— ๋Œ€ํ•œ ํ…Œ๋ฆฌ์˜ ์ƒ๊ฐ๋„ ๊ถ๊ธˆํ•ด์š” :)

Comment on lines +7 to +30
public interface GameDelegate {

/**
* ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์„ ์š”๊ตฌ.
*/
List<String> askPlayerNames();

boolean askDrawCard(String playerName);

/**
* ๊ฐ์ข… ์ •๋ณด ์ถœ๋ ฅ
*/
// ์ดˆ๊ธฐ ์นด๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ
void showInitialParticipantCards(ParticipantDto dealerDto, List<ParticipantDto> playerDtos);

// ์ฐธ๊ฐ€์ž ํ•œ๋ช…์˜ ์นด๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ
void showPlayerCards(ParticipantDto participantDto);

// ๋”œ๋Ÿฌ๊ฐ€ ์นด๋“œ ํ•œ ์žฅ ๋” ๋ฐ›์•˜์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ
void showDealerOneMoreCardMessage();

// ๊ฒŒ์ž„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ
void showGameResult(GameResultDto resultDto);
}
Copy link

Choose a reason for hiding this comment

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

PR ๋ณธ๋ฌธ์—์„œ ์ ์–ด์ฃผ์‹  ํ๋ฆ„์„ ๋ณด๋ฉด,
์ฒ˜์Œ์—๋Š” Observer๋กœ ์‹œ์ž‘ํ–ˆ๋‹ค๊ฐ€ ๊ตฌํ˜„ ๊ณผ์ •์—์„œ controller์™€์˜ ๊ฒฝ๊ณ„๊ฐ€ ํ๋ ค์กŒ๊ณ ,
๊ทธ๊ฑธ ํ’€๊ธฐ ์œ„ํ•ด Delegate๋กœ ์ด๋ฆ„๊ณผ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ์˜ฎ๊ธฐ์‹  ๊ฑฐ์ฃ ?
(์•„๋‹ˆ๋ผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š” ใ…‹ใ…‹ใ…‹ ์ œ๊ฐ€ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์„ ์ˆ˜๋„ ์žˆ์–ด์š”)

๊ทธ๋Ÿฐ๋ฐ ์ œ๊ฐ€ ๋ณด๊ธฐ์—๋Š” ํŒจํ„ด ์ด๋ฆ„์ด Observer์—์„œ Delegate๋กœ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€๊ฐ€ ํ•ต์‹ฌ์ด๋ผ๊ธฐ๋ณด๋‹ค,
๊ทธ ๊ณผ์ •์„ ๊ฑฐ์นœ ๋’ค์—๋„ ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์—ฌ์ „ํžˆ "์ด๊ฒŒ ์ง€๊ธˆ controller์ธ๊ฐ€, observer์ธ๊ฐ€, delegate์ธ๊ฐ€?"๋ฅผ ํ—ท๊ฐˆ๋ฆฐ๋‹ค๋ฉด
ํ˜„์žฌ ๋ฌธ์ œ ๊ทœ๋ชจ์—์„œ ๊ทธ ์ถ”์ƒํ™”๊ฐ€ ๊ตฌ์กฐ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๋œป์ผ ์ˆ˜ ์žˆ์–ด์š”.

์ง€๊ธˆ ๊ตฌ์กฐ๋ผ๋ฉด ์ €๋Š” ๋‘ ๋ฐฉํ–ฅ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋” ์ถ”์ฒœ๋“œ๋ ค์š” :
ํ•˜๋‚˜๋Š” ์ด interface๋ฅผ ์—†์• ๊ณ  Controller๊ฐ€ ์ง์ ‘ ํ๋ฆ„์„ ์กฐ๋ฆฝํ•˜๊ฒŒ ๋‘๋Š” ๊ฒƒ,
๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ •๋ง ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด input ๊ณผ output ์—ญํ• ์„ ๋ถ„๋ฆฌํ•ด์„œ ๊ฐ๊ฐ ๋” ๋ถ„๋ช…ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์™•์ด๋ฉด ์ €๋„ ์˜๋„์™€ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์ด์—ˆ์œผ๋ฉด ํ•ด์š”.
์ง€๊ธˆ์€ ์ œ๊ฐ€ ๋А๋ผ๊ธฐ์—” ์„ค๋ช…๊ณผ ๊ตฌํ˜„์ด ๋ชจ๋‘ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ตฌ์กฐ์˜ˆ์š”.

Comment on lines +39 to +50
public void play(GameDelegate observer) {
List<Player> individualPlayers = players.getPlayers();
for (Player player : individualPlayers) {
while (!player.isBust() && observer.askDrawCard(player.getName())) {
player.addCard(totalDeck);
observer.showPlayerCards(ParticipantDto.from(player));
}
}
while (dealer.addCard(totalDeck).isPresent()) {
observer.showDealerOneMoreCardMessage();
}
}
Copy link

Choose a reason for hiding this comment

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

play() ์•ˆ์—์„œ observer.askDrawCard(player.getName()) ์™€ ๊ฐ™์€ view ๋กœ์ง์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋„ค์š”.
๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ ๊ฒŒ์ž„ ์ง„ํ–‰ ๋กœ์ง์€ ๋„๋ฉ”์ธ ์•ˆ์— ์žˆ์ง€๋งŒ,
์‹ค์ œ ํ๋ฆ„ ์ œ์–ด๋Š” UI ์ž…๋ ฅ์— ๋ฌถ์—ฌ ์žˆ๋Š” ์…ˆ์ด์—์š”.

์ด๋Ÿด ๋•Œ๋Š” domain์ด ์Šค์Šค๋กœ ์ง„ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค,
controller๊ฐ€ "์ž…๋ ฅ ๋ฐ›๊ธฐ -> domain ํ˜ธ์ถœ" ์ˆœ์„œ๋ฅผ ์กฐ๋ฆฝํ•˜๋Š” ์ชฝ์ด ๋” ๊น”๋”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.
์ฆ‰ Game์€ ํ„ด ์ง„ํ–‰ ๊ทœ์น™๋งŒ ์•Œ๊ณ ,
์งˆ๋ฌธ์„ ์–ธ์ œ ๋˜์ง€๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์–ธ์ œ ๋ณด์—ฌ์ค„์ง€๋Š” Controller๊ฐ€ ๋งก๋Š” ๋ฐฉํ–ฅ์„ ์ถ”์ฒœ๋“œ๋ ค์š”.

์ „๋ฐ˜์ ์œผ๋กœ Game ์ด ์ž…์ถœ๋ ฅ์„ ๋ชฐ๋ผ๋„ ๋˜๋Š” ๊ตฌ์กฐ๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?


return new ArrayList<>(List.of(spadeJ, clover5));
}
};
Copy link

Choose a reason for hiding this comment

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

ํ…Œ์ŠคํŠธ์—์„œ ์ด๋Ÿฐ anonymous CardCreationStrategy ๊ตฌํ˜„์ฒด๊ฐ€ ๊ณ„์† ๋ฐ˜๋ณต๋˜๋„ค์š”.

์šฐ์„  ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ด๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ํ•œ ๋ฒˆ ์•Œ์•„๋ณด์‹œ๊ธธ ๋ฐ”๋ผ์š”.

๊ทธ๋Ÿฐ๋ฐ ์ €๋Š” ๋” ๋‚˜์•„๊ฐ€ ํ•ด๋‹น ์ „๋žต ๊ด€๋ จ ํด๋ž˜์Šค (์ „๋žตํŒจํ„ด์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ์—” ์ œ๋Œ€๋กœ ๋„์ž…๋˜์ง€๋Š” ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค) ๋ฅผ
๋” ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ๋„ ๋“ค์–ด์š”.

ํ…Œ๋ฆฌ๊ฐ€ ๋ง์”€ํ•ด์ฃผ์‹  Hands ๊ฐ์ฒด๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ์–ด๋А์ •๋„ ํ•ด์†Œ๋  ๊ฒƒ ๊ฐ™๋„ค์š”.
๊ทธ ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด Player ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด๋Ÿฐ ์ „๋žต์„ ๋งค๋ฒˆ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์งˆํ…Œ๋‹ˆ๊นŒ์š” :)

import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
Copy link

Choose a reason for hiding this comment

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

Mockito ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์…จ๋„ค์š”.
ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์–ด๋–จ ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•œ์ง€ ๋งํ•ด์ฃผ์„ธ์š”!

์ด ์งˆ๋ฌธ์„ ๋‚จ๊ธฐ๋Š” ์ด์œ ๋Š”, ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ธฐ๋ณด๋‹ค๋Š”
์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋„์ž…ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์€ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”.

Comment on lines +114 to +126
//private List<Card> createSampleCards() {
// CardShape[] shapes = CardShape.values();
// CardContents[] contents = CardContents.values();
//
// List<Card> sampleCards = new ArrayList<>();
// for (CardShape cardShape : shapes) {
// for (CardContents content : contents) {
// sampleCards.add(new Card(cardShape, content));
// }
// }
//
// return sampleCards;
// }
Copy link

Choose a reason for hiding this comment

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

์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ๋Š” ์ง€์›Œ์ฃผ์„ธ์š”.
์ด๋Ÿฐ ๋ฏธ์™„์„ฑ๋œ ๋ชจ์Šต์€ ๋ฆฌ๋ทฐ ๋ฐ˜๋ ค ์ด์œ ๊ฐ€ ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Comment on lines +12 to +21
private static final String DELIMITER = ", ";
private static final String NAME_PROMPT = "๊ฒŒ์ž„์— ์ฐธ์—ฌํ•  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.(์‰ผํ‘œ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ)";
private static final String INITIAL_CARD_SHARE = "๋”œ๋Ÿฌ์™€ %s์—๊ฒŒ 2์žฅ์„ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค.\n";
private static final String HIT_OR_STAND_PROMPT = "%s๋Š” ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›๊ฒ ์Šต๋‹ˆ๊นŒ?(์˜ˆ๋Š” y, ์•„๋‹ˆ์˜ค๋Š” n)\n";
private static final String ADDITIONAL_CARD_FOR_DEALER_DESCRIPTION = "๋”œ๋Ÿฌ๋Š” 16์ดํ•˜๋ผ ํ•œ์žฅ์˜ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.";
private static final String PARTICIPANT_CARD_INFO_FORMAT = "%s์นด๋“œ: %s";
private static final String PARTICIPANT_CARD_INFO_FORMAT_LINE = "%s์นด๋“œ: %s\n";
private static final String PARTICIPANT_CARD_INFO_WITH_SUM_FORMAT = "%s - ๊ฒฐ๊ณผ: %d\n";
private static final String WIN_LOSS_RESULT_HEADER = "## ์ตœ์ข… ์ŠนํŒจ\n";
private static final String WIN_LOSS_RESULT_FORMAT = "%s: %s\n";
Copy link

Choose a reason for hiding this comment

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

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

์ €๋Š” ์—ฌ๊ธฐ์„œ๋Š” ์ƒ์ˆ˜ํ™”๋ณด๋‹ค ๋ฌธ๋งฅ ๊ฐ€๊นŒ์ด์— ๋‘๋Š” ํŽธ์ด ๋” ์ฝ๊ธฐ ์‰ฌ์› ์„ ๊ฒƒ ๊ฐ™์•„์š”.
์ •๋ง ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ฐ™์ด ์“ฐ์ด๋Š” ๋ฌธ๊ตฌ๋งŒ ๋‚จ๊ธฐ๊ณ ,
๋‚˜๋จธ์ง€๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ ๊ฐ€๊นŒ์ด๋กœ ๋˜๋Œ๋ฆฌ๋Š”๊ฑฐ์ฃ .

์ด์— ๋Œ€ํ•œ ํ…Œ๋ฆฌ์˜ ์†”์งํ•œ ์ƒ๊ฐ์ด ๊ถ๊ธˆํ•œ๋ฐ, ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

Comment on lines +3 to +5
public enum CardShape {
์ŠคํŽ˜์ด๋“œ, ํ•˜ํŠธ, ๋‹ค์ด์•„๋ชฌ๋“œ, ํด๋กœ๋ฒ„
}
Copy link

Choose a reason for hiding this comment

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

์ €๋Š” ์ฝ”๋“œ์˜ ์‹๋ณ„์ž(enum ์ƒ์ˆ˜, ํด๋ž˜์Šค๋ช…, ๋ฉ”์„œ๋“œ๋ช… ๋“ฑ)๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด ์˜์–ด๋กœ ํ†ต์ผํ•˜๋Š” ํŽธ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.
์ฃผ์„์ด๋‚˜ ์‚ฌ์šฉ์ž ์ถœ๋ ฅ์€ ํ•œ๊ธ€์ด์–ด๋„ ๊ดœ์ฐฎ์ง€๋งŒ,
์ฝ”๋“œ ์ด๋ฆ„๊นŒ์ง€ ํ•œ๊ธ€์ด ๋“ค์–ด๊ฐ€๋ฉด ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜, ํ…Œ์ŠคํŠธ๋ฅผ ์“ฐ๊ฑฐ๋‚˜, ์ง์ ‘ ํƒ€์ดํ•‘ํ•˜๋ฉด์„œ ์ฝ์„ ๋•Œ ์กฐ๊ธˆ์”ฉ ๋ถˆํŽธํ•ด์งˆ ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”.

ํŠนํžˆ CardShape๋Š” Card, DTO, ํ…Œ์ŠคํŠธ ๊ณณ๊ณณ์—์„œ ๊ณ„์† ์“ฐ์ด๋Š” ์ด๋ฆ„์ด๋ผ์„œ,
ํ•œ๊ธ€๋กœ ๋‘์—ˆ์„ ๋•Œ ์–ป๋Š” ์žฅ์ ๋ณด๋‹ค ์˜์–ด๋กœ ํ†ต์ผํ–ˆ์„ ๋•Œ ์ฝ๊ธฐ ์‰ฝ๊ณ  ๋งž์ถฐ ๊ฐ€๊ธฐ ์‰ฌ์šด ์žฅ์ ์ด ๋” ์ปค ๋ณด์—ฌ์š”.

Git diff ๊ฒฝ๊ณ  ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ํŒŒ์ผ ๋ ๋นˆ์ค„์„ ์ถ”๊ฐ€ํ•จ
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