Skip to content

Instantly share code, notes, and snippets.

@djkeh
Last active May 3, 2025 20:23
Show Gist options
  • Save djkeh/44ad061d2b3476f4af54f65ab57b84ee to your computer and use it in GitHub Desktop.
Save djkeh/44ad061d2b3476f4af54f65ab57b84ee to your computer and use it in GitHub Desktop.
코틀린 코드로 하는 엔티티 디자인 제안
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import java.util.Objects
@Table(
uniqueConstraints = [
UniqueConstraint(name = "udx_name_email", columnNames = ["name", "email"]),
],
indexes = [
Index(name = "idx_created_at", columnList = "createdAt"),
Index(name = "idx_modified_at", columnList = "modifiedAt"),
]
)
@Entity
class Student(
@Column(nullable = false) var name: String,
@Column(nullable = false) var age: Int,
@Column(nullable = false) var email: String,
) : AuditingFields() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0L
var phone: String? = null
var address: String? = null
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Student) return false
return when (id) {
0L -> {
if (name != other.name) return false
if (age != other.age) return false
if (email != other.email) return false
if (phone != other.phone) return false
if (address != other.address) return false
true
}
else -> this.id == other.id
}
}
override fun hashCode(): Int = when (id) {
0L -> Objects.hash(name, age, email, phone, address)
else -> id.hashCode()
}
override fun toString(): String {
return "Student(" +
"id=$id, " +
"name='$name', " +
"age=$age, " +
"email='$email', " +
"phone=$phone, " +
"address=$address, " +
super.toString() +
")"
}
}
@djkeh
Copy link
Author

djkeh commented May 3, 2025

  • 테이블 명은 단수로 -> 클래스명과 테이블명이 일치, 별도로 테이블명을 지정할 필요 없음
    • 인덱스의 표현
  • 이 도메인을 구성하는 필수 정보는 not null로 설계, @Column으로 명시, 생성자에 파라미터로 요구
    • id는 자동으로 채워넣는 정보일 경우 생성자에서 제외
  • 그 밖에 부가 정보는 nullable 설계, 생성자에서 제외, 기본값 null을 제시하여 편의성을 끌어올림
  • 컬렉션 매핑과 연관관계를 위해 equals(), hashcode() 구현
    • 영속화된 상황과 아닌 상황을 고려
  • 로그 관찰을 용이하게 하기 위해 toString() 구현
    • AuditingFields와 같이 메타 정보를 분리하였을 경우, super.toString() 추가
    • 생성자에 id가 없을 경우, id를 toString 출력 가장 앞부분으로 직접 위치시킴

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment