본문 바로가기
데이터베이스

데이터베이스 기초

by 매트(Mat) 2020. 7. 29.

매일의 사건이나 행동을 데이터화해 이를 건강관리나 마케팅으로 이용하려는 '라이프 로그' 가 생기고, 거의 모든 것이 데이터베이스로 모입니다. 유튜브 같은 동영상 서비스는 그 자신이 하나의 거대한 데이터베이스 입니다.
'모든 것이 데이터화되는 시대', 즉 모든 장소에 데이터베이스가 존재하고 모든 것이 데이터베이스로 관리되는 시대를 의미합니다.

데이터베이스란

데이터베이스의 역사를 되돌아보면 데이터베이스의 탄생은 주소록을 관리하고 싶다는 욕구에서 시작되었다고 할 수 있습니다.

데이터베이스 기본 기능 : 데이터 검색과 갱신

데이터베이스의 용도로써 가장 중요한 기능은 검색입니다. 다시 말해 '원하는 데이터를 찾는다'는 것입니다. 구글을 한 예로 들면 대표적인 검색 엔진이죠. 키워드 검색만 해주면 관련된 글, 정보들이 쭉 나옵니다. 해당 데이터베이스에서 관련된 데이터를 검색하는 것입니다.
또한 데이터베이스는 새로운 데이터를 등록(추가)하고 기존 데이터를 수정하며 불필요해진 데이터를 제거까지 가능합니다.

데이터베이스 기본 기능 : 동시성 제어

데이터베이스의 중요한 두 번째 기본 기능은 동시성 제어입니다.
데이터베이스를 개인이 관리한다면 혼자서 검색하거나 갱신하면 되지만, 비즈니스나 공공목적으로 이용되는 데이터베이스를 불특정다수의 사용자가 동시에 접근한다면 문제가 발생할 것입니다.
따라서 이러한 상항에 대비한 제어가 필요한 것입니다.

데이터베이스 기본 기능 : 장애 대처와 보안

데이터베이스에는 정말로 중요한 데이터들이 모인 하나의 공간입니다. 이를 위해서는 관리를 해주어야하는데 만약 이 중요한 데이터가 날아갔다면 아주 끔찍할 것입니다. 빵집에 비유하자면 빵집에 빵들이 모두 도둑에게 도둑맞은거나 다름없는 것입니다. 빵집에 빵이 없으면 수익이 없으므로 곧 망하게 되겠죠. 이를 예방하기 위해 데이터베이스의 설계와 구축에서 제대로 된 대책을 취하는 것이 중요합니다. 두 가지 방법을 생각할 수 있습니다.

  • 데이터 다중화 : 데이터를 한 곳이 아니라 여러 장소에 분산에서 유지하는 것으로, 데이터가 완전하게 소실되는 것을 막습니다.
  • 백업 : 보통 중요한 자료가 있다면 USB 같은 데에 백업을 합니다.

데이터베이스는 중요한 데이터를 보관하는 공간이라고 했습니다. 따라서 누구나 이 데이터베이스에 접근할 수 있다면 보안에 취약하겠죠. 또한 회사의 기밀정보가 포함될 수 있기 때문에 보안에 예민해질 수 밖에 없습니다.

관계형 데이터베이스

데이터베이스의 기능을 제공하는 소프트웨어를 DBMS(Data Base Management System, 데이터베이스 관리 시스템)라고 합니다. 즉 이 DBMS를 가지고 우리는 데이터를 넣고 뺏다 할 수 있는 것이죠. 대표적으로 오라클, MySQL, PostgreSQL 이 있습니다. DBMS는 소프트웨어이기에 사용자가 사용 방법만 안다면 쉽게 조작할 수가 있습니다.
데이터베이스가 등장하기전까지는 콤마(,)로 데이터를 관리하는 CSV 파일을 사용하였습니다.

이름 나이 성격
채민수 26 소심

위의 표와 같이 '채민수'에 대한 데이터를 2차원 표를 사용해 관리하는 데이터베이스가 관계형 데이터베이스 입니다.
2차원 표는 우리가 부르기 쉽게 테이블(Table) 이라고 합니다.

테이블을 한마디로 정리하면 '고유한 기본키를 가진 공통점에 의해 정리된 것들의 집합' 입니다.

관계형 데이터베이스의 이점은 사람들이 자연스럽고 직관적으로 이해하고 쉬운 형식으로 데이터를 관리할 수 있다는 점입니다.

