데이터베이스와 ACID 성질

citron03·2022년 2월 10일
0
  • 데이터베이스를 통해서 데이터를 저장해야 하는 이유는 뭘까?
  • 데이터베이스를 사용하지 않고도 In-memory에 데이터를 저장할 수 있다.
  • 하지만, In-memory에 저장된 데이터는 해당 프로그램이 종료되면 데이터가 사라진다.
  • 다시 프로그램을 실행하면, 데이터는 초기화되고 이전에 수정했던 값들은 이미 사라져버린다.
    🍫 즉, 데이터의 수명이 프로그램의 수명에 의존하게 된다.
  • 그렇다면, File I/O로 데이터를 저장하는 것은 어떨까?
  • CSV나 엑셀시트, txt와 같은 파일에 데이터를 저장한다.
  • 하지만, 이렇게 저장된 데이터는 무조건 모두 불러와 사용해야 하고, 원하는 데이터만 필터링하여 가져올 수 없다.
  • 또한, 이들은 대규모 데이터에 적합하지 않다.
    💐 따라서, 데이터의 관리가 편하고 원하는 데이터만 필터링하여 가져올 수 있는 Data에 특화된 서버, 데이터베이스가 필요한 것이다.

🌹 SQL, Structured Query Language는 데이터베이스를 사용하기 위한 데이터베이스용 프로그래밍 언어이다.

  • SQL을 이용하여 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 데이터를 수정할 수 있다.
  • 하지만, SQL을 이용하기 위해서 데이터베이스의 데이터 구조가 고정되어 있어야 한다.
    (Relational Database, RDB, 관계형 데이터베이스)
    🎀 SQL은 구조화된 쿼리 언어를 의미한다.

트랜잭션

  • 트랙잭션은 여러개의 작업을 하나로 묶은 것이다.
  • 트랙잭션의 작업은 모두 성공해야 처리를 한다.
  • 만약, 하나의 작업이라도 실패한다면 모두 실패한 것으로 처리한다.
  • 트랜잭션의 결과는 성공 또는 실패만 존재한다.
  • 데이터베이스의 트랜잭션은 안전성을 보장하기 위해서 ACID 라는 특성을 가진다.

트랜잭션의 ACID 성질

Atomicity

  • Atomicity은, 트랜잭션에 속한 작업이 전부 실패하거나 성공하여, 결과를 예측 가능한 것을 의미한다.
  • 트랜잭션의 속한 작업이 부분적으로만 성공하여 진행된다면, 데이터가 오염될 우려가 있다.
  • 트랜잭션이 실패하면, 실행 이전의 상태로 돌아간다.

🧸 계좌이체를 진행하는데, 이체가 진행되어 계좌에서 돈이 빠져나갔지만, 중간에 오류가 생겨 상대 계좌에 입금이 되지 않는다면 곤란할 것이다.
🧸 이럴 때, Atomicity을 지킨다면, 상대방 계좌에 입금이 실패할시에 계좌에서 돈이 빠져나간 것도 실패해야 한다.
🧸 즉, 실행 전의 상태로 돌아간다.

Consistency

  • 데이터베이스의 상태는 일관되야 한다.
  • 하나의 트랜잭션이 끝난 뒤에도 데이터베이스는 트랜잭션이 실행되기 전과 같이 유효한 상태여야 한다.
  • 데이터베이스에 정해진 제약을 트랜잭션이 일어난 뒤 위반하는 일이 없어야 한다.

🧸 택배 배송 서비스의 데이터베이스가 있다고 했을 때, 배송지 데이터는 반드시 있어야 한다.
🧸 만약 배송지 정보가 없는 데이터가 삽입되거나, 기존 데이터에서 배송지를 삭제하는 작업이 일어난다면, 일관성을 해치게 된다.

Isolation

  • 모든 트랙잭션은 독립적으로 존재해야 한다. 다른 트랜잭션에 의해 영향을 받지 않는다.
  • 동시에 여러개의 트랜잭션이 실행되었을 때, 연속적으로 실행된 결과와 같아야 한다.
  • 격리성을 지키기에 트랜잭션은 다른 트랜잭션이 어떤 작업을 하는지 알 수 없다.

🧸 A 계좌에서 B와 C 계좌로 동시에 이체한 결과와 A 계좌에서 B 계좌에 송금한 뒤에 C 계좌에 연속적으로 이체한 결과는 같아야 한다.

Durability

  • 하나의 트랜잭션이 실행되었다면, 해당 트랜잭션에 대한 로그는 영구히 남아야 한다.
  • 만약 시스템 오류나 런타임 오류가 발생하여도 로그는 영구히 남아야 한다.

🍹 금융 서비스위한 소프트웨어를 개발하는 데 있어서 ACID 특정은 '반드시' 지켜져야 한다. 때문에 이런 경우에는 SQL을 이용한 관계형 데이터베이스를 사용해야 한다. 🍹

참고 자료 : 코드 스테이츠

profile
🙌🙌🙌🙌

0개의 댓글