ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @MappedSuperclass 에 대해 알아 봅시다.
    JPA 2025. 6. 10. 08:46

    @MappedSuperclass 는 공통 컬럼 매핑만 공유하고 독립적인 테이블은 만들지 않는 JPA 상속 전략입니다.

    • 엔티티가 아니므로 직접 조회·저장 대상에 속하지 않고, JPQL에서 타입으로 사용할 수도 없습니다.
    • 하위 엔티티가 상속받으면, 상위 클래스의 필드가 하위 엔티티 테이블에 그대로 포함 됩니다.
    @MappedSuperclass
    public abstract class baseTimeEntity {
        private LocalDateTime createdAt;
        private LocalDateTime updatedAt;
    }
    
    @Entity
    public class User exteds BaseTimeEntity {
        @Id @GeneratedValue
        private Long id;
        private String email;
    }
    
    @Entity
    public class Product extends BaseTimeEntity {
        @Id @GeneratedValue
        private Long id;
        private String name;
    }

     

    위 코드는 다음 테이블로 생성됩니다.
    BaseTimeEntity에 대응하는 전용 테이블은 없고, 각 자식 테이블에 공통 컬럼이 복사됩니다.

    created_at, updated_at 두 컬럼은 BaseTimeEntity에서 내려온 공통 코드입니다.

    언제 사용해야 하는가?

    • 감사 로그 컬럼 공유 : createdAt, updatedAt, creatdBy 등을 모든 도메인 테이블에 두고 싶을 때
    • 공통 비즈니스 컬럼 공유 : price, currency, status 등이 여러 엔티티에서 동일 로직 타입일 때

    장단점을 비교해 보면 다음과 같습니다.

    • 매핑 재사용 : [장점]중복 컬럼 선언 방지, 유지보수 편리 [단점]공통 컬럼 구조가 바뀌면 모든 테이블의 DDL을 변경해야 함
    • 설계 유연성 : [장점]상속 구조가 복잡해도 물리적 조인 부담 없음 [단점] @MappedSuperclass 자체는 JPQL 대상이 아니라 다형성 쿼리 불가
    @Inheritance(strategy = JOINED | SINGLE_TABLE | TABLE_PER_CLASS) 와 달리, @MappedSuperClass 는 상속 매핑 전략이 아니라 '필드 복사' 개념임을 기억해야 합니다.

    직접 생성해서 사용할 일이 없으므로 추상클래스로 선언해서 사용하는게 좋습니다.

    참고 : javadoc - MappedSuperclass

    'JPA' 카테고리의 다른 글

    JPA  (0) 2024.07.30

    댓글

Designed by Tistory.