@DynamicInsert, @DynamicUpdate, @Where

Seung jun Cha·2023년 6월 2일
0

기본적으로 하이버네이트는 INSERT와 UPDATE시에 모든 컬럼을 사용한다. INSERT와 UPDATE 하려고하는 컬럼만 INSERT와 UPDATE 하는 것이 아닌 모든 컬럼에 INSERT와 UPDATE가 적용된다는 것이다.

1. @DynamicInsert, @DynamicUpdate

@DynamicInsert는 null이거나 기본값(default)이 설정된 필드는 insert쿼리에서 제외하여 쿼리가 만들어진다. 만약 해당 필드가 null이라면 쿼리에 들어가지 않기 때문에 DB의 컬럼으로도 들어가지 않는다.

@DynamicInsert 애노테이션을 사용할 때는 엔티티의 필드에 null을 허용하지 않는다거나, null인 경우에 기본값을 가지도록 설정하는 것이 좋은데 이유는 다음과 같다.

  1. 데이터 불일치: 엔티티의 필드에 null을 허용하지 않는데, @DynamicInsert 애노테이션으로 인해 null인 필드가 INSERT 쿼리에서 생략되는 경우, 데이터베이스 테이블과 엔티티의 상태가 일치하지 않게 됩니다. 엔티티의 필드가 null을 허용하지 않는데도 데이터베이스에는 해당 컬럼이 null로 저장되는 상황이 발생할 수 있습니다.

  2. 기본값 누락: 엔티티의 필드가 null인 경우에 기본값을 가지도록 설정하지 않은 경우, @DynamicInsert 애노테이션으로 인해 INSERT 쿼리에서 해당 필드의 값을 생략하면 기본값이 적용되지 않습니다. 따라서 데이터베이스 테이블의 컬럼은 null이거나 이전에 설정된 값으로 유지될 수 있습니다.

  3. 예외 발생: 엔티티의 필드에 null을 허용하지 않는데도, @DynamicInsert 애노테이션으로 인해 null인 필드가 INSERT 쿼리에서 생략되는 경우, 데이터베이스 테이블의 컬럼이 null을 허용하지 않는 상태에서 예외가 발생할 수 있습니다. 이는 데이터베이스 제약 조건이나 유효성 검사 등에서 발생할 수 있는 문제입니다.

@DynamicUpdate는 UPDATE구문 생성 시점에 변경된 컬럼만 포함하여 쿼리문이 만들어진다. 따라서 수정 작업을 최적화하여 변경된 필드만을 업데이트한다.

2. @Where

  • , 엔티티를 조회할 때 특정 조건을 적용하여 해당 조건을 만족하는 데이터만 가져올 수 있도록 필터링하는 기능을 제공한다. 예를 들어 아래와 같은 코드가 있다.
@Where(clause = "is_deleted=false")

이렇게 되는 경우 Hibernate는 쿼리를 실행할 때 WHERE 절에 "is_deleted=false" 조건을 추가하여 해당 조건을 만족하는 엔티티만을 가져온다. 주의할 것은 @Where는 조회에만 적용이 된다는 것이다. 업데이트 쿼리 등에는 명시적으로 where을 추가해야한다.
주의할 것은 컬럼명이 isDeleted라면 is_Deleted로 적어줘야한다는 것이다

0개의 댓글