DB의 종류
1. 관계형 DB (RDBMS)
- 테이블 형태로 데이터를 저장
- 테이블 간의 관계를 이용해 데이터 연결
- 가장 많이 쓰이는 데이터베이스
- 안정성 중심
개념적으로 DB는 데이터의 집합, DBMS는 그걸 관리하는 시스템을 의미하지만, 실무적으로 RDB, RDBMS를 구분하지는 않는다.
2. 비관계형 DB (NoSQL)
- 테이블이 아닌 형태로 데이터를 저장, 관리
- key-value, document, graph, ...
- 스키마가 고정되지 않음, 대규모 데이터 처리, 높은 확장성 제공
- 성능 중심
트랜잭션
하나의 논리적인 작업 단위
- A(Atomicity): 하나의 트랜잭션 내 모든 작업은 전부 성공하거나 전부 실패해야 함
- C(Consistency): 트랜잭션 전후로 DB에 모순이 없는 일관된 상태여야 함
- I(Isolation): 여러 트랜잭션이 동시에 실행되어도 서로 간섭 없이 독립적으로 실행되어야 함
- D(Durability): 트랜잭션의 결과가 DB에 영구적으로 저장
RDBMS 특징
테이블
- 데이터는 행과 열로 구성된 테이블에 저장
- 열(column): 데이터의 속성(attribute)
- 행(row): 관계된 데이터의 묶음(tuple, record)

관계
- 테이블 간의 관계는 외래키(Foreign Key, FK)를 통해 설정
- 1:1, 1:다, 다:다 관계 모두 가능함
- 개념적으로는 ER model 참조

SQL
- RDBMS에서 데이터를 관리하는 표준 언어
- 데이터에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행
Key
- 기본키(Primary Key, PK)
- 테이블 당 하나만 존재
- 중복 불가
- NULL 불가
- 외래키(Foreign Key, FK)
- 다른 테이블의 기본 키를 참조
- 두 테이블 간 관계 설정
- 유일키(Unique Key)

정규화
- 데이터 중복 최소화, 일관성, 무결성 유지를 위한 데이터 구조화 프로세스
- 여러 가지 정규화 단계가 있음
- 과도한 정규화는 테이블의 개수를 늘리며 오히려 성능을 떨어뜨림

데이터 무결성
- 엔티티 무결성: 기본키는 중복되지 않고, NULL 값이 아닌 상태를 유지
- 참조 무결성: 외래키를 통해 참조되는 데이터가 유효성을 유지하도록 보장
- 예: 게시글에 댓글이 달리면, 댓글은 해당 게시글의 PK를 보유하게 됨
- 게시글의 PK가 댓글의 FK
- 이때 게시글이 삭제되면 해당 데이터의 유효성이 깨짐
- 따라서 1. 댓글이 달린 게시물은 삭제 불가 혹은 2. 게시글이 삭제되면 댓글도 삭제되어야 참조 무결성이 보장
- 도메인 무결성: 데이터가 정의된 타입과 제약 조건에 따라 유효한 값을 유지
- 예: 이름에 숫자나 true/false 값이 들어갈 수 없음
대표적인 RDBMS
- MySQL
- PostgreSQL
- OracleDatabase
- Microsoft SQL Server
Docker에서 MySQL 띄우기 (MySQL의 기본 포트는 3306)
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=12345678 -p 3306:3306 mysql:8.4
SQL(Structed Query Language)
1. DDL: 데이터 구조 정의
CREATE: 데이터베이스, 테이블 생성
CREATE TABLE users ( id INT PRIMARY KEY, username VARCHAR(50), email VARCHAR(100) );
ALTER: 데이터베이스, 테이블 구조 수정
ALTER TABLE users ADD created_at TIMESTAMP;
DROP: 데이터베이스, 테이블 삭제 (통째로)
DROP DATABASE hello;
2. DML: 데이터 조작(추가, 수정, 삭제)
INSERT: 테이블에 새로운 데이터(레코드) 삽입
INSERT INTO users (id, username, email) VALUES (1, 'John', 'john123@gmail.com');
UPDATE: 테이블의 특정 데이터 수정
UPDATE users SET email = 'new.email@example.com' WHERE id = 1;
DELETE: 테이블의 특정 데이터 삭제
DELETE FROM users WHERE id = 1;
3. DQL: 데이터 조회
SELECT: 특정 데이터 조회
SELECT email FROM users WHERE username = 'John';
특정 데이터는 WHERE절을 통해 조건을 지정
ORM (Object-Relational Mapping)
- OOP 언어와 RDB 간의 데이터 변환 기법
- OOP의 객체와 RDB의 테이블을 매핑하는 인터페이스

문제점: 패러다임의 불일치
- DB의 데이터는 단일 값만 가능
- OOP는 객체나 리스트 등 복잡한 값을 가질 수 있음
- 따라서 naive하게 객체와 데이터를 동일시할 수 없음
- ORM이 인터페이스로 존재하며 패러다임의 불일치를 해결하고, 편하게 코드로 다룰 수 있게 해줌