1. 데이터베이스(DB)란?
- 조직 내에서 필요한 정보를 체계적으로 축적하고 제공하는 정보 서비스 기관의 핵심.
- DB 자체로는 아무것도 못하고, 관리 시스템(DBMS)과 함께 제공됨.
2. 데이터베이스 관리 시스템(DBMS)
- 사용자와 데이터베이스 사이에서 정보를 생성하고 관리해주는 소프트웨어.
- 예시: MySQL, Oracle 등.
3. SQL (Structured Query Language)
- 관계형 데이터베이스 관리 시스템의 데이터를 관리하기 위한 프로그래밍 언어.
SQL의 3가지 명령어
- DDL (Data Definition Language):
- 설명: 데이터베이스 구조를 정의하거나 수정하는 언어.
- 주요 명령어: CREATE, ALTER, DROP.
- 비유: 건물을 짓고 수정하는 것.
- DML (Data Manipulation Language):
- 설명: 데이터베이스 내의 데이터를 조회, 추가, 수정, 삭제하는 언어.
- 주요 명령어: SELECT, INSERT, UPDATE, DELETE.
- 비유: 서류 파일에서 정보를 읽고, 추가하고, 수정하고, 삭제하는 것.
- DCL (Data Control Language):
- 설명: 데이터베이스의 접근 권한과 보안을 관리하는 언어.
- 주요 명령어: GRANT, REVOKE.
- 비유: 건물의 출입권한을 부여하거나 취소하는 것.
- TCL (Transaction Control Language):
- 설명: 데이터베이스 트랜잭션을 관리하는 언어.
- 주요 명령어: COMMIT, ROLLBACK, SAVEPOINT, RELEASE SAVEPOINT, SET TRANSACTION.
- 비유: 작업의 확정과 취소, 중간 저장.
4. 관계형 데이터베이스 관리 시스템(RDBMS)
- 관계형 데이터 모델을 기초로 두고 데이터를 2차원 테이블 형태로 관리.
- 테이블 간의 관계 정의: 일대일, 일대다, 다대다.
- 장점: 스키마에 맞춰 관리 하기 때문에 명확한 데이터 구조와 데이터 정합성 보장.
- 단점: 쿼리가 복잡해지고, 스키마 변경이 어려우며, 성능 향상을 위해서 Scale-up만 지원.
스키마란 : 데이터베이스의 전체적인 구조와 무결성을 관리하기 위한 청사진을 의미하며, 이를 통해 데이터의 명확성과 정합성(규칙과 제약조건 있음)을 보장
5. 비관계형 데이터베이스(NoSQL)
- RDBMS의 스케일링 한계를 극복하기 위해 등장.
- 데이터의 일관성을 포기하되 Scale-out을 목표로 함.
- 테이블 간 관계를 정의하지 않으며, 주로 비정형 데이터를 저장.
- 주요 유형: Key-Value, Document, Wide Column, Graph Database.
- 장점: 유연하고 자유로운 데이터 구조, 데이터 분산이 용이.
- 단점: 데이터 중복 발생 가능, 명확한 데이터 구조 보장 어려움.
6. 주요 NoSQL 데이터베이스 유형
- Key-Value Database: 데이터가 Key와 Value의 쌍으로 저장.
- Document Database: 데이터가 Key와 Document 형태로 저장. JSON, XML 등 사용.
- Wide Column Database: Key에서 필드를 결정하고 저장.
- Graph Database: 데이터가 Node와 Edge, Property로 저장. 데이터 간의 관계 탐색에 적합.
7. SQL JOIN
- 테이블 간의 데이터를 결합하는 연산.
- 유형: Inner Join, Left Join, Right Join, Outer Join.
8. Index
- 테이블을 처음부터 끝까지 검색하는 대신 인덱스를 검색하여 테이블을 엑세스.
- 데이터 검색 속도를 높이는 기능.
- 단점: INSERT, UPDATE, DELETE 시 오버헤드 발생.
9. 트랜잭션
- 데이터의 정합성을 보장하기 위한 기능.
- 트랜잭션 제어어(TCL): COMMIT, ROLLBACK.
- 트랜잭션의 ACID 특성: 원자성, 일관성, 격리성, 지속성.
트랜잭션은 데이터베이스에서 일어나는 하나의 작업 단위,
주요 특성
원자성(Atomicity): 트랜잭션의 모든 작업이 완벽히 이루어지거나, 전혀 이루어지지 않거나 둘 중 하나입니다. 실패 시 모든 변경 사항이 취소
일관성(Consistency): 트랜잭션이 성공적으로 완료되면 데이터베이스는 항상 일관성 있는 상태를 유지
격리성(Isolation): 동시에 여러 트랜잭션이 수행되더라도, 각 트랜잭션은 독립적으로 실행
지속성(Durability): 트랜잭션이 완료되면 그 결과는 영구적으로 데이터베이스에 반영
예를 들면
마트에서 물건 사기:
물건을 고른다.
카운터에서 계산한다.
영수증을 받는다.
이 모든 단계가 하나의 트랜잭션. 계산이 끝나기 전까지는 물건을 사는 모든 과정이 취소될 수 있음.. 예를 들어, 카드 결제가 실패하면 물건을 사지 못하게 되고, 처음 상태로 돌아가게 됨
이처럼 트랜잭션은 데이터베이스에서 여러 작업을 하나의 단위로 묶어서 처리하여, 모든 작업이 성공적으로 완료되거나 모두 실패하도록 보장하는 중요한 개념
10. 트랜잭션의 격리 수준
- 트랜잭션 간의 격리성을 설정하는 수준.
격리성을 완벽히 보장하려면 동시에 처리되는 트랜잭션을 거의 순서대로 실행해야 한다. 하지만 이렇게 처리를 하면 처리 성능이 매우 나빠지게 된다.
때문에 격리성은 동시성과 관련된(ex.동시에 같은 데이터를 수정하여 영향) 성능 이슈로 인해 격리 수준을 선택할 수 있다.
- 격리 수준 유형: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE.
- 문제점: DIRTY READ, NON-REPEATABLE READ, PHANTOM READ.
READ UNCOMMITTED (커밋되지 않은 읽기):
비유: 아직 결제하지 않은 쇼핑 목록을 다른 사람이 볼 수 있습니다.
문제: 결제 취소 시, 다른 사람이 본 정보는 잘못된 정보가 됩니다. (DIRTY READ)
READ COMMITTED (커밋된 읽기):
비유: 결제가 완료된 물건만 다른 사람이 볼 수 있습니다.
문제: 결제 후 목록이 바뀌면, 다른 사람이 같은 목록을 두 번 봤을 때 결과가 달라집니다. (NON-REPEATABLE READ)
REPEATABLE READ (반복 가능한 읽기):
비유: 처음 본 물건의 수량은 변하지 않지만, 새로운 물건이 추가될 수 있습니다.
문제: 새로운 물건이 추가되면, 처음에는 없었던 물건이 두 번째 조회에서 나타납니다. (PHANTOM READ)
SERIALIZABLE (직렬화 가능):
비유: 한 사람씩 차례로 쇼핑하도록 해서, 다른 사람이 쇼핑을 끝낼 때까지 기다려야 합니다.
문제: 가장 안전하지만, 쇼핑 시간이 오래 걸립니다. (성능 저하)
커밋 : 데이터베이스에서 트랜잭션을 완료하고, 그 동안의 변경 사항을 영구적으로 저장하는 작업.
예를 들어 마트에서 물건을 구매하고 영수증을 받는 것처럼, 트랜잭션을 확정 짓는 중요한 단계.
11. 동시성 제어
- 동시에 실행되는 트랜잭션의 실행 순서를 제어.
- 기법: 락킹, 타임스탬프, 적합성 검증.
- 락킹(Locking):
- 설명: 트랜잭션이 데이터에 접근하기 전에 해당 데이터에 락을 걸어 다른 트랜잭션이 접근하지 못하게 합니다.
- 유형:
- 비관적 락 (Pessimistic Lock): 데이터에 접근할 때마다 즉시 락을 걸어 다른 트랜잭션이 접근하지 못하게 함
- 공유 락(Shared Lock): 데이터 읽기는 허용하지만 쓰기는 불허합니다.
- 베타 락(Exclusive Lock): 데이터 읽기와 쓰기 모두 다른 트랜잭션이 할 수 없게 합니다.
- 낙관적 락 (Optimistic Lock): 트랜잭션이 일단 모든 작업을 수행하고, 커밋하기 전에 데이터의 일관성을 검사합니다. 만약 충돌이 발생하면 트랜잭션을 롤백하고 다시 시도. 낙관적 락을 구현하는 주요 방법 중 하나는 버전 관리(Versioning)
- 비관적 락 (Pessimistic Lock): 데이터에 접근할 때마다 즉시 락을 걸어 다른 트랜잭션이 접근하지 못하게 함
- 타임스탬프(Timestamp):
- 설명: 각 트랜잭션에 고유한 타임스탬프를 부여하여, 타임스탬프 순서대로 트랜잭션을 처리합니다.
12. 정규화
- 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위한 방법.
- 정규형: 제1정규형, 제2정규형, 제3정규형, BCNF 정규형.
- 제1정규형: 모든 필드의 값이 원자값(더 이상 분해할 수 없는 값)이어야 합니다.쉽게 말해: 셀에 여러 값을 넣지 마세요.
- 제2정규형: 제1정규형을 만족하면서, 기본 키에 완전 함수 종속인 속성만 포함해야 합니다. 쉽게 말해: 기본 키의 일부에만 의존하는 컬럼을 없애세요.
- 제3정규형: 제2정규형을 만족하면서, 기본 키가 아닌 속성이 다른 기본 키 아닌 속성에 종속되지 않아야 합니다. 쉽게 말해: 기본 키 외 다른 컬럼에 의존하는 컬럼을 없애세요.
- BCNF 정규형: 제3정규형을 만족하면서, 모든 결정자가 후보 키가 되어야 합니다. 쉽게 말해: 후보 키가 아닌 컬럼이 결정자로 있지 않도록 하세요.
결정자(Determinant)란?
- 결정자는 특정 컬럼의 값이 다른 컬럼의 값을 결정하는 경우, 그 컬럼을 결정자라고 합니다.
- 쉽게 말해: 하나의 값이 다른 값을 고유하게 결정짓는 컬럼입니다.
후보 키(Candidate Key)란?
- 후보 키는 테이블에서 각 행(row)을 고유하게 식별할 수 있는 최소한의 컬럼 집합입니다. 후보 키는 유일성과 최소성을 만족해야 합니다.
- 쉽게 말해: 테이블의 모든 행을 고유하게 식별할 수 있는 컬럼 또는 컬럼들의 조합입니다.
예시로 설명
테이블 예시
학생ID이름이메일학번
1 | 홍길동 | hong@example.com | 201901 |
2 | 이순신 | lee@example.com | 201902 |
3 | 강감찬 | kang@example.com | 201903 |
- 결정자:
- 학생ID는 각 행의 고유한 학생을 식별할 수 있습니다. 즉, 학생ID의 값이 결정되면 이름, 이메일, 학번의 값을 알 수 있습니다. 따라서 학생ID는 결정자입니다.
- 후보 키:
- 학생ID는 모든 행을 고유하게 식별할 수 있으므로 후보 키가 됩니다.
- 이메일도 모든 행을 고유하게 식별할 수 있으므로 후보 키가 됩니다.
- 학번도 모든 행을 고유하게 식별할 수 있으므로 후보 키가 됩니다.
요약
- 결정자(Determinant): 다른 컬럼의 값을 고유하게 결정하는 컬럼. 예를 들어, 학생ID.
- 후보 키(Candidate Key): 테이블의 모든 행을 고유하게 식별할 수 있는 최소한의 컬럼 집합. 예를 들어, 학생ID, 이메일, 학번.
13. 클러스터링, 리플리케이션, 샤딩
- 클러스터링: 여러 대의 서버를 하나의 클러스터로 구성하여 고가용성을 보장.
데이터 가용성: 하나의 서버가 고장 나도 다른 서버에서 데이터를 사용할 수 있습니다.
부하 분산: 작업을 여러 노드에 분산시켜 처리 성능을 향상시킵니다.
- 리플리케이션: 데이터를 여러 대의 서버에 복제하여 데이터의 가용성과 성능을 향상.
데이터 가용성: 하나의 서버가 고장 나도 다른 서버에서 데이터를 사용할 수 있습니다.
읽기 성능 향상: 슬레이브 서버에서 데이터를 읽어와서 마스터 서버의 부하를 줄입니다.
- 샤딩: 데이터를 여러 샤드로 분할하여 데이터베이스의 확장성을 높임.(작은 데이터베이스를 샤드(shard))
데이터 분산: 데이터를 여러 샤드에 분산하여 저장합니다.
쓰기 성능 향상: 각 샤드에 데이터가 분산되어 쓰기 작업의 병목 현상이 줄어듭니다.
- RDBMS vs NoSQL 차이
- RDBMS: 데이터 정합성 보장, (Scale-up : 성능 향상을 위해 서버의 확장을 의미)
- NoSQL: 유연한 데이터 구조, (Scale-out : 수평적 확장성 )
- *정합성 = 무모순성 : 어떤 사람의 언어 혹은 논변이 그것을 포함하는 전제들의 체계를 무너뜨리지 않고 잘 어울린다.
- *데이터 무결성 (data integrity) : 데이터 값이 정확한 상태
- 적합한 상황
- RDBMS: 데이터 구조가 명확하고 변경 가능성이 적은 경우.
- NoSQL: 데이터 구조가 비정형적이고 확장 가능성이 큰 경우.
- Index 설명
- 인덱스는 데이터 검색 속도를 높이며, 조회가 빈번할 때 유용.( 조회는 full table scan 보다 빠름)
- 인덱스 관리: B+Tree, 해시 테이블.
- 트랜잭션 설명
- 트랜잭션은 데이터의 정합성을 보장하며, COMMIT과 ROLLBACK으로 관리.
- 트랜잭션의 ACID 특성.
- 트랜잭션의 격리 수준과 문제점
- 격리 수준: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE.
- 문제점: DIRTY READ, NON-REPEATABLE READ, PHANTOM READ.
- 동시성 제어 기법
- 락킹: 비관적 락, 낙관적 락.
- 타임스탬프, 적합성 검증.
- DB 락 설명
- 트랜잭션 처리의 순차성을 보장.
- 낙관적 락, 비관적 락.
- 행의 개수가 많은 테이블 설계
- 클러스터링, 샤딩, 리플리케이션을 사용하여 트래픽 분산.
'컴퓨터보안 > 웹서버' 카테고리의 다른 글
커맨드 인젝션 (Command Injection) (0) | 2024.05.21 |
---|---|
NoSQL Injection 기법 정리(MongoDB) (0) | 2024.05.20 |
NoSQL Injection (0) | 2024.05.20 |
ServerSide: SQL Injection (0) | 2024.05.16 |
SQL 문법 예시 및 정리 (0) | 2024.05.15 |