F-Lab 멘토링을 하면서 멘토님이 진짜 좋은책이라고 하셨던 오브젝트 책을 읽고 내 프로젝트를 컨버팅을 해보았다.
사실 기능 추가겸 컨버팅? 작업이다 :)

우선 책 설명부터 하자면 객체지향 설계를 실무에 어떻게 대입을 하는지 설명하는 책이다.
그 전에 객체지향의 사실과 오해 책을 읽고 오는 것이 좋다!
진짜 좋은 책이다. 내가 여태까지 짰던 코드들을 부정하듯 객체지향에 대해 자세하고 쉽게 설명되어 있으며 객체지향 언어를 사용해서 개발을 한다면 무조건 읽는게 좋을 것 같다
현재는 원화 코인만 정보를 가져올 수 있는데 원화 말고 비트코인으로 사고 파는 코인과 관심 코인들의 정보를 가져오는 기능을 추가하면서 유지보수하기 쉽게 컨버팅을 해보았다.
기존 설계를 보기전에 upbit API로 거래소 원화(KRW) 코인정보를 가져오려면

이렇게 복잡한 절차를 걸쳐서 비로소 원하는 데이터를 뽑을 수 있다.
기존에 내가 짰던 코드 설계이다.
해당 뷰모델은 업비트 처음 등장하는 거래소 화면에 대한 뷰모델이다.
※ 파랑색은 객채이고 주황색은 추상 인터페이스(프로토콜)다.
보이는 것 처럼 MarketDataFetcher에 getMarketData함수를 통해 [MarketData]를 가져오는데 그때 AllMarketCode가 필요해 MarketCodeManager에서 AllMarketCode를 전달받는다.
원래 생각은 나중에 다른 타입의 코인 정보를 가져올때 KRWMarket처럼 BTCMarket을 만들고 MarketDataFetcher 프로토콜을 채택하는 객체를 만들면 되지 않을까 싶었다.
하지만 막상 추가를 하려다 보니 너무 중복되는 부분도 많고 객체 자체가 커지는 느낌을 받아 컨버팅을 아래와 같이 하게 되었다.

결국은 MarketCode를 마스킹 하는 부분만 다른 거지 marketData를 가져오는 부분은 똑같으니까 MarketCodeManager에서 전체 코드를 가져오고 특별한 마켓 코드들을 마스킹 처리하는게 좋다고 판단했다.
이래야지 각 객체들이 알맞은 책임을 가지고 서로와 협력해서 하나의 기능을 만든다.
이러한 설계 외에도 명령과 쿼리를 분리하는 것 등등 여러가지를 책에 나온대로 하면서 코드의 수준을 많이 높였는데 조금 더 바꿔봐야겠다
빠잉!!!