ETC / / 2023. 8. 17. 20:10

RDBMS와 NoSQL - ACID, Transaction 등등

1. RDBMS란?

RDBMS라는 이름만 보고는 쉽게 유추할 수 없겠지만, 약어로서 작용하는 하나의 시스템이다. 이것을 풀어보자면, Relational Data Base Management System이다. 즉, 관계형 데이터 베이스 관리 시스템이라는 직역이 가능하다. 여기서 가장 큰 중요성이 있는데 바로 Relational(관계형)이다. RDBMS는 프로그래머로서 하여금 관계형 디비 - MySQL, PostgreSQL, MariaDB 등등 - 와 상호작용(생성, 업데이트, 그리고 관리 등등)을 할 수 있게금 해주는 여러 프로그램이나 능력들을 모아둔 것이라고 보면 된다.

 

1-1. RDBMS와 DBMS의 차이

일반적으로 데이터베이스 저장소(DB)는 쿼리를 날려 다른 어플리케이션도 사용할 수 있게하는 데이터들의 집합이라고 할 수 있다. DBMS는 데이터베이스 플랫폼 위에서 관리, 개발등을 지원하는 데이터베이스 관리 시스템이다. 이중에서 RDBMS는 열(row)기반 구조로서 관계되어 있는 데이터 요소들을 연결해준다. 이때 RDBMS는 데이터의 보안, 정확성, 무결 그리고 일관성을 관리하는 기능들을 포함하고 있다.

 

그 외에도 다음과 같은 차이가 있다고 볼 수 있다.

 

  RDBMS DBMS
접근 가능한 유저의 수 여러명의 유저가 접근 가능 한명의 유저밖에 한번에 접근 불가능
하드웨어 및 소프트웨어 요구 사항 높음 낮음
데이터의 수 다양한 크기의 데이터 관리 가능 적은 데이터만 관리 가능
데이터베이스 구조 테이블 기반 관계형 구조 계층적 구조
ACID여부 사용 미사용
분산형 디비 지원 미지원
데이터 정규화 가능 불가능

 

1-2. RDBMS에서의 ACID란?

1-2-1. 트랜잭션이란?

 

ACID를 먼저 언급 하기 전에, Transaction(이하 트랜잭션)에 대해 언급하고 넘어가야 된다. 트랜잭션이란, 데이터베이스에서 이루어지는 연속되는 여러 실행 단위를 묶어둔 것이라고 생각하면 된다. 그리고 각각은 하나의 논리적인 작업의 유닛으로 제공된다. 예를들어 설명해보겠다. A라는 유저가 B라는 유저에게 500만원을 보낸다고 해보자. 그러면 다음과 같은 실행이 일어난다.

 

  1. (데이터베이스 트랜잭션의 시작이라고 불리는) 유저 A에게서 B에게 500만원을 보낸다는 기록을 만든다.
  2. 유저 A에게서 잔고를 확인한다.
  3. 유저 A의 잔고에서 500만원을 뺀다.
  4. 유저 B의 잔고를 읽는다.
  5. 유저 B의 잔고에다가 500만원을 추가한다.

만약 이러한 트랜잭션을 하나의 원자성(하나의 깨지지 않는) 유닛으로 처리하고 만약 시스템이 이러한 트랜잭션을 도중에 실패하면, 트랜잭션은 완료되지 않은 상태에서 기존의 상태로 돌아간다. 일반적으로 롤백(rollback)이라는 단어는 트랜잭션을 통해 만들어진 어느 변화든 미완료 상태에 놓인 프로세스를 되돌리는 것을 말한다. 커밋(commit)이라는 단어는 트랜잭션을 통해 영구적인 변화가 이루어진 경우를 언급한다.

이러한 트랜잭션에는 여러 상태가 있다.

 

  1. 활성 상태(Active) - 트랜잭션의 첫번째 상태이다. 트랜잭션의 명령어(읽고 쓰는 작업)이 실행되는 동안 활성되어 있다.
  2. 일부 커밋된 상태(Partially Commited) - 이 상태로 변한 경우 데이터베이스는 아직 디스크에 데이터를 커밋하지 않은 상태이다. 이러한 상태의 경우 메모리 버퍼에 있는 경우이며, 이 버퍼에 있는 데이터가 아직 쓰이지 않은 경우이다.
  3. 커밋된 상태(Committed) - 이 상태의 경우 데이터베이스에 영구적으로 저장된 상태이다. 그렇기에, 이 상태 이전으로 롤백은 불가능하다.
  4. 실패(Failed) - 만약 일부 커밋된 상태라든지, 활성 상태에서 트랜잭션이 거부되거나 실패한 경우 실패 상태에 진입한다.
  5. 종료(Terminated) - 마지막 상태로 데이터베이스 트랜잭션의 라이프 사이클의 최종 단계이다.

 

