Yebali

Spring JPA Entity에 Data Class를 사용해도 될까? 본문

Kotlin

Spring JPA Entity에 Data Class를 사용해도 될까?

예발이 2021. 10. 31. 23:46

Data Class란?

Kotlin에서 Data Class는 toString(), hashCode(), equals(), copy()를 자동으로 만들어주는 Class를 말한다.

사용법은 class 앞에 ‘data’라는 keyword를 붙여주면 된다.

data class User(
    val name: String,
    val age: Int
)

Data Class의 특징

  1. 상속 받을 수 없다.
  2. abstract, open, sealed, inner를 붙일 수 없다.
  3. 1개 이상의 프로퍼티를 가지고 있어야 한다.

 

이렇게 편리한 메서드를 자동으로 만들어주는 Data Class를 Entity Class를 만들 때 사용할 수 있을까?

Entity에 Data Class를 적용 할 수 없는 이유.

Entity Class를 Data Class로 만들기 꺼려지는 이유들이 있다.

1. JPA는 Data Class를 고려하지 않았다.

Spring 가이드에 보면 ‘JPA는 Data Class가 자동으로 생성한 수정 불가능한 Class나 메서드와 함께 사용되는 것이 고려되지 않았다' 라고 명시되어 있다.

Here we don’t use data classes with val properties because JPA is not designed to work with immutable classes or the methods generated automatically by data classes. If you are using other Spring Data flavor, most of them are designed to support such constructs so you should use classes like data class User(val login: String, …​) when using Spring Data MongoDB, Spring Data JDBC, etc.

호기심을 가지고 개인 프로젝트에 실험을 하는 것은 좋지만, 회사 코드에 사용하는 모험은 하지 말자.

 

2. 지연 로딩

JPA에서 지연 로딩 성능과 밀접한 관계가 있는 기능이다.
Spring은 지연 로딩을 구현하기 위해 아직 로딩되지 않은 Entity는 그 Entity를 상속한 Proxy 객체를 만들어 처리한다.

하지만 Data Class는 상속을 하거나 받을 수 없는 Class이다. 그렇기 때문에 즉시 로딩(eager loading)으로 동작하며 성능 최적화를 할 수 없다.

참고

다만 build.gradle에 ‘allOpen'설정을 하면 Data Class에도 open을 붙여준다.
allOpen이 코틀린 컴파일러 수준의 플러그인이다 보니 Data Class도 상속 가능하게 만들어주는 것으로 생각된다.

하지만 Jetbrain의 답변을 보면 Data Class를 사용하지 않는 것을 권고하고 있다.
Data Class의 스펙을 무시하는 설정은 하지 않는 것이 언어 적으로도 좋아 보인다.

 

결론

결론적으로 Kotlin도 권고하지 않고 Spring도 권고하지 않는다.

일반 class에 allOpen 플러그인을 사용하여 개발하도록 하자.

'Kotlin' 카테고리의 다른 글

OffsetDateTime의 시간 비교  (0) 2023.06.04
Java, Kotlin의 날짜와 시간  (0) 2022.11.28
Kotlin의 Collections  (0) 2021.10.31
Kotlin의 Data/Enum 클래스  (0) 2021.09.22
Kotlin의 nullable변수 처리  (0) 2021.09.22