본문 바로가기
Spring

Spring JPA / @MappedSuperclass

by yang sing 2023. 7. 12.

안녕하세요.

이번 포스팅에서는 JPA에서 사용하는 @MappedSuperclass 어노테이션에 대해서 작성을 해보려고 합니다.

먼저 JPA에서는 3가지의 상속관계 매핑이 존재하며 @MappedSuperclass 어노테이션은 상속관계 매핑과는 전혀 무관합니다.

 

상속관계 매핑과는 무관하다고 하면서 JPA에 3가지 상속관계 매핑이 존재한다고 얘기를 했냐면 DB에서의 상속 관계와는 무관하지만 객체 지향 관점에서 중복되는 컬럼을 하나의 클래스로 정의를 하고 해당 클래스를 상속을 받기 때문입니다.

 

JPA의 상속관계에 대해 잘 모르시는 분들은 이 말이 이해가 잘 안가실 수 있습니다. 

위에 얘기가 잘 이해가 안가시는 분들은 일단 머리속에서 JPA의 3가지 상속관계 매핑이라는 개념을 지우고 @MappedSuperclass에 대한 개념에만 집중을 하셔도 좋을 것 같습니다.

상속관계 매핑에 대한 글이 아니라 상속관계 매핑에 대한 포스팅은 조만간 잘 정리해서 포스팅하도록 하겠습니다.

 

 

상속이란?

객체 지향으로 코딩을 하다 보면 상속이라는 개념을 많이 사용하실게 될 겁니다.

상속이란 부모 클래스가 자식 클래스에게 부모 클래스에 정의되어 있는 멤버 변수나 메서드를 상속하여 자식 클래스에서 사용할 수 있는 자바 개념입니다.

 

상속을 사용을 하게 되면 이미 정의되어 있는 기능들을 상속받아 중복으로 코드를 구현하지 않고 재사용을 할 수 있습니다. 또한 여러 개의 VO 또는 DTO에서 기본값으로 사용되는 필드 값을 정의할 때도 자주 사용을 하게 됩니다.

예를 들어 API를 개발하는 프로젝트에서 각 API 응답값에 맞는 각각의 응답 Response 객체를 만든다고 했을 때 공통의 응답 값을 하나의 부모 객체로 만들고 각각 자식 응답 객체에서 상속을 받아서 사용을 하면 코드 효율성을 높일 수 있습니다.

 

JPA에서의 @MappedSuperclass 어노테이션의 경우에도 위에서 얘기한 상속 개념과 비슷합니다.

프로젝트를 진행을 하면서 여러 테이블들을 생성 및 관리를 할 때 모든 테이블에 혹은 다수의 테이블에 꼭 들어가야 하는 컬럼들이 존재할 수 있습니다. 

예를 들어 생성자, 생성일, 수정자, 수정일 등이 흔히 볼 수 있는 다수의 테이블에서 꼭 필요로 하는 컬럼일 수 있겠습니다. 

이런 테이블 구조의 프로젝트라면  생성자, 생성일, 수정자, 수정일 4개의 컬럼들이 Entity에서도 중복된 필드로 계속 정의를 해야 하는 번거로움이 생기게 됩니다. 

이러한 상황에서 중복 코드를 줄이고 코드를 좀 더 효율적으로 개발할 수 있는 게 해주는 것이 @MappedSuperclass 어노테이션입니다.

@MappedSuperclass

- 부모클래스를 상속받는 자식 클래스에게 매핑 정보만 제공해 주는 클래스
- Entity가 아니다
- JPA 상속관계 매핑과는 무관하며 테이블과 매핑되지 않는다.
- 조회 및 검색이 불가능하고 직접 생성해서 사용할 일이 없어서 추상 클래스 구현을 권장한다.
// 공통 매핑 클래스
@Getter
@Setter
@MappedSuperclass
public abstract class BaseEntityMapping{

    @Column(name="create_user_id")
    private String createUser;
    private LocalDateTime createDate;
    private String updaterUser;
    private LocalDateTime lastUpdateDate;

}


// 공지사항 엔티티
@Getter
@Setter
@Entity
public class Notice extends BaseEntityMapping{
	
    @Id
    @GeneratedValue
    private Long seq;
    private String title;
    
}

// 게시판 엔티티
@Getter
@Setter
@Entity
public class Board extends BaseEntityMapping{
	
    @Id
    @GeneratedValue
    private Long seq;
    private String title;
    
}

 

JPA 상속관계 매핑을 떠나서 단순히 공통 된 속성만 상속을 받고 싶을 때 사용을 하면 프로젝트를 진행하는데 있어서 중복 코드도 줄어들고 코드 관리도 엄청 용이할 것 같다는 생각이 든다.

 

JPA에 대한 개념을 모르고 JPA를 사용하는 프로젝트에 투입이 되었을 때는 이런 개념들을 모르고 그냥 무식하게 모든 Entity에 중복 매핑 필드를 다 정의를 하고 하나가 바뀌면 모두 찾아서 바꾸는 번거로움이 있었는데

JPA를 처음부터 공부를 하면서 내가 정말로 JPA를 하나도 모르고 너무 막 사용을 했구나 싶은 생각을 하면서 다음에 시간적 여유가 된다면 해당 프로젝트를 다시 리펙토링 할 수 있는 시간을 가지면 좋을 거 같다.

 

 

오늘은 이렇게 @MappedSupperclass에 대한 포스팅을 마쳤습니다.

사실 JPA의 상속관계 매핑에 대한 포스팅을 먼저 하고 이번 글을 작성을 해야 했는데 어쩌다보니 뒤로 밀려나게 되었다..

 

포스팅 순서는 좀 어긋났지만 다음 포스팅에서는 JPA의 상속관계 매핑에 대해서 작성을 하도록 해보겠습니다.

감사합니다.

 

 

참고 : 김영환님의 자바 ORM 표준 JPA 프로그래밍 - 기본편