면접을 위한 CS 전공지식 노트 - 트랜잭션과 무결성/데이터베이스의 종류

트랜잭션, 무결성, DB 종류
면접을 위한 CS 전공지식 노트트랜잭션무결성DB종류
avatar
2025.05.22
·
27 min read

6290

트랜잭션과 무결성

트랜잭션

트랜잭션은 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위로, 여러 개의 쿼리를 하나로 묶은 것을 의미합니다. 트랜잭션은 ACID(원자성, 일관성, 격리성, 지속성) 특징을 가집니다.

원자성 (Atomicity)

"All or nothing" 원칙으로, 트랜잭션과 관련된 모든 작업이 전부 수행되거나 또는 전부 수행되지 않음을 보장합니다.

  • 커밋 후 문제 발생으로 롤백 시, 이후 작업들이 모두 수행되지 않음을 보장합니다.

  • 트랜잭션 내부에 외부 API 호출이 포함된 경우, 롤백 시 처리 방안을 마련하고 트랜잭션 전파 관리에 주의해야 합니다.

  • 커밋과 롤백은 데이터 무결성을 보장하며, 변경 사항 확인 및 작업 그룹화를 용이하게 합니다.

    • 커밋 (Commit): 여러 쿼리가 성공적으로 처리되었음을 확정하는 명령어로, 변경 내용이 영구적으로 저장됩니다. "커밋이 수행되었다"는 "하나의 트랜잭션이 성공적으로 수행되었다"와 동일한 의미입니다.

    • 롤백 (Rollback): 트랜잭션으로 처리된 묶음 과정을 이전 상태로 되돌리는(취소하는) 작업입니다.

    • 트랜잭션 전파 (Transaction Propagation): 여러 트랜잭션 관련 메서드 호출을 하나의 트랜잭션에 묶이도록 하여, 매번 커넥션 객체를 전달하는 번거로움을 줄이는 매커니즘입니다.

일관성 (Consistency)

데이터는 '허용된 방식'으로만 변경되어야 하며, 데이터베이스에 기록된 모든 데이터는 여러 조건과 규칙에 따라 유효성을 유지해야 합니다.

격리성/독립성 (Isolation)

트랜잭션 수행 시 다른 트랜잭션의 간섭을 받지 않아야 합니다. 여러 사용자가 동일 데이터에 접근할 수 있도록 하면서, 복수의 병렬 트랜잭션은 서로 격리되어 순차적으로 실행되는 것처럼 보여야 합니다. 단순 순차 실행은 성능 저하를 유발할 수 있습니다.

격리성은 여러게의 격리 수준으로 나뉘어 격리성을 보장합니다.

격리 수준 (Isolation Levels)

발생 가능 현상

↑ 독립성 강함/격리성 약함

READ_UNCOMMITTED

더티 리드, 반복 불가능한 조회, 팬텀리드

READ_COMMITTED

반복 불가능한 조회, 팬텀리드

REPEATABLE_READ

팬텀 리드

↓ 독립성 약함/격리성 강함

SERIALIZABLE

없음 (이론상)

  • SERIALIZABLE: 트랜잭션을 순차적으로 진행시켜, 여러 트랜잭션이 동시에 같은 행에 접근할 수 없습니다. 가장 엄격하며 교착 상태 발생 가능성이 높고 성능이 가장 낮습니다.

  • REPEATABLE_READ: 한 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 하지만, 새로운 행 추가는 막지 않아 팬텀 리드가 발생할 수 있습니다. MySQL 8.0 innoDB의 기본값입니다.

  • READ_COMMITTED: 가장 많이 사용되는 격리 수준으로, PostgreSQL, SQL Server, Oracle의 기본값입니다. 커밋된 데이터만 읽을 수 있지만, 한 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있어 반복 불가능한 조회가 발생할 수 있습니다.

  • READ_UNCOMMITTED: 가장 낮은 격리 수준으로, 커밋되지 않은 데이터도 읽을 수 있어 빠르지만 데이터 무결성 문제가 발생할 수 있습니다. 정확도보다 속도가 중요한 대용량 데이터의 어림짐작 집계 등에 사용될 수 있습니다.

