스프링 공부/JPA

[JPA] 15. 짜잔! 사실 이건 상속관계 매핑은 아닙니다. @MappedSuperclass

장아장 2022. 11. 29. 17:41

혹시몰라 나중에 바뀔지도...

 

이제 상속관계 매핑에 관련된 마지막 어노테이션이다. 

@MappedSuperclass

근데 사실 이건 상속관계 매핑을 해주는 어노테이션은 아니다. 

그저 공통적인 매핑정보를 따로 만들어주기 귀찮기에 만드는 용도이다. 

 

예를 들어, Team과 Member 객체가 동일하게 id, name, createdDate, updatedDate를 가지고 있어야 한다고 가정하자. 

(왜 그런거 있잖아요 게임할 때 비밀번호 수정 안하면 바꾸라고 알림넣어주고

길드 공지나 게시글 같은거 없으면 좀 쓰라고 길드가 한달동안 한 일이 없다고 닥달하는거!)

 

 

그럴 때, 이런 어노테이션을 넣어주면 참 편하다. 

코드로 보여주자면, 

@MappedSuperclass
public class BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private LocalDateTime createdDate;
    private LocalDateTime updatedDate;
}

이런 기본 객체가 있다. 멤버와 팀이 동일하게 가져야 하는 id, name, createdDate, updatedDate를 BaseEntity에 놓는다. 

@Entity
public class Member extends BaseEntity{

    @JoinColumn(name = "TEAM_ID")
    @ManyToOne
    private Team team;
}
@Entity
public class Team extends BaseEntity{

    @OneToMany(mappedBy = "team")
    private List<Member> teamMember;
}

이런식으로 Member, Team에 extend해줄 때, 이를 데이터베이스에서 어떻게 받아들일까?

이런 식으로 Member, Team테이블에 BaseEntity의 인스턴스가 컬럼화되어 들어간다. 

(BLOG_는 무시해주세요...공부할 때 쓰는 파일을 같이 써서 그래요...하핳)

 

이를 통해 MappedSuperclass를 쓰면 각 테이블마다 해당 인스턴스들이 다 들어감을 알 수 있다. 

 

사실 상속관계 매핑의 구현 클래스마다 테이블 전략과 동일하게 들어가는 느낌이다. 

 

확실히 상속관계를 위해서라기보단, 모든 객체의 중복된 인스턴스, 그리고 해당 인스턴스의 getter, setter을 다시 만드는 귀찮음을 줄여줄 수 있을 것 같다. 

 

일단 기본적으로 모든 데이터는 id와 이름이 들어간다. 이를 위해서 BaseEntity같은 객체를 만들어 MappedSuperclass를 하는 것도 확실히 간결한 코드를 만들어주기도 하고, 한번에 고치기 쉬울 것 같다는 느낌이 든다.