본문 바로가기

서버/SpringBoot

[Spring/Kotlin] Entity는 data class로 구현하는게 좋을까?

Entity는 data class로 구현하는게 좋을까? 본론부터 이야기면 Entity는 data class로 구현하면 안된다.

data class의 특징

  • 데이터 클래스는 toString() , hashCode() , equals() , copy()메소드를 자동으로 만들어준다.
  • data class는 상속이 안된다. = open이 아닌 final이다.
    • 이유 : data class에서 기본으로 제공되는 메소드들을 제대로 오버라이딩해서 구현할 수 없기 때문에 data class는 상속하지 못하도록 만들어졌다.

entity class의 요구사항

https://docs.oracle.com/javaee/5/tutorial/doc/bnbqa.html

Requirements for Entity Classes

An entity class must follow these requirements:

  • The class must be annotated with the javax.persistence.Entity annotation.
    • 클래스는 반드시 @Entity 어노테이션을 붙여야 한다.
  • The class must have a public or protected, no-argument constructor. The class may have other constructors.
    • 클래스는 public 또는 protected이어야 하며, 기본 생성자가 있어야 한다. 또 다른 생성자가를 가질 수 있다.
  • The class must not be declared final. No methods or persistent instance variables must be declared final.
    • 클래스는 절대 final이면 안된다. 메소드나 변수 모두 final이어서는 안된다.
  • If an entity instance be passed by value as a detached object, such as through a session bean’s remote business interface, the class must implement the Serializable interface.
    • 엔티티 인스턴스가 분리된 개체로 값이 전달되는 경우 Serializable 인터페이스에 대해 구현해야 한다.
  • Entities may extend both entity and non-entity classes, and non-entity classes may extend entity classes.
    • 엔티티는 엔티티 클래스와 비 엔티티 클래스 모두 확장할 수 있으며, 비 엔티티 클래스도 엔티티 클래스를 확장할 수 있다.
  • Persistent instance variables must be declared private, protected, or package-private, and can only be accessed directly by the entity class’s methods. Clients must access the entity’s state through accessor or business methods.
    • 클라이언트는 엔티티의 상태를 접근자 혹은 비즈니스 메소드에서만 접근해야 한다.

https://techblog.woowahan.com/2675/

entity를 data class로 만들면 안된다!

위와 같은 이유로 entity 클래스는 data class로 만들면 안되며, data class에서 제공하는 toString() , hashCode() , equals() , copy() 메소드가 필요할 경우 다른 방법으로 정의해서 사용해야 한다.

all-open 플러그인

위와 같은 이유로 엔티티는 항상 열려있어야 하는데, 이를 위해서 all-open 플러그인을 사용하도록 권장한다.

https://spring.io/guides/tutorials/spring-boot-kotlin/

https://kotlinlang.org/docs/all-open-plugin.html

apply(plugin = "kotlin-spring")
apply(plugin = "kotlin-allopen")

kotlin-spring 플러그인과 kotlin-allopen 플러그인은 동일하다.

반응형