JPA를 사용하면서 한가지 항상 해야할 것이 있다. 항상 DTO를 Entity로 바꿔주는 일이다.
이러한 과정을 거칠 때면 한가지 상황이 생길 수 있다.
예를들어 DTO는 아이디, 비밀번호로 구성이 되어있고 Entity는 아이디, 비밀번호, 생성일자, 최근 수정일자, 생성한 사람, 수정한 사람의 프로퍼티로 구성되어있다고 가정하자.
MappedSuperClass
이 때, 추가적인 정보들에 대해서 또한 자주 다른 Entity 생성시에도 저런 정보가 계속 추가된다면, 하나로 묶어놓고 항상 자동으로 생성해 삽입된다면 굉장히 편할 것이다.
JPA Auditing
사전적인 의미로는 감사, 감시라는 의미이다. 리스너처럼 JPA의 상황을 주시하다가 특정 동작을 수행(누가, 언제 이 엔터티에 접근했는지 변경했는지)하는 것을 검사하는 의미에서 이름이 저렇게 지어진 듯 싶다.
1. Mapped Super Class 만들기 (Entity-Base Entity)
아래 코드를 보면 Entity와 Auditing Entity가 있다. 편의상 Mapped Super Class Entity를 BaseEntity라고 이름을 지었다. 이는 Entity가 생성되면서 BaseEntity를 프로퍼티에 포함해야하기 때문에 저렇게 지었다.
둘의 연결을 위해서는 Entity에서는 BaseEntity를 상속받아야한다.
또한 BaseEntity에서는 @MappedSuperClass를 통해 해당 클래스가 어떤 엔터티에게 프로퍼티들을 전달할 수 있는 클래스임을 선언한다.
Entity
@Entity
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name="Member")
public class MemberEntity extends BaseEntity{
@Id
private String userId;
private String userPwd;
private String userName;
private String userNumber;
private String userAddress;
private String userEmail;
// DTO를 Entity로 변환
public MemberEntity(MemberDTO member) {
// DTO의 프로퍼티들을 Entity의 프로퍼티들로 매핑
BeanUtils.copyProperties(member, this);
}
// Entity를 다시 DTO로 변환
public MemberDTO toDomain() {
MemberDTO member = new MemberDTO(this.userId, this.userPwd, this.userName, this.userNumber, this.userAddress, this.userEmail);
return member;
}
}
BaseEntity
@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedDate
private LocalDateTime updatedAt;
@LastModifiedBy
private String updatedBy;
}
2. JPA Auditing
BaseEntity를 자세히 보면 @EntityListeners(AuditingEntityListener.class)가 있는데 이를 통해 JPA Auditing 을 수행한다.
일단 기본적인 의미는 해당 애너테이션이 선언되어 있는 엔터티(BaseEntity)를 감시하다가 특정 동작시 AuditingEntityListener라는 클래스를 실행하겠다는 의미하다.
그럼 특정 동작에는 어떤것이 있는가 이는 Persistence Context 상황에 실행된다.
-@PostLoad : Get 요청시 select문 실행 후에 실행
-@PrePersist : Persist를 통해 데이터가 저장되고 이는 select후 insert를 하는데, 해당 객체를 Insert 하기전에 실행
-@PostPersist : Insert 한 후에 실행
-@PreUpdate : update 전에 실행
-@PostUpdate : update 한 후에 실행
-@PreRemove : delete 전에
-@PostRemove : delete 후에
여기서 AuditingEntityListener는 persist 전 객체가 널인지 확인을 해주고 update 전 객체가 널인지 확인해준다.
추가 적으로 해당 코드를 main이나 config로 설정을 해줘야 Auditing 을 사용할 수 있다.
@EnableJpaAuditing
'Server Development > Data API' 카테고리의 다른 글
JPA - @Query with Spring JPA (0) | 2023.04.05 |
---|---|
JPA - Query Method with Spring JPA (0) | 2023.04.05 |
JPA - EntityManager, EntityMapping, Context (0) | 2023.04.04 |
JPA - Spring JPA (0) | 2023.03.29 |
Data API - Basic Concept (0) | 2023.03.28 |