DBMS (Database Management System)
- 데이터를 저장, 관리, 검색 및 조작하는 소프트웨어 시스템으로, 데이터베이스의 생성과 유지 관리를 책임짐
- DBMS는 데이터의 일관성과 무결성을 유지하며, 다수의 사용자와 애플리케이션이 동시에 데이터에 접근할 수 있도록 조정
DBMS의 주요 개념
- 데이터베이스: 관련 데이터를 구조적으로 저장한 집합
- 테이블: 데이터베이스의 기본 저장 단위로, 행(개별 데이터 항목)과 열(데이터의 속성)로 구성
- 스키마(Schema): 데이터베이스의 구조를 정의하는 메타데이터. 테이블, 열, 제약 조건, 관계 등을 나타냄
- 쿼리(Query): 데이터베이스에 대해 수행되는 명령어 또는 요청으로, 데이터를 검색하거나 조작
DBMS의 기능
- 데이터 정의: 테이블과 관계를 정의하고 데이터베이스 구조를 설계. DDL(Data Definition Language)을 사용하여 테이블, 인덱스, 뷰 등을 정의
- 데이터 조작: 데이터를 삽입, 수정, 삭제 및 조회. DML(Data Manipulation Language)을 사용하여 데이터를 처리
- 트랜잭션 관리: 트랜잭션의 원자성, 일관성, 격리성, 지속성을 보장하여 데이터베이스의 무결성을 유지
- 데이터 보안: 사용자 인증 및 권한 부여를 통해 데이터에 대한 접근을 제어. 데이터의 기밀성과 무결성을 유지
- 백업 및 복구: 데이터의 정기적인 백업을 수행하고, 시스템 장애나 데이터 손실 시 데이터를 복구
- 성능 최적화: 쿼리 최적화, 인덱스 생성, 캐싱 등 다양한 방법을 사용하여 데이터베이스 성능을 개선
- 데이터 무결성: 데이터의 정확성과 일관성을 보장하기 위해 제약 조건(예: 기본 키, 외래 키, 유일성 제약 등)을 설정
DBMS의 유형
- 관계형 DBMS (RDBMS, Relational DBMS)
- 데이터를 테이블 형태로 저장하며, SQL(Structured Query Language)을 사용하여 데이터의 정의, 조작, 쿼리 등을 수행.
- 관계형 모델에 기반
- MySQL, PostgreSQL, Oracle, Microsoft SQL Server.
- 객체지향 DBMS (OODBMS, Object-Oriented DBMS)
- 객체 지향 프로그래밍 개념을 데이터베이스에 적용하여 데이터를 객체로 저장
- 객체 간의 관계를 정의
- ObjectDB, db4o.
- 문서 지향 DBMS
- JSON, BSON 등의 문서 형식으로 데이터를 저장
- 데이터 구조가 유연하며, 비정형 데이터를 처리하는 데 적합
- MongoDB, CouchDB.
- 키-값 저장소 (Key-Value Store)
- 데이터를 키와 값의 쌍으로 저장
- 매우 높은 성능을 제공하며, 간단한 조회 및 저장 작업에 적합
- Redis, Riak.
- 열 지향 DBMS (Columnar DBMS)
- 데이터를 열 단위로 저장하여 대규모 데이터 분석 작업에 적합
- 데이터 압축과 빠른 읽기 성능을 제공
- Apache Cassandra, HBase.
- 그래프 DBMS (Graph DBMS)
- 데이터와 그 관계를 그래프 구조로 저장
- 복잡한 관계를 효율적으로 표현하고 분석
- Neo4j, Amazon Neptune.
SQL (Structured Query Language)
데이터베이스 관리 시스템(DBMS)에서 데이터를 정의, 조작, 제어 및 조회하는 데 사용되는 표준 언어
데이터 정의 언어 (DDL: Data Definition Language)
DDL은 데이터베이스의 구조를 정의하는 데 사용
- CREATE: 새로운 데이터베이스 객체(테이블, 인덱스 등)를 생성
CREATE TABLE 테이블명 (
컬럼명1 데이터타입 제약조건,
컬럼명2 데이터타입 제약조건,
...
);
- ALTER: 기존 데이터베이스 객체를 수정
ALTER TABLE 테이블명
ADD 컬럼명 데이터타입 제약조건;
ALTER TABLE 테이블명
DROP COLUMN 컬럼명;
- DROP: 데이터베이스 객체를 삭제
- TRUNCATE: 테이블의 모든 데이터를 삭제하지만 테이블 구조는 유지
DROP TABLE 테이블명;
TRUNCATE TABLE 테이블명;
데이터 조작 언어 (DML: Data Manipulation Language)
DML은 데이터베이스 내의 데이터를 조작하는 데 사용
- SELECT: 데이터 조회
SELECT 컬럼명1, 컬럼명2
FROM 테이블명
WHERE 조건;
- INSERT: 새로운 데이터 추가
INSERT INTO 테이블명 (컬럼명1, 컬럼명2, ...)
VALUES (값1, 값2, ...);
- UPDATE: 기존 데이터 수정
UPDATE 테이블명
SET 컬럼명1 = 값1, 컬럼명2 = 값2
WHERE 조건;
- DELETE: 데이터 삭제
DELETE FROM 테이블명
WHERE 조건;
데이터 제어 언어 (DCL: Data Control Language)
DCL은 데이터베이스에 대한 접근을 제어하는 데 사용
- GRANT: 사용자에게 특정 권한을 부여
GRANT 권한 ON 객체 TO 사용자;
- REVOKE: 사용자로부터 특정 권한을 회수
REVOKE 권한 ON 객체 FROM 사용자;
트랜잭션 제어 언어 (TCL: Transaction Control Language)
TCL은 트랜잭션을 제어하는 데 사용
- COMMIT: 트랜잭션의 변경 사항을 확정
- ROLLBACK: 트랜잭션의 변경 사항을 취소
- SAVEPOINT: 트랜잭션 내에서 되돌릴 수 있는 지점을 설정
- SET TRANSACTION: 트랜잭션의 특성을 설정
COMMIT;
ROLLBACK;
SAVEPOINT 저장점명;
SET TRANSACTION READ ONLY;
집계 함수
COUNT, SUM, AVG, MIN, MAX
SELECT COUNT(컬럼명)
FROM 테이블명
WHERE 조건;
JOINs
테이블 간의 관계를 기반으로 데이터를 결합하는 데 사용
- INNER JOIN: 두 테이블에서 조건에 일치하는 행만 반환
- LEFT JOIN: 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 조건에 일치하는 행을 반환
- RIGHT JOIN: 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 조건에 일치하는 행을 반환
- FULL JOIN: 두 테이블에서 조건에 일치하는 모든 행을 반환
- CROSS JOIN: 두 테이블의 카티시안 곱을 반환
SELECT A.컬럼명, B.컬럼명
FROM 테이블A A
INNER JOIN 테이블B B ON A.조건 = B.조건;
SELECT A.컬럼명, B.컬럼명
FROM 테이블A A
LEFT JOIN 테이블B B ON A.조건 = B.조건;
SELECT A.컬럼명, B.컬럼명
FROM 테이블A A
RIGHT JOIN 테이블B B ON A.조건 = B.조건;
SELECT A.컬럼명, B.컬럼명
FROM 테이블A A
FULL JOIN 테이블B B ON A.조건 = B.조건;
SELECT A.컬럼명, B.컬럼명
FROM 테이블A A
CROSS JOIN 테이블B B;
View
저장된 쿼리로서, 복잡한 쿼리를 단순하게 사용할 수 있게 하는 가상의 테이블
- CREATE VIEW: 뷰 생성
- DROP VIEW: 뷰 삭제
CREATE VIEW 뷰명 AS
SELECT 컬럼명
FROM 테이블명
WHERE 조건;
DROP VIEW 뷰명;
트랜잭션 (Transactional Operation)
- 데이터베이스 시스템에서 데이터를 처리하는 핵심 단위로, 데이터베이스의 일관성과 무결성을 유지
- 여러 사용자 또는 애플리케이션의 데이터 접근과 조작을 조정하여 충돌이나 오류를 방지
트랜잭션의 개념
- 원자성(Atomicity)
- 트랜잭션 내의 모든 작업이 전부 성공적으로 완료되거나, 실패하면 전부 롤백되어 데이터베이스의 상태가 트랜잭션 시작 전으로 되돌아감
- ‘모두 또는 아무것도’라는 원칙을 따름
- 일관성(Consistency)
- 트랜잭션이 성공적으로 완료되면 데이터베이스는 일관된 상태를 유지
- 트랜잭션이 데이터베이스의 무결성을 보장하며, 비즈니스 규칙과 제약 조건이 유지됨
- 격리성(Isolation)
- 동시에 실행되는 트랜잭션 간에는 상호 간섭이 없어야 함. 즉, 트랜잭션이 실행 중일 때 다른 트랜잭션의 결과가 영향을 미치지 않아야 함
- 각 트랜잭션은 독립적으로 실행되어야 함
- 지속성(Durability)
- 트랜잭션이 성공적으로 커밋되면, 해당 트랜잭션의 결과는 시스템의 장애가 발생하더라도 지속적으로 유지되어야 함
- 커밋된 데이터는 영구적으로 저장됨
트랜잭션의 상태
- 활동 중(Active): 트랜잭션이 시작되었지만 아직 완료되지 않은 상태
- 커밋(Committed): 트랜잭션의 모든 작업이 성공적으로 완료되어 데이터베이스에 반영된 상태
- 롤백(Rolled Back): 트랜잭션 중 오류가 발생하거나 의도적으로 취소된 상태로, 모든 작업이 원래 상태로 되돌려짐
- 대기(Deferred): 트랜잭션이 실행되었지만 결과를 즉시 반영할 수 없는 상태로, 주로 트랜잭션이 여러 단계로 이루어진 경우
트랜잭션의 격리 수준
트랜잭션의 격리 수준은 트랜잭션 간의 상호 작용을 제어함
- READ UNCOMMITTED
- 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있음
- 가장 낮은 격리 수준으로, '더티 리드'가 발생 가능
- READ COMMITTED
- 트랜잭션은 커밋된 데이터만 읽을 수 있음
- '더티 리드'는 방지되지만 '논리적 비관계'가 발생할 수 있음
- REPEATABLE READ
- 트랜잭션이 시작된 시점의 데이터만 읽을 수 있으며, 다른 트랜잭션이 데이터를 수정해도 이 트랜잭션은 일관된 읽기 결과를 보장받음
- '논리적 비관계'는 방지되지만 '팬텀 리드'는 발생할 수 있음
- SERIALIZABLE
- 가장 높은 격리 수준
- 트랜잭션이 순차적으로 실행되는 것과 같은 효과를 제공
- '팬텀 리드'를 방지하지만 성능이 저하될 수 있음
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
트랜잭션의 병행성 문제와 해결
트랜잭션이 병행적으로 실행될 때 발생할 수 있는 문제
- 더티 리드(Dirty Read): 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽는 경우. 이는 READ UNCOMMITTED 격리 수준에서 발생]
- 논리적 비관계(Non-repeatable Read): 한 트랜잭션이 데이터를 읽은 후, 다른 트랜잭션이 해당 데이터를 수정하여 이후에 읽을 때 다른 결과가 나오는 경우. 이는 READ COMMITTED 격리 수준에서 발생 가능
- 팬텀 리드(Phantom Read): 한 트랜잭션이 특정 범위의 데이터를 읽은 후, 다른 트랜잭션이 데이터를 삽입하거나 삭제하여 다음 읽기 시 결과가 달라지는 경우. 이는 REPEATABLE READ 격리 수준에서 발생 가능
'CS' 카테고리의 다른 글
| TCP/IP (0) | 2024.08.07 |
|---|---|
| HTTP Request와 Response (0) | 2024.08.06 |
| Git에 대한 모든 것 (0) | 2024.07.31 |
| URL (0) | 2024.07.23 |
| [객체지향 프로그래밍] 객체지향 (0) | 2024.07.22 |