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