본문 바로가기
Mobile App

[안드로이드] - 도메인 레이어 (Use Case)

by Jman 2022. 7. 25.

도메인 레이어

도메인 레이어는 UI 레이어와 데이터 레이어 사이에 있는 선택적 레이어다.

 

 

https://developer.android.com

또한, 도메인 레이어는 복잡한 로직이나 여러 ViewModel에서 재사용되는 간단한 비즈니스 로직의 캡슐화를 담당한다.

따라서, 복잡성을 처리하거나, 재사용성을 선호하는 등 필요한 경우에만 사용해야 한다.

 

도메인 레이어 이점

  • 코드 중복을 방지한다.
  • 도메인 레이어 클래스를 사용하는 클래스의 가독성을 개선한다.
  • 앱의 테스트 가능성을 높인다.
  • 책임을 분할하여 대형 클래스를 피할 수 있다.

 

그리고 도메인 레이어 클래스를 간단하고 가볍게 유지하려면, 각 사용 사례(Use Case)에서는 기능 하나만 담당해야 하고 변경 가능한 데이터를 포함해서는 안된다.

대신, 데이터 레이어에서 변경 가능한 데이터를 처리한다.

 

가이드 이름 지정 규칙

명명 방법 : 현재 시제의 동사 + 동사/대상(선택사항) + UseCase

ex) FormatDataUseCase, LogOutUserUseCase, GetLatestNewsWithAuthorsUseCase 등..

 

 

종속 항목

종속항목 : 클래스를 구성할 때, 주로 다른 클래스의 오브젝트를 참조하게 된다. 예를들어, Car 클래스가 Engine 클래스가 필요한 것처럼 하나의 클래스에서 필요한 다른 클래스를 종속 항목(또는 의존성 주입)이라 한다. 

 

일반적인 애플리케이션 아키텍처에서 사용 사례 클래스(Use Case Class)UI 레이어의 ViewModel 과 데이터 레이어의 저장소 사이에 위치한다.

 

즉, Use Case Class 는 일반적으로 저장소 클래스에 종속되며, 저장소와 동일한 방법으로 콜백(자바의 경우) 또는 코루틴(Kotlin의 경우)을 사용하여 UI 레이어와 통신한다.

 

[예시코드]

class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository
) { /* ... */ }

위 코드를 보면, 뉴스 저장소의 데이터작성자 저장소의 데이터를 가져와 이를 결합하는 Use Case Class다.

 

Use Case Class는 재사용 가능한 로직을 포함하기 때문에 다른 사용 사례에 의해 사용될 수도 있다.

 

class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository,
  private val formatDateUseCase: FormatDateUseCase // 다른 사용 사례 클래스를 재사용
) { /* ... */ }

https://developer.android.com

 

Kotlin 사용사례 (Use Case) 호출

Kotlin 에서 operator 수정자와 함께 invoke() 함수를 정의하여 사용 사례 클래스 인스턴스를 함수처럼 호출 가능하게 할 수 있다.

class FormatDateUseCase(userRepository: UserRepository) {

    private val formatter = SimpleDateFormat(
        userRepository.getPreferredDateFormat(),
        userRepository.getPreferredLocale()
    )

    operator fun invoke(date: Date): String {
        return formatter.format(date)
    }
}

위 코드를 확인해보면, FormatDateUseCase invoke() 메서드를 사용하여 클래스 인스턴스를 함수인 것처럼 호출할 수 있습니다.

 

수명 주기

사용 사례(Use Case) 는 고유한 수명 주기를 갖지 않는다.

대신 그 Use Case Class의 범위가 적용된다.

즉, UI 레이어의 클래스, 서비스, Appiication 클래스 자체에서 사용 사례를 호출할 수 있다.

사용 사례는 변경 가능한 데이터를 포함해서는 안 되므로 개발자가 Use Case Class의 새 인스턴스를 종속 항목으로 전달할 때마다 그 인스턴스를 만들어야 한다.

 

 

도메인 레이어 작업

1. 재사용 가능한 간단한 비즈니스 로직

UI 레이어에 있는 반복 가능한 비즈니스 로직은 Use Case Class에 캡슐화해야 한다.

그러면 그 로직이 사용된 모든 곳에 변경사항을 더 쉽게 적용이 가능하다.

또한, 로직을 독립적으로 테스트할 수 있다.

 

* 참고
사용 사례에 존재할 수 있는 로직이 대신 Util 클래스의 정적 메서드에 포함되는 경우도 있다.
그러나 Util 클래스는 찾기 어렵고 기능도 발견하기 어려운 경우가 종종 있다.
따라서, Util 클래스의 정적 메서드를 권장하지 않는다.
또한 사용 사례에서는 기본 클래스의 스레딩 및 오류 처리와 같은 공통 기능을 공유할 수 있으며 이는 규모가 큰 팀에서 도움이 될 수 있다.

 

2. 저장소 결합

예시를 들어서 설명을 하겠다.

뉴스 앱에는 뉴스와 작성자 데이터 작업을 각각 처리하는 NewRepository 클래스와 AuthorsRepository 클래스가 있을 수 있다.

두 Repo 클래스에 있는 각 Entity 하나 씩 원할 경우 하나의 Repo로 만들어서 정보를 얻어올 수 있다.

로직은 여러 저장소와 관련되어 있고 복잡해질 수 있으므로 하나의 Use Case Class를 만들어 ViewModel 에서 로직을 추상화하고 가독성을 높일 수 있다. 또한, 로직을 보다 쉽게 개별적으로 테스트하고 앱의 다른 부분에서 재사용도 가능하다.