Challenge, and Growth ! GitHub
                                                                                                             

Welcome to my blog 🙌🏻

Total

Today

Yesterday







Database

DBMS란? - 정의, 구조, 저장방식 * 본격적인 데이터베이스 공부 전 읽기 좋은 글 *

뽀시라운 2025. 6. 7. 13:09
반응형
본격적인 데이터베이스 공부 전 읽으면 좋은 글입니다.
DBMS의 전체적인 흐름을 쉽게 설명하고 있습니다.

 

 

1️⃣ DBMS 란

 

DBMS(Database Management System)를 알아보기 전에 데이터베이스를 간단히 짚어보고 넘어갈 것이다.

 

 

✅ 데이터베이스는 서로 연관이 있는 데이터들의 집합이라고 할 수 있다.

  • 특정 목적을 위해 구조화되어 저장된 데이터들의 모음이다.
  • 검색, 추가, 수정, 삭제와 같은 연산을 효율적으로 수행할 수 있도록 정리된 데이터 저장소다. (Ex. select, insert, update, delete)

 

 그렇다면 DBMS는 데이터베이스를 생성하고 관리할 수 있도록 편리한 기능을 제공하는 소프트웨어 패키지이다.

  • DBMS의 주요 목적은 데이터를 안정적으로 저장하고 사용자에게 제공하는 것이다.
  • 데이터베이스에 다수의 사용자들이 접근하여 사용할 수 있도록 지원한다.
  • 대표적인 DBMS에는 MySQL, Oracle, PostgreSQL 등이 있다.

 

2️⃣ DBMS 구조

모든 데이터베이스 구조가 다르기 때문에 DBMS 구조를 표준화하기는 어렵지만 공통적인 부분을 정리하면 다음과 같다.

 

DBMS는 Client-Server Model을 기반으로한다.

애플리케이션(클라이언트)에서 데이터를 요청하면 데이터베이스(서버)가 해당 데이터를 제공하는 구조이다.

 

[그림1] DBMS 구조

 

🔹 트랜스포트(Transport)

  • 클라이언트의 요청은 트랜스포트 서브시스템을 통해 전달된다. 요청은 쿼리(SQL) 형태이고 주로 특정 쿼리 언어로 표현한다.
  • 인증 및 권한을 부여하고 다음 계층인 쿼리 프로세서로 전달한다.
  • 트랜스포터 서브 시스템은 데이터베이스 클러스터 노드 사이의 통신에도 사용된다. (트랜스포트 ↔️ 스토리지 엔진)

 

🔹 쿼리 프로세서(Query Processor)

  • 수신된 쿼리를 해석하고 최적화하여 실행계획을 생성한다.
  • Parser : 쿼리를 해석하고 분석 및 검증한다.
  • Optimizer : 쿼리에서 논리적으로 불가능한 부분과 중복을 제거한 뒤에 내부 데이터 통계(인덱스 카디널리티, 교집합 크기)데이터 위치(클러스터 내 데이터 저장 위치, 전송 비용) 등을 기반으로 가장 효율적인 쿼리 실행 계획을 생성한다. 

 

🙋🏻‍♀️ 인덱스 카디널리티(Index Cardinality)

  • 카디널리티는 칼럼의 서로 다른 값의 개수(=고유값)를 의미한다. 예를 들어 `성별` 의 교유값은 여자/남자로 단 2개다. 반면 `주민등록번호` 의 고유값은 셀 수 없이 많다.
  • 인덱스 카디널리티는 인덱스가 적용된 컬럼의 교유 값 비율을 나타낸다.
  • 따라서 인덱스 카디널리티가 높을수록 인덱스가 효율적이다. Optimizer는 이를 고려하여 "인덱스를 사용할지", "전체를 스캔할지" 결정한다.

 

