Swift

Swift - RESTful API

Goniii 2023. 6. 30. 16:34

* RESTful(Representational State Transfer) API 

- HTTP를 기반으로 한 웹 서비스 아키텍처 스타일 

- 자원을 고유한 식별자로 식별하고, HTTP 메서드를 사용하여 해당 자원에 대한 작업 수행 

- HTTP 프로토콜을 활용하기 때문에 웹의 장점을 최대한 활용할 수 있다

- HTTP 메소드, URI 만으로도 인터넷에 자료를 CRUD 할 수 있다.

 

 

 

* URI(Uniform Resource Identifier)

- URL(Uniform Resource Locator)의 상위 개념. 지원의 식별자

- 인터넷 상에서 리소스(문서, 이미지, 동영상 등)를 고유하게 식별하고 위치를 지정하는 통합된 형식의 실별자 

 

 

* CRUD

- Create(생성), Read(읽기), Update(갱신), Delete(삭제)의 4가지 기본 작업을 나타냄

- 데이터 조작 작업을 표현하는 약어 

 

 

 

* JSON(JavaScript Object Notation)

- 데이터를 효과적으로 교환하기 위한 경량의 데이터 형식

- 키(key)와 값(value)으로 구성된 쌍으로 데이터를 표현함

// JSON 블록
{
  "name": "John",
  "age": 30,
  "isStudent": true,
  "address": {
    "street": "123 Main St",
    "city": "New York"
  }
}

 

 

 

 

* URLSession 

- 네트워크 통신을 위한 API로서, iOS 및 macOS 개발 환경에서 사용 

- Foundation 프레임워크에서 제공하는 API로 iOS 앱과 서버 간에 데이터를 주고 받기 위해 사용

- HTTP를 비롯한 다양한 프로토콜을 지원하며, 데이터 통신을 관리하고 제어하는 기능을 제공 

- 웹 서버와의 통신, 데이터 다운로드, 업로드, RESTful API 호출 등을 수행하는 데 사용 

- Request, Response의 개념을 기본 구조로 구성 

 

Request 

- URL, 메서드(GET, POST, PUT 등), 헤더, 바디 등을 포함하여 서버에게 보냄

 

Response

- 서버로부터 받은 상태 코드, 헤더, 데이터 등을 포함하여 요청에 대한 응답을 반환 

 

 

 

 

 

1. URL 생성 

        // URL 생성, 농림 축산 식품 공공데이터 API 가져오기
        guard let url = URL(string: "http://YourAPI/openapi/sample/xml/Grid_20160624000000000348_1/1/5?AUCNG_DE=YourAPI"
        ) else {
            print("유효한 URL을 생성할 수 없습니다.")
            return
        }

- URLSession을 사용하여 데이터를 다운로드하기 위해 URL 생성

 

 

 

 

 

 

2. URL 세션 생성 

	  // URL 세션 생성
        let session = URLSession.shared

- URLSession.shared는 URLSession 클래스의 shared 속성을 사용하여 기본적인 URL 세션 인스턴스를 가져오는 방법

- URLSession.shared는 앱 전역에서 사용할 수 있는 공유 세션 인스턴스를 반환 

- 앱 내에서 다양한 네트워크 작업에 대한 공유 리소스를 사용함

- 이를 통해 세션 구성, 캐시, 쿠키, 인증 등의 설정을 공유하며, 앱 전반에서 일관된 네트워크 동작 보장 

 

 

 

 

 

 

 

