Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Model 구현 #20

Open
77unny opened this issue Mar 12, 2020 · 16 comments
Open

Model 구현 #20

77unny opened this issue Mar 12, 2020 · 16 comments

Comments

@77unny
Copy link
Collaborator

77unny commented Mar 12, 2020

notify의 타입?
  • 'onLoad' : 초기에 한번 실행될 이벤트 타입 정의
  • 'onInputMoney' : 돈이 투입될때마다의 이벤트 타입 정의
  • 'onPurchase' : 제품 최종적으로 구매했을때의 이벤트 타입 정의
모델의 역할
  • itemModel
    • 초기 데이터를 받아 저장하고 'onLoad' 타입을 구독한 구독자에게 전달한다.
    • 구매 이벤트가 일어나면 'onPurchase' 타입을 구독한 구독자에게 전달한다.
      • 구매한 아이템을 구독자에게 전달
  • walletModel
    • 초기 데이터를 받아 저장하고 'onLoad' 타입을 구독한 구독자에게 전달한다.
    • 투입 이벤트가 일어나면 투입된 데이터를 'onInputMoney' 타입을 구독한 구독자에게 전달한다.
      • 투입된 금액을 구독자에게 전달
    • 구매 이벤트가 일어나면 'onPurchase' 타입을 구독한 구독자에게 전달한다.
      • 최종 계산된 금액을 구독자에게 전달 (잔돈을 반환 하는 로직 포함)

bold 처리된 부분은 구독자에게 전달해야할 데이터

@reesekimm 내용 확인 부탁드려용~

@reesekimm
Copy link
Collaborator

reesekimm commented Mar 12, 2020

@baekCode 멋져요우!!👍

여기서 같이 고민해볼 내용이,

동일한 이벤트가 발생하더라도 구독자마다 필요한 데이터가 다르면
어떻게 해결할 수 있을까요?

예를들어서 아래의 경우엔

walletModel

  • 초기 데이터를 받아 저장하고 'onLoad' 타입을 구독한 구독자에게 전달한다.

statePanelView는 최종 계산된 금액 (-> 초기 데이터는 '0'원 이겠죠?)이 필요하겠고
walletView는 지갑 내역 (-> 100원짜리 몇 개, 500원 짜리 몇개, ... )가 필요하겟죵?

@77unny
Copy link
Collaborator Author

77unny commented Mar 12, 2020

@reesekimm 빠른답변 고마워요! ㅎㅎ 이제야 확인하네용!

근대 생각해보니까 statePanelView 에서 초기값을 받아올 필요가 있을까요?
그냥 처음에 0원이 찍혀있기만 하면되니 view에서 그냥 가지고 있어도 될꺼같다는 생각이 들었어요!

statePanelView 에는 'onPurchase' 이벤트가 일어나면 walletModel에서 최종 계산된 금액을 던저주면 그것만 뿌리는것?

어떻게 생각 하세유?!

@reesekimm
Copy link
Collaborator

reesekimm commented Mar 13, 2020

@baekCode

그냥 처음에 0원이 찍혀있기만 하면되니 view에서 그냥 가지고 있어도 될꺼같다는 생각이 들었어요!

그렇네요! "onLoad"시에 statePanelView는 데이터 없이 디폴트값 0 만 넣어줘도 될 것 같아요ㅎㅎ

statePanelView 에는 'onPurchase' 이벤트가 일어나면 walletModel에서 최종 계산된 금액을 던저주면 그것만 뿌리는것?

-> statePanelView도 "onLoad" 구독자로 등록해서 순차적으로 렌더링 될 수 있게 해 줄 필요는 있을 것 같아요~

@77unny
Copy link
Collaborator Author

77unny commented Mar 13, 2020

@reesekimm
확인했습니당! ㅎㅎ 왜케 일찍...

근대 궁금증! 어제 수업때처럼 크롱이 데이터를 전달할필요가 없는 내부적인것이면 굳이 모델과 연결이 필요한걸까용?