🙋🏻‍♀️ 교집합의 크기

  • 두 테이블을 조인할 때 매칭되는 행(레코드)의 개수이다. 예를 들어 `A` 테이블과 `B` 테이블을 `A.user_id = B.user_id` 로 조인할 때, 몇 개의 쌍이 만들어질지를 의미한다.
  • 따라서 교집합의 크기가 작을 것으로 예상된다면 Optimizer는 해시 조인 같은 빠른 방식으로 처리한다. 반면 대규모 교집합이 예상되면 머지 조인, 중첩 루프 조인과 같은 방식으로 처리할 수 있다.

 

🙋🏻‍♀️ 데이터 위치(클러스터 내 데이터 저장 위치)

  • 분산 DBMS는 데이터가 여러 노드에 저장된다. 필요한 데이터가 한 노드에 모여있다면 빠르게 처리할 수 있지만 흩어져 있다면 전송비용이 증가한다.
  • 따라서 Optimizer는 데이터 분포를 파악하여 필요한 노드로만 요청을 보낸다.


🙋🏻‍♀️ 
전송 비용

  • 분산 시스템에서는 데이터를 네트워크를 통해 전송해야 할 수도 있다. 전송되는 데이터 양이 많고 네트워크 홉 수가 멀수록 처리 시간이 길어진다.
  • 따라서 Optimizer는 전송하지 않고 처리할 수 있는 방법을 고려한다. (Local filtering ➡️ remote join)

 

고려 요소 고려하는 이유
인덱스 카디널리티 인덱스를 사용할지, 전체 스캔할지 결정
교집합의 크기 어떤 조인 방식이 가장 효율적인지 판단
데이터 위치 쿼리를 어떤 노드에서 실행할지 결정
전송 비용 불필요한 네트워크 트래픽을 피하기 위함

 

 

 

🔹 실행 엔진(Execution Engine)

  • 쿼리 프로세서에서 생성된 실행계획을 실제로 실행한다.
  • 연산자 실행
  • 병렬 처리 및 작업 스케쥴링
  • 트랜잭션 관리동시성 제어

* 트랜잭션이란 쪼갤 수 없는 업무 처리의 최소 단위이며, 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위다.

* 동시성 제어란 다수의 트랜잭션의 상호작용으로부터 데이터베이스를 보호하는 것을 의미한다. 예를 들어 트랜잭션 T1이 데이터 D를 수정하고 있는데 트랜잭션 T2가 D를 동시에 수정한다면 문제가 발생할 수 있기 때문에 이것을 제어하는 것을 동시성 제어라고 한다.

 

 

🔹 스토리지 엔진(Storage Engine)

  • 데이터를 실제로 저장하고 관리한다.
  • 데이터 저장/검색/복구/백업
  • 인덱스 관리
  • 버퍼 관리 및 캐싱

* 인덱스란 데이터베이스 테이블의 검색 성능을 높여준다. 추가적인 쓰기 작업과 저장 공간을 활용하여 전체 테이블을 검색하지 않고도 원하는 데이터를 빠르게 검색할 수 있다.

 

 

3️⃣ DBMS 저장 방식 : 인메모리 vs 디스크

 

DBMS는 데이터를 어디에 저장하고 처리하느냐에 따라 인메모리(In-Memory) 방식과 디스크 기반(Disk-Based) 방식으로 나눌 수 있다. 사실 두 방식 모두 디스크를 사용하지만 인메모리 DBMS는 대부분의 데이터를 RAM에 저장한다.

 

메모리는 디스크보다 빠르게 접근할 수 있다. 빠르게 접근할 수 있는 이유는 물리적으로 CPU와 가깝기 때문이다. 메모리와 CPU는 메모리 버스로 연결되어 있는 반면 디스크는 다른 컨트롤러를 거쳐 접근해야 한다. 그러면 '무조건 메모리만 사용하면 되지 않을까?'라고 생각할 수 있지만 현실적으로 메모리는 비싸다. 그래서 상대적으로 저렴한 디스크(SSD, HDD)를 사용하는 것이다. 또한, 메모리의 RAM은 휘발성이다. RAM에 저장된 데이터가 영구적으로 저장되지 않기 때문에 데이터가 손실될 수 있다.

 

 

