본문 바로가기

iOS

[Moya] 란?

본 글 내용 : https://github.com/Moya/Moya

⚠️ Github의 Moya 라이브러리에 대한 글을 직역한 부분도 있어 조금 말이 이상할 수도 있습니다. 

Moya란? Moya와 Alamofire의 차이

Alamofire을 사용하다보면 대부분의 사람들은 "APIManager" 또는 "NetworkModel"이라고 부르는 에드혹 네트워크 추상화 층을 하나 더 만들 것입니다. 그리고 그들은 모두 눈물로 마무리합니다.

지금 위의 문장은 Moya 공식문서의 간단한 서론 부분을 직독직해하였습니다. 여기서 에드혹 네트워크 추상화 층은 무엇일까요?

이 층은 Alamofire 라이브러리를 사용할 때 통신을 하기 위해서 만들었던 NetworkService라는 폴더입니다.(저는 이렇게 생성해서 사용했어요) Alamofire라이브러리를 사용할 때 네트워킹역할을 도맡아서 하는 층 하나를 더 만들고 이 층에서 Alamofire라이브러리를 호출하여 통신을 하였습니다. 하지만 이 네트워크 층은 통신에 관해서 완전히 추상화해주지 않습니다. URLs, parameters 등등.. 모두 이 네트워크 층에서 사용되어 약간 지저분하였습니다. 뿐만 아니라 문서에서는 앱을 시작하고(?), 유지보수하고, 유닛테스트를 작성하는데 나쁘다고 합니다. 

그래서 이러한 에드혹 네트워크층을 대신하고 Alamofire로 바로 연결해주는 네트워크 추상화층이 Moya의 기본 개념입니다.

 

이 그림을 보시면 Moya의 역할에 대해서 쉽게 이해가 되기 때문에 가져와보았습니다. Alamofire 라이브러리만 사용할 때는 왼쪽 그림과 같이 네트워크층을 통과하는 화살표도 있지만 통과하지 않는 화살표도 있습니다. 이는 네트워크층이 완전하게 추상화를 하지 못하였다는 것을 보여주는 그림입니다. 그 부분을 오른쪽 그림과 같이 Moya라이브러리가 정리해줍니다.

Moya's Building Blocks

아래 세가지는 Moya를 구성하는 요소들입니다.

 

Provider

: 모든 네트워크 서비스와 상호작용할때 만들고 사용할 주요한 객체입니다. 초기화할때 Moya Target을 가지는 일반적인 객체입니다.

Target

: 일반적으로 전체 API 서비스를 설명합니다. 이 경우에는, Marvel target과 Imgur target이 있습니다. 그들 각 타겟은 서비스, 그 자체의 가능한 끝점, 요청을 이행하는 각 끝점에 요구되는 정보를 설명합니다. TargetType 프로토콜을 체택하는 것으로 target을 정의합니다.

👉 타겟에 관한 깃헙문서

Endpoint

: Moya는 네트워크 요청을 이행하는 요구된 정보의 기본조각을 설명하는 반 내부(semi-internal) 끝점(Endpoint)객체를 사용합니다(예를들어 HTTP method, request body, header 등) MoyaProvider는 모든 target들을 끝점(Endpoint)으로 변형(transforms)하고, 결국에는 원시 URLRequest로 변형되어 집니다. Endpoints는 높은 수준의 사용자화가 가능합니다.

 

URLSession을 이용하는 것보다 Alamofire을 이용하면 네트워킹 작업이 더 편하듯이 Moya라이브러리를 아주 간단히 알아보았지만 보기만 해도 Alamofire를 사용하는 것보다 더 간편할 것 같습니다. 이번 프로젝트에서 직접 사용해보면서 후기를 가져와 보도록 하겠습니당 아, 그리고 위에서 말씀 안 드린 내용이 있는데 Moya라이브러리에는 이미 Alamofire라이브러리가 내장되어있어서 네트워킹 라이브러리로 Alamofire, Moya를 다 설치하지 않고 Moya만 설치하여도 됩니당 ㅎㅎ 이제 사용해보러 갈건데 너무 설레..네여 읽어주셔서 감사합니다.