8. 데이터 베이스
아래는 첨부하신 파일의 내용을 원본 그대로 보존하여, 요청하신 순서에 맞게 보기 좋게 정리한 문서입니다.
1. 키(Key) 정리
Key란?
검색, 정렬 시 Tuple을 구분할 수 있는 기준이 되는 Attribute
1. Candidate Key (후보키)
Tuple을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합.
조건:
- 유일성: Key로 하나의 Tuple을 유일하게 식별할 수 있음
- 최소성: 꼭 필요한 속성으로만 구성
2. Primary Key (기본키)
후보키 중 선택한 Main Key
특징:
- Null 값을 가질 수 없음
- 동일한 값이 중복될 수 없음
3. Alternate Key (대체키)
후보키 중 기본키를 제외한 나머지 키 (보조키)
4. Super Key (슈퍼키)
유일성은 만족하지만, 최소성은 만족하지 못하는 키
5. Foreign Key (외래키)
다른 릴레이션의 기본키를 그대로 참조하는 속성의 집합
2. SQL - JOIN
조인이란?
두 개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법으로, 적어도 하나의 칼럼을 서로 공유해야 한다.
JOIN 종류
- INNER JOIN
-
교집합으로, 기준 테이블과 조인 테이블의 중복된 값을 보여준다.
-
예시:
SELECT A.NAME, B.AGE FROM EX_TABLE A INNER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP
-
- LEFT OUTER JOIN
-
왼쪽(기준) 테이블의 값과 조인 테이블의 중복된 값을 보여준다.
-
예시:
SELECT A.NAME, B.AGE FROM EX_TABLE A LEFT OUTER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP
-
- RIGHT OUTER JOIN
-
오른쪽 테이블을 기준으로 조인한다.
-
예시:
SELECT A.NAME, B.AGE FROM EX_TABLE A RIGHT OUTER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP
-
- FULL OUTER JOIN
-
두 테이블의 합집합으로, 모든 데이터를 검색한다.
-
예시:
SELECT A.NAME, B.AGE FROM EX_TABLE A FULL OUTER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP
-
- CROSS JOIN
-
모든 경우의 수를 표현한다.
-
(예: A가 3개, B가 4개면 총 12개의 결과)
-
예시:
SELECT A.NAME, B.AGE FROM EX_TABLE A CROSS JOIN JOIN_TABLE B
-
- SELF JOIN
-
자기 자신과 조인하는 것으로, 하나의 테이블을 여러 번 사용하여 데이터를 비교하거나 변형할 때 사용한다.
-
예시:
SELECT A.NAME, B.AGE FROM EX_TABLE A, EX_TABLE B
-
3. SQL Injection
SQL Injection
해커에 의해 조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법
공격 방법
1) 인증 우회
- 예시:
-
정상 쿼리:
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";
-
SQL Injection 공격 시:
비밀번호와 함께 다른 쿼리문을 같이 입력하는 경우1234; DELETE * USER FROM ID = "1";
-
또는 WHERE절에 OR문을 추가하여
'1' = '1'
같은 true문을 만들어 우회할 수 있음.
-
2) 데이터 노출
- 방법:
- 시스템 에러 메시지를 이용해 공격자가 DB 구조를 유추할 수 있음.
- 예를 들어, GET 방식의 URL 쿼리 스트링을 이용하여 에러를 발생시켜 민감한 정보를 얻음.
방어 방법
-
입력값 검증:
- 특수문자 포함 여부 등을 검사하여, 미리 설정한 값이 들어왔을 때 요청 차단
-
에러 메시지 감추기:
- SQL 서버 에러 발생 시 원본 DB 테이블에 대한 정보를 감추도록 설정
-
preparestatement 사용:
- preparestatement를 사용하면 특수문자 자동 escaping이 되어, SQL Injection 공격을 방어할 수 있음
4. SQL vs NoSQL
SQL과 NoSQL의 차이
웹 애플리케이션 개발 시 데이터베이스 선택의 중요한 기준이 됨.
SQL (관계형 DB)
-
특징:
- 정해진 스키마: 데이터는 미리 정의된 테이블의 구조(필드명, 데이터 유형)에 따라 저장
- 관계: 여러 테이블 간에 관계를 통해 데이터를 분산 저장
- 중복 방지: 한 테이블에 중복 없이 데이터를 저장하여 데이터 무결성 보장
-
장점:
- 명확한 스키마와 무결성 보장
- 중복 없이 데이터를 관리
-
단점:
- 스키마 수정이 어려움
- 복잡한 조인문으로 인한 쿼리 복잡성
- 일반적으로 수직적 확장만 가능
NoSQL (비관계형 DB)
-
특징:
- 스키마 없음: 유연하게 데이터를 저장할 수 있음
- 문서 기반 저장: JSON과 유사한 문서(document) 형태로 데이터 저장
- 관계 없음: 관련 데이터를 하나의 컬렉션에 저장하므로, 조인 개념이 없으며 데이터 중복 가능
-
장점:
- 높은 유연성 (필드 추가 및 구조 변경 용이)
- 읽기 속도 향상 및 수평적 확장 지원
-
단점:
- 데이터 중복 가능성으로 인한 수정 시 어려움
- 명확한 스키마가 없어 데이터 무결성 보장이 어려울 수 있음
5. 정규화 (Normalization)
정규화(Normalization)
데이터의 중복을 줄이고, 무결성을 향상시킬 수 있는 정규화
목적
- 데이터 중복 제거 및 불필요한 데이터 최소화
- 무결성 유지 및 이상 현상(Anomaly) 방지
- 논리적이고 직관적인 테이블 구성
- 데이터베이스 구조 확장 용이
제 1정규화 (1NF)
원본 데이터
변환 후
-
조건:
- 모든 도메인이 원자값(하나의 값)이어야 함
- 반복되는 그룹이 없어야 함
- 기본키를 통해 각 집합을 고유하게 식별할 수 있어야 함
-
예시:
- 전화번호 같이 여러 값을 가진 경우, 이를 분리하여 1NF 만족
제 2정규화 (2NF)
원본
변환 후
-
조건:
- 테이블의 모든 컬럼이 완전 함수적 종속을 만족해야 함
- 복합키의 경우, 기본키의 부분집합으로 다른 컬럼을 결정하면 안 됨
-
예시:
Manufacture
와Model
이 키일 때,Manufacturer Country
가 부분 함수 종속인 경우 이를 분리하여 2NF 만족
제 3정규화 (3NF)
원본
변환 후
-
조건:
- 2NF를 만족한 상태에서 이행적 종속을 제거
- 기본키가 아닌 속성들은 오직 기본키에만 의존해야 함
-
예시:
- 기본키가
Tournament
와Year
인 테이블에서,Winner Date of Birth
가Winner
에 의해 결정되는 경우 테이블 분리 필요
- 기본키가
6. 이상(Anomaly)
[DB] Anomaly
잘못된 테이블 설계로 인해 발생하는 이상 현상
예시:
1. 삽입 이상 (Insertion Anomaly)
- 설명:
- 기본키가 {Student ID, Course ID}인 경우, Course를 수강하지 않은 학생은 Course ID가 없으므로 추가 불가
- 해결을 위해 불필요한 데이터를 추가해야 하는 문제 발생
2. 갱신 이상 (Update Anomaly)
- 설명:
- 예를 들어, 학생의 전공(Department)이 변경될 때 모든 관련 데이터를 수정해야 함
- 일부만 수정되면 데이터 불일치 문제 발생
3. 삭제 이상 (Deletion Anomaly)
- 설명:
- 수강 철회 시, 학생 정보와 함께 불필요한 데이터까지 삭제되는 문제 발생
7. 인덱스(INDEX)
Index(인덱스)
목적
추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조
- 비유: 두꺼운 책의 목차와 같음
- 구조: B+ Tree 등으로 구성되어, 전체 테이블을 풀스캔하지 않고 검색
파일 구성
테이블 생성 시 3가지 파일 생성:
- FRM: 테이블 구조 저장 파일
- MYD: 실제 데이터 파일
- MYI: Index 정보 파일 (인덱스 사용 시 생성)
단점
- .mdb 파일 크기 증가
- 동시 수정 시 병행성 감소
- 인덱스된 필드 업데이트, 레코드 추가/삭제 시 성능 저하
- 자주 변경되는 데이터의 경우 인덱스 재작성 필요
사용 시 고려사항
- 적합한 경우:
- WHERE 절, 외래키, JOIN에 자주 사용되는 칼럼
- 피해야 하는 경우:
- 데이터 중복도가 높은 칼럼, DML이 자주 일어나는 칼럼
DML 발생 시 상황
- INSERT:
- Block에 여유가 없으면 새로운 Block 할당 및 Index split 작업 발생
- DELETE:
- Table은 공간 재활용, Index는 사용 안 함 표시 (Table과 Index의 데이터 수 차이 가능)
- UPDATE:
- Table 업데이트 후 Index는 Delete 후 새로운 Insert 작업 필요 (2배 작업 소요)
인덱스 관리 방식
- B-Tree: 이진 탐색트리와 유사하며, Balanced Tree로 O(log N) 탐색
- B+Tree: B-Tree 개선, 값은 리프노드에만 저장, 리프노드 연결로 부등호 연산에 효과적
- HashTable: 해시 함수를 이용하여 값 인덱싱, 평균 O(1) 성능, 단 부등호 연산 불가
8. 트랜잭션(Transaction)
DB 트랜잭션(Transaction)
트랜잭션이란?
데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위
(예: SELECT, INSERT, DELETE, UPDATE)
트랜잭션 예시
- 송금 예시:
- 사용자 A의 계좌에서 금액 차감 (출금)
- 사용자 B의 계좌에 금액 추가 (입금)
- 두 작업 모두 성공해야 Commit, 하나라도 실패하면 Rollback
트랜잭션의 특징 (ACID)
- 원자성 (Atomicity): 전체 작업이 모두 반영되거나 전혀 반영되지 않음
- 일관성 (Consistency): 트랜잭션 완료 후 DB 상태 일관성 유지
- 독립성 (Isolation): 동시에 실행되는 트랜잭션들이 서로 영향을 주지 않음
- 지속성 (Durability): Commit된 결과는 영구적으로 반영
Commit과 Rollback
- Commit: 트랜잭션 성공 후 DB에 반영
- Rollback: 에러 발생 시 이전 일관된 상태로 복원
DBMS의 트랜잭션 관리 전략
-
DBMS 구조:
- Query Processor와 Storage System으로 구성
- 입출력 단위: 고정 길이의 page 단위
-
Page Buffer Manager (Buffer Manager):
- 메모리 내 page 관리, UNDO/REDO 복구에 영향을 줌
-
UNDO:
- 수정된 페이지가 디스크에 기록되기 전에, 비정상 종료 시 원상 복구
- 정책:
- Steal: 언제든지 디스크에 기록 (UNDO 필요)
- Non-steal: EOT까지 버퍼에 유지 (UNDO 불필요)
-
REDO:
- Commit한 트랜잭션의 수정을 재반영
- 정책:
- FORCE: Commit 시 디스크에 바로 반영 (REDO 불필요)
- Non-FORCE: Commit 시 반영하지 않음 (REDO 필요)
9. 트랜잭션 격리 수준 (Transaction Isolation Level)
트랜잭션 격리 수준(Transaction Isolation Level)
Isolation Level 개념
- 목적:
- 동시에 수행되는 트랜잭션 간에 일관성 없는 데이터를 방지
- 효율적 Locking을 통해 성능과 데이터 무결성 간 균형 유지
Isolation Level 종류
-
Read Uncommitted (레벨 0)
- 특징:
- SELECT 문 수행 시 해당 데이터에 Shared Lock 미적용
- Commit되지 않은 데이터도 읽을 수 있어 일관성 유지 어려움
- 예시: 사용자1이 A를 B로 변경하는 중, 사용자2가 B 읽음
- 특징:
-
Read Committed (레벨 1)
- 특징:
- SELECT 시 Shared Lock 적용, Commit된 데이터만 읽음
- 다른 트랜잭션은 접근 대기
- 대부분의 SQL 서버의 Default Isolation Level
- 특징:
-
Repeatable Read (레벨 2)
- 특징:
- 트랜잭션 완료 시까지 조회한 데이터에 Shared Lock 유지
- 결과의 일관성을 보장
- MySQL의 Default Isolation Level
- 특징:
-
Serializable (레벨 3)
- 특징:
- 트랜잭션 완료 시까지 SELECT한 모든 데이터에 Shared Lock 유지
- 완벽한 읽기 일관성 제공, 다른 트랜잭션은 수정 및 입력 불가능
- 특징:
발생 가능한 현상
-
Dirty Read:
- Commit되지 않은 데이터를 읽는 현상 (Read Uncommitted)
-
Non-Repeatable Read:
- 동일 쿼리 재실행 시 중간에 다른 트랜잭션에 의해 수정되어 결과가 달라지는 현상
- (Read Committed, Read Uncommitted에서 발생)
-
Phantom Read:
- 동일 트랜잭션 내에서 반복 조회 시, 새로운 레코드가 추가되어 결과가 달라지는 현상
- (Repeatable Read, Read Committed, Read Uncommitted에서 발생)
10. 저장 프로시저(Stored PROCEDURE)
저장 프로시저(Stored PROCEDURE)
일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합
개념 및 필요성
-
여러 SQL 쿼리를 한 번에 실행하여 원하는 결과를 얻거나, 반복적인 복잡한 로직을 단순화
-
장점:
- 최적화 & 캐시: 최초 실행 후 컴파일된 상태로 캐시에 저장
- 유지 보수: 변경 시 프로시저 내부만 수정
- 트래픽 감소: 클라이언트와 서버 간 SQL문 전달 최소화
- 보안: 테이블 접근 제한 가능
-
단점:
- 호환성: SQL/PSM 표준과의 낮은 호환성
- 성능: 일반 프로그래밍 언어에 비해 느릴 수 있음
- 디버깅: 에러 발생 시 디버깅 어려움
프로시저 생성 및 호출 예시
(IN) 매개변수 사용 예시
CREATE OR REPLACE PROCEDURE test( name IN VARCHAR2 )
IS
msg VARCHAR2(5) := '내 이름은';
BEGIN
dbms_output.put_line(msg||' '||name);
END;
EXEC test('규글');
출력:
내 이름은 규글
(OUT) 매개변수 사용 예시
CREATE OR REPLACE PROCEDURE test( name OUT VARCHAR2 )
IS
BEGIN
name := 'Gyoogle';
END;
DECLARE
out_name VARCHAR2(100);
BEGIN
test(out_name);
dbms_output.put_line('내 이름은 '||out_name);
END;
출력:
내 이름은 Gyoogle
11. Redis
빠른 오픈 소스 인 메모리 키 값 데이터 구조 스토어
보통 데이터베이스는 하드 디스크나 SSD에 저장한다. 하지만 Redis는 메모리(RAM)에 저장해서 디스크 스캐닝이 필요없어 매우 빠른 장점이 존재함
캐싱도 가능해 실시간 채팅에 적합하며 세션 공유를 위해 세션 클러스터링에도 활용된다.`
RAM은 휘발성 아닌가요? 껐다키면 다 날아가는데..
이를 막기위한 백업 과정이 존재한다.
- snapshot : 특정 지점을 설정하고 디스크에 백업
- AOF(Append Only File) : 명령(쿼리)들을 저장해두고, 서버가 셧다운되면 재실행해서 다시 만들어 놓는 것
데이터 구조는 key/value 값으로 이루어져 있다. (따라서 Redis는 비정형 데이터를 저장하는 비관계형 데이터베이스 관리 시스템이다)
value 5가지
- String (text, binary data) - 512MB까지 저장이 가능함
- set (String 집합)
- sorted set (set을 정렬해둔 상태)
- Hash
- List (양방향 연결리스트도 가능)