인스턴스 생성 후에 초기화 작업을 수행하기 위해서 처음에는 @PostConstruct 를 떠올렸는데, Spring Bean으로 지정된 클래스일 경우에만 사용이 가능하다는 것을 뒤늦게 생각이 났습니다.
JPA 엔티티에 대해서 '생성 후 초기화 작업'을 하기 위한 방법으로 @PrePersist를 사용하면 됩니다.
📒
JPA가 제공하는 @PrePersist와 @PreUpdate 어노테이션을 사용하면
엔티티가 데이터베이스에 저장되기 전(@PrePersist), 엔티티가 데이터베이스에 수정되기 전(@PreUpdate) 에 특정 로직을 수행할 수 있습니다.
아래의 코드는 Post 엔티티에서 authorUsername 이라는 필드를 별도로 관리하기 위해서, 이를 @PrePersist를 사용해 구현한 코드입니다.
Post 엔티티에 author 필드가 이미 존재해서 Service단에서는 author와 authorUsername을 각각 넣어주는 코드 스타일이 뭔가 이상해보여서, Post 엔티티에서 내부적으로 값을 할당해주는 방식으로 구현하게 되었습니다.
public class Post {
// ...
@ManyToOne
private Member author;
private String authorUsername;
// ...
@PrePersist
public void updateAuthorUsername() {
if (author != null) {
this.authorUsername = author.getUsername();
}
}
}