UseCase를 알아보자

312·2024년 5월 29일

패턴 알아보기

목록 보기
2/2

What is UseCase ?

UseCase 패턴은 사용자 관점에서 시스템의 서비스 기능 관계를 다이어그램으로 표현한 것이다.

즉 사용자가 서비스에서 수행하고자 하는 기능들을 UseCase라고 한다.

UseCase 패턴에서는 기능의 UseCase를 선언해두고 사용하는 로직이나 호출하는 로직에서 해당 UseCase를 통해 소통하는 것을 원칙으로 한다.

Why UseCase?

UseCase를 자판기로 표현해보자.

돈을 넣는다
원하는 음료 버튼을 누르면 음료수가 나온다

UseCase 패턴을 적용하지 않는다면 음료수를 마시는 과정이 하나의 기능처럼 작동해서 돈이나 음료의 종류나 액수 변경 등의 기능 확장과 유지보수가 어렵게 작동할 수 있다.

기능을 분리하더라도 서비스가 확장될수록 기능의 흐름이 한눈에 파악되지 않고 어디까지 기능을 분리하고 통합할지 고민하게 된다.

이러한 문제때문에 사용자 관점에서 기능을 분리해 기능의 흐름대로 UseCase를 호출하고 그 UseCase 아래에서 각각의 기능을 실행하는 UseCase 패턴을 구축한다.

예를들어, "지폐를 추가한다" 는 기능을 추가할 때 "돈을 넣는다" UseCase의 하위 로직만 수정하고 테스트하면 다른 코드의 신뢰성을 유지할 수 있다.

또한, 중간에 "음료의 온도를 유지한다" UseCase가 추가된다고 해도 코드와 코드의 중간이 아닌 UseCase의 사이에 넣는다거나 순서가 바뀌어도 유동적으로 대처할 수 있게 된다.

How To UseCase?

Kotlin으로 작성된 로그인 코드를 살펴보자.


class FetchAccessTokenUseCase @Inject constructor(
    private val loginRepository: LoginRepository
) {
    suspend operator fun invoke(provider: Provider, token: String) {
        loginRepository.fetchAccessToken(provider, token)
    }
}

class DeleteTokenUseCase @Inject constructor(
    private val loginRepository: LoginRepository
) {
    suspend operator fun invoke() {
        loginRepository.deleteToken()
    }
}

토큰을 통해 로그인 하는 기능, 토큰을 삭제하고 로그아웃 하는 기능의 두가지 기능이 있다.

실제로 로그인/아웃 기능을 사용하는 로그인 페이지에서는 해당 UseCase를 호출하고 UseCase는 LoginRepository 를 통해 토큰 저장소와 소통한다.

이렇게 하면 로그인 페이지에서 직접적으로 Repository를 선언해주지 않아도 되고 기능의 변경이나 확장이 있을때도, UseCase를 추가하고 기능을 구현해주면 된다.

UseCase 패턴을 통해 가독성 좋고 유지보수성 효율성 높은 코드를 만들수 있다.

profile
안드로이드 개발자 이상일입니다.

0개의 댓글