1-2-2. ACID 특성

 

Atomicity(원자성) - 원자성을 생각하면 편하다. 즉 모 아니면 도인 상태이다. 트랜잭션이 커밋되면, 트랜잭션은 기존 상태로 롤백되거나, 아니면 완전히 성공하거나 하는 상태만을 가지는 것이다. 즉, 부분적으로 실행되거나 중단되지 앟ㄴ는 것을 보장해야한다.

 

Consistency(일관성) - 트랜잭션을 사용하는 주된 이유중 하나가 바로 트랜잭션이 성공하든 실패하든 바로 데이터 무결성을 유지하는 것이다. 트랜잭션은 데이터베이스 엔진에 의해 인가된 데이터에게만 영향을 줄 수 있으며, 데이터에 대한 일관성을 제공해야 한다. 

 

Isolation(독립성) - 만약 여러 다른 트랜잭션이 동시에 실행될 경우, 각기 다른 트랜잭션은 독립적으로 다른 트랜잭션에 영향을 주지 않고 실행되어야 한다. 이는 다른 관점에서 다른 트랜잭션이 다른 트랜잭션의 실행 작업도중을 볼 수 없다는 뜻이다.

 

Durability(지속성) - 성공적인 트랜잭션은 영원히 커밋되어야 한다. 모든 트랜잭션은 로그로 남으며 에러 발생 전으로 되돌릴 수 없다는 것이다.

 

1-3. RDB와 DB의 차이

RDB의 경우 관계형 디비(Relational Database)의 줄임말이며, DB는 어느 타입의 데이터베이스든 언급하는 주체가 똑같다. RDB의 경우 데이터를 한개 이상의 테이블 - 각각의 기록을 파악할 수 있는 유니크한 키값이 있는 - 특정한 데이터베이스를 언급한다. RDB의 가장 큰 특징은 바로 데이터의 구성 및 접근 방식이다. RDB는 Structured Query Language(SQL)을 사용한다. 

 

2. NoSQL과 RDBMS

NoSQL은 위의 RDBMS의 대표적인 특징 중 하나인 데이터 간의 관계를 정의하지 않는다. 즉 여기서 RDBMS의 특징인 JOIN연산은 NoSQL에서 불가능하다. 하지만, 이러한 큰 장점을 가지고 있는 RDBMS과 달리 NoSQL에는 기존의 정형화된 데이터 뿐만 아니라, 음성, 비디오 등등, 이러한 비정형화된 데이터도 저장하고 다뤄야 하는 필요성이 제기되기에 사용된다. 

 

NoSQL은 수평 확장성과 고 가용성을 가지고 있는 특징 덕분에 현재 각광받고 있기도 하다.

 

RDBMS의 한계는 스키마 형태의 장점이 반대로 다가오는 과정이다. 기존 테이블에 정의된 데이터 타입이 아니면 컬럼을 자유롭게 추가하거나 변경해야되는데, 이것이 불가능하기에, 새로운 테이블을 만들거나 해야한다. 그 외에도 앞에서 말한 수평 확장성이 거의 불가능하다는 점이 있다.

 

2-1. NoSQL의 종류

 

  1. Key-Value 데이터베이스 - 키와 밸류 쌍으로 데이터가 저장되며, 이때 Key는 값에 접근하기 위한 용도로 사용되고, 이때 Key는 어떤 형태의 데이터라도 담을 수 있다. 대표적으로 Redis가 있다.
    • 성능 향상을 위해 데이터 캐싱을 할 때
    • 웹앱의 일시적인 속성 추적 및 모바일 앱용 사용자 데이터 정보와 구성정보 저장
  2. Document Database - 테이블의 스키마가 유동적이며, 레코드마다 각각 다른 스키마를 가질 수 있다. 대표적으로 MongoDB가 있다. 여기서 단점이 나오는데, 각 문서(Documnet)별로 다른 필드를 가질 수 있기에 칼럼과 필드에 대한 관리를 확실히 해야한다.
    • 다양한 속성이 있는 데이터 관리 및 다양한 유형의 메타데이터 추적
    • 비정규화된 중첩 구조의 데이터를 사용하는 앱
  3. Column Family Database 
  4. Graph Database

 

 

 

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유