PGR21.com
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
Date 2014/10/27 21:03:31
Name 랜덤여신
Subject [일반] 예시로 알아 보는 데이터베이스의 4대 원칙
컴퓨터 데이터베이스 세상에는 'ACID'라는 원칙이 있습니다. 데이터베이스에 자료를 넣거나 뺄 때 '가급적' 지켜야 할 네 가지 원칙(원자성, 일관성, 독립성, 내구성)인데요. 예를 들어 가면서 알아보겠습니다.

[1. 원자성]

원자는 쪼갤 수 없는 최소 단위죠. 물론 쿼크나 전자가 밝혀지면서 의미가 퇴색한 감이 있지만... 아무튼 원래 의미는 그랬습니다.

한편 데이터베이스에서의 원자성은 한 마디로 요약하면 이렇습니다. ["all or nothing"]

예를 들어 알아보죠. 다음과 같은 계좌 잔고 목록이 있다고 합시다.


[A 잔고: 100, B 잔고: 200]

이때 A가 B에 50만큼의 돈을 송금하려고 합니다. 그러려면 어떻게 해야 할까요?

(1) 우선, A에서 50만큼 뺍니다.
(2) 그리고 B에 50을 더합니다.

무척 간단해 보이지만, 뜻밖의 위험이 도사리고 있습니다. 송금 과정이 한 단계가 아닌 [여러 단계로 이루어진다]는 것입니다.

여러분은 엑셀로 계좌 관리를 하고 있습니다. 위 거래를 수행하기 위해, 우선 엑셀에서 A의 잔고 셀을 클릭해서 100을 50으로 낮췄습니다. 그리고 B의 잔고 셀을 누르려는 순간, 갑자기 동료가 커피나 한 잔 하자고 부릅니다. 즐거운 커피 타임~ 그런데 돌아오니 [자기가 무슨 작업을 하고 있었는지 까먹었습니다.] 저 50이라는 돈은 그대로 잊힌 돈이 됩니다.

이런 일을 방지하려면, 어떤 거래를 수행하려면 여러 단계가 필요할 때, 그 단계들이 전부(all) 수행되거나 아니면 전혀 안(nothing) 수행된다는 것을 보장할 필요가 있습니다. 이것이 '원자성'입니다.

컴퓨터가 일할 때 '커피 타임'을 발생시키는 요인에는 여러 가지가 있습니다. 갑작스러운 정전, 네트워크 오류, 소프트웨어 버그... 물론 99.99%의 상황에서 제대로 동작하지만, 나머지 0.01%의 피해를 방지하기 위해 원자성을 보장해야 하는 것이죠.

위에서는 은행 거래를 예로 들었지만, 인터넷 게시판에도 마찬가지로 적용되는 원리입니다. 댓글 작성을 생각해 보면 다음과 같은 단계들을 생각할 수 있겠죠: (1) 댓글 목록에 현재 댓글 추가 (2) 현재 댓글이 달린 글의 댓글 개수를 1만큼 증가 (3) 현재 댓글이 계층 댓글이라면 상위 댓글에 달린 댓글 개수도 1만큼 증가

[2. 일관성]

데이터베이스에 저장된 데이터는 항상 일관성이 있어야 합니다.

소프트웨어 개발자는 데이터베이스를 이용할 때 몇 가지 규칙을 부여할 수 있습니다. 예를 들어, (1) 어떤 글의 댓글 개수는 항상 0 또는 양수여야 한다. (2) 어떤 댓글의 상위 댓글은 항상 존재해야 한다. (3) 사용자 아이디는 반드시 유일해야 한다.

프로그래머도 사람인지라 자주 가끔 실수를 합니다. 예를 들어, 아이디 중복 확인 기능을 깜빡하고 안 넣었더니 같은 아이디를 가진 사용자가 여러 명 있게 되는 경우가 있을 수 있겠죠. 데이터베이스에 저런 규칙들을 사전에 집어 넣으면, 컴퓨터가 자동으로 데이터의 무결성을 확인하므로 이런 실수를 미연에 방지할 수 있습니다.

[3. 독립성]

우리가 쓰는 컴퓨터 시스템은 멀티태스킹을 지원합니다.


[A 잔고: 100, B 잔고: 200]

다시 은행 거래를 예로 들면, (1) A가 B에게 50을 주는 동시에 (2) C도 B에게 100만큼 계좌 이체를 하는 경우를 생각해 볼 수 있습니다.

이때, 1번 거래을 처리하는 컴퓨터는 B의 최종 잔고가 200 + 50 = 250이라고 계산한 후 그것을 적용하려고 할 것입니다. 한편, 2번 거래를 담당하는 컴퓨터도 B의 잔고를 계산하게 되는데, 이미 잔고가 250으로 늘었다는 것을 알지 못하기 때문에 200 + 100 = 300이라고 생각하게 됩니다. 따라서 원래대로라면 350이었어야 할 잔고가 300밖에 안 되는 상황이 발생하게 되죠.

