데이터베이스 배경지식
데이터베이스와 데이터베이스 관리 체계인 DBMS
데이터베이스: 원하는 기능을 동작시키기 위해 마땅히 저장해야 하는 정보의 집합
사전적 정의는 '여러 사람이 공유하여 사용할 목적으로 체계화를 통합, 관리하는 데이터의 집합'
DBMS(데이터베이스 관리 시스템): 데이터베이스를 제대로 관리하기 위한 수단
즉 데이터베이스를 관리하기 위한 프로그램이라고 생각하면 됨
DBMS는 크게 두 유형으로 구분됨

DBMS 점유율을 살펴보면 수많은 개발자들이 주로 사용하고 있는 데이터베이스로 RDBMS를 답변
점유율이 가장 높은 RDBMS는 사실상 MySQL
(점유율만 놓고 보면 Oracle인데, 이건 기업 규모나 레거시 시스템까지 포함한 '전체 시장 점유율')
포스팅 내용에 대한 데이터베이스는 MySQL(버전8.0)을 위주로 학습 예정

DBMS는 여느 응용 프로그램과 다를 바 없는 응용 프로그램
다만, DBMS는 사용자와 직접적으로 상호작용하기보다는 사용자(개발자)가 만든 프로그램과 상호작용하며 실행됨

응용 프로그램이 DBMS를 이용하는 과정은 클라이언트-서버 간의 동작과 유사함
DBMS 클라이언트는 DBMS에 쿼리를 보냄
이를 위해 DBMS는 데이터베이스를 다루기 위한(데이터베이스 언어) 언어를 제공
대표적인 데이터베이스 언어인 SQL은 RDBMS에서 데이터를 조작하고 관리하기 위한 언어로,
이름 그대로 데이터베이스에 질의(Query)하기 위한 구조화된 언어를 말함

> TCL을 제외하고 DDL, DML, DCL 세 종류로 구분하는 경우도 있음
1️⃣ 데이터 일관성 및 무결성 제공이 어려움
2️⃣ 불필요한 중복 저장이 많아짐
3️⃣ 데이터 변경 시 연관 데이터 변경이 어려움
4️⃣ 정교한 검색이 어려움
5️⃣ 백업 및 복구가 어려움
데이터베이스 학습을 시작하려면 데이터베이스에 무엇이 어떻게 저장되는지, 데이터베이스의 연산에는 어떤 성질이 있는지 이해해야함
데이터베이스에는 다양한 속성을 가진 독립적 객체들이 저장될 수 있음
엔티티(Entity): 독립적으로 존재할 수 있는 객체
DB에 저장되면 레코드(record) 또는 도큐먼트(document)라고 부름
'어떠한 특성을 가진 대상'이라고 할 수 있다면 모두 엔티티라고 볼 수 있음

이미지 속 하나 하나의 대상이 모두 데이터베이스에 저장 가능한 엔티티인 셈
속성: 엔티티의 특성을 의미
위 이미지에 구매자 ID, 구매자의 이름과 성별, 제품 번호와 이름이 바로 각 엔티티의 속성
각각의 엔티티는 속성을 강조하여 표기할 수 있음
1. 구매자 ID 속성 = 123, 구매자 이름 속성 = "김한빛", 구매자 성별 속성 = 남자
2. 구매자 ID 속성 = 321, 구매자 이름 속성 = "김빛한", 구매자 성별 속성 = 여자
3. 제품 번호 속성 = abc123, 제품 이름 속성 = "혼공 노트북"
4. 제품 번호 속성 = def321, 제품 이름 속성 = "이것이 키보드"
이때 같은 속성을 공유하는 개별 엔티티는 같은 엔티티 집함(Entity Set)에 속한다고 할 수 있음
1과 2는 구매자라는 엔티티 집합으로 표현할 수 있고,
3과 4는 제품이라는 엔티티 집합으로 표현할 수 있음

| 구분 | RDBMS (예: MySQL, PostgreSQL) | NoSQL - MongoDB |
|---|---|---|
| 엔티티 집합 | 테이블(Table) 또는 릴레이션(Relation) | 컬렉션(Collection) |
| 개별 엔티티 | 레코드(Record) = 테이블의 행(Row) | 도큐먼트(Document) = JSON 객체 |
| 속성 | 필드(Field) = 열(Column) | 필드(Field) = JSON의 키(Key) |

