DB 다뤄본 사람으로써 정리하는 기본 개념

안희수·2021년 6월 15일
1

TIL

목록 보기
16/26

그렇게 꿈꿔왔던 누군가에게 가르침을 받는 DB의 개념

실무를 해오면서 가졌던 아쉬움이라던가 바랬던 점이 있는데
DB를 그렇게 숱하게 다뤄왔음에도 이론적인 부분을 기초부터 차근 차근 배울 수 있는 기회가 없었던 것 같다.


실무를 통해 깨져가면서 느낀 것들은 쉽게 잊어 먹지 않고
소위 몸이 기억하고 있다라고 말할 수 있지만
몸이 기억하는 개념과 정말로 체계와 이론적인 측면을 봐가면서
생각하고 DB를 다뤄왔었냐 라고 자문한다면 그렇지 않은 것 같다.


그런 의미에서 볼 때 부트캠프에서 가르쳐 준 데이터베이스 세션은
다른 사람들에게 보다 본인에게 더 의미있게 다가왔다.


내가 원하던 정말 기초부터 가르쳐 주는 그런 곳이 여지껏 없었다.
혼자서 공부해야 했고 혼자서 알아야 했고 그것이 맞는 것인지 확인할 기회가 없었다.


이번 세션을 통해서 느낀 것은 겸손함과 유연한 사고
그리고 정말로 누군가를 통해 하나부터 열까지 천천히 배워나간다는 것에 대한 소중함 ...


그래서 나는 이번 기회의 이전의 모든 것을 내려놓고
초심자의 입장으로 돌아가서 겸허하게 공부를 하고자 한다.


DB를 다루거나 프로그래밍을 할 때는 겸손해야 된다 라고 사수에게 들었는데
그 부분은 사실 지금도 잘 지켜지고 있다고 하기에는 아직 많이 부족하지만
그래도 겸손하게 배워 나가겠다.

데이터베이스란 ?

  • 데이터베이스란 일반적으로 컴퓨터 시스템에 저장된 정보 또는 데이터의 집합을 의미한다.
  • 데이터베이스는 보통 데이터베이스 관리 시스템(DBMS)로 제어한다.
    데이터와 DBMS는 연관된 어플리케이션들과 함께 '데이터베이스 시스템'으로 일컬어지며,
    더 짧게는 '데이터베이스'라고 통칭되기도 한다. (Oracle).
  • Application에서는 데이터가 메모리 상에서 존재한다.
    메모리에 존재하는 데이터는 보존이 되지 않기 때문에 애플리케이션이 종료하면 메모리에 있던 데이터들은 다시 읽어 들일 수 없다.
    따라서, 데이터를 오랜 기간 저장 및 보존 하기 위해서 데이터 베이스를 사용하는 것이다.
  • 일반적으로 database에는 크게 관계형 데이터베이스(RDBMS)와 "NoSQL"로 명칭되는 비관계형(Non-relational) database가 있다.

기술 벨로그를 굳이 존칭으로 작성하지 않는 이유는 건방져서가 아니라 평어를 사용하는 것이 보다 객관적으로 글을 작성할 수 있을 것 같아서이다.

데이터베이스 에 대해서 어떻게 생각하느냐 라고 묻는다면 대용량의 데이터를 효울적으로 관리할 수 있는 시스템을 통칭하는 것이라고 볼 수 있겠다.
그렇다면 DB의 존재가치는 대용량의 데이터를 효율적으로 관리하는 것 만인가 라고 묻는다면
그것은 DB의 한쪽 부분만을 확인한 것이 아닌가 하는 생각이 든다.

보는 관점에 따라 DB의 존재 의의는 여러가지이다. 여러가지 요소가 다 중요하지만 그 중의 딱 하나 중요한 것을 꼽아보라 한다면,
나는 그중에서 데이터 무결성을 꼽고 싶다.

내가 생각하는 DB의 핵심적인 요소 Transcation

