이전에 클린아키텍처를 이용하여 앱을 만든적이 있습니다.
class DeleteBudgetsUseCase(private val repository: BudgetRepository) {
suspend operator fun invoke(vararg budgets: Budget) {
repository.deleteBugets(*budgets)
}
}
이당시 이런식으로 유스케이스를 만들어서 데이터레이어에있는 Repository로 바로 접근하는것이아니라 도메인레이어에 유즈케이스를 만들어 Repository를 직접적으로 접근하는것을 막았습니다. 이를 통해 데이터 레이어의 구현 세부 사항을 독립적으로 유지할 수 있으며 테스트하기 쉽고, 유지보수가 용이하며, 더 높은 수준의 재사용성을 제공할 수 있습니다.
유스케이스는 어떤 행위와 관련된 액터 간에 수행되는 활동을 기술을 의미합니다. 이는 프로그램의 설계과정중 유스케이스 다이어그램에 관하여 알필요가 있습니다.

위의 다이어그램처럼 사용자는 유스케이스를 통하여 활동을 표현하고있습니다. 이를 앱이나 프로그램의 구조에 적용을 하면 UI레이어에서 데이터레이어의 구현된 로직을 보여주지 않고 Domain레이이어의 UseCase로 접근할수있게되는것입니다. 이렇게 생각할수도 있습니다 어짜피 Repository는 도메인레이어의 Repository의 구현체인 impl 일텐데 굳이 invoke만 할뿐인 UseCase를 써서 코드의 양을늘릴 이유가 있을까?
클린 아키텍처의 주요 목표 중 하나는 시스템의 각 구성 요소 간의 결합도를 최소화하여 유연성과 테스트 용이성을 향상시키는 것입니다. 이를 위해 데이터 레이어와 도메인 레이어 간의 직접적인 의존성을 피하는 것이 중요합니다. 이를 위해 Repository의존성을 가지는 impl을 직접적으로 사용하는 대신 UseCase를 사용하여 중간 계층을 이용한다면 결합도를 최소화할수 있습니다. 따라서 코드 양을 늘리는 것보다 시스템의 유연성, 테스트 용이성, 유지 보수성, 재사용성 등을 고려할 때 UseCase를 사용하는 것이 더 나은 설계 결정일 수 있습니다.