Entity 및 CRUD 메서드를 Kotlin으로 리팩토링▶︎ build.gradle
▷ plugins 추가
id 'org.jetbrains.kotlin.jvm' version '2.0.0'
id 'org.jetbrains.kotlin.plugin.lombok' version '2.0.0'
id 'org.jetbrains.kotlin.plugin.spring' version '2.0.0'
id 'org.jetbrains.kotlin.plugin.jpa' version '2.0.0'
id 'org.jetbrains.kotlin.kapt' version '2.0.0'
▷ kapt 설정 추가
kapt {
keepJavacAnnotationProcessors = true
}
🧐 kapt
▷ dependencies 추가
// kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib"
implementation "org.jetbrains.kotlin:kotlin-reflect"
// kotlin + QueryDSL
implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta"
kapt "com.querydsl:querydsl-apt:5.0.0:jakarta"
kapt "jakarta.annotation:jakarta.annotation-api"
kapt "jakarta.persistence:jakarta.persistence-api"
▷ allOpen 설정 추가
allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.Embeddable")
annotation("jakarta.persistence.MappedSuperclass")
}
🧐 allOpen
final → Spring AOP 및 JPA 같은 프레임워크에서 프록시 객체를 만들기 어렵다@Entity 어노테이션이 있는 객체의 프록시 객체를 생성할 수 있게 된다▶︎ IntelliJ IDEA의 Convert Java File to Kotlin File 을 사용하여 기존 Java class를 Kotlin class 로 변경

▶︎ Todo(할일) Entity
@Entity
@Table(name = "todos")
class Todo(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = 0,
@Column(name = "title", nullable = false)
val title: String,
@Column(name = "contents", nullable = false)
val contents: String,
@Column(name = "weather")
val weather: String,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
val user: User
) : Timestamped() {
@OneToMany(mappedBy = "todo", cascade = [CascadeType.REMOVE])
var comments: MutableList<Comment> = mutableListOf()
@OneToMany(mappedBy = "todo", cascade = [CascadeType.PERSIST])
var managers: MutableList<Manager> = mutableListOf()
init {
managers.add(Manager(user, this))
}
}
equals(), toString() 등의 Object 메서드가 자동 생성되어 예상치 못한 사이드 이펙트가 발생할 수 있다. copy() 메서드가 필요한 경우 적용 검토▶︎ DTO(response)
class TodoResponse(
val id: Long,
val title: String,
val contents: String,
val weather: String,
val user: UserResponse,
val createdAt: LocalDateTime,
val modifiedAt: LocalDateTime
) {
companion object {
fun from(todo: Todo) = with(todo) {
TodoResponse(id,
title,
contents,
weather,
UserResponse.from(user),
createdAt,
modifiedAt
)
}
}
}
🧐 companion object : 정적 팩토리 메서드 선언 시 사용
▶︎ Kotlin 생성자

new 를 사용하지 않음프로퍼티(Property)를 명시하여 인스턴스 생성