격리 수준에 따른 현상은 다음과 같습니다.

  • 더티 리드(Dirty Read): 한 트랜잭션이 다른 트랜잭션에 의해 수정되었으나 아직 '커밋되지 않은' 행의 데이터를 읽는 현상입니다.

  • 반복 불가능한 조회 (Non-Repeatable Read): 한 트랜잭션 내에서 같은 행에 두 번 이상 조회가 발생했을 때 그 값이 다르게 나타나는 현상입니다. (다른 트랜잭션의 수정 및 커밋으로 인해 발생)

  • 팬텀 리드 (Phantom Read): 한 트랜잭션 내에서 동일한 쿼리를 수행했을 때, 이전 조회 결과에 없던 새로운 행이 나타나거나 있던 행이 사라지는 현상입니다. (다른 트랜잭션의 행 삽입/삭제 및 커밋으로 인해 발생)

지속성 (Durability)

성공적으로 수행된 트랜잭션은 영구적으로 반영되어야 하는 것을 의미합니다. 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻하며, 데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공합니다.

  • 체크섬 (Checksum): 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 중복 검사 방법입니다.

  • 저널링 (Journaling): 파일 시스템이나 데이터베이스 시스템에 변경 사항을 반영(commit)하기 전에 로깅하는 것으로, 트랜잭션 등 변경 사항에 대한 로그를 남깁니다.

무결성 (Integrity)

데이터의 정확성, 일관성, 유효성을 유지하는 것을 의미하며, 데이터베이스의 값과 현실 세계 실제 값의 일치를 보장하여 신뢰성을 부여합니다.

무결성 종류

설명

개체 무결성

기본키로 선택된 필드는 빈 값(NULL)을 허용하지 않습니다.

참조 무결성

서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 합니다.

고유 무결성

특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 그 속성 값은 모두 고유해야 합니다.

NULL 무결성

특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우, 그 속성 값은 NULL이 될 수 없습니다.

데이터베이스의 종류

관계형 데이터베이스 (RDBMS: Relational Database Management System)

행과 열을 가지는 표 형식 데이터를 저장하며, SQL 언어를 사용하여 조작합니다. 대표적인 예로는 MySQL, PostgreSQL, Oracle, SQL Server, MSSQL 등이 있습니다. 각 제품은 표준 SQL을 따르지만, 특화된 SQL(예: Oracle의 PL/SQL, SQL Server의 T-SQL)을 사용하기도 합니다.

MySQL

  • 특징:

    • 높은 호환성 및 시장 점유율: 대부분의 운영체제와 호환되며, 널리 사용되어 커뮤니티 및 자료가 풍부합니다.

    • 다양한 기능 및 최적화: C, C++ 기반으로 MyISAM 인덱스 압축, B-트리 기반 인덱스, 스레드 기반 메모리 할당, 빠른 조인, 최대 64개 인덱스 등 성능 향상을 위한 다양한 기능을 제공합니다.

    • 대용량 처리 및 보안: 대용량 데이터베이스 처리를 위해 설계되었으며, 롤백, 커밋, 이중 암호 지원 등 보안 관련 기능을 지원합니다.

    • 모듈식 스토리지 엔진: 스토리지 엔진(예: InnoDB, MyISAM)을 비교적 쉽게 교체할 수 있어, 데이터 웨어하우징, 트랜잭션 처리, 고가용성 등 다양한 요구사항에 맞출 수 있습니다.

    • 쿼리 캐시: 입력된 쿼리 문의 전체 결과 집합을 저장하여, 동일 쿼리 요청 시 파싱,

  • 단점:

    • 복잡한 쿼리 성능: 매우 복잡한 JOIN이나 서브쿼리가 많은 경우 PostgreSQL에 비해 성능이 떨어질 수 있습니다.

    • 스토리지 엔진 제한: 사용하는 스토리지 엔진에 따라 트랜잭션 지원 여부나 기능적 제약이 있을 수 있습니다.

    • 라이선스: Oracle에 인수된 이후 일부 고급 기능이나 특정 에디션에 상용 라이선스가 필요할 수 있습니다.

