🍎 Apple/iOS

URLSession 의존성 제거하기

PushedGun 2023. 10. 28. 18:37

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을 채택하기만 하고 새롭게 써주는 내용이 없어 다소 어색한 모양이 되었다.

이런 형태가 가독성 등에서 문제가 되지 않는지,

혹시 더 좋은 방법이 있진 않은지 고민이다.