Day 22 개발일지 iOS - boostcamp-2020/Project03-A-TOTP GitHub Wiki

네트워킹 구조 개발

지난 3주 프로젝트때 Alamofire로 HTTP 통신을 했다. 이를 이번 5주 프로젝트에서 URLSession으로 바꿔보았다.

URLSession의 GET, POST, DELETE, PATCH를 어떻게 구현할지가 제일 고민됐다.

예전해 구현해놨던 코드가 있어서 최대한 그 코드를 사용하려 했다.

원래는 GET요청과 POST 요청을 따로 해줬는데, 이번에는 request함수 하나로 합쳐보았다.

Requestable 프로토콜

Requestable프로토콜을 선언하고, service마다 이 프로토콜을 채택하여 사용한다.

연관타입으로 Codable을 준수하는 NetworkData를 선언하고, Int값인 resCode, 여러 형태의 데이터를 가질 수 있는 NetworkData인 resResult를 묶어서 NetworkSuccessResult 이름을 가진 typealias로 정의해주었다.

protocol Requestable {
    associatedtype NetworkData: Codable
    typealias NetworkSuccessResult = (resCode: Int, resResult: NetworkData)
    
    func request(_ endpoint: EndpointType,
                 completion: @escaping (NetworkResult<NetworkSuccessResult>) -> Void)
}

request함수에서는 EndpointType이 들어올 수 있고, completion핸들러로 NetworkResult에 NetwokrSuccessResult를 담아 보낼 수 있게 했다.

NetworkResult

enum NetworkResult<T> {
    case networkSuccess(T)
    case networkError((resCode: Int, msg: String))
    case networkFail
}

networkSuccess은 네트워크가 성공하는 경우에 받아올 데이터를 넣을 수 있게 제네릭하게 주었고

networkError에는 네트워크는 성공한 경우이지만, 오류가 났을 때 받아올 수 있게 resCode와 msg를 넣어주었다.

networkFail은 네트워크가 아예 실패했을 경우이다.

Endpoint

EndpointType프로토콜을 정의해놓고, 이 프로토콜을 endpoint마다 채택해서 사용한다.

protocol EndpointType {
    var baseUrl: String { get }
    var path: String { get }
    var method: HTTPMethod { get }
    var params: [String: Any]? { get }
}

각자 입맛에 맞게 변형할 수 있다.

enum UserEndpoint {
    case get
    case create(name: String, email: String)
    case delete(id: Int)
}

extension UserEndpoint: EndpointType {
		var path: String { }
		// ....
}

HTTPMethod

알라모파이어에서는 HTTPMethod를 제공해주지만, URLSession에는 따로 String값으로 주어야 해서

가독성 있게, 사용할 메소드를 enum타입으로 지정해주었다.

enum HTTPMethod: String {
    case GET
    case POST
    case PATCH
    case DELETE
}

백엔드 API 설계

서버에 백업을 하기 위해 필요한 API를 구성해보았다. 인증 문제, 동기화 문제가 크게 있었다. 이 부분은 내일 다시 이야기해보아야겠다.

삭제 선택 할 때 + 버튼 안보이게 바꾸기

삭제하기 위해 선택 버튼을 눌렀을 때 + 셀이 사라지지 않았던 것을 없애주었다.

제로 토큰 그림자랑 아이콘 넣기

토큰이 0개일 때 나오는 뷰가 디자인 해 놓은 대로 되어 있지 않아 이 것을 고쳐주었다.

설정 화면 구성

List로 만들어보려고 했으나 List를 VStack에 넣었을 때 좌우에 없어지지 않는 공간이 생겼다. 이걸 없애기 위해 이것 저것 다 해보았으나 결국 되지 않았다. 그래서 그리드 뷰를 사용하여 리스트를 구성하였다. 다행히 계획했던 UI와 비슷하게 잘 나오게 되었다.

개인 회고

(솔직히 쓰기 - 현재 파트너 또는 누군가가 본다고 생각하지 말고 미래의 내가 본다고 생각하며 쓰면 어떨까요??😏)

어진

  • 네트워크 구조를 짜보았다. 저번 3주 프로젝트때는 팀원과 Alamofire를 사용하기 위해 고민했던 내용을 바탕으로 URLSession으로 바꾸는 작업이었다.
  • 아직 URLSession을 더 공부해야할 것 같지만, 어느정도 이해할 수 있었다.

재명

  • 지난 주에 만들어 놓은 것들에 잔버그들이 좀 있었다. 이것들을 수정하고 버전 1을 배포해보았다. 서버 없이 사용할 수 있는 정도까지 배포할 예정이다. 아직은 버그를 잘 못잡고 있는 것 같은데 앞으로 얼마나 괴로운 것들이 있을지 기대 된다.
  • 확실히 이슈 트래커때 했던 실수들이 보완되어 좀 더 프로젝트를 수월하게 진행할 수 있게 된 것 같다. 한 번 뿐이지만 열심히 해서 그런지 얻은 게 많았다. 이번 프로젝트도 최선을 다하고 있기 때문에 마지막 주까지 지나면 얼마나 성장할지 기대된다.