1. Observable.Create로 구현하기

let response = Observable<[Book]>.create { observer in
            let session = URLSession.shared
            let task = session.dataTask(with: url) { [weak self] (data, response, error) in
                defer {
                    DispatchQueue.main.async { [weak self] in
                        self?.listTableView.reloadData()
                        UIApplication.shared.isNetworkActivityIndicatorVisible = false
                    }
                }
                
                if let error = error {
                    print(error)
                    observer.onError(error)
                    return
                }
                
                guard let httpResponse = response as? HTTPURLResponse else {
                    print("Invalid Response")
                    observer.onCompleted()
                    return
                }
                
                guard (200...299).contains(httpResponse.statusCode) else {
                    print(httpResponse.statusCode)
                    observer.onCompleted()
                    return
                }
                
                guard let data = data else {
                    fatalError("Invalid Data")
                    observer.onCompleted()
                    return
                }
                
                do {
                    let decoder = JSONDecoder()
                    let bookList = try decoder.decode(BookList.self, from: data)
                    
                    if bookList.code == 200 {
                        observer.onNext(bookList.list)
                    } else {
                        observer.onNext([])
                    }
                } catch {
                    observer.onError(error)
                }
            }
            task.resume()
            return Disposables.create{
                task.cancel()
            }
        }.asDriver(onErrorJustReturn: [])

URLSession 이 완료/실패에 따라서 onNext,completed, Error이벤트를 방출하고 UI바인딩을 하기위해 asDriver로 리턴함.