가상화폐 실시간 시세 조회, 하루 수익 일지 기록, 실시간 알림 확인 프로젝트
-
기간 : 2021.07.16 - 2021.10.7(출시 후 게시종료)
-
사용 언어 : Swift
-
개발 인원 : iOS(1명), BackEnd(1명)
-
라이브러리 :
이름 목적 버전 SocketIO 실시간 가상화폐 소켓통신 16.0.1 SwiftyJSON JSON Data decoding 5.0.1 Charts 월별 기록 바 그래프 4.0.0 Lottie Splash Animation 3.2.3 FireBase FCM Push Notification 8.5.0 -
프레임 워크:
이름 목적 버전 Combine 비동기 네트워크 요청, 응답 -
- 거래소(Upbit, bithumb, Coinone) 시세 조회
- 관심 가상 화폐 조회
- 하루 수익 일지 기록
- 목표 금액 도달 시 실시간 알림
AppStore: 코일 앱스토어
Splash Screen | Splash Screen(Gif) |
앱 시작 화면 | 앱 시작 화면 |
시세 화면(관심 코인) | 시세 화면(거래소) | 시세 상세 화면 | 시세 화면(Gif) |
실시간 관심 가상화폐 시세 조회 | 실시간 거래소 가상화폐 시세 조회 | 실시간 가상화폐 시세 그래프 및 이전 기록 표시 | 실시간 거래소 가상화폐 시세 조회 |
검색 화면 1 | 검색 화면 2 | 검색 화면 3 |
관심 등록 유무 표시 | 검색 거래소 선택 | 심볼 검색 |
일지 화면 | 일지 상세 화면 | 기간별 화면 | 일지 작성 및 수정 화면 |
일자별 기록 표시 오름,내림 차순 정렬 스와이프 일지 삭제 수정 기능 일지 추가 |
일별 기록 표시 메모 전체 표시 |
기간별 총 기록 표시 | 일지 날짜, 시작 및 최종 금액, 기록한 메모 작성, 시작 및 최종 금액, 기록한 메모 수정 |
알림 목록 화면 | 알림 생성, 수정 화면 | 알림 검색 화면 |
알림 받는 가상화폐 표시 알림 스위치 On/Off 제공 스와이프 수정, 삭제 기능 |
알림 기준 금액,알림 주기 입력 | 현재 코인 리스트 표시 및 검색 기능 |
위의 링크를 통해 앱을 제작하면서 경험한 이슈 목록을 보실 수 있습니다.
// 거래소 네트워크 요청 메소드
@objc private func selectExchangeItem(_ sender: UISegmentedControl) {
switch sender.selectedSegmentIndex {
case 0:
requestExchangeSocket?("Upbit")
case 1:
requestExchangeSocket?("Bithumb")
case 2:
requestExchangeSocket?("Coinone")
}
}
enum Exchange: CaseIterable{
case Upbit
case Bithumb
case Coinone
}
- 거래소 타입을 집합 시킨 Exchange 열거형, CaseIterable 선언하여 AllCase 활용
struct EnumMapper<key: Hashable, item> {
private let map: [key: item]
init(key: [key], item: [item]) {
self.map = Dictionary(uniqueKeysWithValues: zip(key, item))
}
subscript(key: key) -> item? {
return map[key]
}
}
- key와 value를 묶어주는 Mapper 객체 생성 및 활용
private let exchangeMapper = EnumMapper(key: Array(0..<Exchange.allCases.count),
item: Exchange.allCases)
@objc private func selectExchangeItem(_ sender: UISegmentedControl) {
guard let exchange = exchangeMapper[sender.selectedSegmentIndex] else {
return
}
requestExchangeSocket?(exchange)
....
}
- exchangeMapper를 통해 해당 Int 값을 넘겨주면 해당 거래소 값을 가져올수 있다.
- 또한 확장, 수정이 보다 유연하게 되었다.
- 많은 가상화폐의 이미지를 앱 실행 시, 스크롤 시 마다 다운받는 건 비효율적, 이미지 캐시 처리 필수
- memory Cache과 Disk Cache 방식 중 Disk Cache 방식을 이용, 앱 종료 후 다시 실행 해도 데이터가 소멸 되지 않음
- Cache폴더에 이미지 저장, 존재 유무에 따른 네트워크 요청, 요청 성공유무에 따른 이미지 전달
-
문제
- 푸시 알림에 이미지 추가 구현 중 Extension환경에서 App에 저장 된 가상화폐 이미지를 가져올 수 없음
-
원인
- Extension과 App은 별개. 두개는 각각 다른 container로 존재하며, 기본적으로 둘 사이 데이터 공유되지 않음
-
개선
- Extension과 App 모두 App Group 활성화, 이미지 저장 경로를 shared container에 이미지를 저장
-
결과
- Extension에서도 App에서 저장 되었던 가상화폐의 이미지를 사용 가능
- 소켓으로 들어오는 데이터 수신 용량을 줄이기 위해 백엔드와 함께 의논하며 클라이언트에서 최소한 데이터 소비를 목표로 진행 했던 것이 기억에 남습니다.
- 제네릭 Mapping 객체를 만들고 거래소 추가,삭제에 대해 다형성을 줌으로 확장성이 좋은 코드를 만들 수 있었습니다.
- Composition Root 패턴을 적용시켜 의존성 주입을 한 곳에서 처리 할수 있었고, 적절한 protocol 사용과 의존성 주입이 유연한 코드 작성에 효과적인지 직접 느낄 수 있었습니다.