Skip to content

[πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] νŒŒλ„ λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#1099

Open
choubung wants to merge 29 commits intowoowacourse:choubungfrom
choubung:step2
Open

[πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] νŒŒλ„ λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#1099
choubung wants to merge 29 commits intowoowacourse:choubungfrom
choubung:step2

Conversation

@choubung
Copy link

@choubung choubung commented Mar 13, 2026

μ•ˆλ…•ν•˜μ„Έμš” 웨지!
일단은 사이클2 κΈ°λŠ₯ κ΅¬ν˜„μ— μ§‘μ€‘ν–ˆμ–΄μš”.
이번 μ‚¬μ΄ν΄μ΄λ‚˜ μ„ νƒλ―Έμ…˜ λ•Œ κΈ°νšŒκ°€ 되면 말씀해주신 κ²ƒμ²˜λŸΌ DDD슀럽게 λ°”κΏ€κΉŒ 생각 μ€‘μž…λ‹ˆλ‹€...
μ§€κΈˆ κ΅¬μ‘°λŠ” μ’€ μ•„μ‰¬μš΄ 것 κ°™μ•„μ„œμš”.
κΆκΈˆν•œ 점은 μ•„λž˜μ™€ μ½”λ©˜νŠΈμ— λ‹¬μ•„λ‘μ—ˆμŠ΅λ‹ˆλ‹€! κ°μ‚¬ν•©λ‹ˆλ‹€πŸ˜„

체크 리슀트

  • λ―Έμ…˜μ˜ ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ κ΅¬ν˜„ν–ˆλ‚˜μš”?
  • Gradle testλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ, λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ μ •μƒμ μœΌλ‘œ ν†΅κ³Όν–ˆλ‚˜μš”?
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ‚˜μš”?

μ–΄λ–€ 뢀뢄에 μ§‘μ€‘ν•˜μ—¬ 리뷰해야 ν• κΉŒμš”?

  1. 이미 μ•Œλ €μ£Όμ‹  경계값 ν…ŒμŠ€νŠΈ 외에 쒋은 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λŠ” μ›¨μ§€λ§Œμ˜ 팁이 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€. 또, ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ©΄ μ–΄λ–¨ 땐 ν”„λ‘œλ•μ…˜ μ½”λ“œλ³΄λ‹€λ„ ν’ˆμ΄ 훨씬 많이 λ“œλŠ”λ°, 이게 λ§žλŠ” 건지, λ§žλ‹€λ©΄ μ–΄λ””κΉŒμ§€μ˜ ν’ˆμ΄ μ μ ˆν•œ 건지 μ–΄λ–»κ²Œ νŒλ‹¨ν•  수 μžˆλŠ”μ§€ κΆκΈˆν•΄μš”.
  2. μ—¬λŸ¬ μ‘΄μž¬λ“€μ΄ μ–½ν˜€ μžˆλ‹€ λ³΄λ‹ˆ, μ–΄λ””κΉŒμ§€λ₯Ό ν•œ λ„λ©”μΈμœΌλ‘œ λ‚˜λˆŒμ§€λ„ 고민이 λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€... 이걸 νŒλ‹¨ν•  수 μžˆλŠ” 팁이 μžˆμ„κΉŒμš”?

choubung added 12 commits March 13, 2026 09:38
money 검증 둜직 포함
BlackjackService와 BettingTable λ³€κ²½
기쑴에 Name에 λ“€μ–΄ 있던 name string을 κΊΌλ‚΄μ„œ λ°˜ν™˜ν•΄μ™”μœΌλ‚˜,
Nameμ΄λΌλŠ” voκ°€ μ‘΄μž¬ν•˜λŠ” μ΄μœ μ— λ°˜ν•œλ‹€κ³  μƒκ°ν•˜μ—¬
값이 였갈 λ•Œ Name에 감싸져 μžˆμ„ 수 μžˆλ„λ‘ μˆ˜μ •ν•¨
money의 μƒμ„±μž μΆ”κ°€
λΈ”λž™μž­ μ—¬λΆ€ νŒλ³„μ„ μœ„ν•΄ HandCards에 μ‚¬μ΄μ¦ˆ λ°˜ν™˜ λ©”μ†Œλ“œ μΆ”κ°€
Comment on lines +18 to +35
public Money calculateProfit(Player player) {
if (player.getWinStatus() == WinStatus.WIN && player.isBlackjack()) {
return new Money(bettingTable.get(player).getValueOf() * BLACKJACK_BONUS);
}

if (player.getWinStatus() == WinStatus.LOSS) {
return new Money(0);
}

return bettingTable.get(player);
}

public Money getDealerProfit() {
return new Money(bettingTable.values()
.stream()
.mapToInt(money -> money.getValueOf())
.sum());
}
Copy link
Author

Choose a reason for hiding this comment

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

ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜λ €κ³  ν•˜λ‹ˆ, 미리 μ„ΈνŒ…ν•΄μ•Ό ν•˜λŠ” 값듀이 λ§Žμ€λ°(승리 νŒλ³„),

  1. 클래슀 뢄리가 μ œλŒ€λ‘œ λ˜μ§€ μ•Šμ•„ ν…ŒμŠ€νŠΈκ°€ 더 νž˜λ“  μƒνƒœμΈκ±΄μ§€, μ•„λ‹ˆλ©΄ λ² νŒ…μ΄ μ΄ˆκΈ°μ™€ λ§ˆμ§€λ§‰μ— 걸쳐 μžˆλŠ” κΈ°λŠ₯이기에 이것 저것 μ„ΈνŒ…ν•  것이 λ§Žμ€ 건지 κΆκΈˆν•©λ‹ˆλ‹€.
  2. 또, κΉŠμ΄κ°€ λ„ˆλ¬΄ κΉŠμ–΄μ§ˆ λ•ŒλŠ” νŠΉμ • λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ μ •ν•΄μ§„ 값을 λ°˜ν™˜ν•˜λ„λ‘ ν•˜λŠ” κ°€μ§œ 객체λ₯Ό λ§Œλ“€μ–΄ ν…ŒμŠ€νŠΈ 해도 λ˜λŠ”μ§€, κ·Έ 방식이 μ§€κΈˆ μ—¬κΈ° μ μš©ν•˜κΈ°μ— μ˜¬λ°”λ₯Έμ§€λ„ κΆκΈˆν•©λ‹ˆλ‹€.