3. 데이터 다운로드 작업 생성 

	 // 데이터 다운로드 작업 생성
        let task = session.dataTask(with: url) { (data, response, error) in
            // 네트워크 요청이 완료된 후 실행되는 클로저

- URLSession의 dataTask(with : completionHandler:) 메서드를 사용하여 데이터 다운로드 작업 생성 

- completionHandler 부분을 클로저를 사용

- data : 다운로드한 데이터를 나타내는 Data 객체

- response : 서버로부터 응답을 나타내는 URLResponse 객체

- error : 데이터 다운로드 중 발생한 오류를 나타내는 Error 객체 

- 클로저 내부에서는 매개변수를 사용하여 데이터 응답, 에러 등을 처리 

- 클로저를 사용하여 비동기 작업의 완료 후에 실행되는 코드를 정의함으로써, 네트워크 요청이 완료되었을 때 적절한 동작을 수행 

 

 

 

 

 

 

4. 에러 처리

	  // 에러 처리
            if let error = error {
                print("데이터 다운로드 중 에러 발생: \(error)")
                return
            }

- 클로저에서 에러를 확인하고 처리 

- 'if let error = error' 구문을 사용하여 'error' 변수가 nil이 아닌 경우, 즉 데이터 다운로드 중 오류가 발생한 경우를 확인 

- 에러가 발생한 경우 해당 에러를 출력하고 함수 실행 종료 

 

 

 

 

 

 

 

 

5. 응답 확인 

	// 응답 확인
            guard let httpResponse = response as? HTTPURLResponse,
                  (200...299).contains(httpResponse.statusCode) else {
                print("유효한 HTTP 응답이 아닙니다.")
                return

- 'guard let httpResponse = response as? HTTPURLResponse' 구문을 사용하여 'response'를 HTTPURLResponse로 타입 캐스팅 

- 타입 캐스팅에 성공하고, 상태 코드가 200~299 사이인지 확인

- 응답이 유효한 HTTP 응답이 아니거나, 상태 코드가 200~299 사이가 아닌 경우 "유효한 HTTP 응답이 아닙니다."를 출력하고 함수 종료

 

 

 

 

 

 

6. 데이터 확인

	// 데이터 확인
            if let data = data {
                // 데이터를 원하는 방식으로 처리합니다.
                // 예를 들어, JSON 데이터를 파싱하거나 파일로 저장할 수 있습니다.
                print("다운로드된 데이터: \(data)")
            }

- 'if let data = data' 구문을 사용하여 'data' 변수가 nil이 아닌 경우, 즉 데이터 다운로드된 경우를 확인 

- 데이터가 존재하는 경우 해당 데이터를 원하는 방식으로 처리

 

 

 

 

 

 

7. 작업 시작 

        // 작업 시작
        task.resume()

- 'task.resume()' 은 데이터 다운로드 작업을 시작하는 부분

- 'resume()' 메서드를 호출함으로써 URLSessionDataTask의 작업이 실행

- 이 메서드를 호출함으로써 URL 세션은 서버에 데이터를 요청하고 응답을 기다림

- 네트워크 요청은 비동기적으로 수행되므로, 작업이 백그라운드에서 실행되며 메인 스레드는 차단되지 않음

- 작업이 완료된 후엔 'completionHandler' 클로저가 실행되어 네트워크 요청 결과를 처리하게 됨 

 

 

 

 

 

8. 전체 코드 

//
//  ApiViewController.swift
//  PracticeSwift
//
//  Created by 이수현 on 2023/06/30.
//

import UIKit
import Foundation

class ApiViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // URL 생성, 농림 축산 식품 공공데이터 API 가져오기
        guard let url = URL(string: "http://YourAPI/openapi/sample/xml/Grid_20160624000000000348_1/1/5?AUCNG_DE=YourAPI"
        ) else {
            print("유효한 URL을 생성할 수 없습니다.")
            return
        }


        // URL 세션 생성
        let session = URLSession.shared

        // 데이터 다운로드 작업 생성
        let task = session.dataTask(with: url) { (data, response, error) in
            // 네트워크 요청이 완료된 후 실행되는 클로저

            // 에러 처리
            if let error = error {
                print("데이터 다운로드 중 에러 발생: \(error)")
                return
            }

            // 응답 확인
            guard let httpResponse = response as? HTTPURLResponse,
                  (200...299).contains(httpResponse.statusCode) else {
                print("유효한 HTTP 응답이 아닙니다.")
                return
            }

            // 데이터 확인
            if let data = data {
                // 데이터를 원하는 방식으로 처리합니다.
                // 예를 들어, JSON 데이터를 파싱하거나 파일로 저장할 수 있습니다.
                print("다운로드된 데이터: \(data)")
            }
            
        }
        
        

        // 작업 시작
        task.resume()
    }
    


}

 

 

 

 

 

 

 

참고 ) 
https://weekoding.tistory.com/7 

 

[Swift] 네트워크 통신(RESTful API, JSON, URLSession)

웹앱이 차지하는 비중이 점점 늘고 있는 추세이다. 따라서 네트워크 통신에 대한 기본적인 개념은 아주 중요할 것이다. 📂 RESTful(Representational State Transfer) API REST : 소프트 아키텍쳐의 한 양식. HT

weekoding.tistory.com