클린아키텍처-클론코딩 (5) 영화 검색-2

저는 여태까지 API를 가지고 네트워크 요청을 할때

func requestMovies(page: Int, completion: @escaping ()->Void) {
	URLSession.request(.....
}

이런식으로 특정 네트워크 요청을 위한 함수를 만들어서 요청하는 식으로 코드를 짜왔습니다. 또한 이런 네트워크 작업을 하는 객체를 싱글톤 객체로 만들어서 작업을 했지요.

class NetworkManager {
	static let networkManager = NetworkManager()
    
    func requestMovies() {
    
    }
    
    func requestUserInfo() {
    
    }
    .
    .
    .
}

이런식으로 말입니다. 이런 방식은 NetworkManager가 요청 생성, 인코딩, 디코딩 등등을 모두 담당하기에 단일책임 원칙도 위배하고, 네트워크 작업이 방대해질수록 오류를 찾기도, test하기도 어렵습니다. 그래서 네트워크 작업을 각각의 레이어로 분리 해 보다 쉽게 테스트를 하고, 책임을 분단시킵니다. 

실제로는 이것보다 더 복잡하지만 간단하게 기능을 추리면 이런식으로 레이어를 나눠서 요청을 합니다.