[π μ¬μ΄ν΄2 - λ―Έμ (λΈλμ λ² ν )] μ΄λ λ―Έμ μ μΆν©λλ€.#1127
[π μ¬μ΄ν΄2 - λ―Έμ
(λΈλμ λ² ν
)] μ΄λ λ―Έμ
μ μΆν©λλ€.#1127JYL35 wants to merge 49 commits intowoowacourse:jyl35from
Conversation
- μ΄κΈ° Handλ λΆλ³ 리μ€νΈλ‘ μ΄κΈ°ν - appendCard μμ λΆλ³ 리μ€νΈμ μΉ΄λλ₯Ό μΆκ°νμ¬ μλ‘μ΄ Hand κ°μ²΄λ₯Ό λ°ν
- λ©€λ² λͺ λ¨ ν μ€νΈ - μΉ΄λ μΆκ° ν μ€νΈ - λλ¬ κ²μ κ²°κ³Ό κ²°μ ν μ€νΈ - νλ μ΄μ΄ κ²μ κ²°κ³Ό κ²°μ ν μ€νΈ
- Draw μ μΆλ ₯ ν early returnμ΄ λλ½λμ΄ μμ
- CardNumber, CardPatter νλ final λλ½μΌλ‘μΈν΄ μμ
- Cotroller: λ©μλλͺ μμ λ° κ²μ μ΄κΈ°ν κΈ°λ₯ μ¬μ© λΆκΈ° μμ
- νλμ λ©μλλ₯Ό λλ¬μ νλ μ΄μ΄λ‘ λΆλ¦¬ - Word: ViewMessageλ‘ μ΄λ¦ λ³κ²½ λ° λλ¬ μ΄λ¦ μ κ±°
- 52κ°μ§ μΉ΄λλ₯Ό μ μ₯νλλ‘ κ΅¬ν - ν©ν 리 λ©μλλ μ μ₯μμμ getνμ¬ λ°ν - 52κ°μ§ μΉ΄λλ₯Ό λ§€λ² μμ±νκ³ μ§μμΌν μΌμ΄ μμ΄μ§
- VO: κ°μ κΈμ‘μΌ λ κ°μ κ°μ²΄λ‘ μ·¨κΈνλλ‘ κ΅¬ν (κ°μ κ°μΉ μ·¨κΈ) - μμΈ: λ² ν κΈμ‘μ΄ 0μ λ―Έλ§μ΄λ©΄ μμΈ λ°μ - μμ΅κΈ κ³μ°: μμ΅λ₯ μ λ°μ μμ΅κΈ κ³μ°
- μν ν¨ν΄ λμ μ μν΄ State κ³μΈ΅ λ° Started, Finished μΆμ ν΄λμ€ κ΅¬ν - μ’ λ£ μνμΈ Bustμ Blackjack ꡬν
- νλ μ΄μ΄κ° λ μ΄μ μΉ΄λλ₯Ό λ°μ§ μκ³ μΆμ΄νλ©΄ μνκ° Stayλ‘ λ°λλ κΈ°λ₯ ꡬν
- κ° Stateλ³ stay() κΈ°λ₯ μΆκ°
μν ν¨ν΄ λμ λ° λ² ν κΈ°λ₯ μΆκ°
BlackjackView ꡬν λ° λ²κ·Έ μμ
jamie9504
left a comment
There was a problem hiding this comment.
μλ νμΈμ, μ΄λ . λ¦¬λ·°μ΄ μ μ΄λ―Έμ λλ€.
μ½λ©νΈ λ¨κ²¨λμμ΅λλ€.
| @@ -1,12 +1,16 @@ | |||
| package application; | |||
There was a problem hiding this comment.
μ°μ μ΄λ² μ¬μ΄ν΄λ μ μΆμ΄ μ’ λ¦μ΄μ§ μ μ¬κ³Όμ λ§μ λ립λλ€.
λ―Έμ
μꡬμ¬νμ μ μΆ κΈ°νμ΄ λͺ
μλμ΄μμ§ μμλ€λ©΄, μ¬κ³Όνμ§ μμΌμ
λ λ©λλ€.
μ λ μ κ²½μ°μ§ μλ νΈμ΄μ§λ§, λ€λ₯Έ 리뷰μ΄λ₯Ό λ§λ¬μ λλ μνΈκ°μ μΌμ μ μν΄ μ€λ 걸릴 κ² κ°μΌλ©΄ DMμ λ¨κ²¨λλ λ°©λ²λ μμ κ² κ°μμ.
리뷰μ΄λ
μ μ΄λ―Έλ‘ μΆ©λΆν©λλ€.
-
μΈμ€ν΄μ€ λ³μ 3κ° μ νκ³Ό μμ ꡬ쑰μμμ μΉ΄μ΄νΈ κΈ°μ€
μ΄λ² λ―Έμ μμ '3κ° μ΄μμ μΈμ€ν΄μ€ λ³μλ₯Ό κ°μ§ ν΄λμ€λ₯Ό μ°μ§ μλλ€'λ κ·μΉμ μ§ν€κΈ° μν΄ λ Έλ ₯νμ΅λλ€. κ·Έλ°λ° μμ ꡬ쑰(μ: Member > Player)λ₯Ό μ¬μ©νλ€ λ³΄λ, λΆλͺ¨ ν΄λμ€μ νλμ μμ ν΄λμ€μ νλλ₯Ό ν©μ³€μ λ μ΄ κΈ°μ€μ μ΄λ»κ² μ μ©ν΄μΌ ν μ§ κ³ λ―Όμ΄ λμμ΅λλ€.
리뷰μ΄λμ μμ κ΄κ³μμ λΆλͺ¨μ μμμ νλ ν©κ³λ₯Ό νλμ κ°μ²΄ ν¬κΈ°λ‘ 보μλμ§, μλλ©΄ κ° ν΄λμ€ λ¨μλ‘ λ³΄μλμ§ κΆκΈν©λλ€.
λν, νλ κ°μλ₯Ό μ€μ΄κΈ° μν΄ μμμ μ ννλ κ²μ΄ κ°μ²΄μ§ν₯μ μΌλ‘ μ³μ λ°©ν₯μΈμ§μ λν μ견λ λ£κ³ μΆμ΅λλ€.
- μΈμ€ν΄μ€ λ³μλ, μΌλ°μ μΌλ‘ κ°μ²΄ νλκ° λ°νμμ μ€μ λ‘ λ³΄μ νλ νλμ μ΄ν©μΌλ‘ λ΄ λλ€. ν΄λμ€μ μ΄λ»κ² μ μΈλμ΄ μλμ§λ ν¬κ² μ€μνμ§ μμμ. μμμ νλλΌλ, λ°νμμ ν΄λΉ κ°μ²΄κ° μ€μ λ‘ κ°μ§κ³ μλ λ³μλ 3κ°κ° λκ² μ£ ?
- νλ μλ₯Ό μ€μ΄κΈ° μν΄ μμμ μ ννλ κ²μ μ’μ§ μμ΅λλ€. μμμ "is-a"κ° λͺ νν λ μ¬μ©ν΄μΌ ν©λλ€. λ¬Όλ‘ μ§κΈμ Playerκ° MemberμΈ κ΄κ³λ μμ°μ€λ½μ§λ§, νλμ μ νμ νΌνλ €λ λͺ©μ μΌλ‘ μμμ μ¬μ©νλ€λ©΄ μ€κ³ μμ²΄κ° μ곑λ μ μμ΄μ.
-
λλ―Έν° λ²μΉ(Law of Demeter)κ³Ό μλΉμ€ κ³μΈ΅μ μ± μ λ²μ
νμ¬ κ΅¬μ‘°κ° Service > GameTable > Members > Member μμΌλ‘ λ μ΄μ΄κ° ꡬμ±λμ΄ μμ΅λλ€. νμ λλ©μΈμ΄ λ°μ΄ν°λ₯Ό λμ μ λ¬ν΄ μ£Όλ λ°©μμ ννλ€ λ³΄λ μμ κ°μ²΄μ get νμμ μμ λ©μλκ° λ무 λ§μμ§λ νμμ΄ λ°μνμ΅λλ€.
Serviceμμ μ§μ Member κ°μ²΄λ₯Ό κ°μ Έμ μ μ΄νλ κ²μ΄ κ³μΈ΅ κ° κ²°ν©λλ₯Ό λμ΄λ νμμΌκΉμ?
μλλ©΄ νμ¬μ²λΌ μμ λλ©μΈμ΄ νμ λλ©μΈμ κΈ°λ₯μ λμ νΈμΆ(Wrapping)ν΄ μ£Όλ©° μΊ‘μνλ₯Ό μ μ§νλ κ²μ΄ λ λμ μ€κ³μΌκΉμ? 'Tell, Don't Ask' μμΉμ μ§ν€λ©΄μλ μ°μ Getterλ₯Ό λ§μ μ μλμ§ κΆκΈν©λλ€. νΉμ μ΄λ€ κ²μ΄ λ κ²°ν©λλ₯Ό λμ΄λ νμμΈμ§ κΆκΈν©λλ€.
- νμ¬ κ΅¬μ‘°μΈ μμ λλ©μΈμ΄ νμ λλ©μΈμ κΈ°λ₯μ Wrappingνλ λ°©μμ΄ λ λ«μ΅λλ€. λ¨, μμ λ©μλκ° κ³Όλνκ² λμ΄λλ€λ©΄ μ€κ° κ³μΈ΅ μμ²΄κ° λΆνμνλ€λ μ νΈμΌ μ μμ΄μ.
- Service β GameTable β Members 3λ¨κ³λ³΄λ€ Service β Members 2λ¨κ³λ‘ μ€μ΄λ κ²λ κ³ λ €ν΄λ³΄μΈμ. GameTableμ΄ μ€μ§μ μΌλ‘ Membersλ₯Ό μκ² κ°μΈλ μν λ§ νλ€λ©΄ μ κ±° λμμ΄ λ μ μμ΄μ.
-
ν μ€νΈ μ½λμ μ μ°μ±κ³Ό νμ₯μ± (OCP)
κΈ°λ₯μ΄ μΆκ°λλλΌλ κΈ°μ‘΄ ν μ€νΈκ° μ κΉ¨μ§μ§ μλ λ³κ²½μ μ μ°ν ꡬ쑰λ₯Ό λ§λ€κ³ μ λ Έλ ₯νμ΅λλ€. μν ν¨ν΄μ λμ νλ©΄μ μλ‘μ΄ μν(μ: μλ‘μ΄ κ·μΉμ μΆκ°)κ° μ겨λ κΈ°μ‘΄μ State ν μ€νΈλ ꡬν λ‘μ§μ΄ μμ λμ§ μκ³ νμ₯λ μ μλλ‘ μ€κ³νκ³ μ νμ΅λλ€. μ΄ λΆλΆμ΄ μλλλ‘ μ μ½νλμ§ μ견μ λ£κ³ μΆμ΅λλ€.
- μν ν¨ν΄ λμ μΌλ‘ μλ‘μ΄ μν μΆκ° μ κΈ°μ‘΄ ν μ€νΈκ° κΉ¨μ§μ§ μλ ꡬ쑰λ μ μ‘ν μμ΄μ. λ€λ§ instanceof μ¬μ©μ΄ λ¨μμλ ν μμ ν OCPλΌκ³ 보기 μ΄λ ΅μ΅λλ€. instanceof μ κ±° νμμΌ μ§μ ν νμ₯μ μ΄λ¦° κ΅¬μ‘°κ° λ©λλ€.
-
λΆλ³ κ°μ²΄(Immutable Object)μ μν°ν°μ νλ λ³κ²½
Handλ₯Ό λΆλ³ κ°μ²΄λ‘ 리ν©ν λ§νλ©΄μ κ°μ²΄μ μμ μ±μ λμμ‘μΌλ, μ΄λ₯Ό 보μ ν μμ λλ©μΈμΈ Memberμ hand νλμ finalμ μ¬μ©ν μ μλ λ¬Έμ κ° μκ²Όμ΅λλ€. λ§μ½ MemberκΉμ§ λΆλ³μΌλ‘ λ§λ€λ©΄ μ΄λ₯Ό κ΄λ¦¬νλ Members 리μ€νΈκΉμ§ λ§€λ² μλ‘ μμ±ν΄μΌ νλ λΆλ³μ μ°μ νμμ΄ λ°μνκ² λμμ΅λλ€.
λΆλ³μ κ°λ³μ κ²½κ³μμ, λͺ¨λ μμ λλ©μΈμ λΆλ³μΌλ‘ κ°μ Έκ°λ κ²μ΄ MVC νΉμ μΌλ°μ μΈ μΉ μ ν리μΌμ΄μ ꡬ쑰μμ νμ€μ μΈ λμμΌκΉμ?
νλμ finalμ μ°μ§ λͺ»νλλΌλ λ΄λΆ μνλ§ λΆλ³μΌλ‘ μ μ§νλ μ μμ νννλ κ²μ΄ μΌλ°μ μΈμ§ 리뷰μ΄λμ μ‘°μΈμ λ£κ³ μΆμ΅λλ€.
- λͺ¨λ κ³μΈ΅μ λΆλ³μΌλ‘ λ§λ λ€λ©΄, λͺ¨λ κ³μΈ΅μ λΆλ³μΌλ‘ λ§λ λ€λ©΄ κ°μ²΄ μ¬μμ± λΉμ©κ³Ό μ½λ 볡μ‘λκ° μ»€μ§κ² μ£ ?
λλ μ§ μ΄λ€ κ²μ μ ννλ νΈλ μ΄λμ€νμ λλ€. μ₯/λ¨μ μ λΉκ΅νμ λ μ₯μ μ΄ λ ν° κ²½μ°μλ§ μ¬μ©νλ©΄ λ©λλ€. - Memberμ state νλμ finalμ λͺ» μ°λ κ²μ νμ¬ μ€κ³μ μμ°μ€λ¬μ΄ νΈλ μ΄λμ€νμ λλ€. μ΄ κ²½μ° setterλ₯Ό λ ΈμΆνμ§ μκ³ receiveCard()μ²λΌ μλ―Έμλ λ©μλλ‘λ§ μνλ₯Ό λ³κ²½νλ κ²μ΄ μ’μ ννμ μ΄μμ.
- λͺ¨λ κ³μΈ΅μ λΆλ³μΌλ‘ λ§λ λ€λ©΄, λͺ¨λ κ³μΈ΅μ λΆλ³μΌλ‘ λ§λ λ€λ©΄ κ°μ²΄ μ¬μμ± λΉμ©κ³Ό μ½λ 볡μ‘λκ° μ»€μ§κ² μ£ ?
|
|
||
| @Override | ||
| public double earningRate(State dealerState) { | ||
| if (dealerState instanceof Bust) { |
There was a problem hiding this comment.
μν ν¨ν΄μ μ₯μ μ€ νλκ° λ°λ‘ μ΄λ° instanceof λΆκΈ°λ₯Ό μμ λ κ²μΈλ°,
νμ¬ earningRate λ΄λΆμμ λ€μ instanceofλ‘ νλ³νκ³ μμ΄μ ν¨ν΄μ ν¨κ³Όκ° λ°κ°λκ³ μμ΄μ.
μ΄ λΆκΈ°λ₯Ό μ κ±°ν μ μλ λ°©λ²μ΄ μμμ§ κ³ λ―Όν΄λ³΄μΈμ.
(μ½λ μ λ°μ μΌλ‘ κ²ν ν΄λ³΄μΈμ.)
| @Override | ||
| public State stay() { | ||
| throw new IllegalArgumentException("λλ¬λ μ€μ€λ‘ λ©μΆ μ μμ΅λλ€."); | ||
| } |
There was a problem hiding this comment.
State μΈν°νμ΄μ€μ stay()κ° μλλ°, λλ¬λ μ΄λ₯Ό νΈμΆν μ μμ΄ μμΈλ₯Ό λμ§κ³ μλ€μ.
λλ¬μ νλ μ΄μ΄μ μνλ₯Ό κ°μ μΈν°νμ΄μ€λ‘ λ¬Άλ κ²μ΄ μ μ νμ§,
μν λ³λ‘ μΈν°νμ΄μ€λ₯Ό λΆλ¦¬νλ λ°©ν₯μ κ³ λ―Όν΄λ³΄μΈμ!
| import domain.card.Card; | ||
| import domain.card.Deck; | ||
| import domain.member.Money; | ||
| import dto.MemberStatus; |
There was a problem hiding this comment.
domainμ΄ dtoλ₯Ό μκ³ μκ³ , dtoλ domainμ μκ³ μλ€μ.
μ΄λ° ꡬ쑰μμ μ΄λ€ λ¬Έμ κ° μκΈΈ μ μμμ§ κ³ λ―Όν΄λ³΄μΈμ.
| .map(name -> new MemberStatus(name, members.findCardByName(name), members.checkPlayerScore(name))) | ||
| .forEach(memberStatuses::add); | ||
| return List.copyOf(memberStatuses); | ||
| } |
There was a problem hiding this comment.
getMemberStatuses()μ λ‘μ§μ΄ μ¬μ€μ members μμμ λͺ¨λ μ²λ¦¬λ μ μμ΄ λ³΄μ¬μ.
GameTableμ΄ μ΄ μν μ μ§μ λ΄λΉνλ κ²μ΄ μ μ νμ§ κ³ λ―Όν΄λ³΄μΈμ.
| @@ -0,0 +1,35 @@ | |||
| package domain.card; | |||
There was a problem hiding this comment.
μ΄ μΉκ΅¬λ μ μ΄ ν¨ν€μ§μ μμΉν΄ μμκΉμ?
|
|
||
| import static org.assertj.core.api.Assertions.assertThat; | ||
|
|
||
| public class MembersTest { |
There was a problem hiding this comment.
무μΉλΆ μΌμ΄μ€λ, λλ¬ μ μκ° λμμ ν¨λ°°νλ μΌμ΄μ€ λ±μ΄ ν
μ€νΈλκ³ μλμ?
TDDλ‘ κ΅¬ννλ€λ©΄ μ΄λ° μΌμ΄μ€κ° λλ½λμ§ μμμ κ² κ°μλ°, μ΄λ»κ² μκ°νμλμ?
| @DisplayName("νλ μ΄μ΄κ° μΉ΄λλ₯Ό λ½μ 21μ μ΄ λμμ λ μΉ΄λ κ°μκ° 2κ°κ° μλλ©΄ Stay μνλ₯Ό λ°ννλ€") | ||
| @Test | ||
| void draw_TotalScoreIs21AndCardSizeIsNot2_ReturnBlackjack() { |
There was a problem hiding this comment.
DisplayNameκ³Ό λ©μλλͺ μ μλ―Έκ° λ€λ₯΄λ€μ.
| if (myScore > dealerScore) return MatchResult.WIN.profitRate(); | ||
| if (myScore < dealerScore) return MatchResult.LOSE.profitRate(); |
There was a problem hiding this comment.
κΈ°λ³Έμ μΌλ‘ Java Style Guideμ μμΉμΌλ‘ νλ€.
μμΉμ ν λ² μ½μ΄λ³΄κ³ μ μ©ν΄λ³΄μΈμ.
| @DisplayName("κΈμ‘μ΄ κ°μΌλ©΄ κ°μ κ°μ²΄λ‘ μ·¨κΈνλ€ (VO)") | ||
| @Test | ||
| void equals_SameAmount_ReturnTrue() { | ||
| assertThat(new Money(10000)).isEqualTo(new Money(10000)); |
There was a problem hiding this comment.
μ² λ¨μμ _λ₯Ό μ¬μ©νλ©΄ κ°λ μ±μ΄ μ’μμ Έμ. (μ: 10_000)
μλ νμΈμ. μ μ΄λ―Έ!
μ¬μ΄ν΄ 1μμλ 리뷰 λ°μλ μ΄λ μ λλ€.
μ°μ μ΄λ² μ¬μ΄ν΄λ μ μΆμ΄ μ’ λ¦μ΄μ§ μ μ¬κ³Όμ λ§μ λ립λλ€.
μ΄λ² μ¬μ΄ν΄μμ μκ°λ³΄λ€ λ§μ μλλ₯Ό νκ² λμ΄ μ μΆμ΄ λ¦μ΄μ§ κ² κ°μ΅λλ€...
μ΄λ² 리뷰λ μ λΆνλ립λλ€!
μ²΄ν¬ λ¦¬μ€νΈ
testλ₯Ό μ€ννμ λ, λͺ¨λ ν μ€νΈκ° μ μμ μΌλ‘ ν΅κ³Όνλμ?μ΄λ€ λΆλΆμ μ§μ€νμ¬ λ¦¬λ·°ν΄μΌ ν κΉμ?
1. μΈμ€ν΄μ€ λ³μ 3κ° μ νκ³Ό μμ ꡬ쑰μμμ μΉ΄μ΄νΈ κΈ°μ€
μ΄λ² λ―Έμ μμ '3κ° μ΄μμ μΈμ€ν΄μ€ λ³μλ₯Ό κ°μ§ ν΄λμ€λ₯Ό μ°μ§ μλλ€'λ κ·μΉμ μ§ν€κΈ° μν΄ λ Έλ ₯νμ΅λλ€. κ·Έλ°λ° μμ ꡬ쑰(μ: Member > Player)λ₯Ό μ¬μ©νλ€ λ³΄λ, λΆλͺ¨ ν΄λμ€μ νλμ μμ ν΄λμ€μ νλλ₯Ό ν©μ³€μ λ μ΄ κΈ°μ€μ μ΄λ»κ² μ μ©ν΄μΌ ν μ§ κ³ λ―Όμ΄ λμμ΅λλ€.
리뷰μ΄λμ μμ κ΄κ³μμ λΆλͺ¨μ μμμ νλ ν©κ³λ₯Ό νλμ κ°μ²΄ ν¬κΈ°λ‘ 보μλμ§, μλλ©΄ κ° ν΄λμ€ λ¨μλ‘ λ³΄μλμ§ κΆκΈν©λλ€.
λν, νλ κ°μλ₯Ό μ€μ΄κΈ° μν΄ μμμ μ ννλ κ²μ΄ κ°μ²΄μ§ν₯μ μΌλ‘ μ³μ λ°©ν₯μΈμ§μ λν μ견λ λ£κ³ μΆμ΅λλ€.
2. λλ―Έν° λ²μΉ(Law of Demeter)κ³Ό μλΉμ€ κ³μΈ΅μ μ± μ λ²μ
νμ¬ κ΅¬μ‘°κ° Service > GameTable > Members > Member μμΌλ‘ λ μ΄μ΄κ° ꡬμ±λμ΄ μμ΅λλ€. νμ λλ©μΈμ΄ λ°μ΄ν°λ₯Ό λμ μ λ¬ν΄ μ£Όλ λ°©μμ ννλ€ λ³΄λ μμ κ°μ²΄μ get νμμ μμ λ©μλκ° λ무 λ§μμ§λ νμμ΄ λ°μνμ΅λλ€.
Serviceμμ μ§μ Member κ°μ²΄λ₯Ό κ°μ Έμ μ μ΄νλ κ²μ΄ κ³μΈ΅ κ° κ²°ν©λλ₯Ό λμ΄λ νμμΌκΉμ?
μλλ©΄ νμ¬μ²λΌ μμ λλ©μΈμ΄ νμ λλ©μΈμ κΈ°λ₯μ λμ νΈμΆ(Wrapping)ν΄ μ£Όλ©° μΊ‘μνλ₯Ό μ μ§νλ κ²μ΄ λ λμ μ€κ³μΌκΉμ? 'Tell, Don't Ask' μμΉμ μ§ν€λ©΄μλ μ°μ Getterλ₯Ό λ§μ μ μλμ§ κΆκΈν©λλ€. νΉμ μ΄λ€ κ²μ΄ λ κ²°ν©λλ₯Ό λμ΄λ νμμΈμ§ κΆκΈν©λλ€.
3. ν μ€νΈ μ½λμ μ μ°μ±κ³Ό νμ₯μ± (OCP)
κΈ°λ₯μ΄ μΆκ°λλλΌλ κΈ°μ‘΄ ν μ€νΈκ° μ κΉ¨μ§μ§ μλ λ³κ²½μ μ μ°ν ꡬ쑰λ₯Ό λ§λ€κ³ μ λ Έλ ₯νμ΅λλ€. μν ν¨ν΄μ λμ νλ©΄μ μλ‘μ΄ μν(μ: μλ‘μ΄ κ·μΉμ μΆκ°)κ° μ겨λ κΈ°μ‘΄μ State ν μ€νΈλ ꡬν λ‘μ§μ΄ μμ λμ§ μκ³ νμ₯λ μ μλλ‘ μ€κ³νκ³ μ νμ΅λλ€. μ΄ λΆλΆμ΄ μλλλ‘ μ μ½νλμ§ μ견μ λ£κ³ μΆμ΅λλ€.
4. λΆλ³ κ°μ²΄(Immutable Object)μ μν°ν°μ νλ λ³κ²½
Handλ₯Ό λΆλ³ κ°μ²΄λ‘ 리ν©ν λ§νλ©΄μ κ°μ²΄μ μμ μ±μ λμμ‘μΌλ, μ΄λ₯Ό 보μ ν μμ λλ©μΈμΈ Memberμ hand νλμ finalμ μ¬μ©ν μ μλ λ¬Έμ κ° μκ²Όμ΅λλ€. λ§μ½ MemberκΉμ§ λΆλ³μΌλ‘ λ§λ€λ©΄ μ΄λ₯Ό κ΄λ¦¬νλ Members 리μ€νΈκΉμ§ λ§€λ² μλ‘ μμ±ν΄μΌ νλ λΆλ³μ μ°μ νμμ΄ λ°μνκ² λμμ΅λλ€.
λΆλ³μ κ°λ³μ κ²½κ³μμ, λͺ¨λ μμ λλ©μΈμ λΆλ³μΌλ‘ κ°μ Έκ°λ κ²μ΄ MVC νΉμ μΌλ°μ μΈ μΉ μ ν리μΌμ΄μ ꡬ쑰μμ νμ€μ μΈ λμμΌκΉμ?
νλμ finalμ μ°μ§ λͺ»νλλΌλ λ΄λΆ μνλ§ λΆλ³μΌλ‘ μ μ§νλ μ μμ νννλ κ²μ΄ μΌλ°μ μΈμ§ 리뷰μ΄λμ μ‘°μΈμ λ£κ³ μΆμ΅λλ€.
κΈ΄ κΈ μ½μ΄μ£Όμ μ κ°μ¬ν©λλ€!