✏️ 필요성
- Entity 를 구현하다보면 반복되는 필드값을 볼 수 있다.
- 이러한 중복은 상위 객체를 생성해 상속하는 것으로 해결할 수 있다.
✏️ Entity 상속
📍 상위 Entity 객체 생성
- Entity 를 상속시키기 위해선
abstract
객체로 생성해야 한다.
@MappedSuperclass
- Entity 상속을 위해 선언 해줘야하는 어노테이션이다.
- 객체의 입장에서만 상속되는 것이기 때문에 Table 에게 영향을 미치지 않는다.
- 오직 자식 entity 에게 매핑 정보만 전달하게 된다.
@SuperBuilder
@Builder
와 기능이 거의 비슷하지만 Entity 상속을 사용할 때 선언하는 어노테이션이다.
- ⚠️ 어노테이션은 BaseEntity 에 선언된 필드에 한에서만 작동된다.
- 즉, 상속받은 Entity 에서도 BaseEntity 의 필드의 어노테이션은 함께 상속받아 작동되지만,
상속받은 Entity 에 선언된 필든엔 적용되지 않는다.
- 프로젝트의 entity 에 공통으로 포함된 id, 생성, 수정 날짜를 포함시켰다.
import jakarta.persistence.EntityListeners;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime;
import static jakarta.persistence.GenerationType.IDENTITY;
@MappedSuperclass
@Getter
@SuperBuilder
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
@ToString
public abstract class BaseEntity {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
@CreatedDate
private LocalDateTime createDate;
@LastModifiedDate
private LocalDateTime modifyDate;
}
📍 상속 받는 Entity
BaseEntity
를 상속받는다.
- 상속받은 Entity 에 새롭게 선언한 필드에 대해선
BaseEntity
의 어노테이션이 작동하지 않으니 필요한 어노테이션은 별도로 선언해줘야 한다.
@Entity
@Getter
@NoArgsConstructor
@SuperBuilder
public class Member extends BaseEntity {
private String providerTypeCode;
@Column(unique = true)
private String username;
private String password;
@OneToOne
@Setter
private InstaMember instaMember;
⚠️ ToBuilder 를 사용해야 할 경우
ToBuiler
를 사용해야 한다면 부모 Entitry 와 자식 Entity 에 둘 다 ToBuiler 옵션을 true 로 선언해줘야 한다.
- 둘 중 한가지다로 선언되어있지 않다면 사용할 수 없다.