Choose a reason for hiding this comment

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

ν…ŒμŠ€νŠΈ ν•  게 λ§Žλ‹€λŠ” 건 if λΆ„κΈ°κ°€ λ§Žλ‹€λŠ” λœ»μ΄μ–΄μš”. λΆ„κΈ° ν•˜λ‚˜ ν•˜λ‚˜κ°€ κ°€μΉ˜μžˆλŠ”μ§€ κ²€ν† ν•˜μ„Έμš”.
κ°€μΉ˜κ°€ μžˆλ‹€λ©΄, λ³΄ν˜Έν•΄μ•Ό 될 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λ§žμœΌλ‹ˆκΉŒ μ—΄μ‹¬νžˆ ν…ŒμŠ€νŠΈν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

객체 뢄리가 잘 λ˜μ–΄μžˆμœΌλ©΄ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό 톡해 그런 뢄기듀을 쀄여볼 수 μžˆμ–΄μš”.
예컨데 Moneyμ—μ„œ 1000원 λ‹¨μœ„ validation을 μ•ˆ ν•΄μ£Όκ³  λˆκ³„μ‚° ν•  λ•Œ 같이 ν•œλ‹€κ³  ν•˜λ©΄,
10000원 + 승리쑰건 / 9999원 + 승리쑰건 / 10000원 + 패배쑰건 / 9999원 + 패배쑰건
μ΄λ ‡κ²Œ λΆ„κΈ°μ˜ κ°œμˆ˜κ°€ μ§€μˆ˜μ μœΌλ‘œ μ¦κ°€ν•˜κ²Œ λ©λ‹ˆλ‹€.

이게 λ‹¨μœ„μ μœΌλ‘œ 잘 λΆ„λ¦¬λ˜μ–΄ 있으면 λΆ„κΈ°μˆ˜κ°€ κ°μˆ˜ν•˜κ² μ£ .

κΉŠμ΄κ°€ λ„ˆλ¬΄ κΉŠμ–΄μ§ˆ λ•ŒλŠ” νŠΉμ • λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ μ •ν•΄μ§„ 값을 λ°˜ν™˜ν•˜λ„λ‘ ν•˜λŠ” κ°€μ§œ 객체

이게 도메인 λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ 잘 λ˜μ–΄μžˆμœΌλ©΄ μžμ—°μŠ€λŸ½κ²Œ μ€„μ–΄λ“€μ–΄μš”. (ν•˜μœ„ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό λ―Ώκ³  μƒμœ„μ—μ„  μ μ ˆν•œ 값을 μ§€λ‹Œ 객체만 μ£Όμž…)

μ–΄μ¨Œλ“  "νŠΉμ • λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ μ •ν•΄μ§„ 값을 λ°˜ν™˜ν•˜λ„λ‘ ν•˜λŠ” κ°€μ§œ 객체λ₯Ό λ§Œλ“€μ–΄ ν…ŒμŠ€νŠΈ" ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ κ΅¬ν˜„ ν›„ λ¦¬λ·°μ£Όμ…”μš”. λ³΄λ©΄μ„œ 또 λ§μ”€λ“œλ¦΄κ²Œμš”

Copy link
Author

Choose a reason for hiding this comment

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

λ„΅!! μ§€κΈˆ 도메인이 ν•„μš”ν•œ μ—­ν• λ§Œ λ“€κ³  μžˆλŠ”μ§€, ν…ŒμŠ€νŠΈκ°€ λ³΄ν˜Έν•΄μ•Όν•  λ‘œμ§μ„ 잘 κ²€μ¦ν•˜λŠ”μ§€μ— μ§‘μ€‘ν•΄μ„œ ν•œ 번 ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•΄λ³Όκ²Œμš”!!

}

