※ 본 글은 작성자 본인이 나중에 찾아보기 위해 메모장처럼 정리한 글이므로 형식과 내용이 자유롭고 ‘그렇다더라’식의 기록이 많을 수 있음. 주제 또한 산발적일 수 있음.
들어가며:
MongoDB Atlas의 사이트를 탐색하던 중 “우리는 다중 레코드 ACID 트랜잭션도 완벽 지원한다구요! 후훗” 하는 식의(?) 광고 타이틀을 자꾸 보게 되어 이게 뭔가 싶은 마음이 들었다. NoSQL이 뭔지를 알아보려는 목적에 부합하려면 현재 NoSQL의 대표주자라고 할 수 있는 MongoDB에서 이렇게 크게 광고하는 특성을 짚고 넘어가야 할 것 같았기에 서치를 좀 해보았다.
MongoDB Atlas
: 모든 주요 클라우드 제공업체에서 사용할 수 있는 MongoDB의 완전 관리형 글로벌 데이터베이스 서비스. 데이터베이스를 설치하고 관리하고 AWS같은 서버와 연결하고 하는 DevOps의 역할을 전부 대신 해주는 관리서비스. 사용자는 그냥 데이터베이스 자체만 신경쓰고 쿼리하면 된다.
다중 레코드 ACID 트랜잭션이란?
- ”ACID 트랜잭션은 특히 상거래 처리와 관련된 비즈니스(에서) 크리티컬 트랜잭션 시스템의 핵심 기능입니다. NoSQL의 성능과 교차 수집 ACID 트랜잭션 지원을 모두 제공하는 데이터베이스는 없습니다” - Dharmesh Panchmtia , 전자 상거래 이사, Cisco Systems
- 데이터 무결성?
트랜잭션
: 쪼갤 수 없는 업무 처리의 최소 단위. 거래내역. 은행 ATM이나(!) 데이터베이스 등의 시스템에서 사용되는 용어이다.
: 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위.
예를 들면:
A라는 사람이 B라는 사람에게 1,00원을 송금하고 B라는 사람이 그 돈을 받는 전체 과정이 하나의 트랜잭션이다. A는 보냈는데 B는 받지 못했다면 그 거래는 성립되지 않는다. A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없는 하나의 최소 단위로 이루어져야 하는 것이다. 이렇게 ‘한 쪽에서 보냈으면 다른 한 쪽에서 받아야만’ 성립되는 거래의 최소 단위를 트랜잭션이라고 한다.
데이터베이스에서 트랜잭션을 구현한다는 것은,
데이터를 주거니 받거니 하는 과정에서 ‘주고 받고’가 완결되지 않고 중간에 실행이 멈춘다거나, 여러 클라이언트가 동시에 액세스 하는 문제 등을 방지할 수 있도록 데이터 ‘주고 받고’를 트랜잭션으로 다루는 기능을 구현했다는 것이다. 이 말은 또 트랜잭션이 정상 처리되지 않은 경우 이전 상태로 되돌리는 ‘롤백rollback’이 가능하도록 기능이 마련되었다는 말이 된다.
트랜잭션 처리가 정상적으로 완료되지 않고 오류가 발생하면 ‘롤백’을 하고, 정상적으로 완료된 경우 ‘커밋commit’을 한다.
그러니까 데이터베이스가 트랜잭션 기능 어쩌고를 탑재했다? ‘그 DB의 완전성integrity은 믿어도 되겠다’가 되겠음.
ACID
그리고 이 트랜잭션이 어떤 때 에러가 난다는 건지, 어떤 식으로 롤백을 하고 커밋을 한다는 건지, 수많은 이슈에서 어떻게 작동을 하게 하겠다는 건지 등등의 규칙을 데이터베이스(개발자)가 만들 때 준수하는 사항들이 바로 ACID 조건이다.
즉, ACID란 데이터베이스의 트랜잭션이 안전하게 수행되기 위해, 트랙잭션 기능을 짜는 데 지켜야 할 4가지 필수적인 성질을 말한다.
원자성Atomicity:
일관성Consistency
고립성(격리성)Isolation
지속성(내구성)Durability
(자세한 사항은 패스!)
아무튼 ACID 트랜잭션이란
“ACID 규칙을 지키며 만들어진 안전한 트랜잭션 기능” 이란 뜻 정도가 되겠다.
현재 NoSQL 데이터베이스 중에 이 ACID 트랜잭션을 제공하는 것들이 거의 없다는 말이 사실이라면, MongoDB가 자랑할 만 하네.
아직 끝나지 않았다… ‘다중 레코드(문서)’ ACID 트랜잭션이란 무엇인가
MongoDB는 2018년에 4.0버전을 릴리스할 때 이 “다중 문서 ACID 트랜잭션”을 구현했다.
하지만 왜 ‘multi-document ACID transaction’이 필요하고 중요하다는 건지 잘 모르겠다. 일단 MongoDB가 데이터를 관리하는 단위가 ‘문서document’이다. 기존에 단일 문서에 대해선 이미 트랜잭션 기능을 제공하고 있었다고 한다. 이렇게 보통은 한 문서에 사용자 정보같은 걸 몽땅 다 넣어서 사용하면 되므로 문제가 없는데… 뭔가 RDB처럼 분산된 데이터인 경우 그걸 다루는 걸 말하는 건가. NoSQL의 문서 모델 자체가 규격 없이 데이터를 다 넣어버리면 되는데 왜 다중 문서가 필요한 것이며, 분산 데이터를 다루는 데 어째서 트랜잭션 개념이 중요한가?
(참고한 MongoDB 사이트의 글이 본격적으로 길어져서 마저 읽기와 정리는 다음 포스팅에 이어가기로 한다.)
참고:
Uploaded by N2T