추천 글 🍀
[SpringBoot] REST API 카카오 로그인 개발하는 법
SpringBoot를 이용하여 카카오 로그인을 구현해 보겠습니다. 카카오 로그인에 대해서 설명되어 있는 공식 문서입니다. 공식 문서에 설명 ...
[구조 패턴] 어댑터 | 퍼싸드 | 컴포지트 | 브리지 패턴 (with 예시 코드)
GoF가 정의하고 있는 23가지 패턴은 3가지 종류(생성, 구조, 행위)로 분류한다. 정보처리기사 필기 시험에서 해당 종류에 속하는 패턴을 ...
본격적인 데이터베이스 공부 전 읽으면 좋은 글입니다.
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을 기반으로한다.
애플리케이션(클라이언트)에서 데이터를 요청하면 데이터베이스(서버)가 해당 데이터를 제공하는 구조이다.
🔹 트랜스포트(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) 단위로 저장할 수 있다.
🍪 사담 🍪
올해 취업을 하면서 아주 정신이 없었다. 연수원 다녀오고, 회사에 적응하고.. 물론 진짜 업무는 시작도 안 했지만 ㅋㅋ 이제 숨을 좀 돌릴 수 있게 된 것 같다. 그래서 어떤 공부를 하면 좋을지 생각하다가 데이터베이스에 대한 지식이 많이 부족하다는 것을 취준 생활을 통해 느꼈기 때문에 공부하기로 마음을 먹었다. 올해 초에 이 책을 샀었는데 갑자기(?) 합격하는 바람에 읽을 기회가 없었다. 이 책과 내가 전공수업에서 배웠던 내용을 정리하며 데이터베이스 공부를 시작할 것이다...!