1 분 소요

Class with property

// Constructor
class T1(
    val name: String,
    val id: Int
)

fun main(args: Array<String>) {
  val t1 = T1(
    name = "Kwon", 
    id = 1
  )
  // t1.id = 30
}
  • id는 val이므로, t1.id는 컴파일 에러

Class with field

// Field
class T1_1 {
  val name: String = ""
  val id: Int = 0
  lateinit var lateInitial: String
}

fun main(args: Array<String>) {
  // Field excluded lateinit var is must be initialized
  val t1_1 = T1_1()
}
  • () 프로퍼티 생성자가 없는 클래스

Entity

// Entity
@Entity
class T2(
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id", nullable = false)
    var id: Long? = null,
    val name: String = "",
    val option: Boolean = true
)

fun main(args: Array<String>) {
  // Entity
  val t2 = T2()
  t2.id = 1
  // t2.name = "Kim" // Entity always readable

  // Update or insert Entity
  val newEntity : T2 = T2(
    id = t2.id,
    name = t2.name,
    option = false
  )
}
  • Entity로 사용할 수 있는 클래스
  • @GeneratedValuevar로 사용해야 set이 가능
  • update or insert를 위해서는, 기존 Entity를 사용하는 것이 아니라, 신규 Entity를 생성
    • Kotlinimmutable을 선호, 이미 생성된 객체에 존재하는 상태가 변경되는건 항상 사이드 이펙트가 존재

DTO

// DTO
data class T3(
  var id: Long? = null,
  var name: String
)

fun main(args: Array<String>) {
  // DTO
  // Since the property has not yet been determined
  val t3 = T3(
    name = "Kim"
  )

  // Id property is determined!
  t3.id = 2

  // Data class deep copy
  val t3_2 = t3.copy()
  if (t3 == t3_2) {
    println("same")
  }
  
  // Not same
  t3.id = 4
  if (t3 != t3_2) {
    println("not same")
  }
}
  • DTO로 사용할 수 있는 data class
    • copy()
    • equals()
  • EntityDatabase의 제약 조건을 항상 지키는 클래스
  • Persistence layer외에 다른 layer에서 사용할 수 있는 클래스가 필요
    • Entityval인 프로퍼티들을 결정할 수 없는 상황에서 사용

태그:

카테고리:

업데이트: