군만두의 IT 공부 일지

[스터디3] 데이터베이스 - 06. 트랜잭션과 무결성 본문

학습일지/CS 지식

[스터디3] 데이터베이스 - 06. 트랜잭션과 무결성

mandus 2025. 1. 3. 15:23

목차

     

     

    4.3 섹션인 트랜잭션 위주로 데이터베이스에 대해 정리합니다. 트랜잭션, 인덱스, 조인 모두 공부했던 내용이지만, 계속 복습이 필요한 것 같습니다. 실제 프로젝트에 적용할 때도 유익하니까요.

    4장 데이터베이스

    4.3 트랜잭션과 무결성

    4.3.1 트랜잭션

    • 트랜잭션: 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위. 여러 개의 쿼리들을 하나로 묶는 단위
    • ACID: 원자성, 일관성, 독립성, 지속성
      1. 원자성(atomicity): 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징
      2. 일관성(consistency): 허용된 방식으로만 데이터를 변경해야 하는 것
      3. 격리성(isolation): 트랜잭션 수행 시 서로 끼어들지 못하는 것
        • 격리 수준은 SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED가 있음.
        • 격리 수준에 따라 팬텀 리드(phantom read), 반복 가능하지 않은 조회(non-repeatable read), 더티 리드(dirty read) 현상이 발생함.
      4. 지속성(durability): 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것
        • 데이터베이스에서 체크섬, 저널링, 롤백 기능을 제공함.
    • 트랜잭션의 데이터 무결성 보장
      • 커밋(commit): 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
      • 롤백: 에러나 이슈 등으로 트랜잭션 전으로 돌릴 때 사용하는 명령어
    • 트랜잭션 전파: 트랜잭션을 수행할 때 커넥션 객체를 넘겨서 수행하지 않고, 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것

    4.3.2 무결성

    • 무결성: 데이터의 정확성, 일관성, 유효성을 유지하는 것
    이름 설명
    개체 무결성 기본키로 선택된 필드는 빈 값을 허용하지 않음.
    참조 무결성 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 함.
    고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가짐.
    NULL 무결성 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건임.

    ▲ 무결성 종류 표

    4.4 데이터베이스의 종류

    4.4.1 관계형 데이터베이스

    • 관계형 데이터베이스(RDBMS): 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 데이터베이스
    • SQL 언어를 사용하며, MySQL, PostgreSQL, 오라클, SQL Server, MSSQL 등이 있음.
    1. MySQL: 대부분의 운영체제와 호환되어 가장 많이 사용하는 데이터베이스임.
      • C, C++로 만들어졌음.
      • MyISAM 인덱스 압축 스킬, B-트리 기반의 인덱스, 스레드 기반의 메모리 할당 시스템, 매우 빠른 조인, 최대 64개의 인덱스를 제공함.
      • 대용량 데이터베이스를 위해 설계됨.

    ▲ 2021 스택 오버플로우 조사 결과

    1. PostgreSQL: 디스크 조각이 차지하는 영역을 회수할 수 있는 장치인 VACUUM이 특징임. SQL뿐만 아니라 JSON을 이용해서 데이터에 접근할 수 있음.

    4.4.2 NoSQL 데이터베이스

    • NoSQL(Not Only SQL): SQL을 사용하지 않는 데이터베이스
      1. MongoDB: 와이어드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스
        • JSON을 통해 데이터에 접근할 수 있고, Binary JSON(BJSON) 형태로 데이터가 저장됨.
        • 스키마를 정해 놓지 않고 데이터를 삽입할 수 있음.
      2. redis: 인메모리 데이터베이스. 키-값 데이터 모델 기반의 데이터베이스.
        • 기본적인 데이터 타입은 문자열(string)임.
        • 셋(set), 해시(hash) 등을 지원함.

    4.5 인덱스

    4.5.1 인덱스의 필요성

    • 인덱스(index): 데이터를 빠르게 찾을 수 있는 하나의 장치
    • 인덱스를 설정하면 테이블 안에 내가 찾고자 하는 데이터를 빠르게 찾을 수 있음.

    4.5.2 B-트리

    • 인덱스는 B-트리라는 자료 구조로 이루어짐.
    • B-트리: 루프 노드,  리프 노드, 브랜치 노드로 나뉨.
    -- B-트리 예
                                  [10 | 20]                             --(루트 노드)
                    /                 |                 \
              [5 | 7]             [12 | 15]             [25 | 30]       --(브랜치 노드)
            /   |   \             /      \               /      \
         [1|3] [6] [8|9]       [11]    [13|14]         [22]   [28|29]   --(리프 노드)
    • 인덱스가 효율적인 이유는 효율적인 단계 거쳐 모든 요소에 접근할 수 있는 균형 잡힌 트리 구조와 트리 깊이가 리프 노드 수에 비해 매우 느리게 성장하는 트리 깊이의 대수확장성 때문임.

    4.5.3 인덱스 만드는 방법

    • 데이터베이스마다 인덱스를 만드는 방법은 다름.
    1. MySQL
      • 클러스터형 인덱스: 테이블당 하나를 설정할 수 있음. primary key 옵션이나 unique not null 옵션으로 만들 수 있음.
      • 세컨더리 인덱스: 보조 인덱스로 여러 개의 필드 값을 기반으로 쿼리를 많이 보낼 때 생성해야 하는 인덱스. create index ... 명령어를 기반으로 만들 수 있음.
    2. MongoDB: 도큐먼트를 만들면 자동으로 ObjectID가 형성되며, 해당 키가 기본키로 설정됨. 세컨더리키도 부가적으로 설정해서 기본키와 세컨더리키를 같이 쓰는 복합 인덱스를 설정할 수 있음.

    4.5.4 인덱스 최적화 기법

    • 데이터베이스마다 다르지만 기본 골조는 같음.
    • MongoDB 기반 인덱스 최적화 기법
      1. 인덱스는 비용임.
        • 인덱스는 두 번(인덱스 리스트, 컬렉션 순) 탐색하도록 강요함.
        • 컬렉션이 수정되었을 때 인덱스도 수정되어야 함.
        • 쿼리에 있는 필드에 인덱스를 무작정 설정하는 것은 답이 아님.
      2. 항상 테스팅해야 함.
        • 서비스에서 사용하는 객체의 깊이, 테이블의 양 등이 다르기 때문에 항상 테스팅하는 것이 중요함.
      3. 복합 인덱스는 같음, 정렬, 다중 값, 카디널리티 순으로 생성해야 함.
        • 여러 필드를 기반으로 조회할 때 복합인덱스를 생성하는데 아래 생성 순서에 따라 성능이 달라짐.
          1. 어떠한 값과 같음을 비교하는 ==이나 equal이라는 쿼리를 인덱스로 먼저 설정함.
          2. 정렬에 쓰는 필드를 인덱스로 설정함.
          3. 다중 값을 출력해야 하는 필드(쿼리 자체가 >이거나 < 등 많은 값을 출력해야 하는 쿼리에 쓰는 필드)를 인덱스로 설정함.
          4. 카디널리티(유니크한 값의 정도)가 높은 순서를 기반으로 인덱스를 생성함.

    4.6 조인의 종류

    • 조인(join): 하나의 테이블이 아닌 두 개 이상의 테이블을 묶어서 하나의 결과물을 만드는 것
    • MySQL에서는 JOIN이라는 쿼리로, MongoDB에서는 lookup이라는 쿼리(성능이 떨어짐)로 이를 처리할 수 있음.
    • 조인의 종류(이미지 참고)
      1. 내부 조인(inner join): 왼쪽 테이블과 오른쪽 테이블의 두 행이 모두 일치하는 행
      2. 왼쪽 조인(left outer join): 왼쪽 테이블의 모든 행
      3. 오른쪽 조인(right outer join): 오른쪽 테이블의 모든 행
      4. 합집합 조인(full outer join): 두 개의 테이블을 기반으로 조인 조건에 만족하지 않는 행 모두

    ▲ SQL Joins Visualizer 사이트에서 확인한 조인의 종류

    4.6.1 내부 조인

    • 내부 조인: 두 테이블 간 교집합
    SELECT * FROM TableA A
    INNER JOIN TableB B ON
    A.key = B.key

    4.6.2 왼쪽 조인

    • 왼쪽 조인: 테이블 B에서 일치하는 부분의 레코드와 테이블 A를 기준으로 완전한 레코드 집합을 생성함.
    SELECT * FROM TableA A
    LEFT JOIN TableB B ON
    A.key = B.key

    4.6.3 오른쪽 조인

    • 오른쪽 조인: 테이블 A에서 일치하는 부분의 레코드와 테이블 B를 기준으로 완전한 레코드 집합을 생성함.
    SELECT * FROM TableA A
    RIGHT JOIN TableB B ON
    A.key = B.key

    4.6.4 합집합 조인

    • 합집합 조인(완전 외부 조인): 양쪽 테이블에서 일치하는 레코드를 포함해 테이블 A와 테이블 B의 모든 레코드 집합을 생성함.
    SELECT * FROM TableA A
    FULL OUTER JOIN TableB B ON
    A.key = B.key

    4.7 조인의 원리

    4.7.1 중첩 루프 조인

    • 중첩 루프 조인(NLJ: Nested Loop Join): 중첩 for 문과 같은 원리로 조건에 맞는 조인을 하는 방법
    • 랜덤 접근에 대한 비용이 많이 증가하므로 대용량 테이블에서는 사용하지 않음.
    • 블록 중첩 루프 조인(BNL: Block Nested Loop): 조인할 테이블을 작은 블록으로 나눠서 블록 하나씩 조인하는 방법

    4.7.2 정렬 병합 조인

    • 정렬 병합 조인: 테이블을 조인할 필드 기준으로 정렬하고 정렬이 끝난 후에 조인 작업을 수행하는 조인
    • 조인할 때 사용할 인덱스가 없고, 대용량의 테이블들을 조인하는 조건으로 범위 비교 연산자가 있을 때 사용함.

    4.7.3 해시 조인

    • 해시 조인: 해시 테이블을 기반으로 조인하는 방법
    • 중첩 루프 조인보다 효율적임. 동등 조인에서만 사용할 수 있음.
    • MySQL의 해시 조인 단계
      1. 빌드 단계: 입력 테이블 중 하나를 기반으로 메모리 내 해시 테이블을 빌드하는 단계
      2. 프로브 단계: 레코드 읽기를 시작하며, 각 레코드에서 일치하는 레코드를 찾아서 결과값을 반환함.

    이 글은 면접을 위한 CS 전공지식 노트 책을 학습한 내용을 정리한 것입니다.
    Comments