사용 방법만 안다면 쉽게 조작할 수 있다고 했는데, 데이터를 조작하기 위한 언어가 SQL(Structured Query Language)입니다.

소프트웨어와 데이터베이스

시스템은 단순히 데이터베이스만으로 구현할 수 없습니다. 당연히 여러 가지 소프트웨어와 조합해서 만들어야 하는데, 이 작업을 SI(System Integration)라고 부릅니다. 소프트웨어는 크게 3가지로 구분할 수 있습니다.

1. 운영체제(Operation System)
2. 미드웨어(Middleware)
3. 애플리케이션(Application)

1. 운영체제
운영체제는 시스템을 동작하게 하기 위한 일종의 토대가 되는 기능을 제공하는 소프트웨어입니다. 규모가 아주 크며, 매우 중요하죠.

2. 미드웨어
중간 소프트웨어로, 데이터베이스는 여기에 속하는 소프트웨어입니다. 즉, 데이터베이스는 OS에 설치하여 움직이는 걸 의미합니다. ("이것을 OS에서 동작한다." 라고 합니다.)
조합의 자유도가 높은 것은 OS나 DBMS가 기능에 대한 표준 규칙을 따르고 있는 어느정도의 이식성이 있기 때문입니다. 그래서 하나의 조합에서 다른 조합으로 변경하는 일도 드물지 않은데, 이것을 마이그레이션(Migration)이라고 합니다.

3. 애플리케이션
애플리케이션이란 업무용 기능을 가진 프로그램된 소프트웨어로, 사용자가 가장 빈번하게 조작하는 소프트웨어입니다. 다양한 업무가 있는데, 이 수많은 업무는 시스템화되어 있고 업무 흐름은 프로그램으로 자동화하여 효율성을 높이고 비용을 줄일 수 있는 것이죠. 대표적으로 회계, 재무, 세금처리, 제고관리 등이 있습니다.

사용자가 데이터베이스를 직접 조작하는 것이 아닌 어디까지나 애플리케이션을 매개로 해서 데이터베이스에 접근한다는 형태를 취하고 있습니다.
그러므로 사용자 입장에서는 데이터베이스에 접속하고 있다는 것조차 의식하지 않은 경우가 대부분입니다. 이는 보안을 높이기 위해서이고 업무 로직을 애플리케이션에 집중시켜 개발이나 수정에 걸리는 비용을 낮출 수 있는 이점이 있기 때문입니다.

데이터베이스와 아키텍처

고속의 견고한 시스템을 구축하기 위해서는 아키텍처가 명확한 의도로 설계되어야 합니다.
아키텍처란 구체적으로 "어떤 기능을 가진 서버를 준비하고 어떠한 저장소나 네트워크 기기와 조합해서 시스템 전체를 만들 것인가" 즉 하드웨어와 미들웨어의 구성을 가리킵니다.
이 구성을 시스템이 완수해야 할 목적과 비교하면서 결정해 가는 것, 이것이 아키텍처 설계 입니다. 흔히 시스템의 '뼈대'를 생각하는 상위 설계란 함축적 의의가 아키텍처 설계에 있습니다.

아키텍처의 역사는 구첵적으로 다음 3단계로 나누어서 파악할 수 있습니다

  • Stand-alone(~1980년대)
  • 클라이언트/서버(1990년대~2000년ㄷ)
  • Web 3 계층(2000년~현재)

Stand-alone 특징

Stand-alone은 문자 그대로 데이터베이스가 동작하는 머신(데이터베이스가 동작하는 머신을 'DB 서버' 라고 부릅니다)이 LAN이나 인터넷 등의 네트워크에 접속하지 않고 독립되어 동작하는 구성입니다. 이 구성에서는 데이터베이스의 미들웨어와 애플리케이션의 소프트웨어는 같은 DB 서버에서 동작합니다. 따라서 DB를 사용하고 싶은 사용자는 DB 서버가 설치된 장소까지 직접 가서 사용을 해야하는 불편함과 서버가 네트워크에 접속되어 있지 않아서 물리적으로 떨어진 장소에서 액세스하는 것도 불가능합니다. 동시에 작업할 수도 없습니다..
단, 구축이 매우 간단해서 소규모 작업이나 테스트를 빨리할 수 있다는 장점이 있습니다.

클라이언트/서버

