[iOS] 내가 서버 통신(Networking) 진짜 알기 쉽게 정리해서 올려줄게 (HTTP, JSON, REST API)

2023. 11. 13. 22:01Swift, iOS Foundation

0️⃣ Intro: 내가 이 글을 쓰는 이유


다른 건 다 늘었어도 여전히 내가 왕초보의 마음과 실력을 가지고 있는 분야가 바로 서버 통신(Networking) 부분이다.

이 부분에 대한 공부가 그동안 부족하기도 했고,
뭔가 서버를 붙인다고 하는 게 선뜻 달갑지(?)만은 않다고 해야 하나. 괜스레 내가 겁을 먹게 되는 것 같더라.

Alamofire, Moya .. 등등 방법은 많고 예전에 글로 정리하기도 했지만, 2년이 지나면서 진짜 기억이 하나도 나지 않으면서 왕초보의 마음으로 정말 누구라도 이해하기 쉽게 정리해 보는 것이 이번 글의 목적이자 목표이다.

 

1️⃣ 서버 통신이 일단 뭔지 알아야겠지?


Networking이 처음에 어렵게 느껴지는 이유는 그 무엇보다도, 익숙하지 않은 용어가 한꺼번에 쏟아지기 때문이라 생각한다.

즉, 처음에 그 어려운 (사실, 어렵다기보다는 생소하다고 표현하는 것이 맞겠다.) 용어들에 대해서 머릿속에 꽉 잡고 개념을 들어가게 되면, "아 이 말이 이 뜻이구나"하면서 두려움이 조금 사라지게 될 것이니 집중력을 꽉 잡고 들어가 보자.

☑️ 서버 통신 (Networking)이란?

클라이언트(프론트엔드)와 서버(백엔드)가 서로 데이터를 주고받는 것이다.

화면을 보여주는 클라이언트에서 화면에 필요한 모든 데이터 (날씨 앱을 기준으로, 전 세계의 모든 날씨(지역별, 시간대별, 강수확률 등등) 데이터)를 갖고 있을 수도 있겠지만, 현실적으로 그 데이터들은 용량과 메모리와 바로 이어지기에 불가능한 일.
그러므로, 클라이언트에서 필요한 정보가 있을 때마다 서버에게 요청하고,
서버는 그 요청에 맞는 데이터를 클라이언트에게 전달(응답)하는 과정을 거치게 되는데 이 과정을 서버 통신이라 부르는 것이다.

여기서 "클라이언트는 필요한 정보를 어떻게 서버에게 요청을 할 수 있을까"라는 질문으로 이어지게 되는데,
"클라이언트가 서버에게 요청하는 방식을 미리 정해놓은 것"이 바로, HTTP 프로토콜(방식)이다.

 

2️⃣ HTTP Protocol? HTTP Method?


☑️HTTP Protocol

HTTP 프로토콜오직 클라이언트가 서버에게 데이터가 필요할 때 일방적으로 요청하는 방식을 말하고,
서버가 자료를 전송해주면 클라이언트가 바로 연결을 끊는 방식이다. (이 매정한 클라이언트 녀석.......)


이때, 클라이언트가 서버에게 할 수 있는 시나리오는 여러 개다.
단순히 데이터를 달라할 수도 있고, 역으로 데이터를 서버에게 준다 할 수도 있고, 기존 데이터를 수정한다 할 수도 있고, 원래 있는 데이터를 지워달라고 할 수도 있고... 등등.
즉, 클라이언트가 서버에게 요청을 한다는 뜻은 단순히 데이터가 필요하다는 것이 아니라, 서버와 소통하고 싶다는 뜻과 같다고 이해하면 되겠다.

그리고 클라이언트가 서버에게 "어떤 요청을 보내는지"를 구분해둔 방법이 HTTP Method이다.
☑️ HTTP Method

위에서 말한것처럼, 클라이언트가 서버에게 어떤 요청을 보내는지는 HTTP 방식에 미리 구현되어 있는 메서드를 통해 구분하게 되는데, 이를 HTTP Method라 부른다.
아래 외에도 더 다양한 종류가 있지만, 대표적으로 사용하는 메서드 위주로만 정리해보겠다.

☑️GET: 서버로부터 데이터를 얻고(read) 싶을 때 사용하는 메서드 (메인 화면 정보, 마이페이지 정보 등등 아무튼 정보를 받아오는 것은 전부 GET이다.)
☑️POST: 서버로 데이터를 전송(create)할 때 사용하는 메서드 (유저의 회원가입이나 정보 생성 등등 아무튼 유저에 의해 새로운 것이 형성될 때는 전부 POST를 사용한다.)
☑️PUT: 서버에 있는 기존의 데이터를 수정(update)할 때 사용하는 메서드 (주로 정보 수정과 관련된 것은 PUT이다. 유저 이름 변경 같은 직접적 변경도 있겠지만, 표출 순서를 변경하는 Drag & Drop도 PUT을 사용한다.)
☑️DELETE: 서버에 있는 데이터를 삭제(delete)할 때 사용하는 메서드 (삭제는 전부 DELETE다. 쉽지 이건?)