추가) 컨트롤.init 에서 그냥 ㅎㅎ stateview render 하려고했는데 그냥 ㅎㅎ 맞추려면 onload 해서그냥 해도 되겠네요! ㅎㅎ 해결!!

@77unny
Copy link
Collaborator Author

77unny commented Mar 13, 2020

모델의 역할
  • itemModel
    • 초기 데이터를 받아 저장하고 'onLoad' 타입을 구독한 구독자에게 전달한다.
      • 구독자 : itemPanelView
      • 초기데이터를 구독자에게 전달 (초기데이터 : 아이템 데이터 리스트)
    • 구매 이벤트가 일어나면 'onPurchase' 타입을 구독한 구독자에게 전달한다.
      • 구독자 : statePanelView
      • 구매한 아이템을 구독자에게 전달
  • walletModel
    • 초기 데이터를 받아 저장하고 'onLoad' 타입을 구독한 구독자에게 전달한다.
      • 구독자 : walletView
    • 투입 이벤트가 일어나면 투입된 데이터를 'onInputMoney' 타입을 구독한 구독자에게 전달한다.
      • 구독자 : itemPanelView / walletView / statePanelView
      • 투입된 금액을 구독자에게 전달
      • walletView에서 클릭된 버튼(버튼의 value값 전달) 컨트롤러에게 전달, 다시 모델에게 전달, 모델은 컨트롤러에게 받은 내용을 별도의 투입된 금액 데이터로 저장하여 구독자에게 알린다.
    • 구매 이벤트가 일어나면 'onPurchase' 타입을 구독한 구독자에게 전달한다.
      • 구독자 : statePanelView / walletView
      • 최종 계산된 금액을 구독자에게 전달 (잔돈을 반환 하는 로직 포함)
      • 투입된 금액과, 아이템 금액을 계산하는 로직이 필요,
        투입금액 - 선택한 제품 금액 = 반환금액
뷰의 역할
  • itemPanelView
    • itemModel 에게 초기데이터(아이템리스트)를 받아 렌더링
    • walletModel 에게 'inputMoney'이벤트 알림이 있으면 highlighting 처리 메소드 실행
  • statePanelView
    • walletModel 에게 'inputMoney' 이벤트 알림이 있으면 '투입금액 & 현황판 메시지' 업데이트
    • walletModel 에게 'purchase' 이벤트 알림이 있으면 '투입금액 & 현황판 메시지' 업데이트
    • itemModel 에게 'purchase' 이벤트 있으면 '현황판 메시지' 업데이트
  • walletView
    • walletModel 에게 데이터를 받아 뿌려준다.
    • 금액 버튼을 클릭했을때 컨트롤러에게 버튼클릭을 알려준다. (클릭된 버튼의 value를 전달?)

@reesekimm
Copy link
Collaborator

statePanelView 에서는 'onLoad' 구독은 랜더링만 하기 위한건가용?

음.. 넹 ㅎㅎ model이 서버로부터 데이터를 가져오는대로 view에 넘겨서 렌더링 하는 용도(?)입니당!


데이터를 전달할필요가 없는 내부적인것이면 굳이 모델과 연결이 필요한걸까용?

저도 그것때문에 고민했었는데

  • 순차적으로 렌더링하려면
  • 구조의 일관성 차원에서
    연결이 불가피하다고 판단했어요:)

혹시 다른 아이디어 있으시면 말씀해주세여~!

@77unny
Copy link
Collaborator Author

77unny commented Mar 13, 2020

컨트롤러의 init() 에서 실행되는 일관성을 설명하면 괜찮은 아이디어인거같아요! ㅎㅎ
역시이이이이!! @reesekimm 짱!!

지금 살작 고민인게, walletModel 에서
최종 계산된 금액을 구독자에게 전달! 부분에서 보면

투입된 금액과, 아이템 금액을 계산하는 로직이 필요,
투입금액 - 선택한 제품 금액 = 반환금액

