23.10.23 JSON 데이터 / protocol ( 약간 ) 의 개념정리 1

2023. 10. 24. 01:12IOS [ 개념정리 ]

 

JSON ( JavaScript Object Notation ) 

키 - 값 쌍 으로 이루어진 데이터 오브젝트를 전달하기위한

인간이 읽을만한 텍스트를 사용하는 개방형 포맷.

 

JSON 데이터를 많이 쓰게되는 경우 = 어플리케이션을 만들때 API 호출을 많이하게되고 , 

API호출로 받는 데이터의 형식이 JSON이기 때문에 JSON을 다루는것이 필수이다.

 

그럼 이 JSON 데이터를 사용하기위해서 Encoding 하고 Decoding 하는 과정이 필요한데,

과연 EncodingDecoding이 뭘까?

 

간단하게 Encoding 은 Swift에서 쓰는 언어를 JSON문자열로 변경하는 것 이고 , 

Decoding 은 반대의 경우로 JSON문자를 Swift언어로 변경하는 것 이다.

 

Encoding Decoding들을 하기 위해서는 Coadble protocol을 알아야하는데, 

Coadble protocol 은 Encodable Decodable 조합한 사용자 정의타입이라고 보면된다.

그렇다면 protocol은 뭘 뜻할까?

 

아마 완벽하게 이해하려면 꽤 많은정보가 필요해서 간단히 파악해보자.

우선 protocol 자체는 약속과 비슷한 의미이다.

protocol 을 선언함으로써 , 기본 틀을 잡아놓는 개념이라고 보면된다. ( 내가 파악하기로는 )

설명보다는 예가 더 도움이될것같으니 , 예를 들자면

내가 게임을 하고싶다고 가정했을때 , 

게임을 하려면 컴퓨터가필요할것이고 , 마우스가필요할것이고 , 키보드가필요할것이고 ... 등등 많은요구사항이 있을것이다.

그럴때 ! 이 필요한 요구사항들을 선언하는것이 protocol 인 것이다!

 

아니 그러면 class나 struct 같은거랑 다를게 뭐야? 싶겠지만 

 

protocol 은 특별하게도 컴퓨터의 모델을 지정하거나 , 마우스의 브랜드를 지정하거나 , 키보드의 종류를 지정하는 등 

직접 지정하는 것이 아닌 ,

'이것 ( 게임을 하기위해 ) ' 을 위해 필요한 요구사항들은 ' 저것 ( 컴퓨터 , 마우스 , 키보드...등등 ) ' 들이 있습니다, 라고 내가 필요한 무언가를 할때 필요한 형식을 선언해 주는 것이다.😆

 

여기서 선언하는 방법같은것은 주요 논점이 아니니 , 개념만 이해하고 넘어가도록 하고 ,

다시 돌아와서 JSONEncoding Decoding 을 하기위해 필요한 protocolCodable 이고 ,

Codable 타입을 준수하는 데이터는 Foundation framework ( 파일 맨위에 선언되어있는 import Foundation ) 에 정의가 되어있는 JSONDe/Encoder를 통해 데이터를 다루는것이다.

 

자 , 그럼 JSON 데이터를  Encoding 하는 방법으로 넘어가보면,

Encoding 을 위한 구조체를 먼저 정의해 주어야한다.

import Foundation

struct Person: Codable {
    var name: String
    var age: Int
    var mail: String
    var address: String
}

예시 출처 : jeunghun2.log

 

jeunghun2 (이정훈) - velog

어제보다 더 나은 오늘을 위해

velog.io

 

예시와 같이 struct라는 구조체 타입으로 Person ( 사람 ) 이라는 구조를 만들기 위해 ,  아까말한 protocol의 형식( : Codable )처럼 필요한 정보들( name, age, mail, address ) 을 선언해주었다.

 

그리고 샘플데이터를 아래와 같이 선언해준다.

 

let personKim: Person = Person(name: "김철수", age: 99, mail: "kim@mail.com", address: "서울특별시 종로구")
let personLee: Person = Person(name: "이영희", age: 20, mail: "lee@mail.com", address: "부산광역시 연제구")

출처 동일

 

그럼 사람이라는 구조를 만들기위한 이름, 나이, 메일주소, 실제주소들을 모두 지정해준 상태가 된 것이고 ,
우리는 이 샘플 데이터를 JSON 데이터로 인코딩 ( Swift 언어 > JSON 언어 ) 해주는 작업을 해주어야 API에서 주로 사용하는 형식인 JSON 형태로써 서버에 데이터를 전송할 수 있는것이다!

 

( 이 정보들을 서버에 전송해야 하는 이유도 예를 들어보자면 ,

데이팅 어플을 만든다 가정했을때, 그사람의 이름 , 나이 , 주소등 기본정보들이 필요할 것이고

우리는 이 정보들을 개인이 입력했을때 서버로써 전송하여 저장해두어야 할 것이다.

그때 쓰기위함 )

 

다음으로 샘플데이터를 JSON데이터로 인코딩을 해줄텐데 ,

func jsonEncoder(_ data: Codable) -> String? {
    var encoder = JSONEncoder()
    
    do {
        let jsonData = try encoder.encode(data)
        return String(data: jsonData, encoding: .utf8)
    } catch {
        print("encoding error")
    }
    
    return nil
}

 

출처 동일

 

위와 같은 형식으로 작성해줄 것이다.

var encoder = JSONEncoder() 를 통해 encoder가 JSONEncoder로써 변수선언되었고,

jsonData가 샘플 data 를 encode할때, .utf8 ( 국제적 표준코드 유니코드 ) 타입으로써 jsonDataString값으로 ( 샘플데이터의 정보[ name ,age ...등등 ]들 ) 리턴해 주는것이다.

 

또 필수적으로 저 encoding 이 실패하거나 nil값일때를 대비하여 에러메시지와 리턴nil을 작성해주어야한다.

 

 

Decoding부터는 다음편에 ..