public boolean isBlackjack() {
return handCards.getHandCardsSize() == 2 && getScore() == BLACKJACK_CONDITION;
Copy link
Author

Choose a reason for hiding this comment

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

맀직 λ„˜λ²„λ₯Ό μ“°κ³  μ‹Άμ§€ μ•Šμ•˜λŠ”λ°μš”,,,,
'λΈ”λž™μž­μΈμ§€ μ•„λ‹Œμ§€ ν”Œλ ˆμ΄μ–΄κ°€ νŒλ‹¨ν•˜λŠ” 게 λ§žλ‚˜? κ²Œλ‹€κ°€ ν•΄λ‹Ή μƒμˆ˜κ°€ BlackjackService에 이미 μ •μ˜λ˜μ–΄ μžˆλŠ”λ°, μ—¬κΈ°μ„œ ν•΄μ•Ό ν•  일을 ν”Œλ ˆμ΄μ–΄κ°€ ν•˜κ³  μžˆλŠ” 게 μ•„λ‹Œκ°€? 그런데 μ—¬κΈ°μ„œ 이 둜직으둜 λ°–μœΌλ‘œ λΉΌλ©΄ λ‹€λ₯Έ κ³³μ—μ„œ λ„ˆλ¬΄ λ³΅μž‘ν•΄μ§€λŠ”λ° μ½”λ“œ ꡬ쑰가 μ „λ°˜μ μœΌλ‘œ 잘λͺ»λœ 걸까?' λΌλŠ” 생각이 λ“€μ–΄ 리뷰λ₯Ό λ°›κ³  λ‚˜μ„œ λ°©ν–₯성에 맞게 μˆ˜μ •ν•˜κ³  μ‹Άμ–΄μ„œ 일단 λ‘μ—ˆμŠ΅λ‹ˆλ‹€...

Choose a reason for hiding this comment

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

λ§€μ§λ„˜λ²„λ₯Ό μ™œ μ“°λ©΄ μ•ˆ λ˜λŠ”μ§€ ν•™μŠ΅ν•΄λ³΄μ„Έμš”. νŒŒλ„κ°€ μ•„λ‹Œ λ‹€λ₯Έ κ°œλ°œμžκ°€ 이 μ½”λ“œλ₯Ό 봀을 λ•Œ, "2κ°€ 뭐지?" κ³ λ―Όν•˜κ²Œ λ§Œλ“€ μ—¬μ§€κ°€ 있으면 λ§€μ§λ„˜λ²„μž…λ‹ˆλ‹€.

클래슀 μƒμˆ˜ κ°„μ˜ μ˜μ‘΄μ€ λ‘λ²ˆμ§Έ λ¬Έμ œμ—μš”. μ—¬λŸ¬ 도메인에 쀑볡 μ •μ˜ λ˜λ”λΌλ„ 가독성에 λΆˆνŽΈμ„ μ£Όλ©΄ λ§€μ§λ„˜λ²„λ₯Ό μ œκ±°ν•˜λŠ” 게 λ§žμŠ΅λ‹ˆλ‹€.

μ €λŠ” μ‹€μ œλ‘  λ³Έ λ©”μ„œλ“œμ²˜λŸΌ λˆ„κ°€λ΄λ„ λͺ…ν™•ν•œ 경우 (손 개수 2κ°œμ—¬μ•Όλ˜λŠ”κ΅¬λ‚˜) μƒμˆ˜ν™” ν•˜μ§„ μ•Šμ•„μš”.
λŒ€μ‹  의미λ₯Ό λΆ„λͺ…ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ handCards.getHandCardsSize() == 2 자체λ₯Ό λ©”μ„œλ“œν™” ν• κ±° κ°™μ•„μš” (blackjackHandSizeCheck.. λŒ€μΆ© 지은 λ©”μ„œλ“œλͺ…인데 이런 λŠλ‚ŒμœΌλ‘œμš”.)

Copy link
Author

Choose a reason for hiding this comment

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

웨지 μ½”λ©˜νŠΈλ₯Ό 보고 쑰금 μ°Ύμ•„λ΄€λŠ”λ°μš”, 이런 μ‹μœΌλ‘œ λ©”μ†Œλ“œλ₯Ό μ¨μ„œ μ½”λ“œλ₯Ό μ’€ 더 κ°€λ…μ„±μžˆκ²Œ λ§Œλ“€ 수 μžˆλ‹¨ κ±Έ 처음 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!

Copy link

@sihyung92 sihyung92 left a comment

Choose a reason for hiding this comment

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

μ•ˆλ…•ν•˜μ„Έμš” νŒŒλ„! 리뷰어 μ›¨μ§€μž…λ‹ˆλ‹€

Q1. ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ 적정선
A1. 사이클 1 λ•Œ λ‹€λ₯Έ 리뷰이의 μ½”λ©˜νŠΈμ—μ„œ ν…ŒμŠ€νŠΈμ˜ μ€‘μš”μ„±μ— λŒ€ν•΄ μ–˜κΈ°ν•œ 게 μžˆλŠ”λ°, 링크 μ²¨λΆ€ν•΄μš”. 3번만 λ³΄μ…”μš”

μ€‘μš”μ„±μ€ κ·Έλ ‡λ‹€ μΉ˜λ”λΌλ„, 거기에 λ“€μ΄λŠ” κ³΅μˆ˜κ°€ 고민이신 것 κ°™μ€λ°μš”. ν…ŒμŠ€νŠΈλŠ” aiν•œν…Œ μ΄ˆμ•ˆ λ§‘κ²¨λ³΄μ„Έμš”. (무쑰건 acceptν•˜μ§€ λ§ˆμ‹œκ³ , 결과에 λŒ€ν•΄ 같이 λ³΄λ©΄μ„œ ν•™μŠ΅ 효과λ₯Ό μΌμœΌμΌœλ³΄μ„Έμš”)

Q2. 도메인을 λ‚˜λˆ„λŠ” κΈ°μ€€
A2. μ „ 응집도λ₯Ό κΈ°μ€€μœΌλ‘œ λ΄…λ‹ˆλ‹€. "이 데이터와 이 둜직이 항상 같이 λ³€κ²½λ˜λŠ”κ°€?"λ₯Ό λ³΄μ„Έμš”. 같이 λ³€κ²½λœλ‹€λ©΄ ν•œ 도메인, λ”°λ‘œ λ³€κ²½λœλ‹€λ©΄ 뢄리 λŒ€μƒμž…λ‹ˆλ‹€. μ‘μ§‘λ„λ‚˜ 결합도 같은 κ°œλ…μ— λŒ€ν•΄μ„œ κ³ λ―Όν•˜κ³  κ³„μ‹ κ±Έλ‘œ λ΄€μ–΄μš”. 읽어봐도 잘 λͺ¨λ₯΄κ² λŠ” κ°œλ…λ“€μ€ λ„ˆλ¬΄ νž˜λ“€κ²Œ μ ‘κ·Όν•˜μ§€ λ§ˆμ‹œκ³ , 본인이 이해가 κ°€λŠ₯ν•œ λ²„μ „μœΌλ‘œ 천천히 λ§Œλ“€μ–΄λ³΄μ…”μš”. (aiν•œν…Œ 이해가 갈 λ•ŒκΉŒμ§€ 계속 λ˜λ¬Όμ–΄λ³΄μ„Έμš”.) μ½”λ“œλŠ” κ²°κ΅­ λ‚΄κ°€ λ‚©λ“ν•œ κ°œλ…λ“€λ§Œ λ…Ήμ•„λ“€μ–΄κ°€κ³ , 이해 λͺ» ν•˜κ³  μ μš©ν•œ νŒ¨ν„΄μ€ λ‚˜μ€‘μ— λ¦¬νŒ©ν† λ§ λŒ€μƒμœΌλ‘œ λŒμ•„μ˜€κ±°λ“ μš”.

ν…ŒμŠ€νŠΈ μ§œλ³΄μ‹œκ³  λ‹€μ‹œ μš”μ²­μ£Όμ„Έμš”~


public class Money {
private static final int MIN_INCREMENT = 10_000;
private final int money;

Choose a reason for hiding this comment

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

λˆμ„ Int둜 닀루고 κ³„μ‹ λ°μš”, λˆμ„ λ‹€λ£¨λŠ” 데 μ μ ˆν•œ 자료ꡬ쑰λ₯Ό ν•™μŠ΅ν•˜κ³  λ°”κΏ”λ³΄μ…”μš”.

Copy link
Author

Choose a reason for hiding this comment

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

BigDecimal을 ν™œμš©ν•˜λ„λ‘ μˆ˜μ •ν•˜κ² μŠ΅λ‹ˆλ‹€!


private void validateMinIncrement(int value) {
if (value < MIN_INCREMENT || value % MIN_INCREMENT != 0){
throw new IllegalArgumentException("[ERROR] " + MIN_INCREMENT+ "원 λ‹¨μœ„μ—¬μ•Ό ν•˜λ©°, μ΅œμ†Œ κΈˆμ•‘μ€ " + MIN_INCREMENT + "μž…λ‹ˆλ‹€.");

Choose a reason for hiding this comment

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

였λ₯˜ 풍뢀화 ν•΄μ£Όμ„Έμš” (input도 ν•¨κ»˜ λ‘œκΉ…)

보톡 μ„œλ²„λ‹¨μ˜ 였λ₯˜λ₯Ό ν™”λ©΄λ‹¨κΉŒμ§€ 좜λ ₯μ‹œν‚€λŠ” κ²½μš°λŠ” 잘 μ—†κΈ΄ ν•΄μ„œμš”. λ‚˜μ€‘μ— κ°€λ©΄ κΆκ·Ήμ μœΌλ‘œλŠ” μ„œλ²„κ°œλ°œμžλ₯Ό μœ„ν•œ 둜그만 λ‚¨κΈ°κ²Œ 될 ν…λ°μš”
(λͺ¨λ“  였λ₯˜ μ’…λ₯˜λ₯Ό ν”„λ‘ νŠΈκ°€ μ •μ˜ν•˜λŠ” 건 μ–΄λ ΅κΈ° λ•Œλ¬Έμ— λ·° 단을 μœ„ν•œ 좜λ ₯용 λ©”μ‹œμ§€λ₯Ό λ”°λ‘œ λ§Œλ“€μ–΄μ„œ μ „λ‹¬ν•©λ‹ˆλ‹€.)

λ³Έ λ―Έμ…˜μ—μ„œ μ‚¬μš©μž μž…μž₯μ—μ„œ 보더라도, ν–₯ν›„ μ„œλ²„κ°œλ°œμž 둜그 μž…μž₯μ—μ„œ 보더라도 λ‚΄μš©μ΄ ν’λΆ€ν•œ 였λ₯˜λ₯Ό μ •μ˜ν•˜λŠ” 건 항상 λ„μ›€λ˜λŠ” μΌμž…λ‹ˆλ‹€

Copy link
Author

Choose a reason for hiding this comment

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

둜그 상세화가 버릇이 μ•ˆ λ˜μ–΄μ„œ 자꾸 λ†“μΉ˜λ„€μš”.. μ£Όμ˜ν•˜κ² μŠ΅λ‹ˆλ‹€!!

Comment on lines +18 to +35
public Money calculateProfit(Player player) {
if (player.getWinStatus() == WinStatus.WIN && player.isBlackjack()) {
return new Money(bettingTable.get(player).getValueOf() * BLACKJACK_BONUS);
}

if (player.getWinStatus() == WinStatus.LOSS) {
return new Money(0);
}

return bettingTable.get(player);
}

public Money getDealerProfit() {
return new Money(bettingTable.values()
.stream()
.mapToInt(money -> money.getValueOf())
.sum());
}

Choose a reason for hiding this comment

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

ν…ŒμŠ€νŠΈ ν•  게 λ§Žλ‹€λŠ” 건 if λΆ„κΈ°κ°€ λ§Žλ‹€λŠ” λœ»μ΄μ–΄μš”. λΆ„κΈ° ν•˜λ‚˜ ν•˜λ‚˜κ°€ κ°€μΉ˜μžˆλŠ”μ§€ κ²€ν† ν•˜μ„Έμš”.
κ°€μΉ˜κ°€ μžˆλ‹€λ©΄, λ³΄ν˜Έν•΄μ•Ό 될 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 λ§žμœΌλ‹ˆκΉŒ μ—΄μ‹¬νžˆ ν…ŒμŠ€νŠΈν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

객체 뢄리가 잘 λ˜μ–΄μžˆμœΌλ©΄ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό 톡해 그런 뢄기듀을 쀄여볼 수 μžˆμ–΄μš”.
예컨데 Moneyμ—μ„œ 1000원 λ‹¨μœ„ validation을 μ•ˆ ν•΄μ£Όκ³  λˆκ³„μ‚° ν•  λ•Œ 같이 ν•œλ‹€κ³  ν•˜λ©΄,
10000원 + 승리쑰건 / 9999원 + 승리쑰건 / 10000원 + 패배쑰건 / 9999원 + 패배쑰건
μ΄λ ‡κ²Œ λΆ„κΈ°μ˜ κ°œμˆ˜κ°€ μ§€μˆ˜μ μœΌλ‘œ μ¦κ°€ν•˜κ²Œ λ©λ‹ˆλ‹€.

이게 λ‹¨μœ„μ μœΌλ‘œ 잘 λΆ„λ¦¬λ˜μ–΄ 있으면 λΆ„κΈ°μˆ˜κ°€ κ°μˆ˜ν•˜κ² μ£ .

κΉŠμ΄κ°€ λ„ˆλ¬΄ κΉŠμ–΄μ§ˆ λ•ŒλŠ” νŠΉμ • λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ μ •ν•΄μ§„ 값을 λ°˜ν™˜ν•˜λ„λ‘ ν•˜λŠ” κ°€μ§œ 객체

이게 도메인 λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ 잘 λ˜μ–΄μžˆμœΌλ©΄ μžμ—°μŠ€λŸ½κ²Œ μ€„μ–΄λ“€μ–΄μš”. (ν•˜μœ„ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό λ―Ώκ³  μƒμœ„μ—μ„  μ μ ˆν•œ 값을 μ§€λ‹Œ 객체만 μ£Όμž…)

μ–΄μ¨Œλ“  "νŠΉμ • λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ μ •ν•΄μ§„ 값을 λ°˜ν™˜ν•˜λ„λ‘ ν•˜λŠ” κ°€μ§œ 객체λ₯Ό λ§Œλ“€μ–΄ ν…ŒμŠ€νŠΈ" ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ κ΅¬ν˜„ ν›„ λ¦¬λ·°μ£Όμ…”μš”. λ³΄λ©΄μ„œ 또 λ§μ”€λ“œλ¦΄κ²Œμš”

}

@ParameterizedTest
@ValueSource(strings = {"9999", "10001", "0", "-10000", "11000"})

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.

κ°μ‚¬ν•©λ‹ˆλ‹€πŸ˜„
ν™•μ‹€νžˆ κ²½κ³„κ°’μ΄λ‚˜ λΆ„κΈ° 값을 잘 ν…ŒμŠ€νŠΈ ν•΄μ•Όν•œλ‹€λŠ” κ±Έ 이번 λ―Έμ…˜μ„ ν•˜λ©° 많이 λŠκΌˆμ–΄μš”

}

public boolean isBlackjack() {
return handCards.getHandCardsSize() == 2 && getScore() == BLACKJACK_CONDITION;

Choose a reason for hiding this comment

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

λ§€μ§λ„˜λ²„λ₯Ό μ™œ μ“°λ©΄ μ•ˆ λ˜λŠ”μ§€ ν•™μŠ΅ν•΄λ³΄μ„Έμš”. νŒŒλ„κ°€ μ•„λ‹Œ λ‹€λ₯Έ κ°œλ°œμžκ°€ 이 μ½”λ“œλ₯Ό 봀을 λ•Œ, "2κ°€ 뭐지?" κ³ λ―Όν•˜κ²Œ λ§Œλ“€ μ—¬μ§€κ°€ 있으면 λ§€μ§λ„˜λ²„μž…λ‹ˆλ‹€.

클래슀 μƒμˆ˜ κ°„μ˜ μ˜μ‘΄μ€ λ‘λ²ˆμ§Έ λ¬Έμ œμ—μš”. μ—¬λŸ¬ 도메인에 쀑볡 μ •μ˜ λ˜λ”λΌλ„ 가독성에 λΆˆνŽΈμ„ μ£Όλ©΄ λ§€μ§λ„˜λ²„λ₯Ό μ œκ±°ν•˜λŠ” 게 λ§žμŠ΅λ‹ˆλ‹€.

μ €λŠ” μ‹€μ œλ‘  λ³Έ λ©”μ„œλ“œμ²˜λŸΌ λˆ„κ°€λ΄λ„ λͺ…ν™•ν•œ 경우 (손 개수 2κ°œμ—¬μ•Όλ˜λŠ”κ΅¬λ‚˜) μƒμˆ˜ν™” ν•˜μ§„ μ•Šμ•„μš”.
λŒ€μ‹  의미λ₯Ό λΆ„λͺ…ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ handCards.getHandCardsSize() == 2 자체λ₯Ό λ©”μ„œλ“œν™” ν• κ±° κ°™μ•„μš” (blackjackHandSizeCheck.. λŒ€μΆ© 지은 λ©”μ„œλ“œλͺ…인데 이런 λŠλ‚ŒμœΌλ‘œμš”.)

Choose a reason for hiding this comment

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

κ΅¬ν˜„μ²΄λ‘œ μ‚¬μš©ν•  일이 μ—†λŠ” κ°μ²΄μ—¬μ„œμš”, abstract둜 μ²˜λ¦¬ν•˜μ‹œλ©΄ μ’‹κ² λ„€μš”. 쒋은 μ½”λ“œλŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©λ˜κ²Œ μ΅œλŒ€ν•œ μ œμ•½ν•˜λŠ” κ±°μ—¬μ„œμš”

Copy link
Author

Choose a reason for hiding this comment

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

λ„΅ μˆ˜μ •ν•˜κ² μŠ΅λ‹ˆλ‹€!!

@choubung choubung changed the title [πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ κ²Œμž„ μ‹€ν–‰)] νŒŒλ„ λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€. [πŸš€ 사이클2 - λ―Έμ…˜ (λΈ”λž™μž­ λ² νŒ…)] νŒŒλ„ λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€. Mar 16, 2026
choubung added 13 commits March 16, 2026 12:39
dto μ‚¬μš©μœΌλ‘œ μΈν•œ μž…λ ₯κ°’ λ³€κ²½
mockito μ‚­μ œ
기타 λ³€κ²½
Name으둜 Playerλ₯Ό μ°ΎλŠ” λ©”μ†Œλ“œ μΆ”κ°€
Comment on lines +17 to +18
private final Name playerName = new Name("ν…ŒμŠ€νŠΈ");
private BettingTable bettingTable;
Copy link
Author

Choose a reason for hiding this comment

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

μ›λž˜ mockitoλ₯Ό μ‚¬μš©ν–ˆμ—ˆμœΌλ‚˜, λ² νŒ… 계산 λ©”μ†Œλ“œμ—μ„œ dtoλ₯Ό λ°›κ²Œ λ˜λ©΄μ„œ (κΈ°μ‘΄μ—λŠ” Name, WinStatus, boolean(isblackjack을 λ°›μ•˜μ—ˆμŒ) μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μ–΄μ Έ μ‚­μ œν•˜μ˜€μŠ΅λ‹ˆλ‹€!

@choubung
Copy link
Author

μ•ˆλ…•ν•˜μ„Έμš” 웨지!

μ „λ°˜μ μΈ λ¦¬νŒ©ν† λ§λ„ ν•¨κ»˜ ν•˜κ³ , ν…ŒμŠ€νŠΈλ₯Ό 짜며 μ „λ°˜μ μœΌλ‘œ μ½”λ“œλ₯Ό μ κ²€ν•˜λ‹€λ³΄λ‹ˆ μˆ˜μ •ν•  λ‘œμ§λ„ λͺ‡ μžˆμ–΄μ„œ λŠ¦μ–΄μ§€κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€....

μ²˜μŒμ—λŠ” mockitoλ₯Ό μ‚¬μš©ν•΄μ„œ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν–ˆμ—ˆλŠ”λ°μš”, ν…ŒμŠ€νŠΈ μž‘μ„± μžμ²΄λ„ λΆˆνŽΈν–ˆμ§€λ§Œ, 둜직 μžμ²΄λ„ 이것 저것 μ—°κ²°λœ 게 λ§Žμ•„ λ¦¬νŒ©ν† λ§ λŒ€μƒμ΄λΌκ³  μƒκ°ν•΄μ„œ ꡬ쑰λ₯Ό μˆ˜μ •ν–ˆμ–΄μš”. 기쑴에 Name, Winstatus, isBlackjack을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›μ•„ λ² νŒ… κ²°κ³Όλ₯Ό κ³„μ‚°ν–ˆλŠ”λ°, μ—¬λŸ¬λͺ¨λ‘œ λΆˆν•„μš”ν•˜κ²Œ μ–½ν˜€ μžˆλ‹€κ³  μƒκ°ν•΄μ„œ(winstatusλž‘ isBlackjack λ‹€ λ¬΄μ–Έκ°€λ‘œλΆ€ν„° ꡬ해야 ν•˜λŠ” κ°’) dtoλ₯Ό μ‚¬μš©ν•΄ μ•„μ˜ˆ 값을 serviceμ—μ„œ ν•œ λ²ˆμ— λ‹΄μ•„ μ „λ‹¬ν•˜λŠ” κ²ƒμœΌλ‘œ λ°”κΏ¨μ–΄μš”.

이번 λ¦¬νŒ©ν† λ§μ„ ν•˜λ©΄μ„œ 응집도에 λŒ€ν•΄μ„œ μ’€ 고민을 ν–ˆκ³ , 객체가 μ„œλ‘œλ₯Ό λͺ¨λ₯Έλ‹€λŠ” 게 μ–΄λ–€ μ˜λ―ΈμΈμ§€ μ‘°κΈˆμ€ μ•Œκ²Œ 된 것 κ°™μŠ΅λ‹ˆλ‹€. μ˜ˆμ „μ— 웨지가 μ‘°μ–Έν•΄μ€¬λ˜ κ²ƒμ²˜λŸΌ PlayerManagerλ₯Ό μ‚­μ œν•˜κ³  Playerλ₯Ό μ•„μ˜ˆ BlackjackGame μ•„λž˜λ‘œ μˆ¨κ²Όμ–΄μš”.

늘 λ‚ μΉ΄λ‘­κ³  λ”°λœ»ν•˜κ²Œ λ¦¬λ·°ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! 짧은 μ‹œκ°„μΈλ°λ„ 많이 λ°°μ›Œκ°€κ³  μžˆμ–΄μš”.

Copy link

@sihyung92 sihyung92 left a comment

Choose a reason for hiding this comment

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

μ•ˆλ…•ν•˜μ„Έμš” νŒŒλ„, 리뷰어 μ›¨μ§€μ—μš”.

μ—¬λŸ¬κ°€μ§€ κ³ λ―Όν•˜κ³  λ°˜μ˜ν•΄μ£Όμ‹  흔적이 λ³΄μ΄λ„€μš”. λ¦¬νŒ©ν† λ§μ„ μš”κ΅¬ν•˜λŠ” 리뷰λ₯Ό λ“œλ ΈλŠ”λ°, ν•œλ²ˆ λ°˜μ˜ν•΄λ³΄μ‹œκ³  어렀움이 있으면 편히 μ§ˆλ¬Έμ£Όμ…”μš”.


public Money getDealerProfit() {
return bettingTable.getDealerProfit();
public DealerResultDto getDealerResult() {

Choose a reason for hiding this comment

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

getDealerResultλ‚˜ getPlayerResultInfosλŠ” ν–‰μœ„κ°€ μžˆλŠ”λ°μš”,
getterκ°€ κ°€μ§€λŠ” κ°•λ ₯ν•œ 고정관념 덕뢄에 ν–‰μœ„κ°€ μžˆμ„ 땐 get μ™Έμ˜ λ‹€λ₯Έ 동사 μ‚¬μš©μ„ κ²€ν† ν•΄λ³΄μ„Έμš”.

getPlayerInfos, getPlayerInfo와 비ꡐ해보면 λ§Žμ€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 ν¬ν•¨λ˜μ–΄ μžˆμœΌλ‹ˆκΉŒμš”.

import domain.vo.Name;

public class ResultForBettingDto {
private final Name name;

Choose a reason for hiding this comment

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

μ–΄λ””μ„œλŠ” String name으둜, μ–΄λ””μ„œλŠ” Name name으둜 dtoκ°„ κ·œμΉ™μ΄ λ‹€λ₯Έλ°μš”
ν•˜λ‚˜μ˜ λ°©ν–₯으둜 ν†΅μΌν•΄μ£Όμ…”μš” (λ‹€λ₯Έ 리뷰λ₯Ό λ°˜μ˜ν•˜λ©΄ μ‚¬λΌμ§ˆ κ°μ²΄μž…λ‹ˆλ‹€λ§Œ)

bettingTable.put(name, money);
}

public Money calculateProfit(ResultForBettingDto dto) {

Choose a reason for hiding this comment

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

μ„œλ‘œ λ‹€λ₯Έ λ ˆμ΄μ–΄λ₯Ό κ±΄λ„ˆκ°ˆ λ•Œ DataTransferObject, DTOλ₯Ό μ“°λŠ”λ°μš”
예λ₯Όλ“€μ–΄ 도메인 <-> λ·°, 도메인 <-> DB λ“± μ„œλ‘œ λ‹€λ₯Έ λ ˆμ΄μ–΄λ‚˜ μ•„μ£Ό λ¨Ό μ‚¬μ΄μ˜ 도메인끼리 μ“°λŠ” κ·œμΉ™μ΄μ—μš”

service λ ˆμ΄μ–΄ μ•ˆμͺ½ μ •λ„λŠ” 도메인 끼리의 κ³΅κ°„μœΌλ‘œ λ΄μ„œ ꡳ이 dto둜 λ³€ν™˜ν•΄ 받을 ν•„μš”λŠ” 없을 것 κ°™λ„€μš”. μ›ν˜• κ·ΈλŒ€λ‘œμ˜ Player, Dealerλ₯Ό λ°›μ•„ μ²˜λ¦¬ν•˜λ„λ‘ ν•΄λ³΄μ…”μš”.


public class BettingTable {
private static final double BLACKJACK_BONUS = 1.5;
private final Map<Name, Money> bettingTable = new HashMap<>();

Choose a reason for hiding this comment

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

Player κ°μ²΄μ—μ„œ eqauls&hashcodeλ₯Ό κ΅¬ν˜„ν•˜κ³ , "Name"을 κΈ°μ€€μœΌλ‘œ ν•˜κ²Œ ν•˜λ©΄ Playerλ₯Ό ν‚€λ‘œ 데이터λ₯Ό 뽑을 수 있겠죠

for (Player player : playerManager.getPlayers()) {
blackjackService.dealPlayerCardsOut(player);
private void askBettingMoney() {
for (Name name : names) {

Choose a reason for hiding this comment

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

PlayerλΌλŠ” 객체 λŒ€μ‹  Name인 voκ°€ λ‹€μ–‘ν•œ 객체와 관계 λ§ΊλŠ” 건 μ–΄μƒ‰ν•΄μ„œμš”,
Player둜 λ‹€μ‹œ λ‘œμ§μ„ μ „κ°œν•˜κ²Œ λ¦¬νŒ©ν† λ§ ν•΄λ³΄μ‹œμ£ .

Player의 속을 λ³΄μ—¬μ€„μˆ˜λ‘ Player의 ν–‰μœ„λ₯Ό μˆ˜μ •ν•  λ•Œ λ”°λ‘œ 고쳐야 ν•˜λŠ” 뢀뢄이 λ§Žμ•„μ§‘λ‹ˆλ‹€. μΊ‘μŠν™”κ°€ μ£ΌλŠ” κ°€μΉ˜μ£ 
ν•„μš”ν•œ κ³³μ—μ„œλ§Œ getName을 ν•΄μ„œ μ œν•œμ μœΌλ‘œ Name을 μ•Œ 수 있게 ν•΄μ£Όμ…”μš”.

그리고 κΈ°μ‘΄ 둜직과 ν˜„μž¬ λ‘œμ§μ— μžˆλŠ”, μ»¨νŠΈλ‘€λŸ¬κ°€ playerManager ν˜Ήμ€ namesλ₯Ό ν•„λ“œλ‘œ λ“€κ³  μžˆλŠ” λŒ€μ‹ μ— 이미 ν•΄λ‹Ή 데이터λ₯Ό κ°€μ§€κ³  μžˆλŠ” BlackjackServiceλ‘œλΆ€ν„° μœ μ € λͺ©λ‘μ„ λ°›μ•„μ˜€μ‹œμ£ . (μ •ν™•νžˆλŠ” BlackjackGame이죠)

import java.util.stream.Collectors;

public class GameController {
private final BlackjackService blackjackService;

Choose a reason for hiding this comment

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

μ €λŠ” BlackjackServiceκ°€ ν•΄μ•Όν•˜λŠ” 역할을 controllerκ°€ ν•˜κ³  있기 λ•Œλ¬Έμ—, (μ–΄λ”˜κ°€ "절차" κ°€ ν•„μš”ν•  λ•Œ μˆœμ„œλ₯Ό μ§€μ •ν•˜λŠ” μ—­ν• ) μ•„μ˜ˆ ServiceλŠ” μ œκ±°ν•˜κ³  BlackjackGameκ³Ό BettingTable을 직접 μ˜μ‘΄ν•˜μ—¬ 객체간은 ν˜‘λ ₯만 ν–ˆμœΌλ©΄ μ–΄λ–¨κΉŒ ν•©λ‹ˆλ‹€.
view ν˜•μ‹μ— κ°•ν•˜κ²Œ μ˜μ‘΄λ°›λŠ” (input을 λ°›μœΌλ €λ©΄ wait 해야됨) ν˜„μž¬ λ―Έμ…˜μ—μ„  μ„œλΉ„μŠ€ μ½”λ“œκ°€ 의미λ₯Ό κ°€μ§€κΈ° νž˜λ“€μ–΄μ„œμš”

Comment on lines +16 to +17
testImplementation('org.mockito:mockito-core:5.5.0')
testImplementation('org.mockito:mockito-junit-jupiter:5.5.0')

Choose a reason for hiding this comment

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

λ―Έμ‚¬μš©ν•˜κ²Œ 된 μ˜μ‘΄μ„±μ€ μ œκ±°ν•΄μ£Όμ„Έμš”!


import static org.assertj.core.api.Assertions.assertThat;

class BettingTableTest {

Choose a reason for hiding this comment

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

μ•„ν•˜, BettingTableTestμ—μ„œ card, player, dealer의 stub을 λͺ¨λ‘ λ§Œλ“€μ–΄μ•Ό ν…ŒμŠ€νŠΈ ν•  수 μžˆμ–΄μ„œ 어렀움을 λŠλΌμ…¨κ΅°μš”. stub λ§Œλ“œλŠ” 게 항상 고역이고 ν•™μŠ΅ λ‹¨μœ„μ˜ λ―Έμ…˜λ³΄λ‹€ 훨씬 λ§Žμ€ ν•„λ“œλ₯Ό λ‹€λ£¨λŠ” ν˜„μ—…μ€ 특히 더 κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

리뷰 λ°˜μ˜ν•˜λ©΄μ„œ μ—°μŠ΅ν•œλ‹€ 치고 ν•œλ²ˆ ν•΄λ³΄μ…”μš”. ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ§Œλ“œλŠ” 것도 ν”„λ‘œλ•μ…˜κ³Ό λΉ„μŠ·ν•©λ‹ˆλ‹€. λ°˜λ³΅λ˜λŠ” μš”μ†ŒλŠ” λ©”μ„œλ“œλ‘œ μΆ”μΆœν•˜κ³ , 가독성 μ’‹κ²Œ μž‘μ„±ν•˜λ‹€ 보면 생각보닀 μ•„μ£Ό νž˜λ“€μ§€λ„ μ•ŠμŠ΅λ‹ˆλ‹€


μš”λ²ˆ λ¦¬λ·°μš”μ²­ μ£Όμ‹€ λ•Œ μ‘μ§‘λ„λŠ” κ·ΈλŒ€λ‘œλ©΄μ„œ, κ²°ν•©λ„λŠ” λ†’μ•„μ‘Œμ–΄μš”.
BettingTable이 ν•˜λŠ” μ—­ν•  μžμ²΄λŠ” 달라진 게 μ—†μœΌλ‚˜, Player와 Dealer의 Name, WinStatusλΌλŠ” 상세 κ΅¬ν˜„μ„ 직접 νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„ μ²˜λ¦¬ν•΄μ•Όλ§Œ ν–ˆμœΌλ‹ˆκΉŒμš”


"ν…ŒμŠ€νŠΈν•˜κΈ° νŽΈν•œ μ½”λ“œ", "ν…ŒμŠ€νŠΈκ°€ μš©μ΄ν•œ μ½”λ“œ"λ₯Ό λ§Œλ“€λΌκ³  ν•˜λŠ” 건 "힘이 덜 λ“œλŠ”", "짜기 μ‰¬μš΄", "금방 μ§€ 수 μžˆλŠ”" ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€λΌλŠ” 말이 μ•„λ‹ˆμ—μš”.

λ‹¨μœ„ μˆ˜μ€€μ˜ ν…ŒμŠ€νŠΈλ₯Ό κ΅¬ν˜„ν•  수 있고, 둜직이 κ°€μ§€κ³  μžˆλŠ” 각 뢄기에 λŒ€ν•œ ν…ŒμŠ€νŠΈλ₯Ό λ†“μΉ˜μ§€ μ•Šκ³  ν•  수 μžˆλŠ” ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“€λΌλŠ” λœ»μ΄μ–΄μš”.

예λ₯Όλ“€μ–΄ "GameController의 λ©”μ„œλ“œ ν•˜λ‚˜μ—μ„œ λͺ¨λ“  μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜μ‹œμ˜€"λΌλŠ” μš”κ΅¬μ‚¬ν•­μ΄μ—ˆμœΌλ©΄, ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μ œκ³΅ν•˜λŠ” λͺ¨λ“  κΈ°λŠ₯을 ν…ŒμŠ€νŠΈν•˜λŠ” 게 λΆˆκ°€λŠ₯ν•˜λ‹€ 싢을 정도 μ˜€μ„κ±°μ—μš”.

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” 개발자 ꡬ동 ν…ŒμŠ€νŠΈμ˜ μžλ™ν™”μ—μš”. 이 ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ—†μœΌλ©΄ 맀번 μ„œλ²„λ₯Ό λΉŒλ“œν•˜κ³ , input으둜 μ—¬λŸ¬κ°€μ§€λ₯Ό μž…λ ₯해봐야 ν•΄μš”. λ―Έμ…˜ λ‹¨μœ„μ—μ„  잘 되던 κΈ°λŠ₯ ν•˜λ‚˜κ°€ μ‹€νŒ¨ν•΄λ„ 아무 일 μ—†μ§€λ§Œ, ν˜„μ—…μ—μ„œλŠ” κ³ κ°μ—κ²Œ κΈˆμ „μœΌλ‘œ λ³΄μƒν•΄μ•Όν•˜λŠ” 큰 일 μΌμˆ˜λ„ μžˆμ–΄μš”. 그리고 항상 μž₯μ• λŠ” "μƒˆλ‘œ κ΅¬ν˜„ν•œ λΆ€λΆ„"μ—μ„œ λ‚˜μ§€ μ•Šκ³  "μ˜ˆμƒμΉ˜ λͺ»ν•œ μ‚¬μ΄λ“œμ΄νŽ™νŠΈλ‘œ μΈν•œ κΈ°μ‘΄ κΈ°λŠ₯의 μ‹€νŒ¨"둜 λ‚˜λ”λΌκ΅¬μš”. 맀번 기쑴에 되던 경우λ₯Ό ν™•μΈν•΄μ£ΌλŠ” 게 ν…ŒμŠ€νŠΈμ΄λ‹ˆ, λ‹Ήμž₯ κ΅¬ν˜„λ‹¨κ³„μ—μ„œ ν…ŒμŠ€νŠΈ μ§œλŠ” 게 μ–΄λ €μ›Œλ„ ν–₯ν›„ 1λ…„ 300번의 μ„œλ²„ λΉŒλ“œμ™€ ꡬ동 ν•  μ‹œκ°„μ„ μ•„λ‚€λ‹€λŠ” κ°œλ…μœΌλ‘œ 보고 곡을 λ“€μ—¬λ³΄μ…”μš”.

service λ ˆμ΄μ–΄ μ‚­μ œ
λ‚΄λΆ€ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ dto λŒ€μ‹  Playerλ‚˜ Dealerλ₯Ό 직접 μ°Έμ‘°ν•˜λ„λ‘ λ³€κ²½
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