Swift를 사용한 네트워킹 기초: API 호출과 JSON 파싱 방법

작성일 :

Swift를 사용한 네트워킹 기초: API 호출과 JSON 파싱 방법

Swift는 iOS 및 macOS 애플리케이션을 개발하는데 널리 사용되는 언어입니다. 그 중 네트워킹은 거의 모든 애플리케이션에서 필수적인 부분입니다. 이 글에서는 Swift를 사용하여 네트워크 요청을 수행하고 서버에서 가져온 JSON 데이터를 파싱하는 방법에 대해 설명합니다.

HTTP 요청 기본 이해

네트워크 요청을 이해하기 전에 먼저 HTTP 프로토콜에 대해 간략히 살펴보겠습니다. HTTP는 클라이언트와 서버 간의 데이터 통신을 위한 프로토콜입니다. 클라이언트는 서버에 요청을 보내고, 서버는 해당 요청에 대한 응답을 제공합니다. 가장 일반적인 HTTP 메서드는 다음과 같습니다.

  • GET: 리소스를 가져옵니다.
  • POST: 리소스를 생성합니다.
  • PUT: 리소스를 갱신합니다.
  • DELETE: 리소스를 삭제합니다.

이제 Swift에서 HTTP 요청을 수행하는 방법을 알아보겠습니다.

URLSession을 사용한 네트워크 요청

Swift에서 네트워크 요청을 수행하기 위해 가장 많이 사용되는 클래스는 URLSession입니다. URLSession 클래스는 세션을 관리하고, 데이터 전송 작업을 담당합니다. 다음은 GET 요청을 보내는 간단한 예제입니다.

swift
import Foundation

let url = URL(string: "https://api.example.com/data")!
var request = URLRequest(url: url)
request.httpMethod = "GET"

let session = URLSession.shared
let task = session.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        print("Error: \(error?.localizedDescription ?? "Unknown error")")
        return
    }

    if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
        print("Success: Data received")
        // JSON 파싱 처리
    } else {
        print("Server error")
    }
}

task.resume()

위 코드는 dataTask 메서드를 사용하여 비동기적으로 GET 요청을 보내고, 서버의 응답을 처리합니다. 성공적으로 데이터를 수신한 경우, JSON 파싱 작업을 진행할 수 있습니다.

JSON 데이터 파싱

서버에서 받은 데이터는 일반적으로 JSON 형식으로 되어 있는 경우가 많습니다. Swift에서는 JSONSerialization 클래스와 Codable 프로토콜을 사용하여 JSON 데이터를 파싱할 수 있습니다.

JSONSerialization을 사용한 파싱

JSONSerialization 클래스를 사용하면 JSON 데이터를 딕셔너리 형태로 변환할 수 있습니다. 다음은 JSON 데이터를 파싱하는 예제입니다.

swift
let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
if let json = json {
    print("JSON: \(json)")
}

이 방법은 간단하지만, JSON 데이터의 구조가 복잡할 때는 코드가 지저분해 질 수 있습니다. 이러한 단점을 보완하기 위해 Swift에서는 Codable 프로토콜을 제공합니다.

Codable 프로토콜을 사용한 파싱

Codable 프로토콜을 사용하면 JSON 데이터를 쉽게 구조체나 클래스에 매핑할 수 있습니다. 다음은 Codable 프로토콜을 사용한 예제입니다.

swift
struct User: Codable {
    let id: Int
    let name: String
    let email: String
}

let decoder = JSONDecoder()
if let user = try? decoder.decode(User.self, from: data) {
    print("User ID: \(user.id)")
    print("User Name: \(user.name)")
    print("User Email: \(user.email)")
}

이 예제에서는 서버에서 받은 JSON 데이터를 User 구조체에 매핑하여 데이터를 손쉽게 다룰 수 있게 합니다.

API 호출과 JSON 파싱의 실제 예제

이제 실제로 API 호출과 JSON 파싱을 통합하여 예제를 만들어 보겠습니다. 예제로, 가상의 사용자 정보를 가져오는 API를 호출하고, 해당 정보를 파싱하는 간단한 애플리케이션을 작성해 보겠습니다.

swift
import Foundation

struct User: Codable {
    let id: Int
    let name: String
    let email: String
}

func fetchUserData(completion: @escaping (User?) -> Void) {
    let url = URL(string: "https://api.example.com/user")!
    var request = URLRequest(url: url)
    request.httpMethod = "GET"

    let session = URLSession.shared
    let task = session.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print("Error: \(error?.localizedDescription ?? "Unknown error")")
            completion(nil)
            return
        }

        let decoder = JSONDecoder()
        if let user = try? decoder.decode(User.self, from: data) {
            completion(user)
        } else {
            completion(nil)
        }
    }

    task.resume()
}

fetchUserData { user in
    if let user = user {
        print("User ID: \(user.id)")
        print("User Name: \(user.name)")
        print("User Email: \(user.email)")
    } else {
        print("Failed to fetch user data")
    }
}

이 코드는 URLSession을 활용하여 GET 요청을 보내고, 받은 JSON 데이터를 User 구조체에 매핑한 후, 해당 데이터를 출력하는 간단한 네트워킹 예제입니다.

마무리

Swift를 사용한 네트워킹의 기초를 이해하고, HTTP 요청을 보내고 JSON 데이터를 파싱하는 방법을 배웠습니다. URLSession 클래스를 이용하여 네트워크 요청을 관리할 수 있으며, JSONSerializationCodable 프로토콜을 통해 JSON 데이터를 효율적으로 파싱할 수 있습니다. 이 기초 지식을 토대로 더 복잡한 네트워킹 작업을 수행할 수 있습니다.