앞에서 스탠드 얼론의 단점은 물리적 장소에 직접 가야하는 불편함과 동시에 작업할 수 없는 단점을 극복하려면 데이터베이스를 네트워크에 연결하면 됩니다. 그러면 멀리 떨어져서 또 동시에 작업을 할 수 있게 되는 것이죠. 이처럼 DB 서버 1대에 복수 사용자의 단말이 접속하는 구성을 클라이언트/서버 구성이라고 합니다.

Web 3계층의 특징

단, 위의 클라이언트/서버에도 단점이 있었는데 인터넷에서 직접 DB에 접속하는 것에 대한 보안 위험과 불특정 다수의 사용자가 사용하는 클라이언트에서의 애플리케이션 관리 비용이 많이 드는 점입니다. 따라서 비즈니스 로직을 실행하는 애플리케이션을 서버에서 관리해 비용을 절감하자는 요구에서 제시된 것이 Web 3계층입니다.

Web 3계층에는 웹 서버 계층애플리케이션 계층이 추가되었습니다.

웹 서버 계층

웹 서버는 클라이언트로부터 접속 요청(HTTP 요청)을 직접 받아서 그 처리를 뒷단의 애플리케이션 계층(서버)에 넘기고 그 결과를 클라이언트에 반환합니다. 자주 이용되는 웹 서버로는 아파치IIS(Internet Information Services)가 유명합니다.

애플리케이션 계층

비즈니스 로직을 구현한 애플리케이션이 동작하는 층입니다. 웹 서버로부터 연계된 요청을 처리하고, 필요하면 데이터베이스 계층(서버)에 접속해서 데이터를 추출하고 이를 가공한 결과를 웹 서버로 반환합니다. 대표적으로 톰캣이 있죠.


이처럼 사용자로부터 직접적인 접속 요청을 받는 역할을 웹 서버 계층에 한정하여 애플리케이션 계층과 데이터베이스 계층의 보안을 높일 수 있습니다. 동시에 애플리케이션 계층에 비즈니스 로직을 집중해서 애플리케이션 관리 비용을 낮추는 구성이 될 수 있습니다.

트랜잭션

갱신은 단일 쿼리만으로 구성된 것이 아니고 복수 쿼리를 연속적으로 수행하는 경우가 대부분입니다. 또한, 갱신 전의 데이터로 SELECT를 사용할 이를 포함해 복수 쿼리를 일관된 형태의 한덩어리로 다뤄야 합니다. 트랜잭션이란 이런 복수 쿼리를 한 단위로 묶은 것입니다.

트랜잭션은 다음 4가지 특성으로 정의되며 그 앞글자를 따서 'ACID 특성' 이라고 합니다.

  • Atomicity (원자성)
  • Consistency (일관성)
  • Isolation (고립성 또는 격리성)
  • Durability (지속성)

원자성

원자성이란 데이터의 변경(CRUD)을 수반하는 일련의 데이터 조작이 전부 성공할지 아니면 실패할지를 보증하는 구조입니다. 만약 전부 성공한다면 COMMIT을 실행해 처리를 하거나 단 하나라도 오류가 발생한다면 ROLLBACK을 실행해 오류 나기 직전 상태까지 되돌아갈 수 있습니다.

일관성

DB에는 DB Object에 대해 각종 정합성 제약을 추가할 수 있습니다. 이는 일련의 데이터 조작 전후에 그 상태를 유지하는 것을 보증하는, 즉 일관성을 유지하기 위한 구조입니다.
예를 들어 어떤 시스템에 사용자가 가입하여 고유 번호를 발급했는데 이 번호에 유니크 제약을 설정하면 중복된 사용자 번호를 저장할 수 없게 되는 것입니다.

고립성 또는 격리성

고립성이란 일련의 데이터 조작을 복수 사용자가 동시에 실행해도 '각각의 처리가 모순없이 실행되는 것을 보증한다' 는 것입니다.

지속성

지속성은 일련의 데이터 조작(트랜잭션 조작)을 완료(COMMIT)하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어 그 결과를 읽지 않는 것을 나타냅니다. 이것은 시스템이 정상일 때만이 아니라 DB나 OS의 이상 종료, 즉 시스템 장애도 견딜 수 있다는 뜻입니다.