이를 방지하려면, 1번 거래를 수행하는 동안에는 2번 거래가 기다리도록 순서를 정해 줄 필요가 있습니다. 이런 것을 '독립성'이라고 합니다.

[4. 내구성]

내구성은 무척 간단합니다. 데이터베이스가 일단 '저장 완료'라는 사인을 보냈으면, 그 데이터는 정말로 영구히 보존되어야 한다는 것입니다. 당연한 것 아니냐고 말씀하실 수 있지만, 전원이 갑작스럽게 나간다든지 운영 체제가 뻗는다든지 하는 상황에서도 내구성을 유지하기란 생각보다 쉽지 않습니다.


이러한 4가지 원칙에 대해 알아보았습니다만, 사실 이런 원칙들이 절대적인 것은 아닙니다.

왜냐하면 ACID를 달성하려면 비용이 들기 때문이죠. 특히 성능상 제약이 걸릴 수가 있습니다. 물론 돈이 충분하다면 컴퓨터를 더 좋은 놈으로 업그레이드해서 극복할 수 있겠지만, 만사가 생각대로 되지는 않는 법이죠.

예를 들어, '나는 아이디 중복 확인 기능을 구현하는 것을 절대 까먹지 않는다'고 확신할 수 있다면 굳이 데이터베이스가 일관성을 확인하게 시킬 필요가 없습니다. 일관성 확인도 시간이 소요되는 작업이니까요.

또는, 내 서버에는 UPS가 빵빵한 놈으로 달려 있어서 결코 갑작스러운 정전이 일어나지 않는다고 생각한다면 내구성을 좀 포기하고 성능을 얻을 수도 있습니다.

특히, 요즘처럼 클라우드 컴퓨팅 시대에는 컴퓨터 여러 대를 연결해서 하나의 시스템으로 구축하는 일이 많은데, 이러면 ACID를 지원하기가 좀 버겁게 됩니다. 각 컴퓨터들이 협력해서 움직여야 하기 때문이죠. 이런 걸 분산 시스템이라고 하는데, 이러한 시스템에서 ACID를 어떻게 달성할 것인지 (또는, ACID의 일부를 포기하고도 어떻게 좋은 시스템을 만들 것인지) 연구하는 것도 개발자의 중요한 역할입니다.


지난 글에서 제로보드를 까면서, 불현듯 이 주제가 생각나서 써 보았습니다. 제로보드가 바로 ACID를 제대로 준수하지 못하는 대표적인 소프트웨어거든요.

'계층 댓글 깨짐' 같은 현상이 그래서 일어나는 것이죠. ACID가 보장된다면, 상위 댓글이 없는 댓글은 일관성에서 어긋나기 때문에 데이터베이스가 거부하게 될 것입니다. 하지만 제로보드가 사용하는 MySQL은 이러한 기능이 꺼져 있기 때문에 일관성을 보장하기가 쉽지 않습니다.

또한 재밌게도, PGR21에는 많지는 않지만 4명 정도 아이디가 같은 사용자들이 존재합니다. (!!) 이런 문제도 사전에 방지할 수 있었겠지요.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
14/10/27 21:13
수정 아이콘
뭔가 정보처리기사 시험에서 본거 같은 느낌이 으음...
14/10/27 21:17
수정 아이콘
재밌게 잘 읽었습니다.
이런글 참 좋아요 더 써주세요
즐겁게삽시다
14/10/27 21:19
수정 아이콘
크크 요즘 마침 오라클db배우고 있었는데 재밌게 잘 읽었습니다.
송지민
14/10/27 21:22
수정 아이콘
오랜만에 DB복습 할 수 있게 해주셔서 감사합니다!
스타슈터
14/10/27 22:23
수정 아이콘
DB는 잘 모르지만 이걸 보니 하드디스크 파일 시스템의 journal 컨셉이 문득 떠오르네요. 컴퓨터가 참 재밌는게 우리가 별로 신경쓰지 못한 부분들에 이런 소소하면서도 중요한 매커니즘이 많이 숨어있는것 같아요. 흐흐흐
랜덤여신
14/10/27 22:35
수정 아이콘
네, 파일시스템에서 원자성을 구현한 게 바로 저널링이죠. 파일을 디스크에서 삭제할 때도 여러 단계를 수행해야 하는데, 이게 all or nothing으로 일어나게 하는 게 저널링이니까요.
python3.x
14/10/27 22:28
수정 아이콘
음 데이터만 모여있다고 데이터베이스가 아니라.... 이 말씀이군요.
실험데이터만 잔뜩 쌓인 엑셀은 데이터베이스라고 불리긴 힘들겠죠?
아 닉네임은 신경쓰지마세요 크크크크
양념게장
14/10/27 22:39
수정 아이콘
acid 관점에서 페이스북 스케일을 위한 nosql 서버의 등장도 재밌는거 같아요.
14/10/27 22:51
수정 아이콘
너무나도 간단 명료한 원칙이지만
지키기 어렵죠

