상세 컨텐츠

본문 제목

[JPA] @AttributeOverride

Backend

by choiDev 2024. 1. 7. 22:04

본문

현재 진행하는 사이드 프로젝트에서

매번 Entity(테이블)이 추가될 때 마다 중복된 컬럼들을 모든 Entity에 생성한다면 그만큼의 보일러 플레이트도 없겠다는 생각이 있어 해당 부분도 제거

라는 생각에 BaseEntity를 만들었다.

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@MappedSuperclass
@Getter
@Setter
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractBaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private final Long id = 0L;

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}

 

이렇게 BaseEntity를 만들고 나니 문제되는점이 

id값은 모든 테이블에서 Auto Increment로 생성되겠지만 각 테이블에서 사용하고 싶은 명칭이 id가 아닌 user_id 혹은, book_id 와 같이 이름을 변경하고 싶을 수도 있다는점이 있어

@AttributeOverride를 사용해서 상속받은 부모의 컬럼 속성을 변경하는 작업을 진행해 보았다.

 

@AttributeOverride는?

JPA 제공 어노테이션 중 하나로, 엔티티 클래스에서 상속 관계에 있는 부모 클래스의 매핑 정보(컬럼 정보)등을 재정의할 때 사용됩니다.

 

import com.example.be_study.service.base.AbstractBaseEntity;
import com.example.be_study.service.policy.enums.PolicyType;
import jakarta.persistence.AttributeOverride;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@Table
@AttributeOverride(name = "id", column = @Column(name = "policy_agree_id")) <- 이와같이 id컬럼을 상속받음
@Entity(name = "policy_agree")
public class PolicyAgree extends AbstractBaseEntity {

    @Column(name = "policy_type", nullable = false)
    private PolicyType policyType;

    @Column(name = "policy_history_id", nullable = false)
    private Long policyHistoryId;

    @Column(name = "user_id", nullable = false)
    private Long userId;

    @Builder
    public PolicyAgree(PolicyType policyType, Long policyHistoryId, Long userId) {
        this.policyType = policyType;
        this.policyHistoryId = policyHistoryId;
        this.userId = userId;
    }
}

 

위와같이 사용하면 되고 ID뿐만 아니라 여러 컬럼에도 적용되는것을 알지만 왠만하면 다른 컬럼을 추가하진 않을거같다

그 이유는 추상클래스를 만들고 상속할때 정말 Base에 속할 컬럼인가를 고민하고 상속을 받아야할거같다는 생각이 있다.

Base로 사용할 추상클래스는 정말 확장에는 열려있고 변경에는 닫혀야하기에

주로사용할 변수가 모든 클래스에서 사용하는게 아니라 일부분의 클래스에서만 사용하는건데

추상클래스에 들어가있다면 정말 Base로 사용할 클래스에 들어가야하는게 맞는지?

해당 클래스에서만 정의되어야하는게 아닌기 고민하고 Base에 추가 하면 좋을거같다는것이 있어 과도한 추상클래스 변수는 추가하지 

않고 사용할 Base 변수만 추가 하자! 라는 결론

 

 

관련글 더보기