SQL 문은 DBMS에 줄 수 있는 명령의 종류에 따라 다음 3가지로 구분됩니다.

  • 데이터 정의 언어(DDL, Data Definition Language) : 스키마 또는 테이블 등을 작성하거나 제거 -> CREATE, DROP, ALTER
  • 데이터 조작 언어(DML, Data Manipulation Language) : 테이블의 행을 검색하거나 변경 -> SELECT, INSERT, UPDATE, DELETE
  • 데이터 제어 언어(DCL, Data Control Language) : DB에서 실행한 변경을 확정하거나 취소 -> COMMIT, ROLLBACK

SQL 문은 대부분 DML 입니다~

기본키 할당은 관리의 기본

DB 사용 여부와 관계없이 데이터를 고유하게 식별할 수 있는 기본키를 할당하는 것은 데이터 관리의 기본입니다. 우리는 알게 모르게 이 ID를 무의식 중에 이용하고 있습니다. 예들 들어, 지금 내가 포스팅하고 있는 사이트 티스토리의 내 개인 계정 ID도 기본키를 할당한 것입니다.

당연하겠지만 이 기본키는 중복되면 안됩니다. 그리고 기본키의 값이 바뀌면 곤란한데 그 이유가

  • 변경 후 값의 유일성을 보증할 수 없고,
  • 과거 데이터와의 결합이 어렵다.

또한 기본키는 NULL 값이 존재해서는 안됩니다. 앞서 기본키는 고유한 값인데 NULL 이 되면 안되겠죠.

정규형

처음부분에 테이블은 '고유한 기본키를 가진 공통점에 의해 정리된 것들의 집합' 이라고 했습니다. 이제는 각 테이블이 구체적으로 어떤 열을 가져야 하는지를 생각해보죠.
관계형 데이터베이스 세계에서는 오래전부터 "테이블은 이렇게 정의해야 한다" 는 이론이 구축됐습니다. 그 기본이 되는 것이 정규형입니다.

정규형은 제3정규형까지 이해하면 충분합니다.

제1정규형부터 제5정규형까지 있으며, 실무에서는 제3정규형까지만 이해해도 좋습니다.
(제2,3 정규형이 중요합니다.)

제1정규형

제1정규형의 정의는 '테이블 셀에 복합적인 값을 포함하지 않는다.' 인데 관계형 데이터베이스에서는 이 정의에 반하는 테이블을 작성하는 것이 기술적으로 불가능하기 때문입니다. 따라서 관계형 데이터베이스의 테이블은 전부 제1정규형을 자동으로 만족하고 있습니다.

제2정규형

제2정규형을 충족할려면 '부분함수 종속성' 이라는 함수 종속이 존재하지 말아야 합니다. 부분함수 종속은 간단히 말하면 '기본키를 구성하는 열의 일부에만 함수 종속이 존재하는 것' 입니다.
이를 고려해주지 않으면 '갱신 이상' 을 일으킬 수 있습니다.

제3정규형

제3정규형을 충족하려면 한 개의 함수 종속, 즉 '추이함수 종속'이 존재하지 말아야 합니다.
이것은 기본키 이외의 키 간에 발생하는 함수 종속입니다.

제2,3 정규형을 이해하려면 부분함수 종속성추이함수 종속성을 이해할 필요가 있습니다.

ER 다이어그램

정규화를 수행하면 테이블이 나누어져 그 수가 증가합니다. 만약 복잡한 시스템이라면 테이블 수는 수백 개에 달하겠죠.
이렇게 되면 인간이 전체 테이블의 관계성을 파악하기가 어렵습니다.

이런 테이블 간의 관련성을 한눈에 알 수 있게 고안된 기술이 ER 다이어그램(Entity- Relationship Diagram) 입니다. Entity(엔터티, 실체)란 '테이블', Relationship(관계)란 '테이블 간의 관계' 를 의미합니다. 이를 표시하는데 그래픽으로 이해하기 쉽도록 해주는 기술이 ER 다이어그램입니다.

테이블 설계에서 가장 중요한 것은 테이블이 잡합이 것테이블이 함수인 것을 이해하는 것입니다.

지속성

앞서 지속성(Durability)은 일련의 데이터 동작(트랜잭션 동작)을 완료(COMMIT)하고 완료 통지를 사용자가 받은 시점에서는 그 동작이 영속화되어 결과를 잃어버리지 않는 것을 나타냅니다. 이는 시스템이 정상일 때뿐 아니라 DB 서버나 OS의 비정상적 종료 등의 시스템 장애에 견딜 수 있다는 걸 의미합니다.

