iOS - 꼼꼼한 재은씨 Swift 기본편(4_네트워크 통신과 API)

이한솔·2023년 11월 22일
0

iOS 앱개발 🍏

목록 보기
29/49

네트워크 통신의 종류

소켓 방식의 연결성 통신

보통 저수준 통신을 구하여 구현한다. 전구가 결합하는 소켓의 개념을 따온 소켓 방식의 연결은 일단 앱과 서버가 연결되면 한쪽에서 명시적으로 끊을 때까지 지속해서 연결을 유지하는 방식이다.
연결이 이루어진 단계, 연결이 유지되고 있는 단계, 연결이 종료된 단계 등으로 연결 상태를 각각 구분할 수 있어서 각 단계에 따라 적절하게 대응하는 방식으로 프로그래밍하는 것이 일반적이다.
연결을 종료하기 전까지는 한번 연결된 통신을 계속 유지하므로 재연결할 필요 없이 원하는 만큼 빠르게 메세지를 주고받을 수 있다. 하지만 네트워크 대역을 많이 소모하고 서버 부하도 크다는 단점때문에 네트워크 환경이 고르지 않은 모바일 서비스에서는 메신저나 화상통화, RPG 게임 등에서만 제한적으로 사용되기도 한다. TCP 연결데이터 유실을 방지하고 완전한 전송을 보장하지만 상대적으로 느리고, UDP 연결데이터의 완전한 전송을 보장하지 않지만 상대적으로 빠르다.

프로토콜을 이용한 비연결성 통신

프로토콜을 사용하여 메세지를 주고받는 방식이다. 대표적으로 HTTP, HTTPS 프로토콜이 있다. 연결을 유지하지 않아서 요청이 들어오면 이에 맞는 응답을 보낸 후 바로 연결을 종료하고 다시 요청을 하기 위해서는 새롭게 연결을 맺어야 한다.
매번 요청할 때마다 연결해야 하므로 소켓 방식에 비해 상대적으로 속도에 제약이 있지만 네트워크 대역 소모를 줄일 수 있고, 서버 부하도 낮출 수 있어서 범용적인 모바일 서비스에 많이 사용한다.
동일한 HTTP, HTTPS 프로토콜을 사용하지만 일반 HTML을 제공하는 웹페이지와 달리 데이터만을 주고받을 수 있도록 설계된 모듈을 웹서비스라고 부른다. 웹서비스는 다시 아키텍처 구조에 따라 SOAP과 RESTful방식으로 나눌 수 있고, 데이터 타입에 따라서는 XML과 JSON방식으로 나눌 수 있다.



아키텍처 구조에 따른 웹서비스

SOAP 방식

SOAP(Simple Object Access Protocol)은 일반적으로 널리 알려진 HTTP, HTTPS, SMTP 등의 프로토콜을 통해 양쪽에서 XML 형태의 메세지를 주고받도록 구현된 프로토콜이다. 웹서비스에서 메세지를 전달할 때 몇가지 형태의 메세지 패턴 중에서 원격 프로시저 호출(Remote Procedure Call : RPC)라고 불리는 클라이언트-서버 구조의 메세지 패턴을 많이 사용하여, 이때 통신 구조는 Envelope/Header/Body의 세가지 영역으로 구분할 수 있다.

RESTful 방식

RESTful의 근간이 되는 REST(Representational State Transfer)는 월드 와이드 웹(WWW)과 같은 분산 하이퍼 미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다. REST는 실직적인 네트워크 프로토콜은 아니고 단순히 네트워크 자원을 정의하고 자원에 대한 주소를 관리하는 방식이다. REST란 웹 형식을 빌어 데이터를 전송하되, SOAP나 쿠키 등 별도의 전송 프로토콜 없이 전송하기 위해 만들어진 간단한 형식의 인터페이스이다. 이같은 REST 원리를 따라 구현된 시스템을 RESTful이라는 용어로 지칭한다.

RESTful 시스템은 일반적으로 서버에게 요청하려는 정보를 URI를 통해서 나타낸다. 서버 측에서 제공하는 웹서비스나 콘텐츠의 성격에 따라 URI 구성과 주고받는 데이터의 형식은 달라질 수 있다. 따라서 데이터를 받기 위해서는 서버에서 요구하는 형식에 따라 요청 규격을 정확하게 맞춰야한다.

RESTful API와 HTTP 전송 방식

일반적으로 서버에 요청하는 정보의 타입은 쓰기(Create), 읽기(Read), 수정(Update), 삭제(Delete) 네가지로 구분된다.
RESTful API를 구성한다면 CRUD의 요청을 처리하기 위해 각각 URI 계층이 필요한데 URI 구성 권고에 따르면 URI에는 정보의 동작에 관한 명세는 포함하지 않고 정보의 분류 체계만 포함되는것이 좋다. 대신 HTTP 메소드를 사용하여 액션을 구분할 것을 권장한다.

일반적으로 웹에서 사용되는 HTTP 메소드의 종류는 GET, POST 두가지이다. 크롬, 사파리, 인터넷 익스플로러 등을 통해 사용할 수 있는 전송 방식은 두가지이지만 RESTful API에서 정의하고 있는 HTTP 메소드의 종류는 GET, POST, PUT, DELETE, HEAD, OPTIONS 등 다양하다. URI 헤더에 이 메소드를 사용해서 동작을 정의해 액션을 구분할 수 있다.

