ios

네트워크 통신 모듈화 with Alamofire

junsmustLim 2020. 7. 21. 19:15

들어가며

 

 

 

 회사에서 앱을 개발하던 중, 네트워크 통신을 하는 로직이 항상 마음에 들지 않았습니다. 분명 같은 구조이고 요청할 때 들어가는 전달 변수만 달라지는데 왜 나는 왜 똑같은 코드를 반복하고 있는지 하고 있는 제 자신도 비참해 보였습니다. 그러던 중, 선배 개발자가 " Network Request 하는 건 하나만 만들고 바뀔 값만 전달 변수로 전달해라 " 이렇게 조언을 해주셨습니다. 선배의 말을 듣고 코드를 바꾸고 있는 찰나 좋은 정보는 함께 공유하면 좋을거 같아서 이렇게 글을 쓰기 시작했습니다. 

 

 

 

본론 

Problem -> RestApi Call With Overlapped Same Code diffrent Paraemters

 

 

 

 

잘못된 점 

 

 

  • App에서 Rest Api를 요청하면 이런 구조, 형식으로 같은 코드가 반복 
  • @escaping (Bool?,Error?)->() 
    • 성공시 (true,nil)
    • 실패시 (nil,error)
    • 이로 인해 실제 기능부에서 응답값을 사용할 때 적어도 두 번의 값을 확인해야 하며 ,  unwrapping을 해야한다는 점

 

 

 

 

Solution ->  make only a Requester for REST API

 

 

 

 

 

 

먼저 응답 값을 한개의 객체로 관리하기 위해  enum을 생성했습니다.

response 객체는 enum 타입이며 Generic 타입제약을 사용하여 Codable을 채택한 객체만 올 수 있도록 하였다. 

 

 

 

 

 

 

 

 

request Almofire

 

 

 

  • request하기 위해서 필요한 파라미터들을 requestGeneralAPI(url:params:....) 정의
  • T.Type 매개변수로 받아 <T> 타입 설정
  • Alamofire.request 호출 
  • Json 객체 Decode
  • NetworkResponse 에서 정의에 따라서 
    • 성공시 : completion(.success(responseVO))
    • 실패시:  completion(.error(error))
    • 결과, api를 호출하는 Controller에서는 switch 구문으로 success인지 , failure인지 구분만 하면 됨

 

 

 

API CALL TEST

 

 

 

 

 

결론

 

 위 코드는 제가 작성한 테스트 코드입니다. 제가 작성한 코드를 실제 기능부에서 호출할 때 어떻게 될지 확인하는 차원에서 작성해 봤습니다.  부족한 글이지만 읽어주셔서 갑사합니다. 이번 기회로 코드의 제가 처음에 작성했었던 불필요한 코드들을 더 이상 제 프로젝트에서 배제시키기 위해 노력하겠습니다 XD