[iOS][Swift] iOS 숙련 강의 - 3

팔랑이·2024년 7월 11일

iOS/Swift

목록 보기
45/83

iOS 숙련강의 목차

1) ViewController 생명주기
2) 메모리 관리 이해
3) Core Data 와 UserDefaults
4) 네트워크 통신 이해
5) 날씨 앱 만들기

1, 2에 관련한 내용은 여기
3은 여기


2-4. 네트워크 통신 이해

Json과 Codable

해당 내용은 이 문서를 참고!

API

: 서버와 소통하게 해주는 인터페이스

  • API에 내가 요청을 넣으면 API Request
  • 그 요청의 결과를 받으면 API Response

API 명세를 잘 읽고, 적절한 API Request를 넣으면 된다.

URL 구조

URL은 복잡해보이지만 구조를 가지고 있다.

  • URL (Uniform Resource Locators): 웹에서 특정 위치를 나타내는 주소.
  • Protocol: http, https → 인터넷 통신 규약을 의미.
  • Domain: 자원이 위치한 서버(컴퓨터)의 이름. 예를 들어 google, naver 등. 해당 url 의 정체성을 나타낸다.
  • Port: 구체적으로 어떤 서버를 이용할지 번호로 결정. HTTP 의 경우 80. HTTPS 는 443.
  • Path: 서버에서 제공하는 자원의 경로를 나타냄.
  • Query: 자원에 대한 추가적인 매개변수를 전달하는 데 사용됨. 주로 key=value 형식으로 표현되며, 여러 개의 매개변수는 &로 구분.
  • Fragment: 자원 내에서 특정 부분을 가리킬 때 사용.

내 벨로그 주소를 예시로 알아보자.

위 사진을 보면 알겠지만 Port는 자주 생략된다고 한다.

REST API

: 전세계에서 대표적으로 널리 쓰이는 API 형식중 하나로, HTTP URL을 통해 자원을 명시한다.

HTTP 메서드 (HTTP Methods)

REST API는 HTTP 메서드를 통해 자원의 CRUD를 결정한다.

  • GET: 자원 조회 (Read)
  • Post: 자원 생성 (Create)
  • Put: 자원 업데이트 (Update)
  • Delete: 자원 삭제 (Delete)

URLSession

: Swift에서 서버와 URL로 통신하기 위해 제공되는 클래스

1. URLSessionConfiguration

URLSession으로 네트워크 통신하되, 여러가지 커스텀한 설정을 할 때 URLSessionConfiguration 이용
ex) 네트워크 통신 타임아웃 시간 설정, 캐시 정책 설정 등

다음과 같이 객체 생성 가능

let defaultUrlSession = URLSession(configuration.default)

2. URLSessionTask

URLSessionTask으로 통신할 때 어떤 태스크 수행할 것인지 결정 가능

  • URLSessionDataTask: GET 요청, 서버로부터 데이터 가져오거나 전송할 때 사용
  • URLSessionDownloadTask: 파일 다운로드시 사용, 백그라운드 다운로드 지원
  • URLSessionUploadTask: 파일 업로드시 사용, 백그라운드 업로드 지원

REST API, URLSession 예제코드

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }
    
    // 서버 데이터를 불러오는 메서드 선언
    private func fetchData() {
        
        let defaultUrlSession = URLSession(configuration: .default)
        
        guard let url: URL = URL(string: "https://reqres.in/api/users/1") else {
            print("URL is not correct")
            return
        }
        
        // URLRequest 설정
        var request: URLRequest = URLRequest(url: url)
        
        // GET 메소드 사용
        request.httpMethod = "GET"
        
        // json 데이터 형식임을 나타냄
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        // URLSession 생성 (기본 default 세션)
        let session: URLSession = URLSession(configuration: .default)

        // dataTask
        session.dataTask(with: request) { (data, response, error) in
		        // http 통신 response 에는 status code 가 함께오는데, 200번대가 성공을 의미.
            let successRange: Range = (200..<300)
            
            // 통신 성공
            guard let data, error == nil else { return }
            
            if let response: HTTPURLResponse = response as? HTTPURLResponse{
                print("status code: \(response.statusCode)")
                
                // 요청 성공 (StatusCode가 200번대)
                if successRange.contains(response.statusCode){
                    
                    // decode
                    guard let userInfo: ResponseData = try? JSONDecoder().decode(ResponseData.self, from: data) else { return }
                    print(userInfo)
                    
                } else { // 요청 실패 (Status code가 200대 아님)
                    print("요청 실패")
                }
            }
            
        }.resume()
    }
}

// 데이터 구조체 정의
struct UserData: Codable {
    let id: Int
    let email: String
    let firstName: String
    let lastName: String
    let avatar: URL
    
    // JSON 키와 구조체 프로퍼티 간의 매핑을 위해 CodingKeys 열거형 정의
    enum CodingKeys: String, CodingKey {
        case id
        case email
        case firstName = "first_name"
        case lastName = "last_name"
        case avatar
    }
}

// Support 구조체 정의
struct SupportData: Codable {
    let url: URL
    let text: String
}

// 최상위 구조체 정의
struct ResponseData: Codable {
    let data: UserData
    let support: SupportData
}
profile
정체되지 않는 성장

0개의 댓글