DB에서 업무를 처리하는 단위는 트랜잭션(Transcation)이다. 이것은 데이터베이스 업무의 최소 단위이자
트랜잭션 안에서 모든 것이 행해지고 몇가지 중요한 원칙들이 있으며 이는 데이터베이스라는 것이 근간이자 핵심 요소라고 생각한다.

트랜잭션의 특징은 DB를 많이 다뤄본 사람이라면 익히 들어봤을 ACID가 있는데
ACID는 각 특징적 요소의 약어로

Atomicity(원자성) - 트랜잭션은 업무의 최소 단위로 전부 처리되거나 아예 하나도 처리되지 않아야 함
Consistency(일관성) - 하나의 트랜잭션을 성공적으로 완료해도 여전히 일관된 상태여야 함
Isolation(격리성) - 실행중인 트랜잭션의 중간 결과를 다른 트랜잭션이 접근할 수 없음
Durability(영속성) - 트랜잭션이 일단 성공하면 그 결과는 데이터베이스에 영속적으로 저장

이러한 특징을 가지고 있다.

ACID가 추구하는 바가 본인이 생각하기에는 바로 데이터의 무결성을 가능하게 해주는 것이 아닐까 라고 생각한다.

흔히 워드 나 한글 문서 작업을 사내 파일 서버에서 진행하거나 온라인 스프레드 시트에서 작업을 하다 보면
다른 사람들과 같은 문서 영역에서 작업을 함으로써 내가 작업한 자료들이 다른 사람이 작업한 내용으로 덮어쎠지는 현상을 종종 겪곤 했을 것이다.
물론 컴퓨터라는 것이 그렇게 문제 덩어리는 아니므로 다른 사람이 문서를 열고 있을 경우 먼저 작업한 사람이 닫기 전에는
변경 내용을 반영시키지는 않지만 나중에 작업한 내용이 적용되지 않고 날아가서 다시 작업해야 하는 불편도 종종 겪어 본 사람들이 많을 것이다.
작업 중인 공간에 타인의 개입이 들어간다는 것 자체가 무결성이 보장되지 않는다는 것이고
데이터의 영역에서는 그러한 부분은 매우 심각한 사항이 아닐 수 없다.

데이터베이스는 그러한 관점에서 볼 때 매우 안정적이고 신뢰성을 주기에 더할 나위 없는데 앞서 설명한 ACID 적인 개념으로 설명해보고자 한다.

원자성으로 볼 때 데이터베이스
트랜잭션은 전부다 성공하거나 전부다 실패하거나 둘중 하나이다. 이것이 무엇을 의미하는가 하면
트랜잭션 도중 문제가 생긴 순간 이전에 반영된 내역들을 전부다 롤백 시켜 순수한 상태로 돌려 놓는다는 것인데
이는 실무에서 매우 중요한 요소이다.
데이터가 연쇄 반영을 진행하는데 1단계부터 10단계라고 첬을 때 3단계까지 성공하고 4단계에서 실패
그 이후로 반영이 안된 상태로 진행이 된다. 이것은 사고를 넘어서서 재앙에 가깝다.


차라리 데이터를 전부다 최초 상태로 밀어버리고 다시 진행하는 것이 더 나을 정도인데
왜냐하면 중간에 반영되지 않은 경우 어디서부터 어디까지 반영이 안되었는지 육안으로는 파악할 수 없을 뿐더러
데이터의 신뢰성이 이미 깨져버려 1부터 3단계 뿐만이 아니라 1부터 10단계 데이터 모두 못 쓰는 데이터가 되어버렸기 때문이다.
때문에 도중에 실패한 경우면 전부 실패한 것으로 보고 롤백하는 것 이것이 데이터베이스의 핵심 요소중 하나 원자성 요소이다.


