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 플러그인은 동일하다.
반응형
'서버 > SpringBoot' 카테고리의 다른 글
스프링부트가 다중 유저 요청을 처리하는 방법 (Thread Pool, Thread Safe) (0) | 2022.11.25 |
---|---|
[kotlin] spring jpa에서 복합키를 사용하는 방법, @EmbeddedId, @IdClass (0) | 2022.05.10 |
[Spring] 하나의 build.gradle 파일로 여러 내부 프로젝트 빌드하기 (0) | 2022.03.31 |
@RequestBody로 지정한 객체에 꼭 기본 생성자가 필요할까? (com.fasterxml.jackson.databind.exc.InvalidDefinitionException) (2) | 2022.01.05 |
[Spring] EHcache를 이용해 캐시 간단하게 적용하기 (feat. @ Cacheable) (0) | 2022.01.05 |