개발을 할 때 공통적으로 들어가는 컬럼들에 대해서 BaseEntity를 사용해서 저장하곤 한다.
보통은 등록자, 등록일시, 수정자, 수정일시를 저장하지만 만약에 IP와 같은 요소들을 추가해야한다면 어떻게 해야할까?!
바로 @PrePersist, @PreUpdate를 사용하면 된다.
이 어노테이션을 엔티티가 DB에 저장되기 전에 실행되어야 하는 메서드에 붙이면 저장되기 전에 해당 메서드가 수행된다.
이 어노테이션을 엔티티가 DB에 수정되어 저장되기 전에 실행되어야 하는 메서드에 붙이면 수정되기 전에 해당 메서드가 수행된다.
코드는 아래와 같다.
참고로 아래 코드에서 CommonUtils.getRemoteAddr 는 HttpServletReqest객체로 사용자의 IP를 return해주는 static method다
@MappedSuperclass
@Getter
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedBy
@Column(name = "REG_ID"
@Comment("등록자")
private String registrationId;
@CreatedDate
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name = "REG_DTTM")
@Comment("등록일")
private LocalDateTime registrationDateTime;
@Column(name = "REG_IP")
@Comment("등록IP")
private String registrationIp;
@LastModifiedBy
@Column(name = "MOD_ID")
@Comment("수정자")
private String modifyId;
@LastModifiedDate
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Column(name = "MOD_DTTM")
@Comment("수정일")
private LocalDateTime modifyDateTime;
@Column(name = "MOD_IP")
@Comment("수정IP")
private String modifyIp;
@PrePersist
public void prePersist() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (servletRequestAttributes != null) {
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
this.registrationIp = CommonUtils.getRemoteAddr(httpServletRequest);
this.modifyIp = CommonUtils.getRemoteAddr(httpServletRequest);
}
}
@PreUpdate
public void preUpdate() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (servletRequestAttributes != null) {
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
this.modifyIp = CommonUtils.getRemoteAddr(httpServletRequest);
}
}
}
HttpServletRequest를 가져오는 방법은 두가지가 있다.
1. RequestContextHolder.getRequestAttributes()
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest httpServletRequest = servletRequestAttributes.getRequest();
2.RequestContextHolder.currentRequestAttributes())
HttpServletRequest httpServletRequest = RequestContextHolder.currentRequestAttributes()).getRequest()
나는 1번 방법을 선택하고 null 예외처리를 해주었다.