격리성으로 볼 때 데이터베이스
일관성 같은 경우는 데이터베이스가 가지고 있는 요소들 중 가장 기본적인 부분이어서 설명할 여지가 적으므로
격리성을 설명하면 원자성과 더불어 트랜잭션이 가지고 있는 양대 요소로 본인은 생각한다.
데이터베이스 시스템이 파일 시스템과 다른 가장 큰 차이점이 바로 격리성인데
데이터베이스의 데이터 무결성을 보장하는 가장 중요한 요소이다.


격리성이 가지는 의미는 트랜잭션이 수행중일 때 트랜잭션이 점유하고 있는 데이터를 다른 트랜잭션이 간섭할 수 없다는 것이다.
만약 내가 대용량의 데이터를 일관적으로 수정중인데 그 수정 중인 데이터를 다른 트랜잭션이 침투해서 중간에 바꿔버린다면
내가 작업한 데이터는 무결성을 잃고 원래 의도한 처리가 정상적으로 수행되었는지 보장할 수가 없다.
만약 그럴 일은 존재하지 않겠지만 피치못한 상황에 의해서 간혹 발생할 여지는 있는데
이를 전문적인 용어로 Dirty Data 혹은 오염된 데이터라고 표현하며 오염된 데이터는 단순히 데이터가 잘못 입련된 문제가 아닌
프로그램 더 나아가 시스템을 망가트릴 수도 있는 요소 중 하나이다.


트랜잭션이 처리중일 경우 다른 트랜잭션의 간섭을 막고 있기 때문에 생기는 (Dead Lock) 병목현상이라는 것이 있는데
이는 다른 기고문에서 추가로 작성하려고 하며 데이터의 무결성을 지켜주지만 역으로 시스템 다운을 일으킬 수도 있기 때문에
트랜잭션 처리를 할때 가급적 효율적인 측면을 고려해 가면서 테이블 설계를 진행해야 한다는 점을 이야기 하려고 한다.

영속성으로 볼 때 데이터베이스 역시 일관성과 마찬가지로
트랜잭션이 반영되고 난 후에 대한 데이터베이스의 특징에 가까우므로 추가적인 설명은 생략하고자 한다.

관계형 데이터베이스란 ?

요즈음 핫한 것은 비관계형 데이터베이스이지만
프로그램을 하는 사람들은 기본적으로 관계형 데이터베이스를 알고 비관계형 데이터 베이스를 아는 것이 훨씬 더 효율적이다.
물론 아직 비관계형 데이터베이스에 대해서 공부하지는 않았으므로 우선 알고 있는 관계형 데이터베이스에 대해서만이라도
찬찬히 짚고 넘어가고자 한다.

관계형 데이터베이스를 설명해보라고 한다면 본인은 이렇게 설명하겠다.
하지만 그 전에 사전적 정의를 먼저 명시하고 이에 대해 설며아혹자 한다.

관계형 데이터베이스란 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템을 말한다.

그리고 내가 생각하는 관계형 데이터베이스란 실제 사물이나 인물들을 객체라는 이름으로 추상화 시키고
그 사이에 관계를 정의하여 컴퓨터세상에 데이터로 구현한 것이고
그 사이 연관성을 가지고 객체와 객체를 연결짓는것 그것이 관계형 데이터베이스의 개념이라고 볼 수 있겠다.

거창해 보이지만 사실 같은 말이고 사전적 의미는 더 객관적으로 축약한 것이라 할 수 있갰다.

관계라는 것이 꼭 인간과 인간간의 관계라던지 집단과 개인의 관계 같이 구체적인 것만이 관계라고 보지는 않느다.
컴퓨터 세계에서는 객체가 가지고 있는 속성을 같은 특징을 가진 하나의 객체로 재 구성하여 객체에게 부여할 수도 있고
그 과정에서 분리된 객체는 원본 객체와 관계를 가지게 된다. 이러한 것도 관계형 데이터베이스를 구성하는 정보라고 볼 수 있다.

