iOS의 Network




개요


앱과 서버 간 네트워크 통신이 이루어지는 방식은 크게 두가지가 있다.

TCP/UDP를 사용하는 소켓방식의 연결성 통신과 HTTPS, SMTP를 이용한 비연결성 통신이다.

이에 대해 알아보자.




소켓 방식의 연결 지향 통신


소켓을 이용한 네트워크 통신 방식은 로우레벨 통신을 통해 구현된다.

연결을 명시적으로 종료하기 전까지는 재연결할 필요 없이 원하는 만큼 빠르게 메시지를 주고받을 수 있다.

네트워크 대역을 많이 소모하고, 서버 부하도 크다는 단점 때문에 모바일에서는 메신저, 화상통화와 같이 제한적으로 사용된다.




비연결 지향 통신


대표적으로 HTTP/HTTPS 프로토콜이 있는데, 요청이 들어오면 이에 맞는 응답을 보낸후 연결을 끊는다.

비연결이라는 것은 연결을 하지 않는다는 뜻이 아니라, 연결을 유지하지 않는 것을 의미한다.

비연결 통신은 요청할 때마다 연결하는 작업이 필요하므로 느리다.

동일한 HTTPS 프로토콜을 사용하지만 일반 HTML을 제공하는 웹페이지와 달리, 데이터만을 주고받을 수 있도록 설계된 모듈을 웹서비스라고 부른다.

웹서비스는 구조에 따라 SOAP와 RESTful 방식으로 나눌 수 있고, 데이터 타입에 따라서는 XML, JSON 방식으로 나눌수 있다.




SOAP


Simple Object Access Protocol의 약자로 일반적으로 사용하는 HTTPS등의 프로토콜을 통해 양쪽에서 XML 형태의 메시지를 주고받도록 구현된 프로토콜이다.

SOAP는 웹서비스에서 메시지를 전달할 때 몇가지 형태의 메시지 패턴 중에서 원격 프로시저 호출이라고 불리는 클라이언트 서버 구조의 메시지 패턴을 사용한다.

이때 통신 구조는 Envelope/Header/Body로 나눌 수 있다.

SOAP의 장점은 다음과 같다.

  1. SOAP를 사용한 HTTP는 기존 원격 기술들과 달리 방화벽이나 프록시와 관계없이 쉽게 통신이 가능하다.
  2. SOAP의 표준 전송 프로토콜은 HTTP이지만 이외에도 사용할 수 있는 프로토콜이 다양하다.
  3. 플랫폼 독립적인 통신이므로 시스템이 바뀌거나 이기종 플랫폼 간의 데이터 통신이 편리하다.
  4. 프로그래밍 언어에 종속되지 않는다.
  5. 간단하고 확장이 용이하다.




RESTful 방식


RESTful의 바탕이 되는 REST(Representational State Transfer)는 WWW과 같은 분산 하이퍼 미디어 시스템을 위한 소프트웨어 아키텍처이다.

REST는 네트워크 프로토콜이라기보다 네트워크 자원을 정의하고 자원에 대한 주소를 관리하는 방법에 가깝다.

REST는 HTTP을 바탕으로 필요한 데이터를 별도의 규약 없이 주고 받기만 하면된다.

이러한 REST의 원칙을 따른 시스템을 RESTful이라고 부른다.

RESTful 시스템은 네트워크 서버로만 통신하는게 아니라 일반적인 웹서버로도 구현이 가능해 많이 사용된다.

RESTful 시스템은 보통 URL을 통해서 나타낸다.

서버측의 데이터에 따라 URI구성과 주고받는 데이터의 형식도 달라진다.

따라서 데이터를 받기 위해서는 서버에서 요구하는 형식에 따라 요청 규격을 정확하게 맞춰야한다.

이러한 규격을 맞춘 데이터를 주고받는 방식을 RESTful API라고 부른다.




RESTful 전송 방법


일반적으로 서버에 요청하는 정보의 타입은 CRUD로 구분된다.

Create, Read, Update, Delete의 약자이다.

데이터를 단순히 받아올 때는 Read만 요청하지만 채팅이나 SNS와 같이 서버가 필요한 작업은 CRUD를 모두 사용하는 경우가 많다.

URI에는 어떤 계층의 어떤 데이터라는 정보만 기재한다.

웹에서 사용되는 HTTP 메서드의 종류는 GET과 POST 두가지이다.

데이터를 요청하려면 GET을 사용하고, 데이터를 전송하려면 POST를 사용한다.

GET으로도 할 수 있지만 URL 뒤에 데이터를 줄줄이 붙여서 전송하는 형식이기 때문에 URL이 복잡하며 1024바이트 이상 못보낸다.

URI에 CRUD 동작을 포함하는 대신, URI 헤더에 이들 메서드들을 사용하여 동작을 정의하는 것으로 처리한다.




XML 데이터 포맷


SOAP 방식의 요청이나 RESTful API 모두 XML 방식을 지원한다.

Extensible Markup Language의 약자로 서로 다른 시스템에서 인터넷으로 데이터를 쉽게 주고받기 위해 만들어졌다.

XML 형식의 마크업으로 전달된 데이터는 그대로 사용할 수 있는 것이아니라 데이터 파싱을 통해 형식에 맞게 재가공해야한다.




JSON 데이터 포맷


XML은 데이터의 의미를 전달하기 위해 마크업 태그를 사용하므로 주고받아야 할 전체 데이터의 용량이 지나치게 커진다는 단점이 있다.

이 단점을 극복하기 위해 만들어진 것이 JSON이다. JavaScript Object Notation의 약자로 처음에는 JS에서 객체의 속성을 표현하기 위해서 사용했다.

JSON의 데이터 구조는 JSON 객체와 JSON 배열로 나눌 수 있다.



JSON 객체


JSON 객체는 키 : 데이터 형태로 이루어져있고 여러 속성을 정의하는 순서없는 집합인 딕셔너리타입의 데이터 집합이다.

JSON은 가독성이 떨어진다는 단점이 있다.

그러나 복잡한 데이터 구조를 그룹으로 묶어 계층화 시킬 수 있다는 장점이 있다.

1
2
3
4
{
"title" : "스위프트",
"difficulty" : "hard",
}



JSON 배열


JSON 배열은 순서가 있는 값들의 집합이다.

1
2
3
4
[
[1, 3, 5, 7, 9],
[2, 4, 6, 8, 10]
]