To.Nest로 팀을 꾸리고 각자의 관심사 대해 소통하세요
- 유저 간 [팀(워크스페이스) > 대화방(채널,DM) 메시지](으)로 소통하는 서비스 구조
- 개인 프로젝트 (외부에서 제공 받은 API 사용)
- 2024.01.02 ~ 2024.02.28 (8주)
- iOS App - Minimum deployment target 16.0
진행 기간: 2024.01 ~ 2024.02
| Services, Technology | Stack |
|---|---|
| Architectrue | UDF(ReactorKit), MVVM |
| Asynchronous | RxSwift, Swift Concurrency, Combine |
| Network | Socket.IO, Alamofire |
| UI | UIKit(SnapKit), SwiftUI, Modern Collection View |
| Pay | PG Pay - Iamport |
| DataBase | RealmSwift |
| Cache, Storage | NSCache, UserDefaults, Documents |
| Apple APIs | CoreImage, ShareLink, Photos, AuthenticationServices |
| Custom Serivice | ReferenceCounter, TaskCounter |
| Push Notification | Firebase Cloud Messaging, UNNotification |
| Sender | Receiver |
|---|---|
Sender_.1.mov |
Receiver.mov |
| Foreground Notification | Background Notification | Sleep Notification |
|---|---|---|
NotificationCut.mov |
||
PGPay.mov
| Keyword | Description Link |
|---|---|
| Image Caching | iOS - 채팅창 프로필 이미지 중복 사용 방지 처리 |
| SwiftUI | PG 결제 상품 리스트 API 호출 오류 with StateObject vs ObservedObject |
| UICollectionView | iOS 16부터 UIHostingConfiguration으로 UICollectionViewCell 만들기 |
| Concurrency | TaskCounter를 통해 사용자 앨범에서 이미지 가져오기 |
네트워크, 앨범 접근, 채팅, DB 저장 등 다양한 도메인 및 데이터 의존성 코드의 역할 분리의 필요성으로 단방향 아키텍처를 선택 그 결과, 유저 액션과 값 변화를 분리하여 개발 진행할 수 있었음 하지만 ReactorKit이 화면 전환 간 로직 처리가 복잡해지는 문제를 해결하진 못함
화면 처리가 복잡해진 예시
- Modal Sheet를 내린 후 특정 페이지로 전환
- 채팅 Push Notification 시, 채팅 내용 최신화 후 채팅창으로 바로 전환
WWDC22에서 소개된 UIHostingConfiguration으로 UIKit의 UIContentListCell을 SwiftUI의 뷰로 제작 빠르게 뷰를 만들었지만 채팅 내용에 맞게 데이터가 갱신되지 않는 문제 발생 SwiftUI View의 ViewModel이 ObservableObject 프로토콜을 준수하지 않은 것이 원인 UIHostingConfiguration은 SwiftUI의 View를 재사용 메커니즘을 사용하여, ViewModel에 ObservableObject을 채택해야 데이터 변화를 알려줄 수 있음 UIKit, SwiftUI 모두 작동 원리를 잘 이해 해야 함을 알게 됨
Realm 기본 사항은 MainActor에서 DB 요청을 처리해 화면 처리에 딜레이가 발생하는 문제가 있었다.
이를 해결하기 위해 @globalActor를 이용해 Serial Global Custom Actor에서 Realm을 구동했다.
길고 복잡한 GCD 없이 RealmDB Update시 Race Condition이 발생하지 않았다.
하지만, 안전한 공통된 값을 가져와 다른 화면에 나태낼 때, 각각의 화면 렌더링이 동시에 발생하는 충돌이 발생했다.
화면이 데이터를 완전히 반영할 때까지 각각의 화면에 Delay를 주면서 Progress Bar를 띄우는 방법으로 문제를 해결했지만 아쉬움이 존재했다.
Task 변수를 할당 받아서 처리 지연에 대한 대응을 Background에서 자연스럽게 하는 방법을 늦게 찾아서 주어진 개발 기간동안 리팩토링하기 적절하지 않았고, 직접 적용하지 못 했기 때문이다.
워크스페이스 슬라이더, 이미지 Crop 기능 화면에 SwiftUI를 적용해 빠르게 직접 구현 외부 라이브러리를 사용하는 것보다 시간 소요가 있었지만, 디자인 요구사항에 알맞은 자세한 여백, 간격을 설정할 수 있었음
| 수평 이미지 슬라이더 | 이미지 Crop 뷰 |
|---|---|
Slider.mov |
ImageCrop.mov |


