✏️ 필요성

  • 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 로 선언해줘야 한다.
    • 둘 중 한가지다로 선언되어있지 않다면 사용할 수 없다.
profile
잘못된 내용 PR 환영

0개의 댓글