Giter Club home page Giter Club logo

ios-data-layer's Issues

anyobject

Description

Swift 깃허브 문서의 성능 최적화 팁 중에 해당 단락 을 참고하여 성능 향상 작업을 진행합니다.

요구사항

  1. 클래스만 채택하는 프로토콜에 대해 AnyObject로 제한

TODO

  • AnyObject

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

jwt interceptor

Description

개요

  • API 통신 시 자격 증명을 위해 Authorization header를 추가할 수 있습니다.
  • JWT 기반 인증의 경우 401 에러시 refreshToken을 이용해 토큰을 리프레시 하는 과정을 거칠 수 있습니다.
  • 해당 기능들을 Alamofire에서 지원하는 RequsetInterceptor 프로토콜을 사용하여 간단하게 구현할 수 있습니다.

요구사항

  1. Keychain 저장소에서 jwt 토큰을 가지고 Authorization header에 값을 넣을 RequestAdapter를 구현해야 합니다.
  2. RefreshToken 요청이 구현된 Routable 라우터를 가지고 경우에 따라 Refresh 요청을 수행할 RequestRetrier를 구현해야 합니다.

TODO

  • JWT Authorization header Adapter
  • JWT Refresh Token Retrier

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #11 #29

status code

Description

응답에 대한 처리를 할 때, body에 포함된 payload 외에도 statusCode를 이용해야할 수도 있습니다.

요구사항

  1. 정의된 Response, RequestResult 타입의 이름을 각각 Body, ResponseResult로 변경하여 시멘틱한 네이밍을 해야합니다.
  2. Response의 success 케이스에 statusCode 값을 추가하여 body값과 함께 묶어 Response 튜플을 추가합니다.

TODO

  • Response -> Body, RequestResult -> ResponseResult
  • Response(statusCode, body) tuple

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #8

network service

Description

API 통신을 주관하는 NetworkService 클래스를 작성합니다.

요구사항

  1. 테스트 코드 작성을 고려하여 NetworkService 클래스에 Alamofire의 Session 객체를 주입할 수 있어야 합니다.
  2. Routable 프로토콜을 채택한 객체를 통해 요청을 실시하고, ResponseResult 타입으로 Decoding 하는 형태를 띄어야 합니다.
  3. 일반 요청 외에도 multipartFormData 형태의 요청도 할 수 있어야 합니다.

TODO

NetworkService

  • Session instance DI
  • request and decoding
  • multipartFormData upload

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #7 #8

validate perform request

Description

개요

  • 앞선 PR에서 언급한 내용과 같이 401을 포함한 4XX의 응답 코드를 가진 응답에 대해 Intercept를 못하는 문제가 있습니다.
  • 이를 해결하기 위해 Alamofire의 validate 메소드를 이용하여 Intercept를 할 수 있도록 통신간 에러를 유발하려 합니다.

요구사항

  1. Alamofire의 validate 메소드를 사용하여 200..<300 이외의 응답 코드를 가진 경우에 대해 에러를 만들어줘야 합니다.
  2. responseDecodable 메소드를 responseData 메소드로 변경하여 result가 아닌 data, error의 유무에 따라 핸들링 해야합니다.

TODO

  • validate
  • responseData

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #11 #33 #34

request result

Description

요청에 대한 응답값을 decoding 하기위해 특정 객체가 필요합니다.
본 프로젝트가 Boilerplate 임을 고려하여 관련 값을 제네릭하게 처리하려고 합니다.

요구사항

  1. 응답에 대한 오류와 성공적으로 받아온 응답을 처리하기 위해 두 경우를 Result 열거형을 이용하여 작성합니다.
  2. 응답 자체가 성공하더라도, 요청 성공, 실패에 따라 다른 값을 내려주기 때문에, 두 값을 제네릭하게 처리하는 Reponse enum을 작성합니다.

TODO

RequestResult

  • Result
  • Response

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

final class

Description

  • 오버라이드 되지 않는 클래스의 경우 final 키워드를 명시하여 상속을 방지하는 것이 좋습니다.
  • 이를 통해 indirect acces/calls을 막아 dynamic dispatch로 인해 vtable을 참조하는 overhead를 줄일 수 있습니다.

Refs: https://developer.apple.com/swift/blog/?id=27

TODO

  • 상속이 필요없는 JWTInterceptor, NetworkServiceTests, MockURLProtocol 클래스를 final로 변경해야 합니다.

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #34 #38

keychain service test

Description

KeychainService 클래스에 대해 테스트 코드를 작성합니다.

요구사항

  1. 테스트 환경에서 Keychain 클래스 init시 kSecAttrService 영역의 Keychain 데이터가 초기화 되어야합니다.
  2. KeychainService 클래스의 CRUD에 대한 테스트 코드를 작성해야합니다.
  3. notFound, unexpectedData, duplicateItem, unhandledError 각 에러에 대해 실패 테스트를 작성합니다.

