# iOS 기술 특장점
### SwiftUI
- 익숙한 UIKit에서 벗어나 SwiftUI로만 뷰를 구성하였습니다.
- Preview 기능을 적극 활용하였습니다.
- 다양한 기기에서의 레이아웃 대응 향상을 위해 프리뷰 코드를 작성하였습니다.
- 라이트/다크 모드에 보다 효율적으로 대응하기 위해 프리뷰 코드를 작성하였습니다.
- 애플은 SwiftUI를 선보임에 재사용성을 특히 강조했습니다. (Reusable, parameterized views)
따라서, 뷰의 재사용성을 높이고, extract 기능을 활용하여 더 작은 단위로 나누고 나눠 구현했습니다.
- SwiftUI에서 제공하는 Binding을 활용해 SwiftUI의 design principle 중 하나인 Single Source of Truth를 지켜 하나의 데이터를 참조하는 여러개의 뷰가 올바르게 그려지도록 구현했습니다.
### Combine
- Combine을 활용한 네트워크 통신과 같은 비동기 이벤트를 처리하였습니다.
- 단순히 Combine에만 한정된 것이 아닌, 함수형 Reactive Programming에서의 데이터 흐름에 대해 이해하게 되었습니다.
### CoreData
- 기기가 네트워크에 연결되지 않은 상태일 때 수집한 이벤트 로그를 기기에 저장하도록 구현하였습니다.
- 재생목록에 추가했던 음원들이 기기에 저장해 앱을 재시작해도 유지되도록 구현하였습니다.
### MVVM 구조와 테스트

- 네트워크 통신을 담당하는 NetworkService,
NetworkService와 구체적인 EndPoint를 활용해 서버에 요청을 보내고, 받아온 응답을 ViewModel이 필요로 하는 형태로 가공해주는 UseCase,
View에서 발생하는 이벤트를 받아 UseCase를 통해 요청을 하고 UseCase에서 받아온 응답을 View를 꾸미는데 필요한 형태로 가공해주는 ViewModel,
ViewModel과 바인딩되어 ViewModel의 State에 맞게 화면을 그리는 View로 나눠진 MVVM 구조로 구현하였습니다.
- 뷰와 로직을 분리하여 뷰를 그리는 로직과 뷰에서 발생하는 이벤트에 대한 테스트가 가능한 구조로 구현하였습니다.
- 프로토콜로 각각의 타입을 추상화하고 initializer를 통해 의존성을 주입해주도록 구현하였습니다.
- 프로토콜을 채택해 원하는 결과를 반환하는 모의 객체를 만들어 주입해 실제 네트워크 통신이나, 뷰 없이 로직을 테스트하였습니다.
### 이벤트 로그 수집 프레임워크

- 추상화된 이벤트 로그 타입들과 이벤트를 전송, 보관하는 객체의 구조를 프로토콜로 제공합니다. 구체적인 데이터 구조는 사용자가 프로토콜을 채택하여 구현하게끔 하였습니다.
- 전체 이벤트를 관리하는 EventLogger 객체를 구체 타입으로 제공합니다.
EventLogger는 생성 시점에 LocalStorageType을 채택한 이벤트 로컬 저장 객체와, ServerStorageType을 채택한 이벤트 서버 전송 객체를 주입받아 사용합니다.
- [Reachability](https://github.com/ashleymills/Reachability.swift)를 활용해 기기의 네트워크 연결 상태를 확인해 네트워크에 연결되어있다면 서버로 로그를 전송하고, 연결되지 않았다면 로컬에 로그를 저장합니다.
Reachability를 그대로 사용할 수도 있지만, 테스트 가능한 구조를 만들기 위해 연결 상태를 확인하는 객체를 만들고 프로토콜로 추상화하여 EventLogger에 주입해주는 형태로 구현하였습니다.
- 프레임워크 테스트코드 작성중
요
노션 접는거 어떻게쓰ㅡㄴ지아세요?
/toggle 이렇게 하면 떠요
아니면 우리도 페이지 링크 하나 더 타고 들어가게 만들래요?
그럴것까진 없을 것 같긴 한데
네 링크 하나 더 탈만큼 양이 많진 않으니
밑에 이상한거 생겨있는데 저건 뭘까요???
아마 웹분들 쓰고 남겨두신... 까먹고 안지우신...?
추상화된 이벤트 로그 타입들과 이벤트를 전송, 보관하는 객체의 구조를 프로토콜로 제공합니다.
구체적인 데이터 구조는 사용자가 프로토콜을 채택하여 구현하게끔 하였습니다.
EventLogType 프로토콜로 수집할 이벤트를 정의해주고, LocalStorageType과 ServerStorageType을 채택한 로컬, 서버 저장 객체를 정
이거 근데 두번째 줄이랑 같은 얘기 한번 더하는건데
프레임워크 = 다른사람들도 쓸수있다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
우리도 큰 제목으로 넣을까욬ㅋㅋㅋ
그게좋을것같아요 ㅋㅋㅋㅋㅋㅋㅋㅋ
접는건 너무 작네요
다 펼쳐놔도 그렇게 많진 않은
다ㅡㄹ