나의 발자취
[iOS] Codable - 인코딩 / 디코딩, KakaoAPI를 활용한 BookSearch 앱 만들기 응용 본문
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)
2024.09.09 - [분류 전체보기] - KakaoAPI를 활용한 BookSearch 앱 만들기 (2)
프로젝트 구성 시작
새 프로젝트를 생성해주고, 네비게이션 뷰를 끌어다가 프로퍼티를 세팅해주고 프로토타입 셀에다가 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
가령, 작가들은 "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로 받아온 리스트를 테이블뷰로 보여줄 수 있다.
오늘 공부 내용 끝-
'앱 개발 > iOS' 카테고리의 다른 글
[iOS] BookSearch 앱 좌우 넘기기 화살표 func 하나로 일치, CoreLocation 라이브러리 (0) | 2024.10.28 |
---|---|
[iOS] SPM(Swift Package Manager), 오픈소스 라이브러리 사용 (1) | 2024.10.28 |
[iOS] 테이블뷰컨트롤러에서 데이터 추가/삭제하기 (3) | 2024.10.22 |
[iOS] 로컬에 데이터를 저장하는 PList (2) | 2024.10.21 |
Swift Notes for Professionals PDF (3) Arrays (1) | 2024.09.19 |