PostgreSQL

  • 특징:

    • 높은 신뢰도 및 기능 풍부: MySQL 다음으로 개발자들이 선호하며, 안정성과 다양한 고급 기능을 제공합니다.

    • 효율적인 디스크 관리: VACUUM 기능을 통해 디스크 조각이 차지하는 영역을 회수하여 효율적인 공간 관리가 가능합니다.

    • 대용량 지원 및 유연한 데이터 접근: 최대 32TB의 테이블 크기를 지원하며, SQL뿐만 아니라 JSON을 이용한 데이터 접근도 가능합니다.

    • 강력한 데이터 관리 기능: 지정 시간 복구(PITR), 로깅, 접근 제어, 중첩된 트랜잭션, 백업 등 엔터프라이즈급 기능을 제공합니다.

    • SQL 표준 준수 및 확장성: SQL 표준을 매우 잘 준수하며, 사용자 정의 함수 및 다양한 확장 기능 개발이 용이합니다.

    • 복잡한 쿼리 및 분석 처리 우수: 복잡한 쿼리, 분석 함수, 지리 정보 시스템(GIS) 등 고급 데이터 처리에서 뛰어난 성능을 보입니다.

  • 단점:

    • 상대적으로 높은 초기 진입 장벽: MySQL에 비해 초기 설정이나 사용법, 내부 구조가 다소 복잡하게 느껴질 수 있습니다.

    • 쓰기 중심 워크로드: 매우 높은 빈도의 쓰기 작업이 발생하는 환경에서는 특정 조건에서 MySQL InnoDB보다 성능이 다소 낮을 수 있다는 평가가 있습니다.

    • 호스팅 및 관리: 과거에는 MySQL에 비해 전문 관리형 호스팅 서비스나 숙련된 DBA가 상대적으로 적었으나, 현재는 많이 개선되고 있습니다.

비관계형 데이터베이스 (Not only SQL)

"Not only SQL"이라는 슬로건에서 유래했으며, SQL을 주 언어로 사용하지 않는 데이터베이스를 의미합니다. 대표적으로 MongoDB, Redis 등이 있습니다.

MongoDB

  • 특징:

    • 유연한 데이터 모델 (BJSON): JSON과 유사한 Binary JSON(BJSON) 형태의 도큐먼트 기반으로, 스키마 없이 데이터를 저장할 수 있어 개발 유연성이 높습니다.

    • 확장성 및 성능: 수평적 확장(샤딩)을 통해 대용량 데이터를 분산 저장하고 처리할 수 있으며, 특정 워크로드에서 높은 성능을 제공합니다. 고가용성을 위한 레플리카셋도 지원합니다.

    • 다양한 데이터 처리: 스키마가 정해져 있지 않아 다양한 형태의 데이터를 저장하고 분석하거나 로깅하는 데 유리합니다.

    • 고유 식별자: 도큐먼트 생성 시 고유한 ObjectID를 자동으로 생성하여 키 관리가 용이합니다.

  • 단점:

    • 데이터 일관성: 기본적으로 최종 일관성(Eventual Consistency) 모델을 따르므로, 강력한 트랜잭션이나 복잡한 관계형 데이터의 일관성 유지가 RDBMS만큼 엄격하지 않을 수 있습니다. (최근 버전에서는 트랜잭션 지원 강화)

    • JOIN 연산의 부재: 관계형 데이터베이스의 강력한 JOIN 연산을 직접적으로 지원하지 않습니다. $lookup과 같은 집계 파이프라인 연산자로 유사한 기능을 수행할 수 있지만, 복잡하고 성능 이슈가 있을 수 있습니다.

    • 메모리 사용량: 특정 작업(예: 정렬, 인덱싱)에서 메모리 사용량이 클 수 있습니다.

    • 데이터 중복: 비정규화된 데이터 구조를 권장하는 경우가 많아 데이터 중복이 발생할 수 있으며, 이는 저장 공간 및 업데이트 관리의 부담으로 이어질 수 있습니다.

