📄

정보처리기사 대비 - 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단계

  1. Read Uncommitted
    1. 커밋 안된것도 읽기 때문에 Dirty Read 발생
  2. Read Committed
    1. 커밋된 것만 읽음
    2. Non-Repeatable, Phantom 가능
  3. Repeatable Read(MySQL 설정)
    1. 한 번 읽은 행은 끝날때까지 안 바뀜(비동기적으로)
    2. Dirty 방지
    3. Non-Repeatable 방지
    4. Phantom 가능 - 새로운건 못 읽기 때문
  4. Serializable
    1. 세가지 항목 모두 방지하지만, 너무 느림
    2. 동시 처리량 떨어져
    3. 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 못탐.
이름이랑 주민등록번호 처럼 유니크하고 다양성 있는 데이터에 하면 좋음

  1. 컬럼값이 얼마나 고유한가
  2. 선택도가 높아야 인덱스 효율이 좋다.

정규화

Why? 데이터 중복 제거 + 이상 방지(삽입, 삭제, 갱신)

  1. 1NF
    1. 원자값만 가져야 한다.
    2. 값 여러개 X
  2. 2NF
    1. 부분 함수 종속 제거
    2. 기본키 전체에 종속돼야 한다.
  3. 3NF
    1. 이행적 종속 제거
    2. A→B, B→C ⇒ A→C 이게 되면 안된다.

조인(Join)

  1. Inner join
    1. 공통되는 데이터만 가져온다.
    2. 주문한 고객
  2. Left join
    1. 왼쪽 테이블 기준(왼쪽 테이블 다 나와야 함)
    2. 오른쪽이 없으면 Null
  3. Right join
    1. 오른쪽 테이블을 기준으로
    2. 오른쪽 다 나옴
    3. 왼쪽 없으면 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 실행 순서

  1. FROM
  2. WHERE ← 그룹 전에 필터
  3. GROUP BY
  4. HAVING ← 그룹 후 필터
  5. SELECT
  6. 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 하나라도 있으면 결과가 전부 안 나올 수 있다

Comments_Log
TERMINAL
DEBUG CONSOLE
OUTPUT
~/stay-young-loggit(main)npm run comment:write
nickname:
content:
-- TOTAL COMMENTS: 0 --
[LOADING...] fetching data from supabase...