필드의 수는 차수(degree)라고도 부름. 그리고 한 필드에 대한 고유 값의 수는 카디날리티(cardinality)라고 부름. 즉 카디날리티가 낮을수록 중복된 속성이 많음을 의미함
RDBMS와 NoSQL을 구분하는 주요 기준 중 하나로 스키마의 유무를 꼽을 수 있음
스키마(schema): 데이터베이스에 저장되는 레코드의 구조와 제약 조건을 정의한 것으로, 레코드가 지켜야 할 틀이자 청사진이라고 볼 수 있음
RDBMS에서는 레코드를 테이블 내 행으로 저장하고, NoSQL의 일종인 MongoDB에서는 컬렉션 내 도큐먼트로 저장한다고 했음
따라서 RDBMS에서는 명확한 스키마가 정의되며, 레코드들은 이 스키마로 정해진 테이블의 구조, 필드의 데이터 타입 및 제약 조건을 따라야함

이 테이블의 구조와 각 필드의 데이터 타입, 제약 조건 등이 정의된 틀이 바로 스키마
반면 NoSQL에서는 명확한 스키마가 정의되지 않기 때문에 NoSQL 데이터베이스를 스키마-리스 데이터베이스라고도 부름
레코드들이 지켜야 할 구조와 제약 조건에 제한이 없어 RDBMS보다 자유로운 형태의 레코드를 저장할 수 있음
트랜잭션: 데이터베이스와의 논리적 상호작용의 단위를 의미
데이터베이스가 처리하는 작업의 단위를 나타내므로 초당 트랜잭션이라는 지표로 데이트베이스의 작업 성능을 나타내기도 함
데이터베이스는 한 명의 사용자나 하나의 프로그램만 데이터베이스를 사용하는 경우가 거의 없음
여러 사용자/프로그램이 동시다발적으로 사용하는 것이 일반적. 따라서 여러 작업을 내포하는 트랜잭션이 동시다발적으로 실행될 때는 안전한 트랜잭션을 보장하기 위해 지켜야 하는 성질이 있음
ACID: 원자성, 일관성, 격리성, 지속성의 줄임말.
1️⃣ 원자성
하나의 트랜잭션 결과가 모두 성공하거나 모두 실패하는 성질의 의미
또 원자성을 트랜잭션이 반드시 커밋되거나 롤백되는 성질이라고도 표현

2️⃣ 일관성
트랜잭션 전후로 데이터베이스가 일관된 상태를 유지하는 성질
일관된 상태: 데이터베이스가 지켜야 하는 일련의 규칙들을 지키는 상태를 의미

데이터베이스가 트랜잭션 이후 다음과 같이 새로운 일관된 상태로 전이될 수 있다는 것
이 경우에도 저장된 데이터들은 모두 일관된 상태를 유지해야 함
3️⃣ 격리성
동시에 수행되는 여러 트랜잭션이 서로 간섭하지 않도록 보장하는 성질(레이스 컨디션을 방지하는 성질)
즉, 한 트랜잭션이 어떤 데이터의 접근하여 조작 중일때는 다른 트랜잭션이 접근할 수 없음
하지만 격리성이 보장된다면 두 트랜잭션이 수행되지 않으므로 이러한 문제를 방지할 수 있음
4️⃣ 지속성
트랜잭션이 성공적으로 완료된 후에 그 결과가 영구적으로 반영되는 성질을 의미
특, 시스템 장애가 발생하더라도 완료된 트랜잭션의 결과는 손실되지 않아야 함
예를 들어 은행에서 특정 계좌에 돈을 입금하는 트랜잭션이 성공적으로 완료되었다면 그 결과가 디스크에 기록되어 시스템 장애가 발생하더라도 입금 내역이 사라지지 않아야 함
현대 DBMS에는 대부분 이를 보장하기 위하 회복 매커니즘이 구현되어 있음
트랜잭션이라는 범용적 용어
트랜잭션이라는 용어나 TPS라는 지표는 주로 데이터베이스에서 언급되는 용어이기는 하나, 데이터베이스에서만 사용되는 용어가 아닌 다른 하드웨어 부품에서 사용되거나 전자상거래의 거래 단위로 사용되기 함

참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 6-1)