[JPA] @MappedSuperclass

3Beom's 개발 블로그·2022년 12월 1일
0

SpringJPA

목록 보기
8/21
post-custom-banner

출처

본 글은 인프런의 김영한님 강의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 수강하며 기록한 필기 내용을 정리한 글입니다.

-> 인프런
-> 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의


  • @MappedSuperclass 어노테이션은 JPA에서 반복되는 필드를 하나로 묶어주는 역할을 한다.

1. 반복되는 필드

  • 만약 위 사진과 같이 필드가 설정된다고 가정해 보자.

  • 이렇게 각 엔티티마다 중복되는 필드를 확인할 수 있다.
  • 이를 각 클래스마다 중복되게 넣어도 기능은 할 수 있지만, 하나의 클래스 내에 묶어두고 다른 클래스들이 가져다 쓰도록 설정하면 관리하기도 수월하고 좀 더 객체지향적으로 구성할 수 있다.

2. @MappedSuperclass

  • BaseEntity 클래스에 @MappedSuperclass 어노테이션을 적용하고, 반복되는 필드들을 구성해 둔다.
  • 해당 필드들이 필요한 다른 클래스들(User, Team, Class)이 BaseEntity 클래스를 상속받는다.
  • BaseEntity 클래스를 상속받은 클래스들은 모두 해당 필드들을 갖게 되며, DB에 각자의 컬럼으로 설정된다.

2-1. 구현 예

  • GETTER, SETTER는 생략.

< BaseEntity >

@MappedSuperclass
public abstract class BaseEntity {

    @Id
    @GeneratedValue
    @Column(name = "ID")
    private Long id;

    @Column(name = "NAME")
    private String name;

    @Column(name = "CREATED_DATE")
    private LocalDateTime createdDate;

    @Column(name = "LAST_MODIFIED_DATE")
    private LocalDateTime lastModifiedDate;
}

< User >

@Entity
public class User extends BaseEntity {

    @Column(name = "EMAIL")
    private String email;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

< Team >

@Entity
public class Team extends BaseEntity {

    @OneToOne
    @JoinColumn(name = "LEADER_ID")
    private User user;
}

< Class >

@Entity
public class Class extends BaseEntity {

    @Column(name = "PROFESSOR")
    private String professor;

    @Column(name = "MAJOR")
    private String major;
}

3. @AttributeOverride(s)

  • 만약 @MappedSuperclass 로 설정된 필드들을 재정의하고 싶을 경우, 다음 둘 중 하나를 활용하면 된다.
    • 재정의 하나만 할 때 : @AttributeOverride
    • 재정의 여러개 할 때 : @AttributeOverrides
@Entity
@AttributeOverrides({
        @AttributeOverride(name = "id", column = @Column(name = "USER_ID")),
        @AttributeOverride(name = "name", column = @Column(name = "USER_NAME"))
})
public class User extends BaseEntity{

...

4. @MappedSuperclass 특징

  • @MappedSuperclass는 JPA 내에서 상속이 이루어지지만, 이전 글에서 다루었던 상속관계 매핑과는 아무 관련이 없다.

  • @MappedSuperclass 어노테이션을 적용한 클래스는 엔티티가 아니다.

    • @Entity 어노테이션을 적용하지 않았으니 당연하다.
    • 따라서 테이블과 매핑되지 않는다.
  • 상속을 통해 자식 클래스에게 매핑 정보만 제공해 주는 것이다.

  • 조회, 검색이 불가능하다.

    • entityManager.find(BaseEntity.class, ...) 안된다.
  • 객체를 직접 만들어 사용할 일이 없으므로 웬만하면 추상 클래스로 만드는게 좋다.

    @MappedSuperclass
    public abstract class BaseEntity {
    
    ...
  • 주로 등록일, 수정일, 등록자, 수정자 등과 같이 전체 엔티티에서 공통으로 활용되는 필드를 한 곳으로 모아 관리할 때 사용된다.

<참고 사항>

  • @Entity 어노테이션이 적용된 클래스는 다음 두 가지로 지정된 클래스만 상속받을 수 있다.
    • @Entity 어노테이션이 적용된 클래스
    • @MaapedSuperclass 어노테이션이 적용된 클래스
profile
경험과 기록으로 성장하기
post-custom-banner

0개의 댓글