본문 바로가기

Spring Boot

[Spring Boot] @PrePersist 어노테이션

728x90

@PrePersist란?

JPA의 라이프사이클 이벤트 어노테이션 중 하나로, 엔티티가 영속화(저장)되기 전에 실행할 로직을 정의할 때 사용
EntityManager.persist() 혹은 save() 중 하나라도 호출이 될 때 데이터베이스에 INSERT 되기 직전 실행되는 메소드

 

 

예제 : 유저 가입일 자동 값 입력

UserEntity

import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;

@Getter
@Entity
@Table(name = "user")
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

    private LocalDateTime createAt;


    @PrePersist
    protected void onCreate() {
        this.createAt = LocalDateTime.now();
    }

}

UserService

package com.example.simple_board.user;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository userRepository;

    public UserEntity register(String name) {
        UserEntity user = UserEntity.builder()
                .name(name)
                .build();

        log.info("{}", user);
        // save를 할 때 PrePersis 어노테이션이 있는 메소드 실행
        UserEntity newEntity =  userRepository.save(user); 
        log.info("{}", newEntity);

        return newEntity;
    }

}

 

 

@PrePersist 장점

  • 자동화된 초기화 : 데이터베이스에 저장되기 전에 자동으로 실행되기 때문에 객체 생성 시점에서 해야 default 값을 자동으로 처리할 수 있습니다.
  • 비지니스 로직의 일관성 유지 : 특정 필드를 설정하는 규칙이 여러 곳에서 반복될 수 있다면 중복된 로직을 피할 수 있습니다.
  • 효율성 : 데이터를 저장하기 전에 실행되므로 데이터 처리 효율성을 향상시킬 수 있습니다.
  • 보안성 : 데이터를 저장하기 전에 실행되므로 데이터 보안을 강화할 수 있습니다.

 

@PrePersist 단점

  • 제한된 재사용성 : 특정 Entity 클래스와 긴밀하게 결합이 되므로 여러 Entity에서 재사용이 어려울 수 있습니다.
  • Entity의 복잡성 : 클래스 내에서 비지니스 로직을 정의하면 클래스가 더 커지게 되고 이해하기 어려워 질 수 있으며 클래스가 비지니스 논리를 모두 담당하게 된다면 단일 책임 원칙(SRP) 위반과 같은 문제가 발생할 수 있습니다.
  • 불명확한 흐름 : 클래스에서 비지니스 로직이 관리가 된다면 의도한 대로 작동하는지 명확하게 어려운 경우가 발생할 수 있으며 다른 개발자가 이 로직을 추적하고 이해하기 어려울 수 있습니다.
728x90