[swift] Swift Sourcery를 활용한 클린 아키텍처 구현

소개

클린 아키텍처는 애플리케이션을 구성하는 레이어를 분리하여 유연하고 테스트 가능한 코드를 작성하는 아키텍처 패턴입니다. Swift에서 클린 아키텍처를 구현하기 위해 Sourcery라는 코드 생성 도구를 활용할 수 있습니다. Sourcery는 코드를 분석하여 자동으로 코드를 생성하는 기능을 제공하여 반복적이고 지루한 작업을 줄여줍니다.

이번 기사에서는 Swift Sourcery를 사용하여 클린 아키텍처를 구현하는 방법을 알아보겠습니다.

필요 도구

  1. Swift Package Manager(SPM) - Sourcery를 설치하고 프로젝트를 관리하기 위해 SPM을 사용합니다.
  2. Sourcery - 코드 생성 도구로 Swift 코드를 분석하여 자동으로 코드를 생성할 수 있습니다.

설치 및 설정

  1. 프로젝트에 SPM을 추가합니다. Package.swift 파일을 열고 dependencies 항목을 다음과 같이 수정합니다.
// Package.swift

let package = Package(
    name: "MyProject",
    dependencies: [
        // ...
        .package(url: "https://github.com/krzysztofzablocki/Sourcery.git", from: "1.0.0")
    ],
    // ...
)
  1. 프로젝트 루트 디렉토리에 sourcery.yml 파일을 생성합니다. 이 파일은 Sourcery에서 사용할 설정을 정의합니다. 아래는 예시입니다.
// sourcery.yml

sources:
  - MyProject

templates:
  - MyProject/Templates
  1. sourcery.yml 파일에는 프로젝트의 소스 코드 및 템플릿이 위치한 디렉토리를 설정할 수 있습니다. 위 예시에서는 MyProject 디렉토리를 소스로 지정하고, MyProject/Templates 디렉토리에 있는 템플릿을 사용합니다.

모듈 분리

클린 아키텍처를 구현하기 위해 각 레이어를 별도의 모듈로 분리하는 것이 일반적입니다. 이를 위해 SPM을 사용하여 각 모듈을 만들 수 있습니다.

  1. 각 레이어를 나타내는 모듈을 생성합니다. 예를 들어, Presentation, Domain, Data라는 이름의 모듈을 생성할 수 있습니다.
$ swift package init --type executable
  1. 생성한 각 모듈에는 소스 코드가 존재해야 합니다. Sourcery는 이 소스 코드를 분석하여 자동으로 코드를 생성할 것입니다.

코드 생성

Sourcery를 실행하여 코드를 자동으로 생성할 수 있습니다.

$ swift run Sourcery

위 명령어를 실행하면 sourcery.yml 파일에서 지정한 소스 코드 디렉토리에서 코드 분석이 이루어지고, 템플릿을 통해 코드가 자동으로 생성됩니다.

예제

아래는 템플릿을 사용하여 자동으로 생성된 코드의 예입니다.

Presentation 모듈

public protocol ViewModel {
    // ...
}

public protocol View {
    // ...
}

public class Presenter {
    private let view: View
    private let viewModel: ViewModel

    public init(view: View, viewModel: ViewModel) {
        self.view = view
        self.viewModel = viewModel
    }

    // ...
}

Domain 모듈

public protocol UseCase {
    // ...
}

public class Interactor {
    private let useCase: UseCase

    public init(useCase: UseCase) {
        self.useCase = useCase
    }

    // ...
}

public protocol Repository {
    // ...
}

Data 모듈

public class RepositoryImpl: Repository {
    // ...
}

public class UseCaseImpl: UseCase {
    // ...
}

위 코드는 각 모듈의 레이어를 구현하는 코드 입니다. 이 코드는 처음에는 작성하지만, 소스 코드가 변경되면 서버를 수정할 필요 없이 Sourcery를 실행하여 변경 사항에 맞게 코드를 자동으로 갱신할 수 있습니다.

결론

Swift Sourcery를 활용하여 클린 아키텍처를 구현하는 방법을 알아보았습니다. Sourcery를 사용하면 코드의 생산성을 높일 수 있으며, 유지 보수성과 테스트 용이성을 개선할 수 있습니다. 클린 아키텍처는 대규모 프로젝트에 특히 유용하며, Sourcery를 사용하여 쉽고 빠르게 구현할 수 있습니다.

참고 자료