@MappedSuperclass vs Embedded Type

D A S H B O A R D
D E V E L O P
S E C U R I T Y
 결론
 @MappedSuperclass
 @Embedded & @Embeddable
 정리
Reference

 결론

즉, 상속과 위임 둘 중 선택이지만, 위임이 일반적으로 사용되고 여러 Entity들이 공통으로 사용하는 경우, 혹은 편리함과 직관성을 위해 상속을 선택하기도 한다!!!

 @MappedSuperclass

@MappedSuperclass상속 관계 매핑에서 사용되는 어노테이션으로, 부모 클래스에만 사용할 수 있다.
이 어노테이션이 선언된 클래스는 테이블과 매핑되지 않으며, 자식 클래스에게 매핑 정보만 제공한다.
즉, 자식 클래스는 부모 클래스의 필드를 상속받아 사용할 수 있다.
이를 통해 중복 코드를 줄이고 객체 지향적인 설계를 할 수 있다.
정리 - ‘Is A’ 관계를 사용하고 싶을 때
@MappedSuperclassEntity로써 부모클래스에 정의한다.
여러 Entity에 공통적으로 사용할 때 유용하다.

 @Embedded & @Embeddable

@Embedded@Embeddable값 타입 매핑에서 사용되는 어노테이션이다.
@Embeddable 은 값 타입 클래스에 선언되며, @Embedded 는 값 타입 객체를 사용하는 엔티티 클래스에 선언된다.
@Embeddable 은 값 타입 클래스로 매핑 정보를 제공하는 어노테이션으로, 여러 엔티티에서 공유해서 사용할 수 있다.
@Embedded 는 값 타입 객체를 엔티티에 매핑할 때 사용하는 어노테이션이다.
정리 - ‘Has A’ 관계를 사용하고 싶을 때
@Embeddable 은 값 타입 클래스에 선언한다.
@Embedded 는 값 타입 객체를 사용하는 엔티티 클래스에 선언한다.
@Embeddable 은 여러 엔티티에서 공유해서 사용할 수 있다.

 정리

@MappedSuperclass상속 @Embedded위임라는 차이가 있다.
일반적인 법칙에 따르면 아래와 같은 이유 때문에, 상속보다는 위임이 더 좋기 때문에 위임을 사용하는 것을 추천한다.
상속을 받을 경우 부모 타입과 자식 타입이 강한 결합성을 띄기 때문에 캡슐화가 깨지게 된다.
한 객체 내에서 정의된 상태나 행위에 대해서 관리 및 확인할 포인트(class)가 많아진다.
자식 타입에서의 매서드 재정의 혹은 부모 타입의 매서드 변경될 경우 오작동이 일어날 수 있다.
하지만 몇 가지 경우에서는 상속이 더 편리할 때가 있다!
수정/등록 시간, 수정/등록자 처럼 대부분 혹은 여러개의 Entity들이 공통으로 사용하는 속성일 경우
편리함과, 직관성을 위해
예시 : 왼쪽과 같은 임베디드 타입의 class가 있다고 가정하자.
class TraceDate { TYPE createdDate; TYPE updatedDate; }
SQL
복사
이러한 경우 JPQL 쿼리를 위해서는 아래와 같이 쿼리를 작성해야 한다.
select m from Member m where m.traceDate.createdDate > ?
SQL
복사
하지만 상속 즉, @MappedSuperclass 를 이용한다면 간단하고 쉬워진다.
select m from Member m where m.createdDate > ?
SQL
복사