* 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
'Swift' 카테고리의 다른 글
Swift - 소프트웨어 아키텍처(MVC, MVVM) (0) | 2023.07.02 |
---|---|
Swift - UIAlertController (경고, 알림 등 팝업 창 표시) (0) | 2023.07.01 |
Swift - ViewControll의 LifeCycle (0) | 2023.06.29 |
Swift - iOS 앱의 라이프 사이클 (App's Life Cycle) (0) | 2023.06.29 |
Swift - Optional(옵셔널) (0) | 2023.06.28 |