계산하는 부분을 모델, 컨트롤러 어디에서 해도 상관없는걸까요?
MV 였으면 모델에서 하는게 맞을테고 MVC이니까 어디에서 해도 상관없는거겠죠?
저희가 정의한 C 는 그냥 전달자 역할이면 M에서 계산쓰?!

ps) 머리속에 완전히 흐름이 생기니 재밌어지고있습니당! 리즈덕분입니당!!

@reesekimm
Copy link
Collaborator

확인했습니당! ㅎㅎ 왜케 일찍...

마침 폰 보고 있었어요ㅋㅋㅋ 알림이 와서리...ㅋㅋ

(실시간으로 장문의 코멘트가 달려서 당황하는즁)

이거는 답장하는데 시간 좀 걸리겠네요ㅋㅋㅋㅋ

@77unny
Copy link
Collaborator Author

77unny commented Mar 13, 2020

ㅋㅋㅋㅋ나중에 천천히 답변주세요! ㅎㅎ 급한건 아니에용!!

@reesekimm
Copy link
Collaborator

ㅋㅋㅋㅋ나중에 천천히 답변주세요! ㅎㅎ 급한건 아니에용!!

넹넹 오전중에는 확인해서 회신드릴게요~!
완전 감 잡으신 @baekCode 짱!

@77unny
Copy link
Collaborator Author

77unny commented Mar 13, 2020

@reesekimm 덕분입니다 ㅠㅠ
기다려주시고 이해해주셔서 너무나 감사용! 이따 오후에 봬요!

@reesekimm
Copy link
Collaborator

reesekimm commented Mar 13, 2020

@baekCode

모델의 역할
  • itemModel

    • 초기 데이터를 받아 저장하고 'onLoad' 타입을 구독한 구독자에게 전달한다.

      • 구독자 : itemPanelView
      • 초기데이터를 구독자에게 전달 (초기데이터 : 아이템 데이터 리스트)

-> 현재 로직에서는 itemPanelView 뿐만 아니라 모든 뷰가 'onLoad' 타입의 구독자로 추가됩니다~

왜냐?!

현재 코드는 구독자(view)의 역할을 'model이 준 데이터를 화면해 표시해주는 것'으로 정의했고, 그 역할에 충실하기 위해 model에서 data fetching이 완료되자마자 데이터를 view에 전달해서 렌더링을 해주게끔 작성되어 있어요!

먼저 controller의 init 메소드를 볼게요.

init() {
    // register observers 
    this.itemPanelView.registerAsObserver();
    this.statePanelView.registerAsObserver();
    this.walletView.registerAsObserver();

    // fetch data & render View
    this.itemModel.getInitialData();
    this.walletModel.getInitialData();

    // bind eventListeners
    this.statePanelView.bindOnClickListener(this.onClickItemHandler);
    this.walletView.bindOnClickListener(this.onClickWalletHandler);
  }

맨 처음 구독자 등록을 위한 3줄이 순차적으로 실행되면서
itemPanelView, statePanelView, walletView가 '순차적으로' 구독자 등록을 할거고
구독자 등록이 완료되면 모델의 onLoad 구독자 리스트는 다음과 같을 거에요.

itemModel의 onLoad 구독자 리스트

observers.onLoad = Set[itemPanelView.render, statePanelView.render] 

walletModel의 onLoad 구독자 리스트

observers.onLoad = Set[walletView.render] 

현재 코드는 statePanelView가 walletModel의 onLoad 타입 구독자로 등록되어 있는데, itemModel의 onLoad 타입 구독자로 등록되는게 자연스러울 것 같아요:) -> 수정 필요!


init() {
...
// fetch data & render View
    this.itemModel.getInitialData();
    this.walletModel.getInitialData();
...
}

그 다음 초기 데이터를 로드하기 위해 data fetch를 하고,
데이터 로드가 완료되면 모델이 notify("onLoad", data)를 실행해서
onLoad 구독자 리스트에 등록된 render 메소드를 실행하게 되죠!

