[Spring] 리스너

전주은·2022년 12월 14일
0

들어가기전에

스프링 버전 2.7.6
자바 JDK11
IDE intellij

이벤트 종류

DB 에 CRUD(create read update delete) 작업을 할 때, 이전과 이후로 나눠 작업을 추가할 수 있습니다! pre가 붙은것은 이전, post가 붙은건 이후입니다!

PostLoad: 엔티티가 영속성 컨텍스트에 조회된 직후

PrePersist: 새로운 인스턴스를 merge할 때 수행. persist() 메소드를 호출해서 엔티티를 영속성 컨텍스트에 관리하기 직전에 호출 // insert

PreUpdate: flush, commit를 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출 // update

PreRemove: remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출 // delete

PostPersist: flush, commit를 호출해서 엔티티를 데이터베이스에 저장한 직후에 호출

PostUpdate: flush, commit를 호출해서 엔티티를 데이터베이스에 수정한 직후에 호출

PostRemove: remove 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제한 직후에 호출

예제
users 테이블에 데이터가 insert 될 때 자동으로 reg_date에 현재시간,
update 될 때 update+date에 자동으로 현재시간을 등록해보자!

프로젝트명Application에 @EnableJpaAuditing를 public class위에 추가

공통: category @EntityListeners(AuditingEntityListener.class)추가함

방법1

CreatedDate : insert될때 자동으로 넣어줌
LastModifiedDate: update될때 자동으로 넣어줌

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@EntityListeners(AuditingEntityListener.class)
public class Users extends BaseEntity implements Auditable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String userid;
    private String userpw;
    private String name;
    private String hp;
    private String email;
    @Enumerated(EnumType.STRING)
    private UserStatus status;
    private List<OrderGroup> orderGroups;
    private LocalDateTime regDate;
    private LocalDateTime updateDate;

    @PrePersist
    public void PrePersist(){
        System.out.println("PrePersist!");
        this.regDate = LocalDateTime.now();
        this.updateDate = LocalDateTime.now();
    }

    @PreUpdate
    public void PreUpdate(){
        System.out.println("PreUpdate!");
        this.updateDate = LocalDateTime.now();
    }

}

위와 같은 상황이 많다면 다른 엔티티에서도 재활용해주기 위해 인터페이스와 베이스가 되는 엔티티를 만들어서 설정해줄 수 있다.

방법2 BaseEntity 클래스 Auditable 인터페이스만들어서..

인터페이스

package com.koreait.day5.model.config;

import java.time.LocalDateTime;

public interface Auditable {
    LocalDateTime getRegDate();
    LocalDateTime getUpdateDate();

    void setRegDate(LocalDateTime regDate);
    void setUpdateDate(LocalDateTime updateDate);
}

베이스 엔티티로

package com.koreait.day5.model.config;

import lombok.Data;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
    @CreatedDate
    private LocalDateTime regDate;
    @LastModifiedDate
    private LocalDateTime updateDate;
}

결과
@ToString(callSuper = true) //부모의 toString을 사용하기 위해
@EqualsAndHashCode(callSuper = true)//Generating equals/hashCode 에러 없애는 방법
이걸 쓰면 아래 CreatedDate/LastModifiedDate해줄필요 없음
인터페이스에 getter/setter만들고 클래스에서 @Data로 구현
regDate/updateDate를 지우고, extends BaseEntity implements Auditable해준다.
@ToString(callSuper = true) //부모의 toString을 사용하기 위해

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@ToString(callSuper = true) //부모의 toString을 사용하기 위해
@EqualsAndHashCode(callSuper = true)//Generating equals/hashCode 에러 없애는 방법
@EntityListeners(AuditingEntityListener.class)
public class Users extends BaseEntity implements Auditable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String userid;
    private String userpw;
    private String name;
    private String hp;
    private String email;
    @Enumerated(EnumType.STRING)
    private UserStatus status;
    private List<OrderGroup> orderGroups;
    //private LocalDateTime regDate;
    //private LocalDateTime updateDate;

}

0개의 댓글