킹의 개발일지

@MappedSuperclass 본문

JPA

@MappedSuperclass

k1ng 2022. 6. 4. 03:21

웹 어플리케이션을 만든다 하면 테이블마다 반복적으로 들어가는 칼럼이 있다.

 

'언제 등록/수정 됐는가', '누가 등록/수정 했는가' 를 기록하기위해 테이블마다 registerTime, updateTime, registerdBy, updatedBy와 같은 칼럼을 사용한다.

 

또한 어느 테이블은 누가 수정했는지는 알 필요가 없고 등록/수정된 시간만 알고싶은 테이블도 있기 마련이다.

 

이처럼 테이블마다 반복적으로 들어가는 정보를 테이블의 특성에 따라 유동적이게 칼럼으로 사용하고자 할 때

 

@MappedSuperclass의 사용을 고려해 보자!

 

@MappedSuperclass 어노테이션은 RDBMS에 없는 객체지향의 상속 개념을 표현할 수 있게 해준다.

 

@MappedSuperclass 어노테이션을 사용하면 부모클래스는 테이블과 매핑하지 않고 부모클래스를 상속받는 자식 클래스에게 매핑정보만 제공하도록 해준다.

 

앞에서 예를 들었던 상황을 코드로 만들어보자.

 

우선, 누가 수정/등록 했는가는 알고싶어하지 않는 테이블이 있을 수 있으니, 필수적으로 들어갈 시간관련 칼럼들을 공통적으로 적용해보자.

 

부모엔티티로 사용할 BaseTimeEntity 클래스를 생성해서 @MappedSuperclass 어노테이션을 붙혀주자.

@EntityListeners(value = {AuditingEntityListener.class})
@MappedSuperclass
@Data
public class BaseTimeEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime regTime;

    @LastModifiedDate
    private LocalDateTime updateTime;
}
  •   @EntityListeners의 속성 값으로 있는 AuditingEntityListener는 JPA Auditing기능을 쓸려고 추가해주었다.

 

이렇게 만든 BaseTimeEntity는 테이블에 매핑되지않고 상속하는 자식 클래스에게 매핑정보만을 제공한다.

 

이제 BaseTimeEntity를 상속하는 BaseEntity를 만들어보자.

@EntityListeners(value = {AuditingEntityListener.class})
@MappedSuperclass
@Data
public class BaseEntity extends BaseTimeEntity{

    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedBy
    private String modifiedBy;
}

 

역시 BaseTimeEntity 와 비슷하다.

 

대신 createdBy나 modifiedBy는 현재 로그인한 대상, 즉 SecurityContext의 Authentication객체 안에 저장된 usrname 이 들어갈 것이다.

 

이렇게 작성한 두 클래스는 원하는 자식 엔티티에게 상속시켜주면 변경이 생길 때 자동으로 테이블에 해당 정보가 매핑된다.

public class Member extends BaseEntity{

    @Id
    @Column(name = "member_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @Column(unique = true)
    private String email;

    private String address;
    
	// ...

}

 

위에서 잠깐 설명한 JPA Auditing 기능은 Spring Data JPA가 해당 데이터를 보고 있다가 생성 또는 수정이 발생하면 자동으로 값을 넣어주는 편리한 기능이다.

 

AuditorAware 인터페이스를 구현한 클래스의 오버라이드한 메서드에서 Authetication 객체에 접근해 username을 반환해주면 자동으로 누가 생성/수정 했는지도 저장해준다. 

 

기회가 된다면 해당 기능에 대해 포스팅하고자한다.

'JPA' 카테고리의 다른 글

[JPA] 데이터 조회 시, 성능 향상 고려 사항  (0) 2022.06.08