Redis

  • 특징:

    • 인메모리 기반의 빠른 속도: 모든 데이터를 RAM에 저장하여 디스크 기반 DB에 비해 압도적으로 빠른 읽기/쓰기 성능을 제공합니다.

    • 다양한 자료구조 지원: 단순 문자열(string) 외에도 Set, Sorted Set, Hash, List 등 다양한 자료구조를 지원하여 활용도가 높습니다.

    • 다용도 활용: Pub/Sub 기능을 통한 메시징 시스템, 캐싱 계층, 세션 관리, 실시간 순위표, 간단한 큐 등 다양한 용도로 사용됩니다.

  • 단점:

    • 데이터 영속성: 기본적으로 인메모리 방식이므로, 서버 장애 발생 시 데이터 유실 위험이 있습니다. (RDB, AOF 등의 영속성 옵션을 제공하지만, 성능에 영향을 줄 수 있음)

    • 메모리 크기 제한: 저장 용량이 물리적인 RAM 크기에 의해 제한됩니다. 대용량 데이터를 모두 메모리에 올리기에는 비용 부담이 클 수 있습니다.

    • 단순한 데이터 구조: 복잡한 관계나 다양한 데이터 타입을 처리하기에는 적합하지 않습니다. 주로 키-값 형태의 단순한 데이터 처리에 특화되어 있습니다.

    • 싱글 스레드 모델: 대부분의 연산이 싱글 스레드로 동작하므로, CPU 코어가 많아도 하나의 명령은 하나의 코어만 사용합니다. (I/O 멀티플렉싱으로 동시성 처리)

추가정리

CockroachDB

  • 특징:

    • 분산 SQL 및 강력한 일관성: 여러 노드에 데이터를 분산 저장하면서도 강력한 ACID 트랜잭션을 보장하는 SQL 데이터베이스입니다.

    • 수평적 확장 용이성: 노드 추가만으로 간단하게 시스템의 처리량과 저장 용량을 선형적으로 확장할 수 있습니다.

    • 높은 가용성 및 장애 복구 능력: 디스크, 머신, 랙, 데이터센터 수준의 장애 발생 시에도 최소한의 서비스 중단으로 자동 복구되도록 설계되었습니다.

    • PostgreSQL 호환성: PostgreSQL 와이어 프로토콜과 호환되어 기존 PostgreSQL용 드라이버나 ORM, 도구들을 상당 부분 재사용할 수 있습니다.

    • 다중 지역(Multi-Region) 지원: 데이터를 지리적으로 분산하여 특정 지역 사용자의 응답 속도를 개선하거나, 지역별 규제 요건을 충족시킬 수 있습니다.

  • 단점:

    • 운영 복잡성: 분산 시스템 고유의 특성으로 인해 단일 노드 RDBMS에 비해 설치, 설정, 모니터링, 운영 및 문제 해결이 더 복잡하고 전문 지식을 요구합니다.

    • 성능 민감도 및 튜닝 필요성: 네트워크 지연 시간, 하드웨어 사양, 클러스터 구성, 데이터 지역성 설정 등에 따라 성능이 민감하게 변동될 수 있어 세심한 튜닝이 필요합니다.

    • 상대적으로 작은 생태계: MySQL이나 PostgreSQL과 같은 전통적인 RDBMS에 비해 커뮤니티 규모, 서드파티 도구, 참고 자료, 숙련된 인력 등이 상대적으로 부족할 수 있습니다.

    • 높은 리소스 요구량: 데이터 복제, 분산 트랜잭션 처리, 클러스터 멤버십 관리 등을 위해 일반적인 단일 노드 DB보다 더 많은 컴퓨팅, 메모리, 네트워크 리소스를 소모할 수 있습니다.

