[내일배움캠프] 260127 TIL - dateDecodingStrategy

Bambu·2026년 1월 27일

내배캠 TIL

목록 보기
27/52

1. 앱 개발 입문 주차 과제

1) 날짜 정보 parsing하기

data.json에서 날짜 정보를 Date 타입으로 바로 파싱할 수 있는 방법이 있어 적용해보았다.

dateDecodingStrategy를 활용하는 방법이다.

JSONDecoder는 날짜 정보를 dateDecodingStrategy를 활용해서 파싱한다고 한다.

기존에는 "1997-06-26" 형태의 JSON 데이터를 String 타입으로 파싱하여 그대로 저장했다.

struct Book: Codable {
	let release_date: String
}

dateDecodingStrategy를 활용하여 Date 타입으로 저장해보자.

struct Book: Codable {
	let release_date: Date
}

우선 release_date의 타입을 Date로 변경해주었다.

class DataManager {
	func loadBooks() throws -> [Book] {
    ...
    
    	let dateFormatter = DateFormatter()
    	dateFormatter.dateFormat = "yyyy-MM-dd"

dateFormatter를 생성하여 JSON 데이터의 release_date 형식의 날짜 포맷을 설정해주었다.

"1997-06-26" 였으니, "yyyy-MM-dd"로 설정하였다.


		let decoder = JSONDecoder()
       decoder.dateDecodingStrategy = .formatted(dateFormatter)

JSONDecoderdateDecodinStrategy를 위에서 설정한 포맷으로 설정해주었다.

		do {
        	let data = try Data(contentsOf: URL(filePath: path))
        	let booksResponse = try decoder.decode(BookResponse.self, from: data)
            ...
        }

JSON 데이터를 디코딩하는 방법은 이전과 동일하다.

release_dateDate 타입으로 바뀌었기 때문에 출력 문자열을 생성하는 formatDate 함수를 간소화할 수 있다.

func formatDate(_ released: Date) -> String {
	// 기존 Date 타입을 얻기 위한 부분
    // let dateFormatter = DateFormatter()
    // dateFormatter.dateFormat = "yyyy-MM-dd"
    // let date = dateFormatter.date(from: released)
    
    // dateFormat 설정
    let newFormatter = DateFormatter()
    newFormatter.dateFormat = "MMMM dd, yyyy"
    
    // June 26, 1997 형태의 문자열 반환
    return newFormatter.string(from: released)
}

주석 처리된 부분을 생략할 수 있게 되었다.

출력 또한 정상적으로 잘 되는 것으로 확인하였다.

2) 에러 핸들링하기

필수 구현 Lv2에서 JSON 데이터 파싱에 실패하면 Alert를 띄우라는 요구사항이 있었다.

그으런데 나는 파싱한 book 정보를 DataMangerViewController에 전달하도록 구조를 짜놓아서 DataManager에다 UIKit을 넣어야하나 어째야하나...

애초에 오류를 print문으로 출력하고있는데 왜 Alert를 띄워야하나...라는 의문이 있었는데,

튜터님께서 '사용자에게 XCode를 깔라고 할 수 없다'라고 하셔서 바로 이해했다.

사용자도 왜 안되는지 알아야하니까...

그리고 당연히 DataManagerUIKit을 넣는게 아니라 에러를 ViewController로 전달해야한다고 하셨다.

그렇게 해서 함수를 바꿔보았는데 의문이 생겼다.

func loadBooks() throws -> [Book] { ... }

func fetchData() throws {
	do { 
    	books = try loadBooks
    } catch { ... }
}

func fetchInfo(num: Int, info: Description) throws -> String {
	if books.isEmpty {
    	do { try fetchData() }
        catch { ... }
    }
}

위와 같이 서로 다른 함수들에서 에러 핸들링을 지속해서 하는 것이다.

이게 맞나 싶었는데 아닌게 맞았다.

func loadBooks() throws -> [Book] { ... }

func fetchInfo(num: Int, info: Description) throws -> String {
	if books.isEmpty { books = try loadBooks() }
}

에러를 던지기만 하면 된다면 do-catch문으로 에러 핸들링을 하지 않고 try만 하면, 발생하는 에러는 알아서 던진다고 한다.

다 핸들링해야하는 줄 알았는데.... 코드가 아주 많이 줄어들었다.😅

profile
안녕하세요, iOS 개발을 공부하고 있는 Bambu입니다. (프로필: Swifticons)

0개의 댓글