Overview
Kotlin 에서 제공하는 유용한 기능 중에 JPA 에서는 권장되지 않거나 사용하면 안되는 기능들이 있습니다.
1. data class
Kotlin 에서 제공하는 data class
는 JPA의 @Entity
에서는 사용하지 않는 것이 좋습니다.
data class
는 불변성과 값 기반 비교를 지향하지만, JPA의 엔티티는 보통 가변 상태를 가지며 식별자(ID) 기반으로 관리되기 때문에 둘의 지향점이 다릅니다.
또한, data class
가 자동 생성하는 equals
, hashCode
구현은 모든 필드를 기반으로 비교하기 때문에 id
가 아직 할당되지 않은 상태에서는 동일한 엔티티임에도 불구하고 서로 다른 객체로 인식될 수 있습니다.
그래서 Kotlin 에서 엔티티 객체를 정의할 때는 기본 class 를 사용해야 합니다.
2. init
Kotlin 에서는 init
블럭을 사용할 수 있습니다.
init
블럭은 "객체 생성 직후" 실행되지만, JPA 는 리플렉션을 통해 엔티티를 "빈 객체로 생성 -> 필드 값을 주입" 하는 순서로 동작합니다.
따라서 init
블럭에서 필드 값을 참조하면 아직 값이 설정되지 않아 NullPointerException
또는 예상치 못한 로직 오류가 발생할 수 있습니다.
엔티티 객체 생성 이후에 뭔가를 처리하고 싶다면 외부에서 처리하거나, 내부에서 처리해야 한다면 @PostLoad
등을 활용해야 합니다.
Conclusion
Kotlin 은 여러 편의 기능을 제공하지만, JPA 와 함께 사용할 때는 특정 Kotlin 기능이 JPA 의 동작 방식과 충돌할 수 있습니다.
그 중 대표적인 예로 data class
와 init
블럭 사용을 지양해야 하는 이유를 알아보았습니다.
'Language > Kotlin' 카테고리의 다른 글
Kotlin 에서 JPA 사용하기 3 (@Id 선언) (1) | 2025.06.15 |
---|---|
Kotlin 에서 JPA 사용하기 1 (all-open, no-arg 플러그인) (1) | 2025.06.15 |
Kotlin Collections 와 Sequences 의 차이점 (feat. Java Stream) (1) | 2022.01.27 |
Kotlin Enum (0) | 2021.10.06 |
Kotlin Collection Sorting (정렬) (0) | 2021.02.19 |