Skip to content

Commit 03aea97

Browse files
committed
Refactor: HTTP Request를 진행하는 부분을 따로 나누었습니다. (#4)
1 parent 490b769 commit 03aea97

File tree

4 files changed

+116
-82
lines changed

4 files changed

+116
-82
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//
2+
// CardHTTPRequest.swift
3+
// TodoList
4+
//
5+
// Created by 백상휘 on 2022/04/05.
6+
//
7+
8+
import Foundation
9+
10+
/// 카드 뿐만 아니라 다른 상황에서도 사용할 수 있는 GET/POST 요청을 할 수 있습니다.
11+
///
12+
/// - doGetRequest(url:URL,:[String:Any]?,completionHandler:(Codable?)->Void)
13+
/// - doPostRequest(url:URL,:Data?,completionHandler:(Codable?)->Void)
14+
class CardHTTPRequest: SessionConfiguration {
15+
16+
/// HTTP GET 요청을 보냅니다.
17+
///
18+
/// - url: Request를 보낼 URL입니다.
19+
/// - parameter: Request 뒤에 파라미터로 보낼 딕셔너리 입니다. (예: https://getRequest.com?objectKey=myKey 의 objectKey:myKey)
20+
/// - completionHandler: 요청 후 Data객체를 (혹은 nil인) 호출하는 클로저입니다.
21+
func doGetRequest(url: URL, parameter: [String:String]?, completionHandler: @escaping (Data?)->Void) {
22+
var queryItems = [URLQueryItem]()
23+
if let parameter = parameter {
24+
for param in parameter {
25+
queryItems.append(URLQueryItem(name: param.key, value: param.value))
26+
}
27+
}
28+
var urlComp = URLComponents(url: url, resolvingAgainstBaseURL: false)
29+
urlComp?.queryItems = queryItems
30+
31+
if let url = urlComp?.url {
32+
getRequestHandler(url: url) { request in
33+
self.session.dataTask(with: request) { data, response, error in
34+
guard let data = data else {
35+
completionHandler(nil)
36+
return
37+
}
38+
39+
completionHandler(data)
40+
}.resume()
41+
}
42+
} else {
43+
completionHandler(nil)
44+
}
45+
}
46+
47+
/// HTTP POST 요청을 보냅니다.
48+
///
49+
/// - url: Request를 보낼 URL입니다.
50+
/// - parameter: Request body에 보낼 이진 데이터(Data 구조체)입니다.
51+
/// - completionHandler: 요청 후 Data객체를 (혹은 nil인) 호출하는 클로저입니다.
52+
func doPostRequest(url: URL, _ paramData: Data? = nil, completionHandler: @escaping (Data?)->Void) {
53+
getRequestHandler(url: url) { request in
54+
self.session.uploadTask(with: request, from: paramData) { data, response, error in
55+
guard let data = data else {
56+
completionHandler(nil)
57+
return
58+
}
59+
60+
completionHandler(data)
61+
}.resume()
62+
}
63+
}
64+
}

Client/iOS/TodoList/Network/CardsFetchingDataTask.swift

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Foundation
1111
///
1212
/// - fetchCardsAll(): 모든 보드의 카드를 가져온다.
1313
/// - fetchCardsInBoard(in:BoardData): 특정 보드의 카드를 가져온다.
14-
class CardsFetchingDataTask: SessionConfiguration
14+
class CardsFetchingDataTask: CardHTTPRequest
1515
{
1616

1717
private let encoder = JSONEncoder()
@@ -29,16 +29,14 @@ class CardsFetchingDataTask: SessionConfiguration
2929
func fetchCardsAll(completionHandler: @escaping ([[CardData]]?)->Void)
3030
{
3131
do {
32-
let url = try CardFetchingURL.fetchAll.toURL()
33-
getRequestHandler(url: url) { request in
34-
self.session.dataTask(with: request) { data, response, error in
35-
guard let data = data else {
36-
completionHandler(nil)
37-
return
38-
}
39-
40-
completionHandler(try? self.decoder.decode([[CardData]].self, from: data))
41-
}.resume()
32+
doGetRequest(url: try CardFetchingURL.fetchAll.toURL(), parameter: nil) { data in
33+
34+
guard let data = data else {
35+
completionHandler(nil)
36+
return
37+
}
38+
39+
completionHandler(try? self.decoder.decode([[CardData]].self, from: data))
4240
}
4341
} catch {
4442
print(error)
@@ -49,16 +47,14 @@ class CardsFetchingDataTask: SessionConfiguration
4947
func fetchCardsInBoard(completionHandler: @escaping ([CardData]?)->Void)
5048
{
5149
do {
52-
let url = try CardFetchingURL.oneFetch.toURL()
53-
getRequestHandler(url: url) { request in
54-
self.session.dataTask(with: request) { data, response, error in
55-
guard let data = data else {
56-
completionHandler(nil)
57-
return
58-
}
59-
60-
completionHandler(try? self.decoder.decode([CardData].self, from: data))
61-
}.resume()
50+
doGetRequest(url: try CardFetchingURL.oneFetch.toURL(), parameter: nil) { data in
51+
52+
guard let data = data else {
53+
completionHandler(nil)
54+
return
55+
}
56+
57+
completionHandler(try? self.decoder.decode([CardData].self, from: data))
6258
}
6359
} catch {
6460
print(error)

Client/iOS/TodoList/Network/CardsUpdateDataTask.swift

Lines changed: 31 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Foundation
1313
/// - readCard(from:String,completionHandler:(CardData?)->Void) : 전달한 ID와 일치하는 카드를 가져온다.
1414
/// - updateCard(:CardData,completionHandler:(CardData?)->Void) : 카드 데이터를 업데이트 한다.
1515
/// - deleteCard(from:String,completionHandler:(CardData?)->Void) : 전달한 ID와 일치하는 카드를 삭제한다.
16-
class CardsUpdateDataTask: SessionConfiguration
16+
class CardsUpdateDataTask: CardHTTPRequest
1717
{
1818

1919
private let encoder = JSONEncoder()
@@ -26,17 +26,14 @@ class CardsUpdateDataTask: SessionConfiguration
2626
func createCard(_ param: ScreenCardParameter, completionHandler: @escaping (CardData?)->Void)
2727
{
2828
do {
29-
let paramData = try encoder.encode(param)
30-
let url = try CardManagingURL.create.toURL()
31-
getRequestHandler(url: url) { request in
32-
self.session.uploadTask(with: request, from: paramData) { data, response, error in
33-
guard let data = data else {
34-
completionHandler(nil)
35-
return
36-
}
37-
38-
completionHandler(try? self.decoder.decode(CardData.self, from: data))
39-
}.resume()
29+
doPostRequest(url: try CardManagingURL.create.toURL(), try encoder.encode(param)) { data in
30+
31+
guard let data = data else {
32+
completionHandler(nil)
33+
return
34+
}
35+
36+
completionHandler(try? self.decoder.decode(CardData.self, from: data))
4037
}
4138
} catch {
4239
print(error)
@@ -47,26 +44,15 @@ class CardsUpdateDataTask: SessionConfiguration
4744
func readCard(from objectId: String, completionHandler: @escaping (CardData?)->Void)
4845
{
4946
do {
50-
let queryItems = [URLQueryItem(name: "objectId", value: objectId)]
51-
var urlComp = try CardManagingURL.read.toURLComponent()
52-
urlComp.queryItems = queryItems
53-
54-
if let url = urlComp.url {
55-
getRequestHandler(url: url) { request in
56-
self.session.dataTask(with: request) { data, response, error in
57-
guard let data = data else {
58-
completionHandler(nil)
59-
return
60-
}
61-
62-
completionHandler(try? self.decoder.decode(CardData.self, from: data))
63-
}.resume()
47+
doGetRequest(url: try CardManagingURL.read.toURL(), parameter: ["objectId": objectId]) { data in
48+
49+
guard let data = data else {
50+
completionHandler(nil)
51+
return
6452
}
65-
} else {
66-
print("\(CardManagingError.CardURLError) urlComp: \(urlComp.string ?? ""), queryItems: \(queryItems)")
67-
throw CardManagingError.CardURLError
53+
54+
completionHandler(try? self.decoder.decode(CardData.self, from: data))
6855
}
69-
7056
} catch {
7157
print(error)
7258
completionHandler(nil)
@@ -76,18 +62,14 @@ class CardsUpdateDataTask: SessionConfiguration
7662
func updateCard(_ data: CardData, completionHandler: @escaping (CardData?)->Void)
7763
{
7864
do {
79-
let paramData = try encoder.encode(data)
80-
let url = try CardManagingURL.update.toURL()
81-
82-
getRequestHandler(url: url) { request in
83-
self.session.uploadTask(with: request, from: paramData) { data, response, error in
84-
guard let data = data else {
85-
completionHandler(nil)
86-
return
87-
}
88-
89-
completionHandler(try? self.decoder.decode(CardData.self, from: data))
90-
}.resume()
65+
doPostRequest(url: try CardManagingURL.update.toURL(), try encoder.encode(data)) { data in
66+
67+
guard let data = data else {
68+
completionHandler(nil)
69+
return
70+
}
71+
72+
completionHandler(try? self.decoder.decode(CardData.self, from: data))
9173
}
9274
} catch {
9375
print(error)
@@ -98,26 +80,15 @@ class CardsUpdateDataTask: SessionConfiguration
9880
func deleteCard(from objectId: String, completionHandler: @escaping (CardData?)->Void)
9981
{
10082
do {
101-
let queryItems = [URLQueryItem(name: "objectId", value: objectId)]
102-
var urlComp = try CardManagingURL.delete.toURLComponent()
103-
urlComp.queryItems = queryItems
104-
105-
if let url = urlComp.url {
106-
getRequestHandler(url: url) { request in
107-
self.session.dataTask(with: request) { data, response, error in
108-
guard let data = data else {
109-
completionHandler(nil)
110-
return
111-
}
112-
113-
completionHandler(try? self.decoder.decode(CardData.self, from: data))
114-
}.resume()
83+
doGetRequest(url: try CardManagingURL.delete.toURL(), parameter: ["objectId":objectId]) { data in
84+
85+
guard let data = data else {
86+
completionHandler(nil)
87+
return
11588
}
116-
} else {
117-
print("\(CardManagingError.CardURLError) urlComp: \(urlComp.string ?? ""), queryItems: \(queryItems)")
118-
throw CardManagingError.CardURLError
89+
90+
completionHandler(try? self.decoder.decode(CardData.self, from: data))
11991
}
120-
12192
} catch {
12293
print(error)
12394
completionHandler(nil)

Client/iOS/TodoList/Network/SessionCommonAttributes.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class SessionCommonAttributes {
3232
}
3333
}
3434

35+
private var cachePolicy = URLRequest.CachePolicy.useProtocolCachePolicy
36+
private var timeoutInterval: TimeInterval = 6.0
37+
3538
// MARK: - Initializers
3639
init?(as string: String)
3740
{
@@ -53,7 +56,7 @@ class SessionCommonAttributes {
5356
}
5457

5558
private func reloadRequestURL(_ url: URL) {
56-
request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 6.0)
59+
request = URLRequest(url: url, cachePolicy: cachePolicy, timeoutInterval: timeoutInterval)
5760
request.httpMethod = httpMethod.rawValue
5861
request.setValue(mimeType.rawValue, forHTTPHeaderField: "Content-Type")
5962
}

0 commit comments

Comments
 (0)