TODO

  • Keychain convenience init
  • Keychain CRUD test
  • Keychain Error test

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #15 #24

keychain service

Description

Keychain Item Class의 이해 부족으로 #15 에서 kSecClassGenericPassword 외의 데이터를 저장하지 못하는 구조로 만들었었습니다.

kSecClassGenericPassword외의 데이터를 배재하여 현재 구조를 kSecClassGenericPassword 형태의 데이터를

마치 UserDefaults처럼 kSecAttrAccount-kSecValueData의 key-value 형태로 저장하도록 구조를 수정합니다.

요구사항

  1. Keychain initializer에 Item Class 선택부분을 제거하고, 테스트를 위해 service를 설정할 수 있어야함
  2. KeychainService의 CRUD 수정

TODO

  • Keychain initializer
  • Keychain CRUD

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #15

network service test

Description

#20 번 이슈에서 NetworkService 클래스에서 처리하는 응답 인터페이스를 수정하였습니다. 이에 따라 테스트코드가 수정되어야 합니다.

또한 이전 테스트 코드 작성시 확인하지 못했던 encoding, multipartFormData의 경우에 대한 테스트도 추가합니다.

요구사항

  1. 각 테스트 코드에 statusCode의 값을 확인하는 XCTAssertEqual라인이 추가되어야 합니다.
  2. invalidHTTPURLResponse 에러에 대한 테스트 코드가 추가되어야 합니다.
  3. Routable 프로토콜을 채택한 열거형에 encoding, multipartFormData가 없는 경우도 고려해야합니다.

TODO

  • statusCode test
  • invalidHTTPURLResponse test
  • empty encoding, multipartFormData property

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #20

user defaults service

Description

Keychain에서 저장하는 정보 외의 알람 설정같은 간단한 키-값 쌍의 데이터를 UserDefaults를 통해 저장할 수 있습니다.

요구사항

  1. 테스트가 가능한 구조가 되기 위해 서비스 클래스 혹은 레핑 클래스의 초기화 시에 suiteName을 주입 받아야 함.
  2. Keychain과 유사하게 CRUD 인터페이스를 가져야함

TODO

  • UserDefaultsService initializer with suiteName
  • CRUD

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

network service test

Description

NetworkService 클래스에 대한 테스트 코드를 작성합니다.
WWDC 2018에서 공개한 networking stack의 테스트 코드 작성 팁을 참고하여 진행합니다.

요구사항

  1. 요청에 대해 응답하고 MockResponse를 제공할 수 있는 MockURLProtocol을 작성합니다.
  2. MockURLProtocol 관련 설정을 NetworkService 클래스에 주입하여 인스턴스를 생성하는 initializer를 작성합니다.
  3. 일반 요청 외에도 인코팅 성공/에러 요청, 업로드 성공/에러 요청 각각의 경우를 테스트할 수 있는 Router를 작성합니다.
  4. 3에서 작성한 Router를 가지고 각 요청 응답의 성공/실패/오류 케이스를 테스트하는 테스트 코드를 작성합니다.

TODO

NetworkServiceTests

  • MockURLProtocol
  • NetworkService convenience initializer
  • TestRouter
  • ValidSucees, ValidFailure, InvalidError test

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

keychain service

Description

DataLayer에서 유저의 Password, Certificate, Token 등을 저장하기 위한 목적으로 Keychain을 사용합니다.

애플 개발자 문서를 참고하여 Keychain에 대한 기본 연산을 구현할 수 있습니다.

요구사항

  1. Keychain Item Class를 설정할 수 있어야함
  2. 특정 Keychain 항목의 CRUD 연산을 할 수 있어야함

TODO

  • KeychainItemClass DI
  • Keychain CRUD

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

initial commit

Description

ios-data-layer 프로젝트의 초기 설정을 진행합니다.

요구사항

  1. 해당 프로젝트는 Unit Test를 포함할 예정이기 때문에 Unit Testing Bundle이 포함된 iOS Project를 추가해야 합니다.
  2. gitingore를 통해 iOS 프로젝트에 생기는 불필요한 파일들에 대한 커밋을 제한해야 합니다.
  3. 해당 이슈로 만들어지는 커밋은 저장소의 최초 커밋이기 때문에 바로 main에 push 합니다. 이후에 브랜치 보호 규칙을 추가해야합니다.

TODO

DataLayer

  • unit test bundle
  • .gitignore
  • Branch protection rules

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

issue, pr template

Description

github에서 Issue 또는 PR을 생성하는 경우 관련 내용을 작성하여야 합니다.
repository 관리 차원에서 특정 형식의 템플릿을 통해 해당 내용을 통일하려 합니다.

