DB

정합성 문제

baek-dev 2025. 4. 30. 14:06

정합성 문제란 무엇인가

정합성(整合性, Consistency) 문제란 시스템 내 데이터 간의 논리적 관계나 상태가 어긋나는 상황을 의미함.
쉽게 말해 "데이터가 서로 맞지 않음" → 즉, 하나는 A라고 말하고 다른 하나는 B라고 말하는 경우를 말함.
이러한 정합성 문제가 발생하면 서비스의 신뢰성이 떨어지고, 사용자 경험에도 직접적인 영향을 줄 수 있음.


1. 정합성의 의미

정합성은 시스템에서 데이터의 상태가 논리적으로 일관되고 모순되지 않는 것을 의미함.
정합성이 잘 유지된다는 것은 업데이트, 복제, 분산 처리, 캐시 반영 등이 모두 제대로 동기화되어 있는 상태를 뜻함.

예시

  • 주문 상태가 “결제 완료”인데 실제 결제 이력이 없음 → 정합성 문제
  • 재고 수량은 0인데 주문은 통과됨 → 정합성 문제
  • Kafka로 전송된 이벤트에는 변경 정보가 반영되었지만, DB에는 반영되지 않음 → 정합성 문제

2. 정합성 문제가 발생하는 상황

상황 설명
분산 시스템 서로 다른 서버/서비스가 데이터를 개별적으로 보유하거나 처리하면서 동기화 실패
비동기 메시징 (Kafka 등) 이벤트가 중간에 유실되거나, 순서가 뒤바뀌어 수신됨
DB와 캐시 불일치 DB를 먼저 업데이트했지만 캐시를 갱신하지 않아 사용자에게 잘못된 정보 제공
이중 처리/실패 처리 네트워크 장애 등으로 동일 요청이 중복 처리되어 상태가 꼬이는 경우
트랜잭션 경계 바깥 작업 DB 트랜잭션은 성공했지만 외부 API 호출이 실패함 (혹은 그 반대)

3. 정합성 문제를 방지하거나 해결하는 방법

1) 트랜잭션(Transaction) 활용

  • DB 내에서 ACID 트랜잭션을 적용하여 여러 작업을 하나의 원자 단위로 처리함.
  • 단일 시스템 내에서는 매우 효과적인 방법임.

2) 이중 확인(Double-check)

  • 상태 변경 전후를 검증하여, 조건에 따라 명시적으로 확인하고 동작 수행함.
  • 예: 재고가 남아있는지 다시 확인 후 주문 처리

3) 이벤트 소싱 / 메시지 지연 처리

  • 비동기 메시지 시스템(Kafka 등)에서는 이벤트 순서 보장, 중복 제거, 리트라이 등을 적용함.

4) 데이터 정합성 검증 로직 추가

  • 일정 주기로 DB를 점검하거나, API 응답값을 검증하여 자동 알림 또는 롤백 처리함.

5) SAGA 패턴

  • MSA에서 정합성을 유지하기 위해 사용하는 대표적인 분산 트랜잭션 패턴
  • 보상 트랜잭션 방식으로 각 서비스가 실패 시 되돌리는 책임을 가짐

4. 강한 정합성 vs 약한 정합성

구분 설명 예시
강한 정합성 항상 모든 시스템의 데이터가 즉시 일치함 은행 송금, 재고 차감
약한 정합성 일시적으로 불일치할 수 있으나, 시간이 지나면 일치함 SNS 좋아요 수, 조회수
최종적 정합성(Eventual Consistency) 궁극적으로는 동일한 상태로 수렴함 S3, NoSQL 시스템

→ 어떤 종류의 정합성이 필요한지는 시스템 특성에 따라 설계해야 함.


5. 실무 사례

  • 회원가입 후 이메일 발송 실패
    • DB에는 유저가 생성되었으나, 이메일 발송은 실패 → 후속 작업 불일치 발생
  • 주문 승인 후 결제 실패
    • 재고 차감은 완료되었지만 결제 API 실패 → 주문 상태와 금액이 불일치
  • MSA 간 상태 불일치
    • 결제 서비스는 “완료”, 주문 서비스는 “대기” → 최종 상태 정합성 깨짐
  • 이벤트 기반 처리
    • Kafka의 메시지 중복 소비로 인해 동일 알림이 두 번 전송됨

정리

정합성 문제는 시스템의 데이터 상태가 논리적으로 일관되지 않을 때 발생하는 문제임.
단일 시스템에서는 트랜잭션으로 어느 정도 해결 가능하지만, 분산 시스템/캐시/이벤트 기반 아키텍처에서는 복잡한 문제가 생길 수 있음.

따라서 설계 단계부터 어떤 정합성이 필요한지(강한/약한/최종적) 를 결정하고,
트랜잭션, 이벤트 처리 방식, 보상 로직, 검증 자동화 등으로 대비해야 안정적인 서비스를 제공할 수 있음.

 

 

 

 

출처 : ChatGPT

'DB' 카테고리의 다른 글

PostgreSQL  (0) 2025.04.28