1. 생성자에 val 키워드를 통한 정의

@Entity
@Table(name = "Users")
open class User(
    @Column(unique = true)
    val email: String,

    @Column
    val password: String,

    @Column(unique = true)
    val nickname: String,

    @Id
    @GeneratedValue(generator = "uuid-gen", strategy = GenerationType.IDENTITY)
    @GenericGenerator(name = "uuid-gen", strategy = "uuid2")
    @Column(updatable = false)
    val id: UUID? = null
) {

    open fun changeNickname(nickname: String) {
        this.nickname = nickname // 컴파일 에러
    }

    @OneToMany(mappedBy = "user")
    val posts: MutableList<Post> = mutableListOf()
}
plugins {
    kotlin("plugin.jpa") version "1.6.21"
	kotlin("plugin.spring") version "1.6.21"
}

2. 생성자에 private var를 통한 정의 + 외부 노출 프로퍼티 추가

@Entity
@Table(name = "Users")
open class User(
    @Column(name = "email", unique = true)
    private var _email: String,

    @Column(name = "password")
    private var _password: String,

    @Column(name = "nickname", unique = true)
    private var _nickname: String,

    @Id
    @GeneratedValue(generator = "uuid-gen", strategy = GenerationType.IDENTITY)
    @GenericGenerator(name = "uuid-gen", strategy = "uuid2")
    @Column(updatable = false)
    val id: UUID? = null
) {

    @OneToMany(mappedBy = "user")
    private var _posts: MutableList<Post> = mutableListOf()

    val email: String
        get() = this._email

    val password: String
        get() = this._password

    val nickname: String
        get() = this._nickname

    val posts: MutableList<Post>
        get() = this._posts

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

3. 생성자가 아닌 블록 영역에서 var를 통한 정의 + 클로즈 setter 적용

@Entity
@Table(name = "Users")
open class User(email: String, password: String, nickname: String) {

    @Id
    @GeneratedValue(generator = "uuid-gen", strategy = GenerationType.IDENTITY)
    @GenericGenerator(name = "uuid-gen", strategy = "uuid2")
    @Column(updatable = false)
    var id: UUID? = null
        private set;

    @Column(unique = true)
    var email: String = email
        private set;

    @Column
    var password: String = password
        private set;

    @Column(unique = true)
    var nickname: String = nickname
        private set;

    @OneToMany(mappedBy = "user")
    var posts: MutableList<Post> = mutableListOf()
        private set;

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