Spring
[Spring] DynamicInsert 사용 이유
chanyoun
2024. 7. 22. 12:11
[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
값 저장을 방지할 수 있습니다.