[JPA] MappedSuperclass와 Embedded Type의 차이

eunsiver·2023년 1월 31일
0

임베디드 타입MappedSuperclass의 차이가 무엇이며, 각각 언제 사용해야 좋을까 의문이 들었다.

@MappedSuperclass

  • 공통 매핑 정보가 필요할 때 사용 된다
  • 상속 관계 매핑 X
  • 엔티티 X, 테이블과 매핑 X
  • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
  • 조회, 검색 불가
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
  • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 사용하는 정보를 모을 때 사용

참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능


임베디드 타입

  • 새로운 값 타입을 직접 정의할 수 있다
  • JPA는 임베디드 타입이라고 함
  • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고 함
  • int, String과 같은 값 타입
  • @Embeddable: 값 타입을 정의하는 곳에 표시
  • @Embedded: 값 타입을 사용하는 곳에 표시
  • 기본 생성자 필수

임베디드 타입의 장점

  • 재사용
  • 높은 응집도
  • Period.isWork()처럼 해당 값 타입만 사용하는 의미있는 메소드를 만들 수 있음
  • 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존함

임베디드 타입과 테이블 매핑

  • 임베디드 타입은 엔티티의 값을 뿐
  • 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다
  • 객체와 테이블을 아주 세밀하게 매핑 가능
  • 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많음

그렇다면 MappedSuperclass와 임베디드 도대체 언제 사용해야 할까??

  • 다중상속이 안되고 객체 지향 설계상 유연성이 떨어져 상속보다는 위임이 좋다.

상속: MappedSuperclass, 위임: 임베디드 타입

따라서 가급적 임베디드를 사용하는 것이 좋다.

다만, MappedSuperclass가 쓸만한 경우 딱 한가지

  • 대부분의 엔티티들이 공통으로 사용하는 속성들을 다룰 때
  • 등록일, 수정일, 등록한 사람, 수정한 사람과 같이 운영상의 이유를 포함하는 컬럼을 공통으로 사용할 때는 상속을 사용하는게 더욱 편리하다.

예를 들어, 임베디드 타입으로 만들면 다음과 같다

class TraceDate {

  TYPE createdDate;

  TYPE updatedDate;

}

이런 경우 JPQL 쿼리를 하려면 다음과 같이 항상 traceDate라는 식으로 임베디드 타입을 적어주어야 한다.

select m from Member m where m.traceDate.createdDate > ?

상속을 사용하면 다음과 같이 간단하다.

select m from Member m where m.createdDate > ?

💥결국 둘중 선택이지만, 편리함과 직관성 때문에, 상속(MappedSuperclass)을 사용한다.

참고

profile
Let's study!

0개의 댓글