나의 발자취

[iOS] Codable - 인코딩 / 디코딩, KakaoAPI를 활용한 BookSearch 앱 만들기 응용 본문

앱 개발/iOS

[iOS] Codable - 인코딩 / 디코딩, KakaoAPI를 활용한 BookSearch 앱 만들기 응용

달모드 2024. 10. 22. 16:38

Codable이란?

Swift4 에서 도입된 Protocol

public typealias Codable = Decodable & Encodable

Decodable Encodable 구성

Encodable Struct, Class, Enum 등의 인스턴스를 JSON 데이터로 변경시켜줌

Decodable JSON 데이터를 Struct, Class, Enum 등의 데이터로 변경시켜줌

 

 

Codable Encode

일단 구조체의 프로토콜을 Codable로 설정한다.

import UIKit

struct Person: Codable {
    let name: String
    let age: Int
}

let person = Person(name: "John", age: 20)
let json = try? JSONEncoder().encode(person)
if let json = json, let jsonStr = String(data: json, encoding: .utf8) {
    print(jsonStr)
}

실행 결과

 

Codable Decode

let data = """
{
"name" : "정국",
"age" : 21
}
""".data(using: .utf8)!
let person = try? JSONDecoder().decode(Person.self, from: data)
print(person!)

 

  • data()는 String에 있는 메서드인데, optional 형태를 반환하므로 지금은 중요한게 아니라서 강제해제를 해주었다.
  • decode()에는 타입을 넣어주어야 하므로, .self가 들어가게 된다. (Person.self)
  • try? 를 하면, 전체가 옵셔널이 된다. 이것이 싫으면 try-catch를 하면 된다.

 

 

실행을 하면 Person의 객체가 나오게 된다.

실행 결과

 

일전에 BookFinder 프로젝트에서 API 데이터를 그대로 받아와 직접 다 구현했었는데, 이번에는 Codable을 사용해서 조금 더 가독성있고 손쉽게 비교를 해가면서 할것이다.

2024.09.06 - [앱 개발/iOS] - KakaoAPI를 활용한 BookSearch 앱 만들기 (1)

 

KakaoAPI를 활용한 BookSearch 앱 만들기 (1)

Kakao API를 통해, 책 검색 API를 사용해 검색한 키워드대로 책 목록을 가져오고, 목록을 클릭하면 상세 화면으로 넘어가 책에 대한 상세 내용을 웹뷰로 띄워줄것이다. func search()먼저 Kakao API로 책

wildguess.tistory.com

 

2024.09.09 - [분류 전체보기] - KakaoAPI를 활용한 BookSearch 앱 만들기 (2)

 

KakaoAPI를 활용한 BookSearch 앱 만들기 (2)

저번 포스팅과 같이 코드를 작성하면 시뮬레이터에 아래와 같은 화면밖에 보이지 않는다. 그 이유는 Delegate 를 해주는 tableView에게, 데이터를 호출해서 재가공한 시점에서 새로 생성했다고 알려

wildguess.tistory.com

 


 

 

프로젝트 구성 시작

새 프로젝트를 생성해주고, 네비게이션 뷰를 끌어다가 프로퍼티를 세팅해주고 프로토타입 셀에다가 tag값들을 1부터 순차적으로 부여한다.

마지막으로 TableView Cell에 Identifier를 book으로 주는 것 잊지말자

 

새로운 Cocoa Touch Class 를 생성하여 BookTableViewController로 이름을 짓고, 클래스 연결을 해준다.

 


MVC 패턴: Model 정의하기

위와 같이 Models, ViewController 폴더를 만들고 Models 안에 Book.swift를 만들어준다.

 

 

Kakao Developers

Kakao developers 페이지에 가서, 도서 검색 API 문서를 참고하면서 할 것이다.

기본적으로, API 문서에 있는 key 값과 똑같아야하므로, 모델에 필요한 키값을 잘 선언해준다.

https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide#search-book-response-body-document

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

가령, 작가들은 "authors" 이고 String[] 타입인 것처럼 말이다.

 

Codable

import Foundation

struct Book: Codable {
    let title: String
    let publisher: String
    let authors: [String]
    let thumbnail: String
}

 

그리고 페이지와 관련된 메타 구조체도 정의해준다.

struct Meta: Codable {
    let is_end: Bool
    let pageable_count: Int
    let total_count: Int
}

 

그러나 여기서 Meta 구조체의 변수들은 카카오 API 문서에 정의된 대로 snake case라서, swift는 camel case를 따르는데, 마음에 들지 않는다.

이 부분은 enum으로 바꿀 수 있다.

 

Naming Convention Confirmation

CodingKeys를 이용해서 swift snake case > camel case로 바꾸기

대소문자를 구분해서 CodingKeys 열거체를 생성한다.

구조체 처음 선언할 때부터 스위프트의 규칙인 camel case로 선언해주고, enum CodingKeys의 우변에 원래의 변수를 써준다.

struct Meta: Codable {
    let isEnd: Bool
    let pageableCount: Int
    let totalCount: Int
    enum CodingKeys: String, CodingKey {
        case isEnd = "is_end"
        case pageableCount = "pageable_count"
        case totalCount = "total_count"
    }

}

 

 

이제 이 둘을 담은 구조체를 생성해줄 건데, 직관적으로 네이밍을 하기 위해 API 문서의 documents는 books로 바꾸었다.

struct BookInfo: Codable {
    let meta: Meta
    let books: [Book]
    enum CodingKeys: String, CodingKey {
        case books = "documents"
        case meta
    }
    
}

 


func search() 구현, cellForRowAt() 구현

검색창이 있는 BookTableViewController.swift 의 viewDidLoad() 안에 구현을 해준다.

 

 

REST API 앱 키를 넣어준다.(네이티브 앱 키를 넣을 경우 호출되지 않는다!)

 

중요하므로, apiKey 는 따로 빼서 .gitignore에 따로 올린다.

아래와 같이 API로 받아온 리스트를 테이블뷰로 보여줄 수 있다.

Swift TableViewController

 

 

 

 

오늘 공부 내용 끝-

Comments