데이터 양이 많아질때 정합성을 맞추기 위함인데
정말 중요한게 아니면 포기하는 부분이기도 하죠
광개토태왕
14/10/28 00:03
수정 아이콘
순간 정보처리기사 시험공부 하는줄..... 흐흐
데이터베이스의 성질 중 틀린걸 물어보는거 나오는데 대표적인 오답은 종속성 크크
SugarRay
14/10/28 00:21
수정 아이콘
으으 데이터베이스 으으
바우어마이스터
14/10/28 00:39
수정 아이콘
평소 관심은 있었으나 따로 공부하지 않고서는 접할 일 없는 정보를 얻게 되어 참 좋네요앞으로도 이쪽 분야의 글을 많이 볼 수 있으면 좋겠습니다.
동네형
14/10/28 01:10
수정 아이콘
안녕하세요 skt 고객정보 만지는 개발자입니다.
YORDLE ONE
14/10/28 09:47
수정 아이콘
오랜만에 다시 생각하게 되서 좋네요
주여름
14/10/29 16:38
수정 아이콘
이게 어떻게 재밌을 수가 있죠?
크크..데이터베이스의 입문이죠..
가장 먼저 배우는 개념
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
54600 [일반] 내가 영원히 기억할 신해철 노래 Best 20 [29] 리콜한방18029 14/10/30 18029 9
54542 [일반] 예시로 알아 보는 데이터베이스의 4대 원칙 [15] 랜덤여신6940 14/10/27 6940 5
54524 [일반] 주식투자에 대한 몇가지 이야기. [68] Love&Hate12917 14/10/26 12917 14
54447 [일반] 주식투자로 등록금 만들기. [81] 스테비아10530 14/10/22 10530 3
54385 [일반] [일드] 한자와 나오키 2는 언제쯤 볼수 있을까? [28] 비타에듀10650 14/10/19 10650 1
54216 [일반] 요즘 핫한 직구에 대해 아주 간단히 정리해 봤습니다. [63] ArcanumToss10000 14/10/09 10000 1
54128 [일반] 휴면예금 자동으로 기부? [5] 호접몽7212 14/10/04 7212 1
54102 [일반] 기업, 경남은행 이용하시는 분들 미리 현금 대비를 해 두세요. [9] 니시키노 마키6207 14/10/02 6207 0
53991 [일반] 온라인 결제를 위한 고행의 길 [72] 사과씨6667 14/09/26 6667 4
53903 [일반] 낼모레 사십인 아저씨 일주일 동안 집에서 컴퓨터 못 쓴 이야기 [10] The xian7377 14/09/21 7377 0
53847 [일반] 저성장, 적은 고용, 그리고 왜? [22] nickyo5843 14/09/18 5843 10
53813 [일반] 보이스피싱 간신히 막았습니다.... 아이고;;; [49] 압도수7801 14/09/16 7801 3
53802 [일반] [본문내용(2)추가] 밥 안 하는 전업주부, 어찌 해야 합니까~~ [115] 산타15970 14/09/15 15970 1
53594 [일반] 울랄라세션/퓨어킴/라붐의 MV와 네스티네스티/신지훈/틴탑의 티저가 공개되었습니다. [6] 효연광팬세우실3672 14/09/02 3672 0
53577 [일반] 미드 <멘탈리스트> 리뷰 : 과장의 내적 리얼리티 [38] 헥스밤9656 14/09/01 9656 5
53439 [일반] 奇談 - 아홉번째 기이한 이야기 (4) [9] 글곰2765 14/08/26 2765 5
53061 [일반] [영화리뷰?] 앤디 듀프레인은 무죄인가? (쇼생크 탈출 스포그자체) [55] 김연아10136 14/08/05 10136 3
52904 [일반] 보이스피싱 당할 뻔 했내요 [33] 자판커피6222 14/07/25 6222 0
52794 [일반] 국대감독으로 김호곤 or 김학범 전감독 추천합니다. [28] 막강테란4629 14/07/18 4629 1
52179 [일반] 미국 뉴욕 빈민가에서 가난한 흑인으로 산다는 것... [16] Neandertal10775 14/06/10 10775 17
52075 [일반] 불평등의 증가가 2007-09년 경기 불황이 길었던 원인인가? [24] 낭만토토로5499 14/06/03 5499 4
52056 [일반] 75kg 감량기 -4- [166] 리듬파워근성19472 14/06/02 19472 122
52021 [일반] 신간 경제학책 몇 권 감상 [22] endogeneity6400 14/05/31 6400 1
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로