[Noeul] Sealed Class로 State 관리하기~

love&peace·2024년 9월 27일

neoul

목록 보기
2/2
post-thumbnail

What is Sealed Class ?!

sealed class는 부모 클래스를 상속하는 자식 클래스의 종류를 제한하는 특성을 갖는 클래스.

특징

  • 직접 인스턴스화 할 수 없다 , 서브 클래스의 인스턴스화는 가능하다
  • 서브 클래스는 data class, object, class가 가능하다
  • 같은 파일 내에 선언 되어야 한다

Enum Class 와 비교해보기

Enum Class : 타입 안정성을 갖는 상수의 집합을 표현합니다. Enum 클래스를 사용하여 열거형 타입을 정의할 수 있습니다.

서브클래스 정의:

  • Sealed Class: 여러 서브클래스를 정의할 수 있으며, 각 서브클래스가 서로 다른 상태와 속성을 가질 수 있습니다.
  • Enum Class: 고정된 상수 집합을 정의하며, 서브클래스를 생성할 수 없습니다. 각 상수는 동일한 타입을 가집니다.

when 구문 사용:

  • Sealed Class: 모든 서브클래스를 컴파일 타임에 확인할 수 있어, 처리하지 않은 경우에 대한 경고가 발생합니다. 이는 모든 가능성을 명확히 처리해야 함을 보장합니다. (else 불필요)
  • Enum Class: 각 열거형 상수를 사용할 수 있지만, 경우에 따라 새로운 상수를 추가할 수 없으므로, 모든 경우를 처리하는 것이 항상 보장되지 않습니다.(else 필요)

State 관리가 필요한 이유

프로젝트에서 엑티비티에 진입하자고 바로 api 요청 받는 화면에서 api 통신의 결과에 따른 상태관리가 필요했다

  • 비로그인 상태
  • 로딩 상태
  • 요청 실패 상태
  • 요청 성공 상태

BrandDetailState.kt

sealed class BrandDetailState {
    object Uninitialized : BrandDetailState()

    object Failure: BrandDetailState()

    object NotAuth: BrandDetailState()

    data class Success(
        val brand: BrandDetail
    ) : BrandDetailState()
}

BrandDetailActivity.kt

//..//
 override fun observeData() {
        viewModel.brandDetailStateLiveData.observe(this) {
            when (it) {
            	is BrandDetailState.Uninitialized -> (
                	handleLoading() // 로딩 UI
                }
                
                is BrandDetailState.Success -> {
                    handleSuccess(it) //성공 했을 시 binding
                }

                is BrandDetailState.Failure -> {
                    handleFailure() // 실패 UI
                }

                is BrandDetailState.NotAuth -> {
                    handleNotAuth() // 로그인 화면으로 이동
                }
            }
        }
//..//

전체적인 흐름은 viewModel에서 의존성 주입 받은 비즈니스 로직(api 통신)의 결과를 LiveData에 넣어 View에서 관찰하여 UI 상태를 번경 한다.

[Neoul 깃헙]
https://github.com/UMC-neoul/NEOUL_FRONT/blob/develop/Neoul/app/src/main/java/com/umc/neoul/presentation/main/brand/detail/BrandDetailState.kt

참고

https://velog.io/@kej_ad/Kotlin-Enum-class-와-when문

0개의 댓글