컴퓨터/Spring

[Spring] 트러블 슈팅 - Entity 날짜 자동 세팅(org.springframework.dao.DataIntegrityViolationException: could not execute statement [Column 'created_at' cannot be null] [insert into ...] )

도도새 도 2024. 1. 20. 13:49

 

문제상황

 

스프링 부트에서 특정 어노테이션을 달면 해당 Entity가 DB에 저장될 때 자동으로 현재 날짜로 세팅이 된다. 보통 게시글을 언제 썼냐 추적할 때 사용한다.

 

하지만 아래 에러가 발생하였다.

org.springframework.dao.DataIntegrityViolationException: could not execute statement [Column 'created_at' cannot be null] [insert into ...]

 

즉 created_at이 null로 세팅되어 에러가 난다는 것이다.

 

해결

이를 사용하기 위해서는 JAP Auditing 기능을 활성화 해주어야한다. 이는  데이터베이스에서 엔터티 객체의 변경 이력을 추적하는 기능을 제공하는 기술이다.

 

메인 설정 클래스에 @EnableJpaAuditing를 달아준다. 이로서 auditing을 활성화한다.

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})
@EnableJpaAuditing
public class MyrecipeApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyrecipeApplication.class, args);
	}

}

 

추적할 엔터티에 @EntityListeners(AuditingEntityListener.class)를 추가한다. @EntityListeners(AuditingEntityListener.class)AuditingEntityListener 클래스를 통해 변경 이력 추적을 활성화하게 된다.

@Entity
@Table(name="recipe")
@ToString
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class Recipe {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="recipe_id")
    private Long id;

    (...)
    
    @CreatedDate
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;
}

그러면 save등을 사용할 때 자동으로 createdAt이 생성되어 현재 시간으로 저장된다