그 외에도 적어야 될 내용은 많지만 다른 기고문에서 추가로 다룰 일이 있을 것이다.
데이터베이스는 복합적으로 모든 개념이 연계되어 있으므로 업무를 다루다 보면 여기서 다뤄진 내용이
다른 방면에서 또 다시 다뤄지기도 하고 기고문 하나에 다 담을 수 없을 정도로 방대한 기술 스택을 가지고 있다.

왜 테이블들을 연결하는가?

원래 세션에는 어떻게 테이블들을 연결하는가 라는 내용도 있지만
본인이 생각하기에는 어떻게 보다는 왜가 더 중요한 것 같아서 왜 테이블들을 연결하는 가를 정리하려고 한다.

앞서 설명했지만 데이터베이스라는 것은 방대한 양의 데이터의 집합이다.
테이터베이스를 구성하고 있는 최소의 객체 단위 (물론 셀 안에 있는 값이 가장 최소의 단위이긴 하지만)로는
테이블들을 들 수 있을 것이다.

무언가를 데이터로 가공해서 모든 정보를 입력바든다고 하면 동일한 정보들이 불필요하게 중복되서 저장될 수 밖에 없을 것이다.
이는 2차원 구조로 데이터를 정리하는 테이블이라는 녀석의 숙명이라 어찌할 도리가 없다.
그래서 데이터를 다루는 사람이라면 같은 데이터를 최대한 한 곳으로 모아서 불필요한 데이터의 중복을 막기 위한 고민을 해야 하는데
하나의 응집된 데이터 덩어리들로 묶어서 관리하는 것이 바로 테이블을 분리하는 개념이라고 볼 수 있다.

테이블을 연결하는 이유는 한마디로 설명하자면 조각난 데이터들을 하나로 연결해야 하나의 완전한 대상이 만들어지기 때문이다.
또한 데이터를 응집시킴으로써 얻을 수 있는 이점으로는 IO(입출력)을 최소화하여 보다 적은 메모리로 데이터를 끌어 올리는 것이 가능하기 때문인데 이러한 과정을 통틀어서 정규화라고 지칭한다.

흔히 데이터베이스의 조인이라고 하는 개념을 집합의 개념에 빗대어서 설명하는데 이는 차후 조인이라는 영역 하나만 가지고도
기고문 하나를 작성할 수 있으므로 다른 기고문에서 다루고자 한다. (one to one, one to many, many to many) 역시 그 때 설명하고자 한다.

쓰다 보니 길어져서 정리하는 글

데이터베이스를 설명하려고 하면 한도 끝도 없고 배울 내용도 하루 이틀에 끝날 내용이 아니다.
데이터베이스는 너무나 방대하고 데이터베이스가 없으면 프로그래밍이 아무런 소용이 없다.
데이터베이스가 프로그래머의 기본소양이라고 하는데 그 기본 소양이라고 하는 것이 사실 프로그램의 공부 영역을 아득히 앞서 나간다는 것이 함정이기는 하지만 사실 본인이 필요했던 것은 기본과 초심이었다.
그러한 측며에서 부트캠프를 다니고 있다는 것이 마냥 비효율적이라던가 불합리하다고 전혀 생각하지 않는다.
오히려 절호의 기회이고 모르는 것을 알고 되짚어 갈 수 있는 기회가 될 수 있다라고 보고 있다.
데이터베이스 분야 관련 뿐만 아니라 다른 리눅스라던가 파이써이라던가 다른 여러가지 기초부터 차근차근 밟아 나가다보면
지난 5년간 바쁘게 걷기만 하다 잃어버렸던 나의 길을 다시 되찾을 수 있을 곳이라 생각하고 있다.

profile
9년차 소프트웨어 개발자 (2024년 재 개편 예정입니다)

1개의 댓글

comment-user-thumbnail
2023년 12월 7일

유익한 내용 감사합니다...!

답글 달기