[API targets 정의]

enum ScriptAPI {
    case getScript(fileMetaID: String)
}

[TargetType을 채택 후 API 요청에 필요한 파라미터 정의]

extension ScriptAPI: TargetType {
    var validationType: ValidationType {
        return .successCodes
    }

    var baseURL: URL {
        return URL(string: Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as? String ?? "BaseURL 에러")!
    }

    var path: String {
        switch self {
        case let .getScript(fileMetaID):
            return "/file-meta/\\(fileMetaID)/script"
        }
    }

    var method: Moya.Method {
        switch self {
        case .getScript:
            return .get
        }
    }

    var task: Moya.Task {
        switch self {
        case .getScript:
            return .requestParameters(
                parameters: ["deflated": "false"],
                encoding: URLEncoding.queryString
            )
        }
    }

    var headers: [String: String]? {
        switch self {
        case .getScript:
            return nil
        }
    }
}

[Provider 정의]

class Provider<T: TargetType> {
    let unAuthProvider: MoyaProvider<T> //기본 Provider
    let provider: MoyaProvider<T> // Interceptor를 포함한 Provider
    let logProvider: MoyaProvider<T> // Log Plugin을 포함한 Provider

    init() {
        unAuthProvider = MoyaProvider<T>()
        provider = MoyaProvider<T>(session: Session(interceptor: AuthInterceptor.shared))
        logProvider = MoyaProvider<T>(session: Session(interceptor: AuthInterceptor.shared), plugins: [MoyaLoggingPlugin()])
    }
}

[Service정의]

[ServiceType 프로토콜 정의]

protocol ServiceType {
	func fetchScript(_ fileMetaID: String) -> Single<[Paragraph]>
}

[ServiceType 채택한, ScriptService 객체 생성]