itemModel부터 '순차적으로' data fetching을 하기 때문에
itemPanelView, statePanelView가 '차례대로' 렌더링 되고
그다음 walletModel이 data fetching을 해서 walletView를 렌더링 하게 될 거에요.

그래서 모든 화면이 순서대로 렌더링 되려면
렌더링시 데이터가 필요 없는 statePanelView를 포함해서 모든 view가 model의 'onLoad' 구독자로 등록되어야
해요:)


  • walletModel
    • 투입 이벤트가 일어나면 투입된 데이터를 'onInputMoney' 타입을 구독한 구독자에게 전달한다.

      • 구독자 : itemPanelView / walletView / statePanelView
      • 투입된 금액을 구독자에게 전달

구독자에 따라 다른 데이터가 필요한 상황이 생기더라고요~

예를들면 투입 이벤트 발생시 walletModel의 onInputMoney구독자들이 필요한 데이터는

  • itemPanelView : 총 투입 금액 -> 구매 가능한 아이템을 하이라이팅
  • statePanelView : 총 투입 금액 & 투입된 금액 -> 총 투입 금액 및 현황판 업데이트
  • walletView : 업데이트된 지갑 내역 필요

이런식으로 모델별로, 이벤트 타입별로 조금더 살펴보면 좋을 것 같아요~!


* **최종 계산된 금액**을 구독자에게 전달 (잔돈을 반환 하는 로직 포함)
* 투입된 금액과, 아이템 금액을 계산하는 로직이 필요,
  투입금액 - 선택한 제품 금액 = 반환금액

잔돈이 좀 애매해요.
총 투입된 금액은 walletModel이 관리할거고
아이템의 가격은 itemModel이 관리할텐데..
잔돈을 어떻게 처리하면 좋을까요?!

(추가)

백코도 같은 고민이시네요!
방법을 찾아봅시다용ㅎㅎ

지금 살작 고민인게, walletModel 에서
최종 계산된 금액을 구독자에게 전달! 부분에서 보면

투입된 금액과, 아이템 금액을 계산하는 로직이 필요,
투입금액 - 선택한 제품 금액 = 반환금액

계산하는 부분을 모델, 컨트롤러 어디에서 해도 상관없는걸까요?
MV 였으면 모델에서 하는게 맞을테고 MVC이니까 어디에서 해도 상관없는거겠죠?
저희가 정의한 C 는 그냥 전달자 역할이면 M에서 계산쓰?!

@77unny
Copy link
Collaborator Author

77unny commented Mar 14, 2020

itemMdel 수정 예정
vendingmachineModel 변경

  • 아이템 리스트
  • 아이템 선택
  • 투입금액 / 반환금액 및 계산
  • 메세지 출력

@77unny
Copy link
Collaborator Author

77unny commented Mar 14, 2020

해야할일

  • vendingMachineModel 로 변경
  • vendingMachineModel 기능 구현
  • walletModel 기능 구현

@reesekimm
Copy link
Collaborator

reesekimm commented Mar 14, 2020

@baekCode

  1. 어제부로 itemModel -> vendingMachineModel로 네이밍 변경 및 역할 확장을 하게 되면서 설계를 수정하게 됐으니 새로운 이슈로 등록해서 관리하는거 어떨까요~?
    변경 전과 분리해서 관리하면 좋을 것 같아서요!

  2. 지난번에 정리하신 것 처럼

  • 모델별로 어떤 뷰들이 구독자로 등록되어야 하는지
  • 이벤트(데이터로드, 구매, 금액투입)가 발생했을때 뷰마다 어떤 데이터를 받아서 무엇을 할건지

설계하고 공유해주시면
저도 주말내에 확인해 보겠습니다~

화이팅!!🙌

@77unny
Copy link
Collaborator Author

77unny commented Mar 14, 2020

네네 확인 했습니다!

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

No branches or pull requests

2 participants