<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Atomicity on HandsLog</title>
    <link>https://blog.jsontapose.com/tags/atomicity/</link>
    <description>Recent content in Atomicity on HandsLog</description>
    <generator>Hugo -- 0.146.0</generator>
    <language>ko-kr</language>
    <lastBuildDate>Tue, 26 May 2026 13:59:38 +0000</lastBuildDate>
    <atom:link href="https://blog.jsontapose.com/tags/atomicity/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>DynamoDB UpdateItem의 원자성은 어떻게 보장되는가</title>
      <link>https://blog.jsontapose.com/posts/how-dynamodb-updateitem-guarantees-atomicity-3b2763/</link>
      <pubDate>Tue, 26 May 2026 13:59:38 +0000</pubDate>
      <guid>https://blog.jsontapose.com/posts/how-dynamodb-updateitem-guarantees-atomicity-3b2763/</guid>
      <description>&lt;h3 id=&#34;들어가며&#34;&gt;들어가며&lt;/h3&gt;
&lt;p&gt;DynamoDB의 &lt;code&gt;UpdateItem&lt;/code&gt; API는 카운터 증감이나 상태 변경 같은 &amp;lsquo;읽기-수정-쓰기&amp;rsquo; 연산을 단 한 번의 호출로 실행합니다. 이때 여러 클라이언트가 동시에 같은 아이템을 수정하려 할 때, 어떻게 데이터의 정합성과 원자성(Atomicity)을 보장하는지 그 내부 동작 원리가 궁금할 수 있습니다.&lt;/p&gt;
&lt;p&gt;결론부터 말하면, &lt;strong&gt;특정 아이템이 속한 파티션의 모든 쓰기 요청을 단일 리더(Leader) 노드가 직렬화(Serialize)하여 순차 처리&lt;/strong&gt;하기 때문입니다. 이 구조 덕분에 동시 쓰기 요청이 서로를 덮어쓰거나 유실되지 않고 안전하게 처리됩니다.&lt;/p&gt;
&lt;h3 id=&#34;핵심-원리-요약&#34;&gt;핵심 원리 요약&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;개념&lt;/th&gt;
          &lt;th&gt;설명&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;단일 파티션 리더&lt;/td&gt;
          &lt;td&gt;특정 파티션 키에 대한 모든 쓰기 요청은 하나의 리더 노드가 전담함&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;쓰기 요청 직렬화&lt;/td&gt;
          &lt;td&gt;리더는 수신한 쓰기 요청을 큐처럼 순서대로 하나씩 처리함&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;동기식 복제&lt;/td&gt;
          &lt;td&gt;리더는 변경 사항을 다수의 팔로워 노드에 복제하고, 확인 응답을 받아야 최종 커밋함&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;원자성 보장&lt;/td&gt;
          &lt;td&gt;이 세 가지 요소가 결합되어 &lt;code&gt;UpdateItem&lt;/code&gt; 연산의 원자성을 보장함&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;원자성-보장-메커니즘-상세&#34;&gt;원자성 보장 메커니즘 상세&lt;/h3&gt;
&lt;h4 id=&#34;1-파티션-기반-분산과-리더-선정&#34;&gt;1. 파티션 기반 분산과 리더 선정&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;DynamoDB 테이블 데이터는 파티션 키(Partition Key)를 기준으로 여러 파티션에 분산 저장됨&lt;/li&gt;
&lt;li&gt;각 파티션은 3개의 복제본(Replica)으로 구성되며, 서로 다른 가용 영역(AZ)에 배치됨&lt;/li&gt;
&lt;li&gt;복제본 중 하나는 리더(Leader)가 되고 나머지는 팔로워(Follower) 역할을 수행함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-단일-리더로의-쓰기-요청-라우팅&#34;&gt;2. 단일 리더로의 쓰기 요청 라우팅&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;클라이언트의 &lt;code&gt;UpdateItem&lt;/code&gt; 요청은 먼저 DynamoDB 요청 라우터(Request Router)에 도달함&lt;/li&gt;
&lt;li&gt;요청 라우터는 아이템의 파티션 키를 해싱하여 데이터가 속한 파티션을 찾고, 해당 파티션의 &lt;strong&gt;단일 리더 노드&lt;/strong&gt;로 요청을 전달함&lt;/li&gt;
&lt;li&gt;따라서 같은 아이템에 대한 모든 쓰기 요청은 항상 동일한 리더 노드가 처리하게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;3-리더-노드의-쓰기-요청-직렬화&#34;&gt;3. 리더 노드의 쓰기 요청 직렬화&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;원자성 보장의 핵심으로, 리더 노드는 동시에 도착한 여러 쓰기 요청을 병렬로 처리하지 않음&lt;/li&gt;
&lt;li&gt;대신, 요청을 내부적으로 큐에 넣고 &lt;strong&gt;하나씩 순서대로(Serially) 처리&lt;/strong&gt;함. 이는 아이템에 대한 비관적 락(Pessimistic Lock)과 유사한 효과를 가져옴&lt;/li&gt;
&lt;li&gt;예를 들어, 두 요청이 동시에 &lt;code&gt;SET counter = counter + 1&lt;/code&gt;을 호출하면, 리더는 첫 번째 요청의 &amp;lsquo;읽기-수정-쓰기&amp;rsquo; 사이클을 완전히 마친 후에야 두 번째 요청을 시작함&lt;/li&gt;
&lt;li&gt;이로 인해 두 번째 요청은 첫 번째 요청이 변경한 최신 값을 읽게 되어 데이터 정합성이 깨지지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;4-동기-복제를-통한-내구성-확보&#34;&gt;4. 동기 복제를 통한 내구성 확보&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;리더는 쓰기 연산을 완료한 후, 변경 사항을 팔로워 노드들에게 **동기적으로 복제(Synchronous Replication)**함&lt;/li&gt;
&lt;li&gt;리더는 쿼럼(Quorum), 즉 과반수 이상의 복제본에 데이터가 성공적으로 기록되었음을 확인한 뒤에 클라이언트에게 성공(200 OK) 응답을 보냄&lt;/li&gt;
&lt;li&gt;이 과정 덕분에 &lt;code&gt;UpdateItem&lt;/code&gt; 연산은 &amp;lsquo;전부 성공&amp;rsquo;하거나 &amp;lsquo;전부 실패&amp;rsquo;하는 원자적 특성을 가지며, 리더 장애 시에도 데이터 유실을 방지함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;동시-업데이트-처리-과정-예시&#34;&gt;동시 업데이트 처리 과정 예시&lt;/h3&gt;
&lt;p&gt;두 클라이언트(A, B)가 &lt;code&gt;counter&lt;/code&gt; 값이 0인 아이템에 &lt;code&gt;SET counter = counter + 1&lt;/code&gt; 요청을 동시에 보냈다고 가정해 보겠습니다.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
