📌 1. 관계형 데이터베이스(RDB, Relational Database)란?
✅ 개념
- 데이터를 행(Row)과 열(Column)로 구성된 표(Table) 형태로 저장하는 데이터베이스
- 각 테이블은 하나의 엔티티(Entity)를 표현함
- 테이블 간의 관계(Relation)를 설정해서 데이터를 효율적으로 관리
✅ 예시 (학생 테이블)
학번 | 이름 | 전공 |
101 | 홍길동 | 컴퓨터공학 |
102 | 김영희 | 산업공학 |
103 | 이철수 | 기계공학 |
→ 이 표가 바로 하나의 "관계(Relation)"이고, 이런 관계를 여러 개 만들 수 있음 (예: 과목 테이블, 성적 테이블 등)
📌 2. 관계형 데이터베이스 관리 시스템 (RDBMS)
✅ 개념
- RDBMS는 RDB를 생성, 조회, 수정, 삭제(CRUD) 할 수 있게 도와주는 소프트웨어 시스템
- 테이블 간의 관계 유지, 트랜잭션 처리, 동시성 제어, 보안 등을 담당
✅ 대표적인 RDBMS
제품명 | 설명 |
MySQL | 오픈소스, 가볍고 속도가 빠름 |
PostgreSQL | 오픈소스, 고급 기능과 확장성 제공 |
Oracle | 상용 소프트웨어, 강력한 기능 제공 |
Microsoft SQL Server | 마이크로소프트 제품, .NET과 호환성이 좋음 |
📌 3. RDB와 RDBMS의 차이점
항목 | RDB | RDBMS |
정의 | 관계형 데이터베이스 (데이터 구조 그 자체) | 관계형 데이터베이스를 관리하는 시스템 |
형태 | 테이블로 구성된 데이터 | 데이터를 조작하고 제어하는 소프트웨어 |
예시 | 학생, 성적 등의 테이블 | MySQL, PostgreSQL, Oracle 등 |
기능 | 데이터만 저장 | CRUD, 트랜잭션, 보안, 백업, 복원 등 포함 |
📌 4. 왜 RDBMS를 사용하는가?
- 📋 구조화된 데이터 관리: 테이블로 명확히 표현 가능
- 🔗 데이터 간 관계 설정: 외래키로 연결
- 🧾 SQL 지원: 데이터를 쉽게 조회 및 조작 가능
- 🔒 데이터 무결성 유지: 제약조건(Primary Key, Foreign Key 등)
- 🔁 트랜잭션 지원: 데이터 일관성 보장
- 🔐 보안 기능 제공: 사용자 권한 제어 가능
📌 5. RDB의 장/단점
[장점]
구분 | 장점 | 설명 |
데이터 정합성 | ACID 보장 | 트랜잭션의 안정성과 일관성 확보 (은행, 병원 등 핵심 시스템에 필수) |
구조화된 데이터 관리 | 스키마 기반 설계 | 데이터 구조가 명확하여 설계와 유지보수가 쉬움 |
복잡한 쿼리 처리 가능 | SQL 지원 | JOIN, GROUP BY 등 다양한 조건으로 복잡한 질의 수행 가능 |
데이터 무결성 유지 | 제약조건 설정 (PK, FK) | 중복 방지, 관계 보장, 데이터 오류 방지 |
보안 및 접근 제어 | 권한 기반 사용자 관리 | 데이터에 대한 세밀한 접근 통제 가능 (GRANT, REVOKE) |
표준화된 언어 사용 | SQL 표준 지원 | 다양한 RDBMS에서도 비슷한 문법으로 개발 가능 (MySQL, PostgreSQL, Oracle 등) |
백업 및 복구 용이 | 운영/백업 체계 잘 갖춤 | 데이터 손실 시 신속한 복구 가능 |
성숙한 생태계 | 툴, 커뮤니티 풍부 | 다양한 ORM, 분석 도구, 대시보드 등과 호환 쉬움 |
[단점]
단점 | 설명 |
확장성 부족 (수평 확장 어려움) | RDB는 Scale-Up(더 좋은 서버로 교체) 중심이라 대용량 데이터에 비효율적 |
복잡한 JOIN 연산 | 여러 테이블 간의 JOIN 연산이 많아질수록 성능 저하 발생 |
유연성 부족 (스키마 고정) | 스키마(테이블 구조)가 사전에 고정되어 있어 데이터 변경이 어려움 |
비정형 데이터 처리 어려움 | JSON, 이미지, 센서 데이터 등 비정형/반정형 데이터 처리에 약함 |
속도 이슈 | 특히 읽기/쓰기 트래픽이 급증하는 경우 속도가 느려질 수 있음 |
위와 같이 RDB를 구성해서 사용하기 위해서는 테이블의 키(KEY)가 매우 중요하다. 키(KEY)를 통해 테이블 간의 관계가 연결된다.
📌 1. 키(Key)란?
키는 테이블에서 "각 행(Row)"을 구분하거나, "테이블 간 관계"를 연결하기 위해 사용되는 값(속성)
📌 2. 주요 키의 종류 및 역할
키(KEY) | 설명 | 예시 |
Primary Key (기본키) | 테이블에서 각 행을 유일하게 식별하는 키. NULL 불가, 중복 불가 | 학번, 주문ID 등 |
Foreign Key (외래키) | 다른 테이블의 기본키를 참조하여 관계를 맺는 키 | 학생.학과ID → 학과.학과ID |
Candidate Key (후보키) | 기본키가 될 수 있는 후보들 중 하나. 유일성과 최소성을 만족 | 주민번호, 이메일 등 |
Alternate Key (대체키) | 후보키 중에서 선택되지 않은 나머지 키 | 기본키가 아닌 이메일, 전화번호 등 |
Composite Key (복합키) | 두 개 이상의 컬럼으로 구성된 기본키 | 과목ID + 학번 (수강 테이블) |
Super Key (슈퍼키) | 유일성은 만족하지만 최소성은 만족하지 않는 키 | 학번+이름, 학번+전화번호 등 |
Unique Key (유니크키) | 기본키는 아니지만 중복 없이 고유해야 하는 값, NULL은 허용 | 이메일, 전화번호 등 |
📌 3. 실전 예제로 이해해보기
예시 테이블: 학생(Students)
학번(PK) | 이름 | 학과ID(FK) | 이메일(UNIQUE) |
2023001 | 홍길동 | CSE | gil@example.com |
2023002 | 김영희 | ISE | kim@example.com |
- Primary Key: 학번
- Foreign Key: 학과 ID → 학과 테이블의 학과ID
- Unique Key: 이메일
- Candidate Key: 학번, 이메일
- Alternate Key: 이메일
- Composite Key: (예: 수강 테이블에서 학번 + 과목코드)
📌 4. 주요 키 제약 조건 요약
키 | 중복 허용 | NULL 허용 | 역할 |
Primary Key | ❌ 불가능 | ❌ 불가능 | 유일한 식별자 |
Foreign Key | ✅ 가능 | ✅ 가능 | 관계 연결 |
Unique Key | ❌ 불가능 | ✅ 가능 | 고유값 보장 |
Composite Key | ❌ 불가능 | ❌ 불가능 | 여러 컬럼 조합으로 식별 |
위의 내용을 통해 DB의 테이블이 생성되고 관리된다. 이때 우리는 관계형 데이터베이스(RDB)를 잘 다루기 위해 SQL 명령어를 통해 쿼리문을 작성하며 데이터베이스를 관리하게 된다.
SQL 명령어는 아래와 같이 분류된다.
📌 1. SQL 명령어 분류 총정리
분류 | 이름 | 주 명령어 | 역할 |
🔧 DDL | Data Definition Language | CREATE, DROP, ALTER, TRUNCATE | 데이터베이스 구조 정의/수정 |
🧾 DML | Data Manipulation Language | SELECT, INSERT, UPDATE, DELETE | 데이터 조작 (조회/삽입/수정/삭제) |
🛡 DCL | Data Control Language | GRANT, REVOKE | 사용자 권한 제어 |
🔄 TCL | Transaction Control Language | COMMIT, ROLLBACK, SAVEPOINT | 트랜잭션 제어 |
📌 2. 각 SQL 종류별 예제와 설명
✅ 🔧 DDL (데이터 정의 언어)
명령어 | 설명 | 예시 |
CREATE | 테이블, 데이터베이스 생성 | CREATE TABLE users (id INT, name VARCHAR(50)); |
DROP | 테이블, DB 삭제 | DROP TABLE users; |
ALTER | 구조 변경 | ALTER TABLE users ADD email VARCHAR(100); |
TRUNCATE | 데이터 전체 삭제 (구조는 유지) | TRUNCATE TABLE users; |
🚨 주의: DDL은 트랜잭션 롤백이 안 됨!
✅ 🧾 DML (데이터 조작 언어)
명령어 | 설명 | 예시 |
SELECT | 데이터 조회 | SELECT * FROM users; |
INSERT | 데이터 삽입 | INSERT INTO users VALUES (1, '홍길동'); |
UPDATE | 데이터 수정 | UPDATE users SET name='김영희' WHERE id=1; |
DELETE | 데이터 삭제 | DELETE FROM users WHERE id=1; |
✅ 트랜잭션 적용 가능 (롤백/커밋 가능)
✅ 🛡 DCL (권한 제어 언어)
명령어 | 설명 | 예시 |
GRANT | 권한 부여 | GRANT SELECT ON users TO 'user1'; |
REVOKE | 권한 회수 | REVOKE SELECT ON users FROM 'user1'; |
보안 정책이나 사용자 관리에서 사용
✅ 🔄 TCL (트랜잭션 제어 언어)
명령어 | 설명 | 예시 |
BEGIN 또는 START TRANSACTION | 트랜잭션 시작 | START TRANSACTION; |
COMMIT | 변경 내용 확정 | COMMIT; |
ROLLBACK | 변경 내용 취소 | ROLLBACK; |
SAVEPOINT | 중간 저장점 설정 | SAVEPOINT sp1; |
ROLLBACK TO | 특정 저장점으로 롤백 | ROLLBACK TO sp1; |
DDL, DML, DCL 모두 DB의 데이터와 관련된 명령어들이라는 것을 알 수 있다.
여기서 이것들과는 조금 다른 TCL(Transaction Control Language), 트랜잭션과 관련된 명령어를 볼 수 있다.
트랜잭션에 대해 이해하면 위의 명령어도 쉽게 이해될 것이다.
📌 3. 트랜잭션(Transaction)이란?
✅ 개념
트랜잭션이란, 데이터베이스에서 하나의 논리적인 작업 단위를 의미한다.
여러 DML 명령을 한 덩어리로 묶어 처리하며, 성공하면 COMMIT, 실패하면 ROLLBACK.
✅ 트랜잭션의 4대 특성 (ACID)
항목 | 의미 |
A - Atomicity (원자성) | 모든 작업은 전부 수행되거나, 전혀 수행되지 않음 |
C - Consistency (일관성) | 트랜잭션 전후로 DB 상태가 일관됨 |
I - Isolation (격리성) | 동시에 실행되는 트랜잭션 간 간섭 없음 |
D - Durability (지속성) | 커밋된 내용은 시스템 장애 후에도 유지됨 |
✅ 트랜잭션 예시
START TRANSACTION;
UPDATE 계좌 SET 잔액 = 잔액 - 10000 WHERE 계좌번호 = 'A123';
UPDATE 계좌 SET 잔액 = 잔액 + 10000 WHERE 계좌번호 = 'B456';
COMMIT; -- or ROLLBACK;
이 두 UPDATE는 한 덩어리 트랜잭션으로 처리되어야 한다.
하나만 실행되면 돈이 사라지거나 두 번 입금되는 오류가 발생할 수 있다.
📌 4. 트랜잭션 격리 수준 (Isolation Level)
수준 | Dirty Read | Non-Repeatable | ReadPhantom | Read 성능 |
READ UNCOMMITTED | 발생 ❗ | 발생 ❗ | 발생 ❗ | 🔥 최고 |
READ COMMITTED | 방지 ✅ | 발생 ❗ | 발생 ❗ | ⬆ |
REPEATABLE READ | 방지 ✅ | 방지 ✅ | 발생 ❗ (MySQL InnoDB는 방지함) | ⬆⬆ |
SERIALIZABLE | 방지 ✅ | 방지 ✅ | 방지 ✅ | ⬆⬆⬆ 가장 느림 |
💡 기본 격리 수준:
- MySQL(InnoDB): REPEATABLE READ
- PostgreSQL: READ COMMITTED
📌 5. 💥 동시성 제어 (Concurrency Control)
✅ 왜 필요할까?
- 다수의 트랜잭션이 동시에 동일한 데이터를 조작하면 충돌이 발생할 수 있음
- 예) 두 사람이 동시에 은행 계좌에서 돈을 인출하면, 잔액 오류 발생 가능
📌 6. 🔒 잠금(Locking) 메커니즘
잠금(Lock) 은 하나의 트랜잭션이 자원을 사용할 때 다른 트랜잭션의 접근을 막는 방식
📌 6.1 잠금의 종류
구분 | 이름 | 설명 |
범위 | Row-level Lock | 특정 행(Row)만 잠금 (정밀함, 병행성 높음) |
Table-level Lock | 전체 테이블을 잠금 (간단함, 병행성 낮음) | |
권한 | Shared Lock (S-Lock) | 다른 트랜잭션도 읽기는 허용, 쓰기는 불가 |
Exclusive Lock (X-Lock) | 읽기/쓰기 모두 막음, 오직 하나의 트랜잭션만 허용 |
📌 6.2 잠금 예시 (MySQL InnoDB 기준)
✅ Shared Lock (읽기 잠금)
SELECT * FROM accounts WHERE id = 1 LOCK IN SHARE MODE;
✅ Exclusive Lock (쓰기 잠금)
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
🔐 이 명령들은 트랜잭션 안에서만 유효하고 COMMIT 또는 ROLLBACK 시 해제됨
📌 7. 🔁 교착 상태(Deadlock)란?
두 개 이상의 트랜잭션이 서로가 가진 자원을 기다리며 무한 대기하는 상태
💥 발생 예시
- 트랜잭션 A: 행 X → 행 Y 잠금 요청
- 트랜잭션 B: 행 Y → 행 X 잠금 요청
→ 서로 상대의 잠금 해제를 기다리며 영원히 멈춤
✅ 해결 방법
- DBMS가 자동으로 한쪽 트랜잭션을 강제 종료 (ROLLBACK)
- 쿼리 실행 순서 정렬, 타임아웃 설정, 명시적 잠금 사용으로 사전 방지 가능
우리의 일상에서 쉽게 찾아볼 수 있는 예시로 은행, 재고 관리 등 트랜잭션으로 이루어지는 동작들이 많이 있다.
DB에 관련된 내용으로 RDB부터 시작해 SQL, 쿼리문, Transaction까지 알아보았다.
다음에는 JOIN, 정규화, INDEX 등에 대해 자세히 알아볼 예정이다.
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.
#카카오클라우드 #AIaaS마스터클래스 #AIaaS #카카오엔터프라이즈 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #개발자교육 #클라우드개발자 #클라우드엔지니어
'클라우드(Cloud)' 카테고리의 다른 글
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 4주차 - DB3 (데이터베이스3 - 정규화 中 1NF, 2NF, 3NF, BCNF, 4NF) (0) | 2025.04.17 |
---|---|
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 4주차 - DB2 (데이터베이스2 - JOIN/인덱스/백업) (0) | 2025.04.17 |
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 3주차 - Docker 기반 2-Tier 아키텍처 실습 (1) | 2025.04.13 |
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 2주차 - Grafana + Loki Stack 모니터링 (0) | 2025.04.06 |
[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 1주차 후기 (0) | 2025.03.30 |