Skip to content

HoonHaChoi/Coin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

549 Commits
 
 
 
 
 
 
 
 
 
 
 
 

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

 
 
 

Contributors

Languages