Swift - 라이브러리

Swift - Alamofire 라이브러리

iosos 2023. 7. 1. 17:18

* Alamofire

- Swift에서 네트워킹 작업을 수행하기 위한 강력하고 인기 있는 통신 라이브러리 

- HTTP 요청을 만들고 보내는 작업을 단순화하기 위해 설계되었으며, 네트워크 작업을 처리하는 데 사용되는 다양한 기능과 편의성 제공 

- URLSession을 감싸고 있는 래퍼 라이브러리로, 기본적으로 URLSession과 함께 사용되며 추가적인 편의 기능과 추상화를 제공 

 

 


Alamofire 설치

 

 

1. PodFile을 실행하여 설치하고자 하는 라이브러리 입력 

 

 

 

 

 

 

2. pod install

3. 설치 완료 


 

 

 

 

 

Alamofire 사용 방법 

 

 

 

 

 

1. ViewController에 Alamofire 프레임워크 추가 

import UIKit
import Alamofire

 

 

 

 

2. Request 구조체 

struct AlamofireRequest : Encodable{
    var start : String
    var end: String
}

- Alamofire를 통해 전송할 요청 데이터를 인코딩하기 위한 모델로 'Encodable' 프로토콜을 준수하는 구조체 

- 서버에 전송할 데이터 'start', 'end' 속성을 가진다 

 

 

 

 

 

 

3. Response 구조 

struct AlamofireResponse : Decodable{
    var data : Int?
    var success : Bool
    var message : String
    var property : Int
}

- Alamofire를 통해 수신된 응답 데이터를 디코딩하기 위한 모델로 'Decodable' 프로토콜을 준수하는 구조체

- 'data'  : 서버로부터 수신된 정수형 데이터를 담는 옵셔널 속성

- 'success' : 성공 여부를 나타내는 Boolean 속성

- 'message' : 응답에서 반환된 메시지를 저장하는 문자열 속성

- 'property' : 정수형 데이터를 담는 속성으로, 응답에서 추가적인 정보를 제공하기 위해 사용되는 정수 값 (404, 301 등 )

 

 

 

 

 

 

4. 사용 구조 

    override func viewDidLoad() {
        super.viewDidLoad()

        let param = AlamofireRequest(start: "시작", end: "끝")
        postAlamofire(param)
        
    }

- Request 구조체의 'start', 'end' 속성 값에 값을 부여한 'AlamofireRequest' 구조체의 인스턴스 생성

- 해당 인스턴스를 'postAlamofire'  함수로 전달

 

 

 

* Post Method

func postAlamofire(_ parameters: AlamofireRequest) {
        AF.request("http://43.200.179.53:3000/add", method: .post, parameters: parameters, encoder: JSONParameterEncoder(), headers: nil)
            .validate()
            .responseDecodable(of: AlamofireResponse.self) { [self] response in
                switch response.result {
                case .success(let response):
                    if(response.success == true){
                        print("서버에 데이터 전달 받기 성공")
                        navigationController?.popViewController(animated: true)
                    
                        print(response.data ?? 0, response.message, response.success)
                        
                    }
                    
                    else{
                        print("서버에 데이터 전달 받기 실패 \(response.message)")
                        //alert message
                        let FailAlert = UIAlertController(title: "경고", message: response.message, preferredStyle: UIAlertController.Style.alert)
                        
                        let FailAction = UIAlertAction(title: "확인", style: UIAlertAction.Style.default, handler: nil)
                        FailAlert.addAction(FailAction)
                        self.present(FailAlert, animated: true, completion: nil)
                    }
                    
                    
                case .failure(let error):
                    print(error)
                    print("서버 통신 실패")
                    let serverFailAlert = UIAlertController(title: "경고", message: "서버 통신에 실패하였습니다.", preferredStyle: UIAlertController.Style.alert)
                    
                    let serverFailAction = UIAlertAction(title: "확인", style: UIAlertAction.Style.default, handler: nil)
                    serverFailAlert.addAction(serverFailAction)
                    self.present(serverFailAlert, animated: true, completion: nil)
                }
                
            }
    }

- postAlamofire 함수 내에서 Alamofire를 이용한 POST 요청을 보내고 응답을 처리하는 예제

- 'AF.request' 함수를 사용하여 URL에 대해 POST 요청을 보냄

- 요청 메서드는 '.post'로 설정하고 파라마티러로 'parameters' 사용 

- encoder로 JSONParameterEncoder()를 사용하여 파라미터를 JSON 형식으로 인코딩 

 

- 'validate()' 메서드는 응답의 유휴성을 검사

- 응답이 성공적인 경우 '.responseDecodable' 메서드를 사용하여 응답 데이터를 'AlamofireResponse' 구조체로 디코딩 

- 'AlamofireResponse.self' 는 디코딩할 타입을 지정하는데, 여기서는 'AlamofireResponse' 구조체를 디코딩 대상으로 설정 

- 클로저 내부에서 'response'를 통해 서버의 응답을 받고 응답을 처리하는 로직 구현

 

- '[self] response in' 구문은 capture list를 통해 클로저가 'self' 를 약한 참조로 캡처하고, 클로저의 매개변수로 'response'를 사용한다는 의미 

- 'response.result' : 성공 여부 확인

- 'response.value' : 디코딩된 객체에 접근 

- 'response.error' : 성공 실패 시 에러 정보에 접근 

 

 

- 'response.result'를 'switch' 문으로 분기처리 

- 'let response' : 'response.result'의 값을 성공한 경우에 해당하는 제네릭 타입 'T'로 디코딩된 값. 'response'라는 이름으로 해당 값 참조 

- 'response' 객체를 통해 서버 응답을 확인하고 성공(success = true)한 경우 위와 같이 네비게이션 컨트롤러로 화면 이동을 한다던지, UI 컨트롤 가능 

- 'response.sucess'의 값이 false인 경우 (실패) 'response.message'를 출력하고 실패한 메시지를 UIAlertController를 사용하여 팝업으로 표시 

 

 

- 'case .failure (let error)' : 'response.result' 가 실패한 경우 'let error' 를 에러 객체로 사용하며 'error'라는 이름으로 해당 값 참조

- "서버 통신 실패" 메시지를 출력하고 UIAlertController를 사용하여 실패 메시지를 팝업으로 표시 

 

 

 

 

 

* Get Method

func getAlamofire() {
    AF.request("http://43.200.179.53:3000/add", method: .get, parameters: nil, headers: nil)
        .validate()
        .responseDecodable(of: AlamofireResponse.self) { [self] response in
            // 처리 로직
        }
}

- Post 방식이 아닌 Get 메서드를 사용하면 일반적으로 'parameters' 파라미터를 받지 않은 형태로 작성

- 'parameters' 파라미터를 'nil'로 설정하고 요청