네트워크 통신

JG Ahn·2024년 12월 5일

iOS

목록 보기
12/32
post-thumbnail

네트워크

네트워크는 둘 이상의 기기가 데이터를 주고 받는 것을 의미한다. 서버도 하나의 컴퓨터이기 때문에 '컴퓨터'와 '서버'의 통신도 네트워크 통신이다.

데이터를 전송하는 대표적인 방법 : JSON과 XML

XML (EXtensible Markup Languaged)

XML마크업 언어다. 마크업 언어는 데이터를 태그(<>)등을 사용해 표현하며 주로 데이터를 저장 및 전송하기 위해 만들어진 언어이다.
XML은 문서의 호환성이 좋아 시스템이 달라도 교환이 쉽게 가능하다. 데이터가 많아질수록 가독성이 떨어지고 용량이 커져서 JSON에 비해 전송하고 읽는 속도가 느리다고 한다.

예시)

<?xml version="1.0" encoding="UTF-8"?>
<list>
		<snack>
          		<name>포카칩</name>
          		<weight>150g</weight>
          		<price>2000</price>
  		</snack>
  		<snack>
          		<name>무뚝뚝 감자칩</name>
          		<weight>100g</weight>
          		<price>3000</price>
  		</snack>
</list>

JSON (JavaScript Object Notation)

JSON은 JavaScript에서 객체를 만들때 사용하는 표현식을 의미한다.(언어나 문법 ❌)
XML에 비해 쉽게 데이터를 저장 및 교환할 수 있기 때문에 서버와 클라이언트가 가장 많이 사용한다.
JSON은key-value의 형태를 가진다.

예시)

[
    {
        "name": "Jack",
        "phoneNumber": "010-1111-2222"
    },
    {
        "name": "Jay",
        "phoneNumber": "010-3333-4444"
    },
    {
        "name": "John",
        "phoneNumber": "010-5555-6666"
    }
]

API (Application Programming Interface)

강의에서는 API창구에 비유하고있다.

내가 원하는 정보를 규칙에 맞게 작성해서 API라는 창구를 통해 서버에 요청하면, 서버도 마찬가지로 서버도 응답을 작성해서 API를 통해 보내준다고 생각하면 될 것 같다.

Client ⇠ 응답/요청 ⇢ [ API ] ⇠ 응답/요청 ⇢ Server

예시)

  • 서버의 DB에 유저 정보가 저장되어있다.(이름, 전화번호 등등)
  • 클라이언트(iOS앱)에서 "Harry" 유저의 정보를 요청한다.
  • 서버는 API로 UserInfo라는 API를 뚫어 놓았고, 이 API를 통해 유저의 정보를 제공받을 수 있다.

API Request 명세 예시

{
		name: "Harry"
}

API Response 명세 예시

{
		"name": "Harry",
		"phoneNumber": "010-1111-2222",
		"Mbti": "ISFJ"
}
  • 개발자는 위와 같이 API 명세서에 맞게 Request JSONResponse JSON 형식을 지키면 서버에 정보를 요청할 수 있다.

개발자는 API를 통하면 서버 내부의 로직을 몰라도 되기 때문에 API에도 추상화 개념이 적용된는 것을 알 수 있다.

Swift Codable

공식문서에서는 Codable을 '외부 표현으로 변환할 수 있고 외부 표현에서 다시 변환할 수 있는 유형' 이라고 소개하고있다.

swift의 Codable프로토콜을 채택하는 것은 인코딩, 디코딩을 한다는 의미이다.

  • 인코딩(encoding) : 데이터를 특정 형식으로 변환하는 것
  • 디코딩(decoding) : 인코딩된 데이터를 원본으로 변환하는 것

서버와 통신 할 때 주로 JSON 형식으로 인코딩을 많이 한다고 한다.

swift에서 JSON 형식의 데이터를 디코딩하는 코드 실습

import Foundation

struct PhoneBook: Codable {
    
    let name: String
    let phoneNumber: String
    
}

//String으로 json 모양의 데이터 생성
let jsonString = """
[
    {
        "name": "Adam",
        "phoneNumber": "010-1111-2222"
    },
    {
        "name": "Eve",
        "phoneNumber": "010-3333-4444"
    },
    {
        "name": "Abel",
        "phoneNumber": "010-5555-6666"
    }
]
"""

//jsonString으로 jsonData 생성
let jsonData = jsonString.data(using: .utf8)!

//JSON 디코더
let jsonDecoder = JSONDecoder()

do {
    //[PhoneBook].self : self까지 붙여야 타입을 의미한다
    let phoneBooks = try jsonDecoder.decode([PhoneBook].self, from: jsonData)
    for phoneBook in phoneBooks {
        print("name: \(phoneBook.name), phoneNumber: \(phoneBook.phoneNumber)")
    }
} catch {
    print("JSON 디코딩 실패")
}

결과

name: Adam, phoneNumber: 010-1111-2222
name: Eve, phoneNumber: 010-3333-4444
name: Abel, phoneNumber: 010-5555-6666

URL (Uniform Resource Locators)

  • URL : 웹에서 특정 위치를 나타내는 주소
  • Protocol: http, https → 인터넷 통신 규약을 의미
  • Domain: 자원이 위치한 서버(컴퓨터)의 이름. 예를 들어 google, naver와 같이 url 의 정체성을 나타낸다
  • Port: 구체적으로 어떤 서버를 이용할지 번호로 결정. HTTP 의 경우 80. HTTPS 는 443.
  • Path: 서버에서 제공하는 자원의 경로
  • Query: 자원에 대한 추가적인 매개변수를 전달하는 데 사용됨. 주로 key=value 형식으로 표현되며, 여러 개의 매개변수는 &로 구분
  • Fragment: 자원 내에서 특정 부분을 가리킬 때 사용한다 ex) https://ko.wikipedia.org/wiki/대한민국#문화

0개의 댓글