+ 나중에, 서버도 클라이언트에게 요청을 하게 되는데, 그때는 HTTP 방식이 아닌 Socket이라는 방식을 사용하게 된다는 것까지만 가볍게 알고 넘어가자.

 

3️⃣ REST API는 어떻게 구성되어 있을까?


☑️REST API?

위에서 HTTP Protocol이나 Method에 대한 설명을 들었지만, 아직 서버 통신을 위해서 필요한 것들이 조금 남았다.
데이터를 가져오는 서버가 어디인지도 알아야 할 것이고, 무슨 언어(Swift? Python? Java?)로 주고받을지도 정해야 할 것이고, 어떤 요청을 할지도 알려줘야 할 것인데,,,,,
이 모든 것들을 딱 정리해 둔 아키텍처가 REST API다.
REST를 통해 구현한 서비스 API라는 뜻이고, 조금 자세하게는 "자원을 이름으로 구분해 정보를 주고받을 수 있도록 한 것"이라고 말할 수 있겠다. ("자원을 이름으로 구분한다는 말의 뜻"은 아래 첨부한 이미지를 보면 이해할 수 있을 거다.)

여기서의 REST는 행위, 자원, 메시지로 구성되어 있는데,

☑️ 행위(Verb)는 위에서 말한 HTTP 메서드 (데이터를 얻을지 GET, 전송할지 POST 등..)
☑️ 자원(Resource)은 서버에 접근하기 위한 URI (http://15.164...에서 http:// 뒷부분을 의미)
☑️ 메시지(Representation)는 서버에서 요청한 결과값 (보통 JSON이나 XML의 형태)

"네트워크 자원을 이름으로 구분한다는 것"의 의미

☑️JSON? Struct? Codable?

REST API에서 메시지 부분은 서버에서 요청한 결과값을 의미한다고 했는데,
이 부분은 주로 JSON(JavaSript Object Notation)을 사용하게 된다.

JSON은 Key-Value 형태로 있는 데이터이며, 객체는 중괄호 {}로 배열은 []로 표기하고, 모두 큰따옴표를 이용해 표기하는 방식이다.

서버에서 오는 형태는 JSON으로, 우리가 클라이언트에서 사용할 때는 보통 Strcut 자료형으로 변환해서 사용한다.
(왜냐고 묻는다면 서버에서 클라이언트로 넘어오는 데이터가 간단한 형태가 아니므로, JSON의 형태는 다루기가 쉽지 않기 때문이다.)
그리고, 이 JSON을 Struct로, Struct를 JSON으로 바꿔주기 위해서 Codable의 과정이 필요한 것이다.
JSON을 Struct로 바꾸는 과정을 Decode, Struct를 JSON으로 바꾸는 과정을 Encode라고 하는 것이고, 이 두 개를 합친 것이 Codable이라고 이해하면 되겠다.

왼쪽이 JSON 자료형, 오른쪽이 Strcut 자료형으로 표현된 동일한 데이터이다.

 

4️⃣ 서버 통신(Networking)의 개념을 앞에서 배운 용어를 기반으로, 다시 정의해보자!

iOS에서 서버 통신을 한다는 것
클라이언트가 서버의 URI를 가지고 HTTP 메서드를 포함한 요청을 보내면, JSON 형태의 데이터를 받게 되는 것을 의미한다.
= 자원(Resource)으로 접근해서, 행위(Verb)를 서버에게 알려주고, 메시지(JSON)를 클라이언트가 받는 프로세스

 

5️⃣ 앞에서 배운 개념을 바탕으로 API 명세서를 이해해보자!


지금까지 위에서 배운 개념들은 서버가 어떤 식으로 작동되는지, 클라이언트와 서버는 어떤 식으로 서로 데이터를 요청하고 받고하는 과정들을 이해하기 위해서 설명했던 거였다.
이번에는 실제로 우리가 서버 개발자와 소통을 할 때, 어떤 것들을 확인해야 하고 어떻게 코드를 짜야하는지를 알아보기 위해 먼저 알아야할 개념들에 대해서 배워보겠다.

위에서 REST API가 "자원을 이름으로 구분해 정보를 주고받을 수 있도록 한 것"이라고 했는데,
이번에는 "자원을 이름으로 구분한다"는 보다 구체적인 의미와 서버 개발자 선생님들이 만들어주실 "서버를 어떻게 접근해야한다는 가이드 라인"인 API 명세에 따라 우리 클라이언트는 어떤 식으로 처리를 해줘야 하는지에 대해 설명해보도록 하겠다.

API 명세서는 보통 이런식으로 주어진다. (Swagger를 사용하는 경우도 있다고 합니다 ^__^)

서버는 기본적으로 하나만 덜렁 딱 붙이는 게 아니다.
각 화면에 맞게, 클라이언트에서 해주는 작업에 맞게 필요한 데이터를 요청하는 과정이 네트워킹의 핵심이므로, 데이터가 필요한 각 부분부분마다 각기 다른 서버를 붙여줘야 한다.

여기서 각 서버를 붙일때마다 클라이언트는 서버 개발자가 작성해준 "일종의 형식"을 통해 요청을 해야하는데, 그 "일종의 형식"이라는 것이 어떤 것을 말하는지 아래에서 이해해보자.

☑️ REST의 행위는? (= 어떤 HTTP Method를 사용해야 하지?)
GET(가져오기), POST(보내기), PUT(수정하기), DELETE(삭제하기) 등으로 정해질 것이다.

☑️ REST의 자원은? (= 서버에 접근하기 위한 URI는 어떤 것이지?)
Base URL이라는 공통적인 주소가 주어질 것이고, 각 API별로 추가적인 주소를 붙여서 구분하게 된다.


☑️ Request Header?
클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해주는 것.
Key: Value의 형태로 구성되어 있으며, "Content-Type": "application/json"은 request에 실어 보내는 데이터(body)의 Type가 클라이언트의 앱에서 json 타입의 형태로 보낸다는 의미이다.

☑️ Request Params (parameter)?
URL 주소에 포함되는 변수를 담는 방식
(예시: API 문서 상, https://minjae-server.o-r.kr/:id/login 주소가 있다면 :이 있는 id 부분이 Request Params이다.)

☑️ Request Query?
URL 주소 이후에 포함되는 변수를 담는 방식 
(예시: API 문서 상, https://minjae-server.o-r.kr/groups?user-id 주소가 있다면 ?가 있는 user-id 부분이 Request Query다.)
Request Params와 형태적으로 다른 점이 있다면, 변수가 Key=Value 형태로 들어간다는 점과 Query가 여러개일 때 "/"가 아니라 "&"으로 연결된다는 점이 있다.


☑️ Request Body?
iOS의 Struct 자료형을 Decode해서 만든 json을 서버에 보낼 때 사용하는 것. (주로 POST를 생각하면 되겠다!)

☑️ Response Body?
서버에 Request를 보내게 되면 받게 되는 응답을 Response Body라고 부른다.

자, 그럼 각각의 형식을 알았으니 네트워크 통신 각 행위(HTTP Method)는 대강 어떤 식으로 이루어지는지도 이해할 수 있을 것이다.

세부적인 내용은 API 명세에 따라 다를 수도 있겠지만,
서버 통신에 기본이 된다고 할 수 있는 POST와 GET을 기반으로 위의 용어도 익히면서 큰 틀을 배워보도록 하자.
코드나 라이브러리로 실제 구현하는 것은 이어지는 글들에서 확인할 수 있을 것이다!

☑️ POST (CREATE)
: 클라이언트가 서버에 데이터를 전송하는 행위이다.
이때, 데이터는 Request Body에 넣은 상태로 보내줘야 하고, Request Body에 넣는 데이터는 Decodable한 Struct 자료형으로 만들게 된다.

*내용을 수정(update)하는 PUT 메서드 역시 바꿀 내용을 서버에게 보내줄 때, Request Body에 넣는 POST 방식과 동일하게 사용한다.

☑️ GET (READ)
: 클라이언트가 서버로부터 정보를 받아오는 행위이다.
Request Body로만 넣어서 보냈던 POST와는 다르게, GET은 데이터를 보낼 수 있는 방법이 두 가지이다.
주소에 포함시켜 보내는 Parameter 방식과, 주소 이후에 Key=Value로 추가해 보내는 Query 방식이 그것이다. 물론, 두 방법을 동시에 사용할 수도 있다는 것까지 알아두자.
*Parameter 방식과 Query 방식 간의 차이를 다룬 글을 아래에 같이 첨부하니, 참고하길 바란다.
 

[Library] Moya #2 - request-parameter, request-query 이해하기

서버 선배와 Moya 선배 처음 공부하기 너무 어려웠다. 하지만 어떻게 하겠노...무조건 성장하기 위해서... 공부해야지..... 오늘은 또 하나 헷갈리는 개념이었던 request-parameter와 request-query 내용을

mini-min-dev.tistory.com