✅ 인메모리(In-Memory) DBMS

  • 데이터를 메모리(RAM)에 저장하고 처리한다.
  • 속도가 매우 빠르며, 실시간 분석이나 고속 처리에 적합하다.
  • 단점은 메모리 용량에 제한이 있고, 시스템 장애 시 데이터 유실 가능성(RAM의 휘발성)이 있다.
대표 사례: Redis, SAP HANA

 

✅ 디스크 기반(Disk-Based) DBMS

  • 데이터를 디스크(SSD, HDD)에 저장하고 처리한다.
  • 속도는 인메모리보다 느릴 수 있지만, 대용량 데이터 저장 및 영속성(내구성) 확보에 유리하다.
  • 대부분의 전통적인 RDBMS는 디스크 기반이다.
대표 사례: MySQL, Oracle, PostgreSQL

 

 

 

3️⃣ DBMS 저장방식 : 행(row) vs 열(column)

데이터를 저장할 때, 하나의 테이블을 행(row) 단위로 저장하거나, 열(column) 단위로 저장할 수 있다.

 

✅ 로우 기반(Row-based) 저장

아마도 대부분이 익숙한 저장방식은 Row 기반일 것이다.

| ID | 이름  | 나이 | 지역 |
|----|------|----|------|
|  1 | 김삐삐 | 25 | 서울 |
|  2 | 홍당무 | 30 | 울산 |

 

  • 테이블의 한 행(row) 전체를 한 번에 저장한다. (ID, 이름, 나이, 지역)
  • 일반적인 OLTP 시스템(온라인 트랜잭션 처리)에 적합
  • INSERT, UPDATE, DELETE 같은 작업이 자주 일어나는 경우 효율적
대표 사례: MySQL(InnoDB), PostgreSQL

 

 

✅ 칼럼 기반(Column-based) 저장

| ID |    날짜   |   주식   |   가격   |
|----|----------|---------|---------|
|  1 | 25.05.01 |  00건설  |  50,000 |
|  2 | 25.06.10 |  00전자  |  25,000 |
|  3 | 25.06.11 |  00건설  |  58,000 |

 

위와 같은 테이블을 칼럼별로 모아서 아래와 같이 저장한다.

날짜 : 1:25.05.01; 2:25.06.10; 3:25.06.11
주식 : 1:00건설; 2:00전자; 3:00건설
가격 : 1:50,000; 2:25,000; 3:58,000

 

  • 같은 열(column)의 데이터를 연속적으로 저장한다. (이름, 이름, 이름..)
  • OLAP 시스템(온라인 분석 처리)에 적합 → 대량의 데이터를 빠르게 집계하거나 분석하는 데 효율적
  • SELECT AVG(price)처럼 특정 열만 조회하는 연산에 빠르다.
대표 사례: MySQL(InnoDB), PostgreSQL

 

 

 

 

3️⃣ DBMS 저장방식 : 데이터 파일 vs 인덱스 파일

데이터를 저장할 때, 하나의 테이블을 행(row) 단위로 저장하거나, 열(column) 단위로 저장할 수 있다.

 

 

 

 

 


 

🍪 사담 🍪

 

올해 취업을 하면서 아주 정신이 없었다. 연수원 다녀오고, 회사에 적응하고.. 물론 진짜 업무는 시작도 안 했지만 ㅋㅋ 이제 숨을 좀 돌릴 수 있게 된 것 같다. 그래서 어떤 공부를 하면 좋을지 생각하다가 데이터베이스에 대한 지식이 많이 부족하다는 것을 취준 생활을 통해 느꼈기 때문에 공부하기로 마음을 먹었다. 올해 초에 이 책을 샀었는데 갑자기(?) 합격하는 바람에 읽을 기회가 없었다. 이 책과 내가 전공수업에서 배웠던 내용을 정리하며 데이터베이스 공부를 시작할 것이다...!

 

출처 : https://www.oreilly.com/library/view/database-internals/9781492040330/

 

 

 

그리고 짧게 남기는 취업 소감 😗

 

반응형
LIST
loading