# STEP 3 논의
## 상세내용

<br>
## 논의사항
- View끼리 재고내역 주고받는 방법
- 싱글톤 사용
- FruitStore나 Fruit 자체를 싱글톤처리해도 View에서는 결국 JuiceMaker 객체를 통해 접근해야 하기 때문에 JuiceMaker를 싱글톤 클래스로 변경해야 할 것으로 보임
- 단점 : 여러 개의 JuiceMaker 생성 불가
- KVO 사용
- 세부적인 변경사항 적용시 사용 가능(예: getStockInventoryStatus 함수로 전달받는 내용을 KVO로 변경 가능). 다만 기본적으로 관찰할 대상 객체가 필요하기 때문에 역시 JuiceMaker의 싱글톤 처리가 사전에 필요할 듯
- **Notification Center 사용 -> 채택**
- 화면이 넘어갈 때 과일 전체의 재고현황만 userInfo로 넘겨줄 수 있음
- 단점 : 변경사항을 앱 전체로 알림
## TODO
### 개인
- [ ] 오토레이아웃 예습 (https://yagom.net/courses/ios-starter-uikit/) -> 오토레이아웃은 STEP 마지막에 진행
### STEP 2 머지 후 할일
- [ ] 의존모둠 DM방 생성 (전원 STEP 2 머지 이후에 함께 논의할 수 있도록)
- [ ] to 밈 : 과일타입 class / 과일가게타입 struct 관련 문의 (염두에 두고 작업해야 하는지?)
### 프로젝트
- [ ] 데이터 전달 방법 결정
- [ ] 모달창에 닫기 버튼 넣고 함수 추가
- [ ] Stepper +, - 눌렀을 때 레이블값 실시간 변동 처리
- [ ] 숫자가 0 이하로 내려가지 않도록 부속처리 필요
- [ ] 오토레이아웃 적용
Juice Maker [STEP 3]
# STEP 3 PR
안녕하세요 밈(@JoSH0318)!
쥬스메이커 STEP 3 PR 보내드립니다.
항상 수고가 많으세요 🙌
이번 리뷰 잘 부탁드립니다!🙇♀️
## 고민했던 점
- 화면간 데이터를 주고받는 부분에서 많은 고민이 있었습니다. 이제까지 학습한 내용을 활용해보려고 다양한 방법을 시도했지만, 결과적으로 Notification Center를 이용하는 방식을 선택했습니다.
- 싱글톤 사용
- FruitStore나 Fruit 자체를 싱글톤처리해도 View에서는 결국 JuiceMaker 객체를 통해 접근해야 하기 때문에 JuiceMaker를 싱글톤 클래스로 변경해야 할 것 같았습니다. 다만 이렇게 되면 여러 개의 JuiceMaker를 생성할 수 없고, 형태상으로도 그다지 좋아보이지 않았습니다.
- KVO 사용
- 기본적으로 관찰할 대상 객체가 필요하기 때문에, JuiceMaker를 통해 재고 변동사항에 따른 알림을 받으려면 역시 JuiceMaker의 싱글톤 처리가 사전에 필요할 것으로 생각되었습니다.
- **Notification Center 사용 -> 채택**
- 객체 공유 없이 화면이 넘어갈 때 과일 전체의 재고현황만 userInfo로 넘겨줄 수 있어서 이 방법을 선택했습니다.
- 메서드를 불러오는 시점에 따라 메서드가 동작하는 시점 또한 달라져서 고민을 많이 했습니다.
- 예를 들어 MainViewController의 replaceStockLabel 메서드를 처음에는 viewDidLoad 부분에 넣어 실행했습니다. 그러자 MainViewController에서 StockViewController로 화면이 전환 된 후에 재고를 수정하고 나서 다시 MainViewController로 돌아왔을 때 재고가 변하지 않음을 확인했습니다. 그 이유를 알아보니 viewDidLoad는 한 번만 호출되기 때문입니다. 그래서 저희는 viewWillAppear 부분에 replaceStockLabel을 넣어 호출되게 구현해서 해결했습니다.
- 위와 같은 맥락에서 StockViewController에서 MainViewController로 재고 변경사항을 전달하는 메서드인 setUpNotificationPost를 모달 dismiss에 핸들러로 물려 호출하니 실제 메서드가 호출되는 시점이 viewWillAppear보다 늦어지는 문제가 있었습니다. 따라서 이 부분은 모달창이 사라지기 직전에 호출할 수 있도록 viewWillDisappear로 이동시켰습니다.
## 조언을 얻고 싶은 부분
- 데이터 전달 형식(디자인 패턴)을 선택하는 기준에 있어서 참고할 만한 내용이 특별히 있을까요?
- StockViewController와 MainViewController에서 동일한 동작을 하는 내용이 많아, 메서드가 상당 부분 중복이 되고 있습니다. 다만 해당 메서드에서 구현되는 내용에 클래스 내부 특정 변수를 활용하는 부분이 많아 프로토콜로 빼기 어렵고, 클래스 상속을 활용하자니 이미 UIViewController를 상속받고 있어 불가능하네요ㅠㅠ 혹시 좋은 방법이 있을까요?
- 스토리보드 방식과 코드 방식을 함께 섞어서 구현할 수 있는 방법이 있을까요?(예: 화면전환시 init을 통해 StockViewController에 특정 파라미터를 전달하고 싶었는데, 스토리보드 형식을 기반으로 한 경우 무조건 required init(coder:NSCode)를 타야 해서 불가능하다고 보았습니다ㅠㅠ)