Skip to content

HoonHaChoi/Coin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

코일

가상화폐 실시간 시세 조회, 하루 수익 일지 기록, 실시간 알림 확인 프로젝트

  • 기간 : 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) 시세 조회
- 관심 가상 화폐 조회
- 하루 수익 일지 기록
- 목표 금액 도달 시 실시간 알림

스크린샷 2021-11-05 오후 10 25 16


화면 & 특징

스플래시 화면

스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16
Splash Screen Splash Screen(Gif)
앱 시작 화면 앱 시작 화면
시세 화면
스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16
시세 화면(관심 코인) 시세 화면(거래소) 시세 상세 화면 시세 화면(Gif)
실시간 관심 가상화폐 시세 조회 실시간 거래소 가상화폐 시세 조회 실시간 가상화폐 시세 그래프 및 이전 기록 표시 실시간 거래소 가상화폐 시세 조회

검색 화면

스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16
검색 화면 1 검색 화면 2 검색 화면 3
관심 등록 유무 표시 검색 거래소 선택 심볼 검색

일지 화면

스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16
일지 화면 일지 상세 화면 기간별 화면 일지 작성 및 수정 화면
일자별 기록 표시
오름,내림 차순 정렬
스와이프 일지 삭제 수정 기능
일지 추가
일별 기록 표시
메모 전체 표시
기간별 총 기록 표시 일지 날짜, 시작 및 최종 금액, 기록한 메모 작성,
시작 및 최종 금액, 기록한 메모 수정

알림 화면

스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16 스크린샷 2021-11-05 오후 10 25 16
알림 목록 화면 알림 생성, 수정 화면 알림 검색 화면
알림 받는 가상화폐 표시
알림 스위치 On/Off 제공
스와이프 수정, 삭제 기능
알림 기준 금액,알림 주기 입력 현재 코인 리스트 표시 및 검색 기능

프로젝트 구조


진행 과정에서의 이슈

위의 링크를 통해 앱을 제작하면서 경험한 이슈 목록을 보실 수 있습니다.

거래소 요청에 대한 다형성 적용하기

스크린샷 2021-11-05 오후 10 25 16

문제: 확장,수정이 어려운 코드 (OCP 규칙 위반)

// 거래소 네트워크 요청 메소드 
@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폴더에 이미지 저장, 존재 유무에 따른 네트워크 요청, 요청 성공유무에 따른 이미지 전달

스크린샷 2021-11-23 오전 12 08 39


App, Notification Extension 이미지 공유

  • 문제

    • 푸시 알림에 이미지 추가 구현 중 Extension환경에서 App에 저장 된 가상화폐 이미지를 가져올 수 없음
  • 원인

    • Extension과 App은 별개. 두개는 각각 다른 container로 존재하며, 기본적으로 둘 사이 데이터 공유되지 않음
  • 개선

    • Extension과 App 모두 App Group 활성화, 이미지 저장 경로를 shared container에 이미지를 저장
  • 결과

    • Extension에서도 App에서 저장 되었던 가상화폐의 이미지를 사용 가능

스크린샷 2021-11-05 오후 10 25 16


개발 후기

  • 소켓으로 들어오는 데이터 수신 용량을 줄이기 위해 백엔드와 함께 의논하며 클라이언트에서 최소한 데이터 소비를 목표로 진행 했던 것이 기억에 남습니다.
  • 제네릭 Mapping 객체를 만들고 거래소 추가,삭제에 대해 다형성을 줌으로 확장성이 좋은 코드를 만들 수 있었습니다.
  • Composition Root 패턴을 적용시켜 의존성 주입을 한 곳에서 처리 할수 있었고, 적절한 protocol 사용과 의존성 주입이 유연한 코드 작성에 효과적인지 직접 느낄 수 있었습니다.

About

코일 프로젝트(출시 21.10.7 ~ 종료)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages