본문 바로가기
Kotlin & SpringBoot

[Kotlin] Sealed Class 사용하기

by 향각산 2025. 6. 24.

Sealed Class는 Enum Class와 달리 여러 서브 클래스를 가질 수 있다.

상속을 지원하면서 서브 클래스를 무조건 Sealed Class와 같은 파일 내에 선언해야 하기 때문에, 관리포인트가 적다.

 

서브클래스는 class,data class, object 전부 사용 가능하다.

이러한 특징을 활용하면 if 문으로 나열된 조건들을 깔끔하게 분리해서 관리할 수 있다.

 

 

문제 상황

if (user.age < 18) {
    println("미성년자는 가입할 수 없습니다.")
}
if (!user.email.contains("@")) {
    println("이메일 형식이 잘못되었습니다.")
}
if (user.nickname.isBlank()) {
    println("닉네임은 필수입니다.")
}

조건이 늘어날수록 로직은 복잡하고 유지보수하기 어려워진다.

 

Sealed Class로 추상화

Sealed Class로 추상화하면 다음처러 선언할 수 있다. 각 검증조건을 하나의 클래스로 분리해서 선언형으로 작성할 수 있다.

자바에서 일반적인 Validation 전용 클래스랑 비슷할 수 있다.

sealed class ValidationRule(val name: String) {
    abstract fun isInvalid(user: User): Boolean

    object UnderAge : ValidationRule("미성년자 불가") {
        override fun isInvalid(user: User): Boolean {
            return user.age < 18
        }
    }

    object InvalidEmail : ValidationRule("이메일 형식 오류") {
        override fun isInvalid(user: User): Boolean {
            return !user.email.contains("@")
        }
    }

    object EmptyNickname : ValidationRule("닉네임은 필수") {
        override fun isInvalid(user: User): Boolean {
            return user.nickname.isBlank()
        }
    }
}

 

사용

실제로 호출하는 부분에서 다음처럼 호출한다.

fun validate(user: User): List<String> {
    val rules = listOf(
        ValidationRule.UnderAge,
        ValidationRule.InvalidEmail,
        ValidationRule.EmptyNickname
    )

    return rules
        .filter { it.isInvalid(user) }
        .map { it.name }
}

 

validate 하는 부분에 있는 코드들이 다양한 조건으로 만들수 있고, Rule로 만들어놓은 조건들이 재활용도 가능한 부분에서 좋아보인다.

 

Sealed Class는 단순한 Enum의 대체가 아니라, 조건이나 상태, 검증, 정책등 복수의 서브 클래스로 표현할 수 있는 모든 상황에 적합해 보인다.

Java에서 쓰는 validation 전용 클래스가 있다면 리펙토링 해보기 좋아보인다.

 

 

'Kotlin & SpringBoot' 카테고리의 다른 글

[Kotlin] 코틀린 @ConfigurationProperties 사용하기  (0) 2025.05.20