본문 바로가기
JAVA & KOTLIN

[KOTLIN] Kotlin에서 Value Object 언제 사용할까?

by nozee 2024. 12. 21.
반응형

 

Kotlin에서는 Value Object를 사용하여 데이터를 안전하게 캡슐화하고, 코드의 가독성과 유지보수를 향상시킬 수 있다. Value Object란 특정 도메인에서 의미를 가지는 값을 표현하기 위해 설계된 객체로, 데이터를 단순히 묶는 것뿐 아니라, 유효성 검사를 포함한 다양한 로직을 내부에 캡슐화한다.

Spring을 활용하면 Value Object를 통해 들어오는 요청 데이터를 검증할 수 있으며, 도메인 로직의 일관성을 유지할 수 있다.

 

1. Value Object란?

Value Object는 값 그 자체로 식별되는 객체이다. 예를 들어, 이메일 주소, 전화번호, 금액과 같은 값들은 각각 독립적인 의미를 가지며, 이를 Value Object로 정의하면 다음과 같은 이점을 얻을 수 있다:

  1. 도메인 로직 캡슐화
    값의 유효성 검사와 관련된 로직을 객체 내부에 포함시킬 수 있다.
  2. 불변성
    Kotlin의 data class와 함께 사용하면 불변성을 보장할 수 있다.
  3. 의미 있는 표현
    단순 문자열이나 숫자 대신 명확한 타입을 사용하여 코드의 의미를 드러낼 수 있다.

 

2. Kotlin에서 Value Object 예제

아래는 이메일 주소를 표현하는 Value Object의 예제

@JvmInline
data class Email private constructor(val value: String) {
    companion object {
        private val EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$".toRegex()

        fun of(value: String): Email {
            require(value.matches(EMAIL_REGEX)) { "Invalid email format: $value" }
            return Email(value)
        }
    }
}

 

위 코드에서 Email 클래스는:

  • 이메일 유효성 검사를 수행한다.
  • 생성자를 private으로 제한하여 무조건 of 메서드를 통해 객체를 생성하도록 강제한다.
참고
@JvmInline
애너테이션은 Kotlin의 인라인 클래스를 정의할 때 사용된다. 인라인 클래스는 런타임에 래퍼 객체를 생성하지 않고도 타입 안정성을 유지하는 방법을 제공한다. 이를 통해 불필요한 객체 생성 비용을 줄일 수 있다.

 

 

3. Spring과 연계한 Value Object 활용

Spring에서는 HTTP 요청을 처리할 때, 요청 데이터를 DTO(Data Transfer Object)에 매핑하여 값을 전달받는다. 이 과정에서 Value Object를 활용하면 자연스럽게 유효성 검사를 통합할 수 있다.

DTO에 Value Object를 사용한 예제

data class UserRequest(
    val name: String,
    val email: Email
)

 

Spring의 컨트롤러에서 이를 활용하면 다음과 같은 방식으로 동작한다:

@RestController
@RequestMapping("/users")
class UserController {

    @PostMapping
    fun createUser(@RequestBody request: UserRequest): ResponseEntity<String> {
        // 이메일 값은 이미 Value Object 내부에서 검증되었으므로 신뢰할 수 있다.
        return ResponseEntity.ok("User created with email: ${request.email.value}")
    }
}

 

이점

  • Email.of 메서드를 통해 값이 자동으로 검증되므로 컨트롤러에서 별도의 유효성 검사 코드를 작성할 필요가 없다.
  • 도메인 로직이 집중되어 코드 중복을 줄이고 유지보수를 용이하게 한다.

 

4. 마무리

Kotlin에서 Value Object는 도메인 로직을 캡슐화하고 코드의 안전성을 높이는 데 유용하다. Spring과 함께 사용하면 HTTP 요청 처리 시 유효성 검증을 자연스럽게 통합할 수 있어 효율적이다.
Value Object를 활용한 설계는 코드의 가독성과 재사용성을 높이며, 도메인 중심 설계(DDD, Domain-Driven Design)를 실천하는 데 큰 도움이 된다.

 
반응형