본문 바로가기
데이터베이스/JPA

[JPA] @MappedSuperClass

by jeonghaemin 2021. 3. 13.
728x90

여러 엔티티에서 공통적으로 사용하는 속성들을 부모 클래스로 뽑아내고, @MappedSuperClass 애노테이션을 적용하면 DB 테이블에는 영향을 주지 않고 코드상 중복을 제거할 수 있다.

@Entity
public class Teacher {

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

    private String name;

    private String subject;
}

@Entity
public class Student {

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

    private String name;

    private String grade;
}

예를 들어 다음과 같이 Student, Teacher 엔티티가 있다고 가정해보자. 두 엔티티 모두 id, name 필드를 사용하는 것을 볼 수 있다.

id, name 필드를 부모 클래스로 뽑아내고 @MappedSuperClass 애노테이션을 사용하여 중복을 제거해보자.

@MappedSuperclass
public abstract class BaseEntity {

    @Id @GeneratedValue
    private Long id;

    private String name;

}

@Entity
public class Student extends BaseEntity{

    private String grade;

}

@Entity
public class Teacher extends BaseEntity {

    private String subject;

}

@MappedSuperClass 적용 전후 클래스 변화

공통 속성들로 부모 클래스를 만들고, @MappedSuperClass 애노테이션을 적용하였지만, DB 테이블 구조는 그대로인 것을 알 수 있다.

@MappedSuperClass 적용 전후 DB 테이블 변화

참고로 @MappedSuperClass를 적용한 클래스는 단독으로 생성해서 쓰일 일이 없기 때문에 abstract 키워드를 사용하여 추상 클래스로 만드는 것을 권장한다.

참고 : www.inflearn.com/course/ORM-JPA-Basic#

댓글