강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

정라잇님의 프로필 이미지
정라잇

작성한 질문수

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

Member 도메인 모델 확장

안녕하세요 코틀린으로 강의 수강 시 도메인 코드 질문드립니다

작성

·

11

·

수정됨

0

좋은 추석 보내고 계신가요?
현재 코틀린으로 강의를 따라해 보고 있습니다.

 

class Member private constructor(
    val email: String,
    var nickname: String,
    var passwordHash: String,
    var status: MemberStatus,
) {
    fun activate() {
        check(status == MemberStatus.PENDING) {
            "회원이 PENDING 상태가 아닙니다"
        }
        this.status = MemberStatus.ACTIVATE
    }

    fun deactivate() {
        check(status == MemberStatus.ACTIVATE) {
            "회원이 ACTIVE 상태가 아닙니다"
        }
        this.status = MemberStatus.DEACTIVATED
    }

    fun verifyPassword(
        password: String,
        passwordEncoder: PasswordEncoder,
    ): Boolean = passwordEncoder.matches(password, this.passwordHash)

    fun changeNickname(nickname: String) {
        this.nickname = nickname
    }

    fun changePassword(password: String) {
        this.passwordHash = password
    }

    companion object {
        fun create(
            email: String,
            nickname: String,
            password: String,
            passwordEncoder: PasswordEncoder,
        ): Member =
            Member(
                email,
                nickname,
                passwordEncoder.encode(password),
                MemberStatus.PENDING,
            )
    }
}

이러한 식으로 작성하였는데 자바에서는 const로 선언한 객체나 변수가 아닌 이상 기본적으로 가변입니다.

 

그런데 코틀린에서는 val, var 키워드에 따라서 var로 선언해야 가변 타입이 됩니다.

 

Member 도메인 모델 확장 챕터 수강하고 있는데 이 경우는 도메인에서 가변 속성을 미리 정의하고 해당 속성들을 var로 선언하는 것이 맞을지, 혹은 val을 통해 불변성을 확보하고 새 객체를 생성하여 변경을 처리하는 것이 적합할지 궁금합니다.

코틀린에서 도메인 코드를 작성할 때 자바와 다른 문법&개념과 도메인 중심 설계가 종종 난해할 때가 있네요.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 정라잇님, 코틀린으로 도메인 모델을 작성하실 때의 어려운 점에 대해 질문 주셨어요. 코틀린의 val과 var는 자바의 final과 다르게 불변성과 가변성을 보다 명확하게 구분해 주므로, 도메인 모델을 설계할 때 중요한 고려 사항이 됩니다.

도메인 모델에서 가변성을 어떻게 다룰 것인지는 도메인의 특성 및 요구사항에 따라 변할 수 있습니다. 코틀린에서 불변성을 유지한다는 것은 도메인 객체가 변하지 않도록 설계하여, 객체 자체의 상태를 보장할 수 있게 해줍니다. 이는 특히 여러 스레드에 의해 객체가 접근될 수 있는 환경에서 유용합니다.

코틀린에서 도메인 코드 작성 시 고려사항:

  1. 불변성을 고려한 설계: 생성 시 값이 절대 변하지 않아야 한다거나 비즈니스 로직에서 상태 변화가 자주 발생하지 않는 경우, val로 선언하여 불변성을 처리하는 것이 좋습니다.

  2. 가변성이 필요한 경우: 사용자가 특정 기능(예: 비밀번호 변경, 상태 변경)을 사용할 때, 도메인 모델의 일부 속성을 변경해야 할 필요가 있습니다. 이런 경우는 var로 설정해도 괜찮습니다. 그러나, 가변성이 현재 디자인에 필요할 때는 그 변화를 적절히 관리할 수 있는 로직, 예를 들어 상태 전환 메소드와 같은 안전한 메커니즘을 준비해야 합니다.

코드상에서는 비밀번호를 변경하는 기능이나 애플리케이션 로직에서 nickname을 변경하는 기능이 있으므로, var로 설정되어 있습니다. 이는 비즈니스 요구사항이 변경되는 경우에도 잘 대응할 수 있는 방식입니다.

도메인 모델의 불변성을 반드시 보장해야 한다면, 변경을 적용할 때마다 새로운 객체를 반환하여 수정하도록 설계할 수도 있습니다. 다만, 그러한 설계는 성능과 메모리 사용에 추가적인 고려가 필요하다는 점을 염두에 두어야 합니다.

강의에서 다루어진 내용과 관련된 기존 게시물을 찾아보면 도움이 될 경우가 있습니다. 관련된 주제를 잘 설명한 게시물을 추천합니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

정라잇님의 프로필 이미지
정라잇

작성한 질문수

질문하기