1. 리뷰
final class APINetwork {
func request<T: Decodable>(requestable: Requestable, type: T.Type) -> AnyPublisher<T, Error> {
let request: URLRequest = requestable.asURLRequest()
return URLSession.shared
.dataTaskPublisher(for: request)
.//생략..
.eraseToAnyPublisher()
}
}
위 코드에서 리뷰어님께 다음과 같은 리뷰를 받았다.
2. Session 프로토컬 생성
protocol Session {
func dataTaskPublisher(for request: URLRequest) -> URLSession.DataTaskPublisher
}
extension URLSession: Session {
//
}
URLSession과 독립적으로 테스트할 수 있도록, Session이라는 프로토콜을 만들었다.
URLSession에도 이를 채택하여 URLSession도 사용할 수 있도록 하였다.
final class APINetwork {
private let session: Session
init(session: Session) {
self.session = session
}
func request<T: Decodable>(requestable: Requestable, type: T.Type) -> AnyPublisher<T, Error> {
let request: URLRequest = requestable.asURLRequest()
return session
.dataTaskPublisher(for: request)
.//생략...
.eraseToAnyPublisher()
}
}
이렇게 적용하니, URLSession에 의존하지 않고, Session을 따로 만들어 테스트 또한 가능할 수 있게 되었다.
그런데, URLSession이 Session을 채택하기만 하고 새롭게 써주는 내용이 없어 다소 어색한 모양이 되었다.
이런 형태가 가독성 등에서 문제가 되지 않는지,
혹시 더 좋은 방법이 있진 않은지 고민이다.
'🍎 Apple > iOS' 카테고리의 다른 글
[iOS] assertionFailure, 배포버전에선 터지지 않도록 하기 (0) | 2023.10.26 |
---|---|
[iOS] designated init, convenience init 은 대체 뭘까?? (0) | 2023.10.22 |
[iOS] NSCoding, 내 마음 속에.. 아니 Data에 저장하고 싶을 때 (0) | 2023.10.22 |
[iOS] required init?(coder: NSCoder) 이게 뭔데 자꾸 만들어줘 (0) | 2023.10.22 |
[iOS] 어디서 문제가 생긴걸까?? Log를 찍어보자. (0) | 2023.10.05 |