domain / usecase 는 왜 필요할까?

유재민·2022년 12월 5일
0
post-thumbnail

클린 아키텍처 구조로 설계를 하다보니 domain의 역할에 대해서 의문이 들었다. presentation과 domain의 중간 다리 같은 느낌인데, domain 모듈을 만듦으로써 느낄 수 있는 이점이 어떤 것이 있을까 고민을 해봤다.

1. ViewModel의 역할

뷰모델에서 Repository로 바로 접근했던 경우에는 뷰모델이 어떤 동작들을 하는지, 어떤 데이터를 가져오거나 저장하는지를 확인하려면 특정 함수에서 repository의 어떤 메서드를 호출하는지 확인을 할 필요가 있다. 하지만, usecase를 사용하고 의존성 주입을 같이 사용한다면 뷰모델의 인자를 확인해보면 어떤 동작들을 하는지 한번에 확인할 수 있다. (이는 usecase의 클래스 네이밍이 동작, 상태를 나타내기 때문이다.)

@HiltViewModel
class GlobeViewModel @Inject constructor(
    private val getGlobesUseCase: GetGlobesUseCase,
    private val createGlobesUseCase: CreateGlobeUseCase,
) : ViewModel()

이는 domain 모듈을 사용하면서 생긴 이점이라고 하기에는 사소하다고 생각할 수 있다.

2. 캡슐화

뷰모델에서 직접 Repository에 접근하게 되면 사용되지 않는 메서드에도 접근이 가능하다. 그렇게 되면 실수로 사용되지 않는 메서드에 접근할 수도 있고 이는 캡슐화에 적절하지 않은 방식이다.

3. UI와 Data 계층의 결합도

domain 계층이 없으면 presentation과 data layer의 의존성이 서로 생기게 된다. 모듈 간 데이터를 전달할 때 domain을 통해 인터페이스를 활용하여 계층 간 결합도를 낮춰줄 수 있다.

4. 데이터 결합 및 재사용성

하나의 usecase에서 여러 repository에 접근하여 데이터들을 결합하여 ui 쪽으로 전달해줘야하는 경우가 있다. 만약 usecase가 없다면 뷰모델에서 여러 repository에 접근해야하며 해당 기능이 다른 뷰모델에서 사용될 때 똑같이 여러 repository에 접근해야한다. usecase를 통해 각 repository에 접근하여 데이터를 결합한 후 필요한 뷰모델에서 해당 usecase만 사용하면 되기 때문에 문제를 해결할 수 있다.

class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository
) { /* ... */ }
profile
유잼코딩

0개의 댓글