[swift] Swift Sourcery를 활용한 코드 생성 유틸리티 개발

이번 포스팅에서는 Swift Sourcery를 활용하여 코드 생성 유틸리티를 개발하는 방법에 대해 알아보겠습니다.

Sourcery 소개

Swift Sourcery는 Swift 코드를 분석하고, 분석된 정보를 바탕으로 코드를 생성해주는 도구입니다. 주로 반복적이고 단조로운 작업을 자동화할 수 있는데, 예를 들어 Swift 모델 객체들을 JSON 형식으로 바꿔주는 코드를 생성한다거나, Equatable, Codable, Mock 등의 프로토콜 구현 코드를 자동으로 생성할 수 있습니다.

Sourcery 설치

Sourcery를 사용하기 위해서는 먼저 설치해야 합니다. 아래의 명령어를 이용해서 Sourcery를 설치합니다.

brew install sourcery

또는 만약 Carthage로 프로젝트를 관리하고 있다면, Cartfile에 다음과 같은 의존성을 추가하고 carthage update 명령어로 설치할 수도 있습니다.

github "krzysztofzablocki/Sourcery" ">= 1.4.0"

Sourcery 템플릿 작성

Sourcery를 사용하기 위해서는 먼저 코드 생성에 필요한 템플릿을 작성해야 합니다. 템플릿은 Swift 코드로 작성되며, Sourcery가 분석한 정보를 기반으로 코드를 생성합니다.

예를 들어, Codable 프로토콜을 채택한 구조체에서 JSON으로 변환하는 코드를 자동으로 생성하고 싶다면, 다음과 같은 템플릿을 작성할 수 있습니다.

// Generated by Sourcery
import Foundation

{% for type in types.all %}
extension {{ type.name }}: Encodable {
    enum CodingKeys: String, CodingKey {
        {% for property in type.variables %}
        case {{ property.name }}
        {% endfor %}
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        {% for variable in type.variables %}
        try container.encode({{ variable.name }}, forKey: .{{ variable.name }})
        {% endfor %}
    }
}
{% endfor %}

코드 생성 스크립트 작성

템플릿을 작성했다면, 다음은 좀 더 복잡한 과정인 코드 생성 스크립트를 작성해야 합니다. 이 스크립트는 Sourcery를 실행하고, 템플릿을 사용하여 코드를 생성하는 역할을 합니다.

프로젝트 루트에 generate.sh라는 이름으로 스크립트 파일을 만들고, 다음과 같이 작성합니다.

#!/bin/sh

# Generated by Sourcery

sourcery --sources ./MyProject --templates ./Templates --output ./Generated

코드 생성 실행

모든 준비가 되었다면, 다음 명령어를 이용하여 코드 생성을 실행할 수 있습니다.

sh generate.sh

이 명령어를 실행하면, Sourcery가 프로젝트의 소스 코드를 분석하고, 템플릿에 따라 코드를 생성하게 됩니다. 생성된 코드는 Generated 폴더에 저장됩니다.

결론

이번 포스팅에서는 Swift Sourcery를 활용하여 코드 생성 유틸리티를 개발하는 방법에 대해 알아보았습니다. Sourcery를 사용하면 반복적이고 단조로운 작업을 자동으로 처리할 수 있어 생산성을 향상시킬 수 있습니다.

추가적인 정보는 공식 Sourcery 페이지를 참고하시기 바랍니다.