본문 바로가기
JAVA/SpringBoot

JPA @MappedSuperclass: 공통 필드와 메소드 재사용으로 코드 중복 줄이기

by GangDev 2024. 3. 24.

 

@MappedSuperclass 는 JPA에서 사용하는 어노테이션으로, 공통적인 속성이나 행동을 여러 엔티티에서 상속받아 사용할 수 있게 해준다.
@MappedSuperclass 로 지정된 클래스는 직접적으로 데이터베이스 테이블과 매핑되진 않는다. 다만 이 클래스를 상속받은 엔티티 클래스들은 상속받은 속성들을 자신의 것처럼 데이터베이스 테이블에 매핑할 수 있다.

 

@MappedSuperClass 는 공통된 속성이나 행동을 가진 엔티티들 간에 코드의 중복을 줄인다. 모델의 일관성을 유지하는 데 매우 유용하다.

 

사용법 및 특징 >>

 

공통된 필드(id, 생성일 등)와 메소드들을 @MappedSuperclass 로 정의하면, 이를 상속받는 하위 클래스들이 이러한 속성과 행동을 재사용할 수 있다.

 

@MappedSuperclass 로 지정된 클래스는 자체적인 데이터베이스 테이블을 가지진 않는다. 대신, 상속받는 하위 클래스들이 각자의 데이터베이스 테이블과 매핑된다.

 

하위 클래스들은 @MappedSuperclass 에서 정의된 필드를 마치 자신의 필드처럼 데이터베이스 테이블에 매핑할 수 있다.

import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@MappedSuperclass
public abstract class BaseEntity {

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

    // 공통 필드 및 메소드
}

@Entity
public class User extends BaseEntity {
    // private Long id; // BaseEntity의 id를 상속받았다.
    
    private String name;
    private String email;
    
    // User 특유의 필드 및 메소드를 추가 정의한다.
}

@Entity
public class Product extends BaseEntity {
    // private Long id; // BaseEntity의 id를 상속받았다.
 
    private String productName;
    private double price;

    // Product 특유의 필드 및 메소드를 추가 정의한다.
}

 

위 코드에서, User와 Product 엔티티는 BaseEntity를 상속받아 id 필드를 재사용한다.

 

---

24년 1월 11일에 작성된 글입니다