Alamofire는 네트워크 통신을 간편하게 처리하도록 설계된 라이브러리다.
이전에 URLSession으로 과제를 진행했었는데, 코드가 적어서 사용해보고 싶었는데 가독성이 좋다고 느끼고 이해하기가 쉬워서 좋았다.
웹에서 Axios를 사용해서 코드의 가독성을 높여주는 편리함 때문에 처음 라이브러리를 적용했던 생각이 났다.
import Alamofire
func fetchMovies(category: MovieCategory, page: Int = 1, completion: @escaping (Result<MovieResponse, Error>) -> Void) {
let url = "\(baseURL)\(category.rawValue)"
let parameters: [String: String] = [
"api_key": apiKey,
"language": "ko-KR",
"page": "\(page)"
]
AF.request(url, method: .get, parameters: parameters)
.validate()
.responseDecodable(of: MovieResponse.self) { response in
switch response.result {
case .success(let movieResponse):
completion(.success(movieResponse))
case .failure(let error):
completion(.failure(error))
}
}
}
}
URLSession은 Swift 기본 네트워킹 API로 직접 구현하면 이렇게 해야한다. 조금 번거롭고 코드가 복잡해진다.
import Foundation
func fetchMoviesURLSession(completion: @escaping (Result<MovieResponse, Error>) -> Void) {
let urlString = "https://api.themoviedb.org/3/movie/popular?api_key=apiKey&language=ko-KR&page=1"
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(error))
return
}
guard let data = data else {
completion(.failure(NSError(domain: "DataError", code: -1, userInfo: nil)))
return
}
do {
let movieResponse = try JSONDecoder().decode(MovieResponse.self, from: data)
completion(.success(movieResponse))
} catch {
completion(.failure(error))
}
}.resume()
}
| 비교 항목 | Alamofire | URLSession |
|---|---|---|
| 학습 곡선 | 쉬움. 사용이 간편하고 직관적임 | 비교적 복잡. 코드량이 많아짐 |
| 코드 간결성 | 매우 간결함 (AF.request 한 줄이면 끝) | 네트워크 요청, 파싱 코드 직접 작성 |
| 추가 기능 | 자동 리트라이, 캐싱, 인코딩, 멀티파트 지원 | 기본 기능 제공 (확장 시 코드 필요) |
| 의존성 | 외부 라이브러리 (Alamofire 설치 필요) | 내장 라이브러리 (추가 설치 불필요) |
| 에러 핸들링 | 쉽게 구현 가능 (.validate()) | 수동으로 HTTP 상태 코드 처리 |
| 커스터마이징 | 커스터마이징 옵션 제공 | 원하는 대로 세밀하게 설정 가능 |
| 테스트 및 유지보수 | 단순하고 유지보수 쉬움 | 테스트가 번거롭고 코드가 복잡해짐 |
| 성능 및 경량화 | 약간의 오버헤드 (라이브러리 사용) | 가장 가벼움 (Swift 내장 기능 사용) |
| 커뮤니티 및 지원 | 활발한 커뮤니티와 문서 제공 | 공식 Apple 문서만 참조 가능 |
추천 상황
추천 상황