[JPA] IP를 저장하는 BaseEntity

파워소동·2023년 4월 30일
0

JPA

목록 보기
3/5
post-thumbnail

개발을 할 때 공통적으로 들어가는 컬럼들에 대해서 BaseEntity를 사용해서 저장하곤 한다.

보통은 등록자, 등록일시, 수정자, 수정일시를 저장하지만 만약에 IP와 같은 요소들을 추가해야한다면 어떻게 해야할까?!

바로 @PrePersist, @PreUpdate를 사용하면 된다.

@PrePersist

이 어노테이션을 엔티티가 DB에 저장되기 전에 실행되어야 하는 메서드에 붙이면 저장되기 전에 해당 메서드가 수행된다.

@PreUpdate

이 어노테이션을 엔티티가 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();
  • RequestAttributes가 없는 경우 null을 return한다.

2.RequestContextHolder.currentRequestAttributes())

HttpServletRequest httpServletRequest = RequestContextHolder.currentRequestAttributes()).getRequest()
  • RequestAttributes가 없는 경우 예외를 발생시킨다.

나는 1번 방법을 선택하고 null 예외처리를 해주었다.

profile
이것저것 모음집

0개의 댓글