[iOS] Networking for Web Server

Seonhu Kim·2023년 4월 2일
0

iOS

목록 보기
9/16
post-thumbnail

이번에는 네이티브 앱에서 웹과 통신하는 방법을 정리하고자 한다. 요즘 대부분의 앱은 하이브리드 앱의 형태로 배포하고 있다. 가장 큰 이유는 네이티브 앱 배포까지의 많은 시간이 걸리기 때문이다. 보통의 경우 소스를 아카이빙하고, 테스트플라이트(내부 QA 진행)에 등록 후 앱스토어(Apple)에 심사까지 1~2일의 시간이 걸린다.

  • 대부분의 모바일 앱은 최신 데이터를 제공해야 함 → 앱을 배포한 이후에 웹서버와의 통신을 통해 필요한 데이터를 지속적으로 받을 수 있음
  • 네트워크 통신(HTTP)를 통해 웹서버의 데이터를 json, xml 형태로 받아서 출력 → 실시간으로 필요한 데이터를 웹서버를 통해 받아옴

RESTful 방식

보통 웹서버와 통신을 위해 RESTful 방식을 많이 사용한다. SOAP 또는 GraphQL 등 다양한 통신 방법이 있으나 이번에는 RESTful 위주로 정리해보고자 한다. (나중에 RESTful, GraphQl, SOAP 방식을 비교해보겠음...)

  • REST(Representational State Transfer)은 분산 하이퍼 미디어 시스템을 위한 소프트웨어 아키텍쳐의 한 형식 HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미
  • 즉, REST는 데이터를 HTTP 프로토콜을 바탕으로 별도의 규약 없이 간단하게 주고받기 위한 간단한 형식의 인터페이스

RESTful API 메서드 종류

  • GET : 특정 리소스의 대표적 정보를 요청
  • POST : ID 없이 리소스를 생성하거나 수정할 때
  • PUT : ID 기반으로 리소스를 생성하거나 수정할 때
  • DELETE : 리소스를 삭제할 때

JSON(JavaScript Object Notation)

위에 설명한 RESTful 방법으로 웹서버와 HTTP 규약을 가지고 통신을 하게 되는데, 외부 API 호출할 때, JSON 형태의 데이터를 요청하고 응답받게 된다. JSON은 아래와 같은 특징을 가지고 있다.

  • XML은 태그로 구성된 마크업 형식을 기본 규격으로 사용하므로 플랫폼에 의존적이지 않은 표준 데이터를 제공할 수 있다는 장점이 있음 → But 주고 받아야할 전체 데이터의 용량이 커진다는 단점 존재
  • JSON은 자바스크립트에서 시작되었지만, C, Java, Python과 같은 다양한 언어에서 쉽게 사용할 수 있는 텍스트 기반의 데이터 구조
  • {데이터 키 : 데이터 내용} 형태로 이루어지는 순서 없는 집합형 구조
  • [ … ] 형태로 이루어지는 순서화된 리스트 구조

웹서버와 통신하기 위한 환경 셋팅

  • iOS 9.* 부터 외부 네트워크 관련 보안 규칙이 신설됌 → HTTPS를 사용하지 않는 웹서버와 통신하는 경우 ATS(App Transport Security)가 추가되어 HTTP 프로토콜 기반으로 사용하려면 Info.plist 파일을 오픈해서 위 코드를 추가함

웹서버와 통신을 위한 메서드

  • URLSession 클래스 : HTTP의 핵심은 관련 데이터를 검색하기 위한 일련의 요청과 응답 세션 → URLSession 클래스를 사용해서 HTTP 세션을 관리
  • URLRequest 구조체 : URL, HTTP 메서드(GET, POST), HTTP 헤더 등을 캡슐화
  • URLSessionDataTask 클래스 : 실제 데이터 전송을 수행 → resume() 메서드를 호출해야 작업이 실행됌

GET 방식으로 호출

  1. URL 객체 정의 : URL주소를 감싼 URL 객체를 생성 (가드렛 바인딩)
  2. URLRequest 객체를 정의하고 요청 내용을 담음 → “GET” 방식을 여기서 지정함
  3. HTTP 요청 메세지 헤더를 세팅 → Content-Type을 “application/json”으로 지정
  4. URLSession 객체에 요청 객체를 담아 전송 준비를 하고 응답값을 받아서 처리할 클로저 구문 작성 → URLSession.shared.dataTask(with:)구문 사용
  5. HTTP 통신은 비동기로 이루어지기 때문에 응답값을 받아서 처리하는 것은 클로저로 작성
  6. 서버로 전송해서 API를 호출함 → task.resume()메서드를 호출해야 요청이 서버로 전달됌

  • JSON 데이터를 처리하는 메서드

Alamofire는 스위프트 기반 Http 네트워킹 라이브러리로 Apple의 Foundation networking 기반으로 인터페이스를 제공하여 일반적인 네트워킹 작업을 단순화할 수 있다. (코드의 가독성을 살리고, 간결하게 작성할 수 있음)

profile
iOS Developer.

0개의 댓글