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

 

반응형