JPA : 상속관계 맵핑 MappedSuperClass
- Spring/JPA
- 2021. 11. 28.
MappedSuperClass → 엔티티가 아니다.
MappedSuperClass는 앞선 상속 관계는 약간 다른 개념으로 사용이 된다. 앞선 게시글에서 이야기 했던 슈퍼 타입 - 서브 타입 모델의 관계는 계층 구조를 표현하기 위함이었다면, MappedSuperClass는 공통으로 사용될 변수를 셋팅하는데 '귀차니즘'을 줄이는데 도움을 주는 클래스다.
예를 들어 어플리케이션 전체에서 로그 추적을 위해서 처음 기록된 시간, 마지막으로 수정된 시간들이 각각의 DB Table에 저장된다고 생각해보자. 그렇다면 기본적으로는 각 엔티티마다 그 변수를 가지도록 해주어야 한다. 그런데 이게 테이블이 적을 때는 문제가 없으나 테이블이 많으면 문제가 될 수 있다.
하나하나 손으로 작성을 해줘야하는데 누락되는 경우도 발생할 수 있고, 변수명을 잘못 입력하거나, 타입명을 잘못 입력하는 것과 같은 자잘한 실수들이 발생할 수 있다.
MapeedSuperClass는 바로 이런 귀찮은 과정들을 해결해주기 위해 사용한다고 이해하면 된다.
MappedSuperClass 사용방법
- MappedSuperClass로 사용될 클래스를 abstract class로 하나 만든다.
- MappedSuperClass에 필요한 필드 변수들을 입력해준다.
- MappedSuperClass를 사용할 클래스들은 extends로 상속받아준다.
MappedSuperClass 사용 시, 테이블 생성 쿼리 살펴보기
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedTime;
}
// Album, Book, item, Locker, Member, MemberProduct, Movie, Product, Team 엔티티가 존재함.
BaseEntity를 위와 같이 만들고 @MappedSuperclass 어노테이션을 달아두고, 모든 엔티티에 상속을 해보았다.
DB에 생성된 테이블을 살펴봤을 때, BaseEntity 테이블을 생성되지 않았다. 당연하지만 create Table 쿼리에 BaseEntity는 따로 포함되지 않았다. 대신에 각 테이블을 생성할 때는 BaseEntity가 가진 변수들이 각 테이블에 전부 들어가있는 것을 확인할 수 있었다.
각 테이블을 DB에서 조회해보면, BaseEntity에 있던 필드 변수가 각 Table에 잘 생성된 것을 확인할 수 있었다.
MappedSuperClass 상속 엔티티 저장해보기
Member member = new Member();
member.setUsername("memberA");
member.setCreatedDate(LocalDateTime.now());
em.persist(member);
위 코드로 MappedSuperclass를 상속받은 엔티티를 저장해봤다.
저장을 할 때 Insert 쿼리가 단 1회 나가는 것을 확인할 수 있다. 그리고 실제 DB에서 살펴보면 정상적으로 저장된 것도 확인할 수 있다.
MappedSuperClass 정리
- 엔티티가 아니다. 따라서 테이블 생성이 안되고, 이 타입으로 조회가 안된다. (em.find X)
- 공통으로 사용하는 변수를 쉽게 셋팅하는데 사용한다.
- 이 클래스를 상속받는 자식 클래스에게 Mapping 정보만 제공해준다.
'Spring > JPA' 카테고리의 다른 글
JPA : Fetch Join (0) | 2021.12.02 |
---|---|
JPA : CASCADE를 통한 영속성 전이, 고아 객체 (0) | 2021.11.28 |
JPA : 상속관계 맵핑, 슈퍼 타입 - 서브 타입 모델링 (0) | 2021.11.28 |
JPA, 다양한 연관관계 맵핑 (0) | 2021.11.27 |
다대일 연관 관계, 외래키는 어디에 있어야할까? (0) | 2021.11.27 |