DBMS에서 데이터를 보존하는 기억장치는 대부분 하드디스크입니다. 하드디스크에서 지속성을 실현하려면 쓰기를 전부 '동기화 쓰기'로 하면 좋겠지만, DB의 쓰기는 기억장치의 임의 장소에 무작위로 액세스해서 쓰기를 수행하기 때문에 성능면에서는 실용적이지 않습니다.
지속성과 성능이 양립하도록 DBMS에서는 다음 구조를 사용합니다

로그 선행 쓰기

로그 선행 쓰기(WAL, Write Ahead Log)의 기본 개념은 DB의 데이터 파일 변경을 직접 수행하지 않고, 우선 로그로 변경 내용을 기술한 로그 레코드를 써서 동기화하는 구조입니다. MySQL에서는 이 로그를 InnoDB 로그라고 부릅니다.

데이터베이스 버퍼

커밋 시에는 WAL에 변경 내용을 쓰기 때문에 데이터 파일의 변경 내용은 트랜잭션이 커밋되면서 동시에 동기화할 필요가 없습니다. 그렇다고 트랜잭션마다 버퍼를 취해 비동기적인 쓰기를 하면 로그와 데이터 파일 간 일관성 유지하기가 어렵습니다.

그래서 일반적인 DBMS에서는 데이터베이스 버퍼를 준비해 데이터 파일로의 입력을 데이터베이스 버퍼 경유로 일원화해서 단순화하고 있습니다. 이 때문에 효율적으로 데이터의 일관성을 유지할 수 있게 됩니다.

크래시 복구

WAL과 데이터베이스 버퍼, 데이터베이스 파일 3가지가 연계 플레이로 지속성을 담보하면서 현실적인 성능으로 DBMS가 동작하고 있습니다. 만약 크래시(ex. MySQL 서버의 비정상적 종료)가 발생한 경우 MySQL 서버를 재시작하면 갱신 정보를 사용해 데이터베이스 파일을 크래시 때까지 커밋된 최신 상태로 수정합니다. 이 동작을 롤 포워드(Roll-Forward)라고 합니다.
단 논리적인 파괴(DDL 문에 따른 테이블 파기 등)나 물리적인 파손(디스크 장치의 고장 등)에는 대응할 수 없기 때문에 미리 백업이 필수입니다.

인덱스

인덱스는 DB의 성능 향상 수단으로 가장 일반적인 방법입니다. 응답 시간이 늦은 SQL이 발견되면 우선 인덱스로 해결할 수 없는지를 검사하는 것이 튜닝의 제1선택입니다.
인덱스는 트리 형태를 하고 있는 것을 나타내며, 일반적으로는 B-tree로 표기합니다.
B-tree는 관계형 데이터베이스에서 튜닝의 기본이 되는 인덱스입니다.
B-tree는 반드시 데이터를 정렬된 상태로 유지합니다. -> 순서 유지

B-tree는 왜 빠른가

이유는 어떤 값에 대해서도 같은 시간에 결과를 얻을 수 있기 때문입니다. 만약 루트 노드로부터 비교 과정을 2회 반복하면 목적 리프에 도달한다고 했을 때 값의 대소를 비교해 어딘가의 분기에 들어가는 탐색 방법을 이진 탐색이라고 합니다. 이진 탐색은 정렬을 마친 데이터 구조를 탐색할 때 효율적인 방법입니다.
만약 정렬되어 있지 않은 경우에는 일일이 모두 탐색해야 하는데 이를 선형 탐색이라고 부릅니다.

B-tree는 균형 트리인데, 테이블에 대한 데이터 갱신(CRUD)이 반복되면서 균형이 깨지고, 이에 인덱스를 사용할 때의 성능도 악화됩니다. 어느 정도는 자동으로 균형을 회복하지만 갱신 빈도가 높을 경우에는 인덱스를 정기적으로 재구성(Rebuild)해서 트리의 균형을 되찾는 작업이 필요합니다.

균형 트리 : 루트로부터 리프까지의 거리가 일정한 트리 구조
트리의 균형을 되찾는 작업 중 예로 PC의 하드디스크에서 자주 행하는 '디스크 조각 모음'과 같은 유지관리 작업을 들 수 있습니다.

여기까지 데이터베이스 기초 포스팅을 마치겠습니다.
지금까지의 내용은 미크, 기무라 메이지 저자, 박주항님옮김, 데이터베이스 첫걸음 이라는 책을 바탕으로 요약하였습니다.
감사합니다.

댓글