[swift] SwiftGen과 함께 사용하는 서버 통신 처리

이번 포스트에서는 SwiftGen이 제공하는 강력한 코드 생성 기능과 함께 서버 통신을 처리하는 방법에 대해 알아보겠습니다.

SwiftGen 소개

SwiftGen은 Xcode 프로젝트의 리소스 관리를 돕는 도구로, 코드를 통해 리소스에 접근할 수 있는 강력한 기능을 제공합니다. 주로 이미지, 색상, 폰트 등의 리소스를 사용할 때 유용하며, 코드의 가독성과 유지보수성을 향상시켜줍니다.

SwiftGen을 사용하려면 먼저 CocoaPods 또는 Swift Package Manager를 통해 프로젝트에 SwiftGen을 추가해야 합니다. 추가한 후에는 SwiftGen의 명령어를 사용하여 리소스를 코드로 변환해줍니다.

서버 통신 처리

SwiftGen과 함께 서버 통신을 처리하려면 다음과 같은 단계를 따를 수 있습니다:

  1. API 엔드포인트 정의
  2. SwiftGen을 사용하여 API 엔드포인트를 코드로 생성
  3. Alamofire 또는 URLSession을 사용하여 서버에 요청을 보내고 응답을 처리

1. API 엔드포인트 정의

먼저 서버와 통신할 API 엔드포인트를 정의해야 합니다. 예를 들어, 사용자 정보를 요청하는 API 엔드포인트라고 가정해봅시다.

enum APIEndpoint {
    case userInfo(userId: String)
    
    var path: String {
        switch self {
        case .userInfo(let userId):
            return "/users/\(userId)"
        }
    }
}

2. SwiftGen을 사용하여 API 엔드포인트를 코드로 생성

이제 정의한 API 엔드포인트를 SwiftGen을 사용하여 코드로 생성합니다. SwiftGen은 템플릿 파일을 사용하여 리소스를 코드로 변환해주는 기능을 제공합니다.

swiftgen templates add apiEndpoint=path.swift
swiftgen config run swiftgen.yml

위 명령어를 실행하면 APIEndpoint+Path.swift 파일이 생성되고, API 엔드포인트에 대한 코드가 자동으로 생성됩니다.

3. Alamofire 또는 URLSession을 사용하여 서버에 요청 보내고 응답 처리

이제 생성된 API 엔드포인트 코드를 사용하여 서버에 요청을 보내고 응답을 처리할 수 있습니다. Alamofire나 URLSession을 사용하여 서버에 통신하는 코드를 작성합니다.

import Alamofire

func fetchUserInfo(userId: String, completion: @escaping (Result<User, Error>) -> Void) {
    let endpoint = APIEndpoint.userInfo(userId: userId)
    AF.request(endpoint.path).responseDecodable { (response: AFDataResponse<User>) in
        switch response.result {
        case .success(let user):
            completion(.success(user))
        case .failure(let error):
            completion(.failure(error))
        }
    }
}

위 코드에서는 Alamofire를 사용하여 API 엔드포인트에 대한 요청을 보냅니다. 응답은 AFDataResponse<User> 형태로 받아서 처리하고, 성공 및 실패에 대한 결과를 completion 핸들러를 통해 전달합니다.

마무리

이번 포스트에서는 SwiftGen과 함께 서버 통신을 처리하는 방법에 대해 알아보았습니다. SwiftGen을 사용하여 API 엔드포인트를 코드로 생성하고, Alamofire를 통해 서버에 요청을 보내는 방법을 살펴보았습니다. SwiftGen을 활용하면 코드의 가독성과 유지보수성을 높일 수 있으며, 서버 통신 처리도 더 효율적으로 할 수 있습니다.