Firebase Firestore

  • 특징:

    • NoSQL 문서 기반 및 유연한 구조: 컬렉션 내의 문서에 데이터를 저장하며, 중첩된 객체와 하위 컬렉션을 통해 유연하고 계층적인 데이터 구조를 쉽게 만들 수 있습니다.

    • 실시간 동기화: 데이터 변경 시 연결된 모든 클라이언트(웹, 모바일 앱)에 실시간으로 업데이트를 푸시하여 협업 기능이나 라이브 데이터 표시에 매우 유용합니다.

    • 강력한 오프라인 지원: 네트워크 연결이 끊어져도 앱이 로컬 캐시를 사용하여 정상적으로 작동하고, 연결이 복구되면 자동으로 데이터를 동기화합니다.

    • 서버리스 및 자동 스케일링: 개발자가 서버 인프라 관리에 신경 쓸 필요 없이 자동으로 확장/축소되어 대규모 사용자 요청도 처리할 수 있습니다.

  • 단점:

    • 비용 구조의 복잡성: 읽기, 쓰기, 저장 공간, 네트워크 사용량 등에 따라 비용이 책정되므로, 데이터 사용 패턴을 정교하게 예측하고 최적화하지 않으면 예상보다 높은 비용이 발생할 수 있습니다. (특히 실시간 리스너는 많은 읽기 연산을 유발할 수 있습니다.)

    • 쿼리 기능의 제약: NoSQL의 일반적인 특성으로, RDBMS만큼 복잡한 JOIN 연산이나 다양한 집계 함수, 트랜잭션 기능에 제한이 있을 수 있습니다. 특정 쿼리 패턴에 최적화되지 않으면 비효율적이거나 구현이 어려울 수 있습니다.

    • 데이터 마이그레이션 및 백업: 다른 데이터베이스 시스템으로 데이터를 이전하거나, 정교한 백업 및 복구 전략을 수립하는 것이 상대적으로 복잡하고 제한적일 수 있습니다.

    • 벤더 종속성(Vendor Lock-in): Firebase 및 Google Cloud Platform 생태계에 깊이 통합되어 있어, 다른 클라우드 제공업체나 자체 호스팅 환경으로 이전하는 데 어려움이 따를 수 있습니다.


핵심 포인트

트랜잭션

  • 정의: 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업 단위, 쿼리들의 묶음.

  • ACID 특징:

    • 원자성(Atomicity): All or nothing; 작업 전체가 성공하거나 실패해야 함 (커밋/롤백).

    • 일관성(Consistency): 허용된 방식으로만 데이터를 변경하여 유효성 유지.

    • 격리성(Isolation): 여러 트랜잭션이 서로 간섭 없이 독립적으로 수행되는 것처럼 보여야 함.

      • 격리 수준: SERIALIZABLE, REPEATABLE_READ, READ_COMMITTED, READ_UNCOMMITTED 순으로 격리성은 약해지고 동시성은 강해짐.

      • 발생 현상: 더티 리드, 반복 불가능한 조회, 팬텀 리드 등이 격리 수준에 따라 발생 가능.

    • 지속성(Durability): 성공한 트랜잭션은 영구적으로 반영되어야 함 (회복 기능 필요).

  • 트랜잭션 전파: 여러 트랜잭션 관련 메서드 호출을 하나의 트랜잭션으로 묶는 관리 기법.

무결성

  • 정의: 데이터의 정확성, 일관성, 유효성을 유지하여 데이터 신뢰도 확보.

  • 종류:

    • 개체 무결성: 기본키는 NULL 불가.

    • 참조 무결성: 테이블 간 참조 데이터의 일관성 유지.

    • 고유 무결성: 특정 속성 값의 유일성 보장.

    • NULL 무결성: 특정 속성 값에 NULL 허용 않음.

데이터베이스 종류

  • 관계형 데이터베이스 (RDBMS):

    • 표 형식(행/열) 데이터 저장, SQL 사용.

    • MySQL: 가장 널리 사용, B-트리 인덱스, 쿼리 캐시 등 제공.

    • PostgreSQL: VACUUM 기능, JSON 지원, 지정 시간 복구 등 제공.

    • CockroachDB: 분산 SQL DB, 수평 확장, 강력한 ACID 트랜잭션(기본 SERIALIZABLE), PostgreSQL 호환, 다중 지역 클러스터 지원.

  • NoSQL 데이터베이스:

    • SQL을 주 언어로 사용하지 않음.

    • MongoDB: 도큐먼트 기반(BJSON), 스키마리스, 확장성 및 빅데이터 성능 우수.

    • Redis: 인메모리 키-값 저장소, 빠른 속도, 캐싱/세션 관리/실시간 순위표 등에 사용.

    • Firebase Firestore: NoSQL 문서 기반 DB, 실시간 동기화, 오프라인 지원, 자동 스케일링, 서버리스.

출처

  • 면접을 위한 CS 전공지식 노트







- 컬렉션 아티클