📄
정보처리기사 대비 - DB
v1.0.0@young_log|License|Published on 2026-02-21
"No description provided for this extension."
Details
Changelog
Dependencies
트랜잭션의 4대 특성
- A - Atomicity(원자성)
- All or Nothing
- 도중에 실패하면 Rollback
- 영속성 컨텍스트 관련
- C - Consistency(일관성)
- DB는 항상 정상 상태를 유지해야 한다.
- 무결성 제약조건 유지
- 타입, FK, Not null 깨지면 안된다.
- I - Isolation(격리성)
- 동시에 실행되어도 서로 영향 최소화
- 없으면 Dirty Read: 커밋되지 않은 데이터를 읽음
- Non-Repeatable Read - 재실행했는데 데이터 수정되어 있음
- Phantom - 재실행 했는데 행이 생겼거나 줄어듬
- D - Durability(지속성)
- Commit 되면 영구 저장
- 서버가 꺼져도 살아있다.
격리 수준 4단계
- Read Uncommitted
- 커밋 안된것도 읽기 때문에 Dirty Read 발생
- Read Committed
- 커밋된 것만 읽음
- Non-Repeatable, Phantom 가능
- Repeatable Read(MySQL 설정)
- 한 번 읽은 행은 끝날때까지 안 바뀜(비동기적으로)
- Dirty 방지
- Non-Repeatable 방지
- Phantom 가능 - 새로운건 못 읽기 때문
- Serializable
- 세가지 항목 모두 방지하지만, 너무 느림
- 동시 처리량 떨어져
- Deadlock 잘 발생- Lock을 많이 걸기 때문
교착 상태(Lock & Deadlock)
- Lock
- 여러 트랜잭션이 동시에 같은 데이터를 건들때 충돌 방지를 위한 “잠금”
- Shared Lock (S-lock, 읽기 잠금) - 나 읽는 중
- Exculsive Lock(S-lock, 쓰기 잠금) - 나 수정 중
- 여러 트랜잭션이 동시에 같은 데이터를 건들때 충돌 방지를 위한 “잠금”
- Dead Lock
- 서로가 서로으이 락이 풀리길 기다리면서 영원히 멈춤 상태
- Dead Lock 해결 방안
- 타임아웃: 오래 기다리면 강제 종료
- 롤백: 둘 중 하나 취소
- 락 획득 순서 통일: 1→2
인덱스
데이터를 빨리 찾기 위한 목차
인덱스가 없으면 Full Scan 해야함..
- B-tree
- 균형트리, 탐색시간, 범위 검색에 유리
- 이진 탐색처럼 줄여나가면서 찾는다.
- 단점
- 데이터가 바뀌면 인덱스도 재정렬
- 쓰기 성능 느려짐
그래서 조회 많은 컬럼에만 인덱스 걸기(WHERE절)
그런데 와일드 카드(%)랑 연산은 B-tree 못탐.
이름이랑 주민등록번호 처럼 유니크하고 다양성 있는 데이터에 하면 좋음
- 컬럼값이 얼마나 고유한가
- 선택도가 높아야 인덱스 효율이 좋다.
정규화
Why? 데이터 중복 제거 + 이상 방지(삽입, 삭제, 갱신)
- 1NF
- 원자값만 가져야 한다.
- 값 여러개 X
- 2NF
- 부분 함수 종속 제거
- 기본키 전체에 종속돼야 한다.
- 3NF
- 이행적 종속 제거
- A→B, B→C ⇒ A→C 이게 되면 안된다.
조인(Join)
- Inner join
- 공통되는 데이터만 가져온다.
- 주문한 고객
- Left join
- 왼쪽 테이블 기준(왼쪽 테이블 다 나와야 함)
- 오른쪽이 없으면 Null
- Right join
- 오른쪽 테이블을 기준으로
- 오른쪽 다 나옴
- 왼쪽 없으면 Null
GROUP BY / HAVING
-
Group by
- 같은 값을 가진 행끼리 묶는 것
SELECT 고객id, SUM(금액) // 어떤 컬럼? FROM 주문 // 어떤 테이블? GROUP BY 고객id; // 이거별로 묶어서 ㅎㅎ -
Where(그룹 전 필터, 일반 조건) vs Having(그룹 후 필터, 집계 조건)
SELECT 고객id, SUM(금액) AS total FROM 주문 GROUP BY 고객id HAVING SUM(금액) >= 2500;
SQL 실행 순서
- FROM
- WHERE ← 그룹 전에 필터
- GROUP BY
- HAVING ← 그룹 후 필터
- SELECT
- ORDER BY
서브 쿼리(Subquery)
쿼리 안에 또 다른 쿼리
SELECT *
FROM 고객
WHERE id IN (
SELECT 고객id
FROM 주문
);-
IN
WHERE 고객id IN (SELECT 고객id FROM 주문)결과값 비교
-
EXISTS - 안전 모드
WHERE EXISTS ( SELECT 1 FROM 주문 o WHERE o.customer_id = c.id )- 존재 여부만 확인, 하나라도 찾으면 TRUE
서브 쿼리 안에 NULL 하나라도 있으면 결과가 전부 안 나올 수 있다