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
'Spring Boot' 카테고리의 다른 글
[Spring Boot] HTTP Body 암호화 및 간단한 예제 (0) | 2024.12.17 |
---|---|
[Spring Boot] 로그 파일 생성하기 (0) | 2024.11.30 |
[Spring Boot] Slf4j와 Logback (1) | 2024.11.29 |
[Spring Boot] Lombok과 직렬화/역직렬화 (0) | 2024.11.25 |
[Spring Boot] 간단한 실시간 웹소켓 채팅 구현하기 (0) | 2024.11.22 |