iOS

[오픈소스] CustomDump 소개

Phililip
728x90

안녕하세요.

 

이번에는 customDump라는 오픈소스를 소개해볼까 해요.

 


 

# 1. CustomDump 소개

CustomDump의 소개글을 살펴볼게요.

 

A collection of tools for debugging, diffing, and testing your application's data structures.

 

CustomDump는 데이터 구조를 디버깅, diff 그리고 테스트하는 것에 특화된 API들이 있는 모듈이에요.

 

 

어떤 기능이 있는지 하나씩 살펴볼게요.

 

 

 

## 1.1 customDump

Swift에는 print와는 별개로 디버깅을 위한 dump라는 함수가 있어요.

 

일단 print와 dump가 콘솔에 어떻게 찍히는지부터 볼게요.

 

아래 같이 Dictionary 변수가 있다고 할 때,

 

let dic = [
    "KEY1" : "VALUE1",
    "KEY2" : "VALUE2"
]

 

 

print와 dump를 사용해서 콘솔에 출력하면 아래처럼 나올 것입니다.

 

print dump

 

 

 

이 처럼, dump를 사용하면 좀 더 구체적인 로그를 출력할 수 있는데요,

 

만약 여러 depth의 Dictionary이거나 데이터 구조가 복잡하면, 로그가 한눈에 안 들어올 수 있어요.

 

이를 보완한 것이 customDump라는 API입니다.

 

 

 

customDump의 사용 방법은 사실 dump랑 똑같아요. 대신에 콘솔에 출력되는 로그가 좀 더 직관적이에요.

 

비교해보면

 

dump([1: "one", 2: "two", 3: "three"]) customDump([1: "one", 2: "two", 3: "three"])

 

 

어떤 느낌인지 아시겠나요??ㅎㅎㅎ

 

 

 

## 1.2 diff

diff라는 API도 제공해주고 있는데요,

 

API 명에서 알 수 있듯이, 두 데이터의 차이를 직관적으로 보여주는 API입니다.

(마치 github에서 소스코드 diff를 보는 느낌이에요.)

 

var user = User(firstName: "Philip", lastName: "Chung", favoriteNumbers: [1, 2, 3])
var other = user
other.favoriteNumbers[1] = 99
print(diff(user, other)!)

//  User(
//     firstName: "Philip",
//     lastName: "Chung",
//     favoriteNumbers: [
//       [0]: 1,
// -     [1]: 2,
// +     [1]: 99,
//       [2]: 3
//     ]
//   )

 

 

제네릭 타입으로 파라미터를 받기 때문에, 만약 다른 타입의 객체를 비교하려고 한다면 컴파일 에러가 발생합니다.

 

 

 

## 1.3 XCTAssertNoDifference

unit test에 도움을 주는 API도 있어요.

 

Swift 기본 내장 API인 XCTAssertEqual을 사용하면, '둘이 같지 않다'를 알려줄 뿐, '어디가 어떻게 다른데?'를 알려주지 않아요.

 

즉, 사용자가 어디가 다른지 일일이 확인을 해야 하는 불편함이 있습니다.

 

var user = User(name: "Philip", age: 19)	// Phi`l`ip
var other = User(name: "PhiIip", age: 19)	// Phi`I`p
XCTAssertEqual(user, other)

// XCTAssertEqual failed: ("User(name: "Philip", age: 19)") is not equal to ("User(name: "PhiIip", age: 19)")

 

 

 

이때, CustomDump 모듈의 XCTAssertNoDifference API를 사용하면 어떤 필드가 어떻게 다른지 diff 형태로 보여줘서 상대적으로 눈에 잘 띄게 됩니다.

 

var user = User(name: "Philip", age: 19)
var other = User(name: "PhiIip", age: 19)
XCTAssertNoDifference(user, other)

//XCTAssertNoDifference failed: …
//
//    User(
//  −   name: "Philip",
//  +   name: "PhiIip",
//      age: 19
//    )
//
//(First: −, Second: +)

 

 

 

## 1.4 CustomDumpStringConvertible

customDump를 쓰면 직관적인 로그를 볼 수 있지만, 출력되는 로그 형식을 커스텀할 수는 없나?? 라고 생각이 들 수도 있어요.

 

물론 가능합니다!! 😎

 

 

직접 생성한 커스텀 클래스에 CustomDumpStringConvertible 프로토콜을 준수함으로써, customDump로 출력될 description을 설정할 수도 있어요.

 

 

 

예를 들어서, User라는 클래스를 만들고 customDump API를 호출하면 가장 기본 형태의 로그가 출력됩니다.

 

class User {   
    var name: String = "Philip"
    var age: Int = 19
}

customDump(User())

// User(
//   name: "Philip",
//   age: 19
// )

 

 

이때 CustomDumpStringConvertible 프로토콜을 준수하도록 구현하면, customDumpDescription이 로그로 출력됩니다.

 

class User: CustomDumpStringConvertible {
    var customDumpDescription: String {
        "MyUser(name => \(self.name), age => \(self.age))"
    }
    var name: String = "Philip"
    var age: Int = 19
}

customDump(User())

// MyUser(name => Philip, age => 19)

 

 

 


 

 

이번 글은 여기서 마무리.

 

 

 

 

반응형

'iOS' 카테고리의 다른 글

[오픈소스] Bagbutik  (0) 2022.03.28
mailto scheme과 기본 메일 앱 설정  (0) 2022.03.23
TabulaData framework  (0) 2022.03.09
Swift Package 의존성 추가, 생성, 배포 방법  (0) 2022.02.24
SceneDelegate를 제거하는 방법  (0) 2022.02.05