요구사항

  1. 이슈 템플릿
  2. PR 템플릿

TODO

Template

  • ISSUE_TEMPLATE.md
  • PULL_REQUEST_TEMPLATE.md

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

alamofire router

Description

앱의 크기가 커짐에 따라 네트워크 스택을 구축할 때 공통 패턴을 채택하기 위해 라우팅을 이용합니다.
이를 구현하기위해 Alamofire에서 제공하는 URLRequestConvertible 프로토콜을 채택한 Routable 프로토콜을 작성합니다.
해당 구현의 대한 예시는 Alamofire의 공식 문서에 포함되어 있습니다.

요구사항

  1. 공식 문서와 유사하게 baseURL, method, path, parameter의 프로퍼티와 asURLRequest 메소드가 설정되어야 합니다.
  2. RESTFul한 요청에 대한 기본 encoding 설정 외에 추가적인 설정이 가능해야합니다.
  3. 미디어, 이미지 등의 데이터 전달을 위해 multipartFormData 설정을 할 수 있어야 합니다.

TODO

Routable

  • baseURL, method, path, parameter, asURLRequest
  • ParameterEncoder
  • MultipartFormData

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

persistent service test

Description

배경

  • PersistentService 클래스에 대한 테스트 코드를 작성합니다.

요구사항

  1. Keychain, UserDefaults의 identifier를 주입하기 위해 테스트 번들 identifier를 가져오는 클래스가 필요합니다.
  2. Keychain, UserDefaults의 identifier를 주입하기 위해 PersistentService 클래스의 convenience initializer를 작성해야됩니다.
  3. 두 저장소 모두 테스트를 위해 저장소를 다르게 선택한 두 테스트 클래스를 만들어 테스트해야 합니다.
  4. 공통된 로직은 분리 후, 프로토콜 기본 구현을 이용하여 각 테스트에 채택하여 코드를 간소화 합니다.

TODO

  • BundleProvider for test
  • PersistentService convenience initializer for test
  • PersistentService default implementation protocol
  • KeychainStore, UserDefaultsStore Tests

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #29

persistent service

Description

개요

  • UserDefaultsServices 클래스는 KeychainService 클래스와 인터페이스, 에러 타입이 유사합니다.
  • Keychain 클래스도 UserDefaults의 suiteName과 유사하게 service 값을 가지고 초기화합니다.
  • 위의 이유료 저장소 타입을 선택하여 Key-Value 쌍으로 저장할 수 있는 PersistentService 클래스를 작성합니다.

요구사항

  1. keychain의 service, userDefault의 sutieName을 설정하기 위해 identifier를 통해 초기화 할 수 있어야합니다.
  2. 데이터를 저장할 Keychain, UserDefaults 저장소를 initializer를 이용해 설정 할 수 있어야합니다.
  3. 테스트를 위해 identifier를 지정한 경우 데이터 초기화를 위해 관련 메소드가 인터페이스에 정의되어야 합니다.
  4. KeychainService, UserDefaultsService 클래스에 공통된 과정을 PersistentService로 이관하여야 합니다.

TODO

  • identifier, storeType initializer
  • removePersistentData method
  • service-store 분리

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #24 #27

network service decoding test

Description

개요

  • 이전 PR에서 수정한 performRequest 로직으로 인해 디코딩이 실패히는 경우에 대해 테스트 코드가 작성되지 않았습니다.
  • 따라서 이번 이슈에서 해당 라인에 대한 테스트 코드를 작성해야 합니다.

요구사항

  1. NetworkService.Error와 Decoding Error를 분리하기 위해 테스트 메소드를 추가합니다.
  2. 분리한 테스트 메소드에서 DecodingError.keyNotFound 케이스를 테스트 합니다.
  3. 테스트를 위해 실패 응답에서 CodingKey와 Context 정의하여 DecodingError를 만듭니다.

TODO

  • divide requestNetworkServiceError
  • implement requestDecodingError
  • create decodingError

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #35

cocoapods, alamofire

Description

라이브러리등의 프로젝트 종속성 관리를 위해 SPM나 CocoaPods를 사용합니다.
해당 프로젝트에서는 빌드 설정의 용이성이 있는 CocoaPods를 사용하겠습니다.

요구사항

  1. 프로젝트에 CocoaPods 초기화 후 주석 제거, 플랫폼 명시등을 해야합니다.
  2. 본 프로젝트의 HTTP networking library로 사용할 Alamofire를 설치해야합니다.

TODO

Dependency

  • init CocoaPods
  • insall Alamofire

Environment

macOS: Monterey 12.5.1, Apple M1
iOS: 15.5, iPhone 13 mini
IDE: Xcode 13.4.1

Related: #

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.