Kotlin Academy · 강의

Arrow 핵심 형식으로 함수형 도메인 모델링하기

Either, NonEmptyList, 검증된 오류 누적을 사용해 복잡한 도메인을 모델링합니다.

레슨 4/413개 단계

Arrow 핵심 형식으로 함수형 도메인 모델링하기은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

함수형 도메인 모델링이란 무엇입니까

함수형 도메인 모델링은 대수적 타입(Either, Option, 봉인 클래스)을 사용하여 비즈니스 규칙을 타입에 인코딩합니다. 컴파일 시점에 잘못된 상태를 표현할 수 없게 되며, 오류는 함수 시그니처에 명시됩니다. 숨겨진 예외가 없습니다.

인라인/값 클래스를 사용한 값 객체

기본 타입 집착을 막으려면 Kotlin 값 클래스로 기본 타입을 감싸십시오. PostId가 필요한 곳에 UserId를 전달하면 타입 시스템이 거부합니다:

@JvmInline value class UserId(val value: Long)
@JvmInline value class PostId(val value: Long)

fun findUser(id: UserId): Either<UserError, User> = TODO()
// findUser(PostId(1L))  // Compile error!

도메인 오류를 위한 봉인 클래스

오류를 봉인 클래스 계층 구조로 모델링하십시오. 각 하위 클래스는 해당 오류 사례와 관련된 데이터만 포함합니다:

sealed class UserError {
    data class NotFound(val id: UserId) : UserError()
    data class EmailTaken(val email: String) : UserError()
    data class ValidationFailed(val field: String, val reason: String) : UserError()
}

Validated: 여러 오류 누적하기

첫 번째 오류만이 아니라 모든 검증 오류를 한 번에 보고하려면 Arrow의 Validated를 사용하십시오. 또는 Raise DSL에서는 zipOrAccumulate을 사용할 수 있습니다. 오류는 NonEmptyList에 누적됩니다:

import arrow.core.Validated
import arrow.core.valid
import arrow.core.invalid

fun validateName(name: String): Validated<String, String> =
    if (name.isNotBlank()) name.valid() else "Name is blank".invalid()

검증 결과 조합하기

여러 Validated 결과를 결합하려면 zip()을 사용하십시오. 어느 하나라도 Invalid이면 모든 오류가 누적됩니다:

val result: Validated<NonEmptyList<String>, User> =
    validateName(name).zip(validateEmail(email)) { n, e -> User(n, e) }
        .mapLeft { it }

잘못된 상태를 표현할 수 없게 만들기

nullable email과 isVerified 플래그가 있는 User 대신 봉인 하위 클래스를 사용하면 타입 시스템이 인증되지 않은 사용자의 이메일에 접근하지 못하게 합니다:

sealed class User {
    data class Unverified(val id: UserId, val pendingEmail: String) : User()
    data class Verified(val id: UserId, val email: String) : User()
}

스마트 생성자

공개 생성자 대신 Either 또는 Option을 반환하는 동반 객체 팩토리 함수를 사용하십시오. 이렇게 하면 인스턴스가 항상 valid 상태가 됩니다:

class Email private constructor(val value: String) {
    companion object {
        fun of(raw: String): Either<String, Email> =
            if (raw.contains("@") && raw.length <= 255) Email(raw).right()
            else "Invalid email format".left()
    }
}

Either와 Option을 처리 흐름에서 조합하기

실제 도메인 작업에서는 일반적으로 저장소 조회(Option)와 검증(Either)을 연쇄적으로 연결합니다. Arrow의 either { } 블록과 .bind()를 사용하면 두 작업을 자연스럽게 조합할 수 있습니다:

fun createPost(authorId: UserId, title: String, body: String): Either<PostError, Post> = either {
    val author = userRepo.findById(authorId).toEither { PostError.AuthorNotFound }.bind()
    val validTitle = validateTitle(title).bind()
    postRepo.save(Post(author, validTitle, body))
}

불변성과 복사

도메인 엔터티는 불변이어야 합니다. 데이터 클래스와 copy()를 사용하여 새로운 상태를 도출하십시오. arrow-optics의 Arrow Lens를 사용하면 변경 없이 중첩된 상태를 편리하게 업데이트할 수 있습니다:

val updated = user.copy(email = "new@example.com")
// Arrow Optics:
val emailLens = User.email
val updatedWithLens = emailLens.set(user, "new@example.com")

봉인 클래스를 사용한 타입 안전한 구성

봉인 클래스로 애플리케이션 구성의 여러 변형을 모델링하면 컴파일러가 모든 경우를 처리하도록 강제합니다:

sealed class DbConfig {
    data class Postgres(val url: String, val user: String, val pass: String) : DbConfig()
    data class InMemory(val dbName: String = "test") : DbConfig()
}

한눈에 보는 이점

Arrow의 핵심 타입을 활용한 함수형 도메인 모델링으로 다음을 얻을 수 있습니다:

  • 도메인 코드에서 null 포인터 예외가 발생하지 않음
  • 함수 시그니처에서 오류가 드러남
  • 봉인 계층 구조에 대한 완전한 when 검사
  • 테스트 가능한 순수 함수
  • 자체적으로 의미를 설명하는 코드

빠른 확인

예외를 던지는 것보다 도메인 오류에 sealed class 계층 구조를 사용하는 주된 이점은 무엇입니까?

정리: Arrow 핵심 타입을 활용한 함수형 도메인 모델링

핵심 요점:

  • 값 클래스가 기본 타입 집착을 막습니다
  • 봉인 오류 계층 구조가 실패 사례를 빠짐없이 처리하면서 타입 안전성을 보장합니다
  • 스마트 생성자가 valid 인스턴스를 보장합니다
  • either { }.bind()가 실패할 수 있는 작업을 깔끔하게 조합합니다
  • 불변 데이터와 copy() / Arrow Optics를 함께 사용하여 상태 전환을 안전하게 처리합니다
무료로 시작

AI 튜터와 함께 Kotlin을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
51
레슨
203

자주 묻는 질문

“Arrow 핵심 형식으로 함수형 도메인 모델링하기” 강의는 무료인가요?

네 — “Arrow 핵심 형식으로 함수형 도메인 모델링하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Arrow 핵심 형식으로 함수형 도메인 모델링하기”에서 뭘 배우나요?

Either, NonEmptyList, 검증된 오류 누적을 사용해 복잡한 도메인을 모델링합니다. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“Arrow 핵심 형식으로 함수형 도메인 모델링하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Either : 예외 없이 타입이 지정된 오류 처리
  2. Arrow Raise DSL: 형식이 지정된 오류 조합하기
  3. Option과 Nullable: 각각 언제 사용할까요
  4. Arrow 핵심 형식으로 함수형 도메인 모델링하기
← Kotlin Academy(으)로 돌아가기