Spring

[Spring] DynamicInsert 사용 이유

chanyoun 2024. 7. 22. 12:11
@DynamicInsert

[Spring] @DynamicInsert 사용이유

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Knowledge {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(nullable = false)
	private String thumbnailImageUrl;
	@Column(nullable = false)
	private String contentImageUrl;
	@Column(columnDefinition = "boolean default false")
	private Boolean isDeleted;
	@Column(updatable = false)
	@CreationTimestamp
	private LocalDateTime createdAt;

}

위와 같은 knowledge 객체를 생성 및 저장 할 때 isDeleted 필드 값을 설정하지 않으면, 데이터베이스에 null 값이 저장됩니다. 이는 데이터베이스에 기본값이 true 또는 false로 설정되어 있더라도 발생할 수 있는 문제입니다.

 

예를 들어, Knowledge Entity 가 위와 같을때 Knowledge 객체를 저장하게 되면(isDeleted 가 null 인 상태로), 아래와 같은 쿼리가 생성됩니다:

2024-01-03T16:21:44.759+09:00 DEBUG 32029 --- [           main] org.hibernate.SQL                        : 
    insert 
    into
        knowledge
        (thumbnail_image_url, contentImageUrl, isDeleted, createdAt) 
    values
        (?, ?, ?, ?)

이 쿼리는 isDeleted 필드가 명시적으로 null로 설정되었기 때문에, 데이터베이스에 false가 아닌 null이 저장되는 문제를 발생시킵니다.

 

이를 해결하기 위해 @DynamicInsert 어노테이션을 사용할 수 있습니다. @DynamicInsert를 사용하면 isDeleted 필드가 null일 경우 INSERT 문에서 제외됩니다. 따라서 데이터베이스는 isDeleted 필드에 대한 기본값을 적용하여 false를 저장하게 됩니다.

2024-01-03T16:21:44.759+09:00 DEBUG 32029 --- [           main] org.hibernate.SQL                        : 
    insert 
    into
        knowledge
        (thumbnail_image_url, content_image_url, created_at) 
    values
        (?, ?, ?)

@DynamicInsert 어노테이션을 사용하면, 엔티티 객체의 null 값을 가진 필드를 INSERT 문에서 제외하여 데이터베이스의 기본값이 적용되도록 할 수 있습니다. 이를 통해 Knowledge 엔티티 클래스의 isDeleted 필드가 올바르게 처리되며, 불필요한 null 값 저장을 방지할 수 있습니다.