호댕의 iOS 개발

[Swift] DecodingStrategy 본문

Software Engineering/Swift

[Swift] DecodingStrategy

호르댕댕댕 2022. 1. 8. 15:07

JSON 객체에서 데이터 타입의 인스턴스를 디코딩해주는 JSONDecoder에는 기본적으로 decoding에 대한 Strategy가 존재한다. 

물론 CodingKey를 사용하여 어떤 식으로 JSON 파일을 디코딩할 지 정해줄 수도 있다.

 

하지만 일일이 CodingKey를 정해줘야 하는 만큼 만약 이미 정해진 Strategy가 있다면 훨씬 간단하게 디코딩을 해줄 수 있다. 

 

KeyDecodingStrategy

일단 먼저 KeyDecodingStrategy를 살펴보자. 

 

KeyDecodingStrategy는 JSONDecoder에 정의된 열거형으로 그 종류는 3가지가 있다. 

  • useDefaultKeys: 디코딩할 때 key의 name을 변경하지 않는다. 
  • convertFromSnakeCase: Snake-Case로 된 key의 name을 Swift에 맞게 Camel-Case로 변경해준다. 
  • custom: 클로저에 커스텀한 decodingStrategy을 정의해준다. 

 

하지만 KeyDecodingStrategy의 경우 각각의 모든 키를 검사하고 변환해주기 때문에 눈에 띄는 성능 비용이 소모된다. 

따라서 거의 대부분의 key를 변환해주는 것이 아니라면 CodingKey 프로토콜을 채택하여 일부만 바꿔주는 것이 성능상으로 이점이 있을 수 있다. 

 

또한 convertFromSnakeCase 공식문서를 보면 다음과 같이 말하고 있다. 

The JSONDecoder.KeyDecodingStrategy.convertFromSnakeCase strategy can’t infer capitalization for acronyms or initialisms such as WYSIWYG or URI.

 

즉 URL 같은 두문자어는 변환을 해줄 수 없다는 것이다. 

 

따라서 KeyDecodingStrategy는 편리하지만 항상 장점만 가지고 있진 않은 것 같다. 

 

😀 장점

1. 따로 CodingKey 프로토콜 없이 Key의 이름을 변경해줄 수 있다. 

 

🥲 단점

1. 모든 키를 각각 검사하고 변환해주기 때문에 성능 비용이 발생한다. 

2. convertFromSnakeCase의 경우 두문자어는 표현해줄 수 없다. (항상 프로퍼티 명을 lower-camel-case로 정의해야 한다)

 

 

dateDecodingStrategy

이는 JSON 데이터의 날짜에 해당하는 데이터를 Date 타입으로 변환해주는 것이다. 

 

여기서 6가지의 Strategy가 있다. 

  • deferredToDate: 기본으로 설정된 Strategy이다. 
  • iso8601: ISO 8601 기준으로 디코딩을 해준다. 
    "yyyy-MM-dd'T'HH:mm:ss.SSS"​
     이런 형식의 날짜를 Decoding해준다. 즉 1996-01-20T12:30:014 이런 형식의 날짜인 것이다.
  • formatted: 직접 DateFormatter로 정해준 기준을 넣어주게 된다. 
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SS"
    
    JSONDecoder.DateDecodingStrategy = .formatted(formatter)​
  • custom: 이는 KeyDecodingStrategy처럼 클로저 내부에 커스텀한 디코딩 방식을 작성해주게 된다. 
  • millisecondsSince1970: 국제 표준시인 UTC를 기준으로 1970.01.01 자정부터 밀리초 단위로 계산한 시간이다. 
  • secondsSince1970: 국제 표준시인 UTC를 기준으로 1970.01.01 자정부터 초 단위로 계산한 시간이다. 

JSON 데이터에 있는 형식에 맞춰 사용해주면 된다. 

 

 

물론 이런 Strategy들이 항상 좋은 것은 아니지만 상황에만 적절하게 사용해주면 코드의 가독성도 올라가고 간편하게 사용이 가능한 것 같다. 

Comments