Spring
@PrePersist와 @PreUpdate
Dev Park
5/31/2024
83 views
서론
데이터베이스에서 처리하기 어려운 제약 조건을 애플리케이션 로직내에서 처리하려고하면 어떻게 해야할까?
코드를 일일이 적어서 처리하는 방식은 세련되지 못한다.
그렇다면 데이터가 저장되기전이나 데이터 변경이 감지되었을때 로직을 실행할 수 있게한다면 좋지않을까?
그걸 가능하게 해주는게 @PrePersist, @PreUpdate 어노테이션이다.
오늘은 이 어노테이션에 대해서 알아보자.
@PrePersist
@PrePersist 어노테이션은 엔티티가 데이터베이스에 저장되기 전에 호출된다.
이를 사용하여 엔티티가 영속화되기전에 필요한 초기화나 유효성 검사를 수행할 수 있다.
Kotlin1@EntityListeners(AuditingEntityListener::class) 2@MappedSuperclass 3class BaseEntity( 4 @Column(name = "created_at", updatable = false) 5 var createdAt: LocalDateTime? = null, 6 7 @Column(name = "updated_at") 8 var updatedAt: LocalDateTime? = null, 9 10 @Column(name = "deleted_at") 11 var deletedAt: LocalDateTime? = null, 12) { 13 @PrePersist 14 fun prePersist() { 15 createdAt = LocalDateTime.now(); 16 updatedAt = LocalDateTime.now(); 17 } 18 19 fun softDelete() { 20 this.deletedAt = LocalDateTime.now() 21 } 22}
위와 같이 데이터베이스가 저장되기전 로직을 실행시켜 createdAt, updatedAt을 실행시킬 수 있다.
@PreUpdate
@PreUpdate 어노테이션은 데이터베이스에서 Entity가 업데이트 되기전에 실행된다.
Kotlin1@EntityListeners(AuditingEntityListener::class) 2@MappedSuperclass 3class BaseEntity( 4 @Column(name = "created_at", updatable = false) 5 var createdAt: LocalDateTime? = null, 6 7 @Column(name = "updated_at") 8 var updatedAt: LocalDateTime? = null, 9 10 @Column(name = "deleted_at") 11 var deletedAt: LocalDateTime? = null, 12) { 13 @PrePersist 14 fun prePersist() { 15 createdAt = LocalDateTime.now(); 16 updatedAt = LocalDateTime.now(); 17 } 18 19 @PreUpdate 20 fun preUpdate() { 21 updatedAt = LocalDateTime.now(); 22 } 23 24 fun softDelete() { 25 this.deletedAt = LocalDateTime.now() 26 } 27}
장점
- 데이터 무결성 보장
- Entity가 영속화되기 전에 실행되므로 데이터의 무결성을 보장할 수 있다.
- 데이터 처리 효율성 향상
- 데이터베이스에 저장하기전에 로직을 실행하므로 데이터 처리 효율성이 올라간다.
- 데이터 보안 강화
- 데이터베이스에 저장하기전 필드 값을 암호화하거나, 저장하기전 권한을 확인하는 등의 작업을 수행할 수 있다.
- 데이터 동기화
- Entity필드값을 다른 Entity와 동기화하거나, 다른 데이터베이스와 동기화하는 작업을 수행할 수 있다.
- 데이터 일관성 유지
- 필드값이 변경될 떄 이를 일관성 있게 처리하거나, 데이터베이스에 저장하기전 데이터를 검증하여 일관성을 유지할 수 있다.
단점
- 제한된 재사용성
- Entity 클래스와 긴밀하게 결합되기때문에, 다른 Entity에서 동일한 로직을 사용하거나 어플리케이션과 공유하는 것이 어렵다.
- 감소된 테스트 가능성
- Entity클래스 내에 정의된 로직을 테스트하는 것은 다른 어플리케이션 로직을 테스트하는 것보다 어려울 수 있다.
- 잠재된 성능 오버헤드
- Entity 인스턴스에서 복잡한 계산이나 데이터베이스 상호 작용이 포함된 작업의 경우 성능 오버헤드가 발생할 수 있다.