Spring에서 BaseEntity작성하기

nGyu·2022년 2월 15일
7
post-thumbnail

BaseEntity는 JPA를 사용하며 @Entity 클래스를 설계할 때 공통 속성인 create_at(intsert time) , update_at(update time) 컬럼에 대해 모든 @Entity 클래스에서 공통적으로 소유할 가능성이 보여 클래스를 분리한 것이다.


순수 JPA를 이용한 BaseEntity 구현

@Setter
@Getter
@MappedSuperclass
public class BaseEntity{
	@Column(updatable = false)
	private LocalDateTime created_at;
	private LocalDateTime updated_at;

	@PrePersist
	public void prePersist(){
		LocalDateTime now = LocalDateTime.now();
		created_at = now;
		updated_at = now;
	}
	@PreUpdate
  public void preUpdate() {
    updated_at = LocalDateTime.now();
  }
}

여기서 여러개의 어노테이션이 보이게 되는데,

Getter, Setter는 Lombok에서 제공하는 어노테이션으로 Getter,Setter를 따로 작성해주지 않아도 된다.

MapperSuperclass

이 어노테이션 상당히 낯설다. 이게 뭐하는 어노테이션인지 한번 알아보자.

이 BaseEntity는 각종 Entity에 상속을 해주어야 한다. 하지만, 클래스 명만 Entity이지 이는 Entity클래스가 아니다. Entity클래스는 Entity클래스끼리만 상속을 받을 수 있는데 Entity클래스에서 일반 클래스를 상속받기 위해서는 해당 어노테이션을 작성해 주어야 한다.

Column(updatable = false)

매핑되는 컬럼에대한 특성을 지정해주는데, created_at 컬럼은 최초에 값을 insert 할 때 들어가는 값이 쭉 유지가 되어야 하므로 Entity가 Update 될 때 created_at이 update가 되지 않게하기위해 작성을 해준다.

PrePersist

순수 JPA는 EntityManager를 이용해 persist() 메소드를 통해 영속화 작업을 한다.
그렇기 때문에, persist() 메서드가 호출되기 전, prePersist() 메소드가 실행되는데, 해당 메소드 안에서 작동하는 로직을 나타내기 위해 작성하고, 이 안에서 created_at, updated_at을 현재 시각으로 수정시켜준다.

PreUpdate

변경 감지를 통해 update쿼리가 실행 되었을 때 해당 어노테이션에서 preUpdate()메서드를 통해 updated_at의 시간을 현재시각으로 수정시켜준다.


Spring Data JPA를 이용한 BaseEntity

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass
public class BaseEntity {

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

    @LastModifiedDate
    private LocalDateTime updated_at;
}

위 처럼 구현을 할 수 있다.

순수 JPA와는 사뭇 다른 모양인데 하나하나 자세히 알아보자.

JPA에서 하던것과 비교를 하면 먼저 보이는건 우선 PrePersist와 PreUpdate어노테이션의 유무이다.

그럼 여기서 PrePersist와 PreUpdate 어노테이션의 기능은 누가 하는지 정말 궁금한데, created_at과 update_at을 보면 위에 새로운 어노테이션이 붙어있다.

CreatedDate

PrePersist와 비슷한 기능으로, Entity가 생성되어 저장될 때 시간이 자동으로 저장이 된다.

LastModifiedDate

PreUpdate와 비슷한 기능으로, 조회한 Entity의 값을 변경할 때 시간이 자동으로 저장된다.

이렇게까지 보면 PrePersist와 PreUpdate를 CreatedDate어노테이션과 LastModifiedDate 어노테이션이 대체를 해준다는것을 알 수 있다.

결과적으로 Spring에서는 BaseEntity 를 만들때 더욱 편리하게 할 수 있다는 사실을 알게되었다.

그런데 순수JPA 와 비교를 했을 때 뭔가 다른게 하나가 더 있다. EntityListeners인데 이는 또 무엇일까

EntityListeners

JPA에서는 PrePersit, PreUpdate등 Entity에 LifeCytcle과 관련된 이벤트들이 존재하는데 해당 이벤트를 Listen해주는것이다.

아래 클래스 즉, BaseEntity 에 기능을 추가한다는 뜻이다.

EntityListeners에서 Spring의 DI개념이 등장하게 되는데 DI의 개념은 다음에 알아보자.

profile
지금보다 내일을, 모레를 준비하자

0개의 댓글