대부분의 서버는 RESTful API형식으로 데이터를 제공하도록 설계되어 있고, 개발자는 서버에서 작성해놓은 URI 명세에 따라 원하는 요청을 식별할 수 있도록 URI를 구성해 보내기만 하면 사용할 수 있다.

💡 헤더란?
주고 받아야 할 데이터 이외에 시스템적인 필요에 의해 주고받는 부가적인 정보가 작성되는 영역, 주고 받는 데이터가 작성되는 영역은 바디나 본문이라고 부른다. 헤더바디는 HTTP 표준 프로토콜에 의해 명확한 형식으로 구분된다.



데이터 타입에 따른 웹서비스

XML 방식

SOAP, RESTful API 모두 XML 방식으로 만들어진 결과를 제공할 수 있다.
XML(Extensibla Markup Language)는 W3C에서 특수 목적의 마크업 언어를 만드는 데에 권장하는 다목적 마크업 언어이다. 서로 다른 시스템에서 인터넷을 통해 데이터를 쉽게 주고받을 수 있도록 HTML의 한계를 극복할 목적으로 만들어졌으며, 임의의 자료 구조를 표현하는데 편리하다. 일반적으로 태그(Tag)라고 불리는 마크업과 내용으로 구성된다.

시작 태그: <element>
끝 태그: </element>
빈 요소 태그: <element/>

시작 태그와 끝 태그는 서로 짝을 이루고 있어서, 시작 태그로 시작하여 짝이 되는 끝 태그로 끝나거나 빈 요소 태그만으로 이루어지기도 한다. 시작 태그와 끝 태그 사이에는 마크업이 아닌 문자열로 내용이 작성될 수도 있고, 하위 계층을 이루는 태그 쌍이 포함될 수도 있다. 이로 인해 데이터의 계층 구조가 만들어진다.

JSON 방식

XML은 태그로 구성된 마크업 형식을 기본 규격으로 사용하므로 플랫폼에 의존적이지 않은 표준 데이터를 제공할 수 있다는 장점이 있지만 데이터의 의미를 전달하기 위해 마크업 태그를 사용하므로 주고받아야 할 전체 데이터의 용량이 지나치게 커진다는 단점이 있다. 이러한 단점을 극복하기 위해 만들어진 경량의 데이터 교환 형식이 JSON(JavaScript Object Notation)이다. 자바스크립트 언어에서 객체의 속성을 표현하기 위한 방법으로 처음 사용하기 시작했지만 쉽고 간결한 표현 능력 덕분에 C언어나 Java, Perl, Python 등 다수의 프로그래밍 언어에서도 지원되는 대표적인 텍스트 기반 데이터 구조로 자리 잡았다.

JSON에서 사용되는 데이터 구조

JSON 객체

{ 키 : 데이터 } 형태로 이루어진 사전식 데이터 집합, 여러가지 속성을 다양하게 정의할 수 있다. 복잡한 구조의 데이터를 그룹으로 묶어 계층화할 수 있어서 높은 수준으로 구조화된 데이터를 만들 수 있다는 장점이 있다.

{ 
  "title" : "미니언즈" , 
  "description" : "미니언들의 이야기" , 
  "openData" : "2023-05-01" , 
  "thumbnail" : "미니언즈.jpg" ,
  "rating" : {
      "20age" : 8.74 ,
      "30age" : 7.56 ,
      "40age" : 9.32 ,
   } ,
 }

JSON 배열

[ 데이터 ]형태의 리스터 데이터, 문자열이나 숫자, 논리값이나 JSON객체나 JSON 배열 자체를 나열할 수도 있다. JSON 배열 내부에 들어가는 항목을 아이템이라고 한다.

// JSON 배열-숫자 나열
[ 1, 3, 5, 7, 9 ]

// JSON 배열-JSON 배열 나열
[
  [ "a", "b", "c" ] ,
  [ "d", "e", "e" ]
]

// JSON 배열-JSON 객체 나열
[ 
   { title : "미니언즈1" } ,
   { title : "미니언즈2" } 
]

반드시 모든 JSON 객체의 항목이 같아야 하는건 아니다.

[ 
   { title : "미니언즈1" } ,
   { title : "미니언즈2", "desciption" : "미니언즈 이야기" } 
]

이렇게 사용할 수도 있지만 통일되지 않은 항목을 나열한 구조는 데이터를 받아 파싱할때 "desciption" 항목이 있을 때와 없을 때를 구분해서 처리해야되기 때문에 좋은 구조가 아니다. 아래와 같이 항목을 맞춰 주는 것이 좋다.

[ 
   { title : "미니언즈1", "description" : "" } ,
   { title : "미니언즈2", "desciption" : "미니언즈 이야기" } 
]

목록 형태의 데이터를 제공하는 경우에 단순히 JSON 배열만 전달하기보다 데이터의 전체 개수나 종류 등에 대한 메타 정보를 함께 제공해야 할 때가 있는데, JSON 객체로 메타 정보를 구성하고, JSON 배열을 넣어 아래와 같은 형태로 만들 수 있다.

{
   "listTotalCount" : 3,
   "section" : "movie",
   "row" : [
   {
     "title" : "미니언즈" ,
     "description" : "미니언즈 이야기" ,
   } ,
   {
     "title" : "베트맨" ,
     "description" : "" ,
   } 
   ]
}   

JSON 배열이 JSON객체의 row 항목 하위에 포함되어있다. 이런 JSON 데이터 형식을 파싱해서 데이터를 분석해 주고받을 수 있다.

0개의 댓글