DBMS/Cassandra
Spring Data Cassandra save vs insert 동작 차이
seungh0
2024. 7. 11. 04:59
반응형
Spring Data Cassandra의 save vs insert 동작 차이에 대해서, 간단히 정리해 본 내용입니다.
1. save vs insert 실행 결과 비교
테이블 및 코드 설정
테스트 할 sample 테이블과 코드는 다음과 같습니다
create table sample(
id text primary key ,
value1 text,
value2 text
);
@Table(value = "sample")
data class Sample(
@PrimaryKey
val id: String,
var value1: String?,
var value2: String?,
)
interface SampleRepository : CassandraRepository<Sample, String>
1-1. Save 테스트
@Test
fun `save`() {
// given
val id = "save"
val sample = Sample(
id = id,
value1 = "변경 전 1",
value2 = "변경 전 2"
)
sampleRepository.save(sample)
sample.value1 = null
sample.value2 = "변경 후 2"
// when
sampleRepository.save(sample)
// then
val sut = sampleRepository.findById(id)
assertThat(sut.get().value1).isNull()
assertThat(sut.get().value2).isEqualTo("변경 후 2")
}
- save를 사용하면, value2 뿐만 아니라, value1도 null로 업데이트됩니다. 즉, 전체 업데이트(Full Update)가 이루어집니다.
실제 쿼리를 보면, save의 경우 null로 명시된 value1도 쿼리에 포함되는 것을 확인할 수 있습니다.
1-2. Insert 테스트
@Test
fun `insert`() {
// given
val id = "insert"
val sample = Sample(
id = id,
value1 = "변경 전 1",
value2 = "변경 전 2"
)
sampleRepository.save(sample)
sample.value1 = null
sample.value2 = "변경 후 2"
// when
sampleRepository.insert(sample)
// then
val sut = sampleRepository.findById(id)
assertThat(sut.get().value1).isEqualTo("변경 전 1")
assertThat(sut.get().value2).isEqualTo("변경 후 2")
}
- insert를 사용하면, value2만 업데이트되고, value1은 기존 값이 유지됩니다. 즉, 부분 업데이트(Partial Update)가 이루어집니다.
- 실제 쿼리를 보면, insert의 경우 null로 명시된 value1은 쿼리에 포함되지 않아 변경되지 않는 것을 보실 수 있습니다.
그럼 왜 이런 차이가 발생할까요? 그건 Spring Data Cassandra의 내부 코드를 보면 알 수 있습니다.
2. Spring Data Cassandra 내부 동작 차이
2-1. Save
(Optimistic Lock을 사용하지 않는다고 가정합니다)
- save 메서드는 내부적으로 withInsertNulls(insertNulls: true) 설정을 사용해서 insert 합니다.
- 이는 null을 포함한 엔티티의 모든 필드가 업데이트됩니다.
2-2. insert
- insert 메서드는 InsertOptions.empty() 설정을 사용하며, 이는 insertNulls: false를 의미합니다.
- 이는 부분 업데이트(Partial Update)를 수행하여 null이 아닌 필드만 업데이트됩니다.
3) InsertOptions.insertNulls 이란?
- insertNulls는 엔티티의 null 값을 명시적으로 null로 쿼리에 포함시킬지 여부를 결정합니다.
(쉽게 비유하면, Full Update vs Partial Update)- true인 경우: 전체 값이 포함된 쿼리가 나가고, 전체 업데이트(Full Update)가 수행됩니다.
- false인 경우: null이 아닌 값들만 포함된 쿼리가 나가고, 부분 업데이트(Partial Update)가 수행됩니다.
4. 요약
operation | insertNulls | 처리 방식 |
save | true | Full Update |
insert | false | Partial Update |
반응형