현재 선택한 데이터 아키텍처 과정

DAP 이론 학습

이론 목록으로 돌아가기

DBMS·데이터 액세스·트랜잭션 개요

DBMS의 저장·질의·트랜잭션 기능과 SQL 처리 흐름을 개관하고, 애플리케이션 데이터 액세스와 ACID·잠금·MVCC·격리 수준·데드락을 연결합니다. 범위가 넓으므로 세부 주제의 공통 판단 틀을 제공하는 개요 단원으로 한정합니다.

예상 읽기 8

핵심 요약

DBMS는 데이터를 저장하는 파일 관리자를 넘어 스키마·무결성·질의 처리·동시성·복구·보안을 제공한다. 애플리케이션은 연결·SQL 실행·결과 수신·트랜잭션 경계를 통해 DBMS를 이용한다. 동시 사용 환경에서는 ACID, 잠금과 MVCC, 격리 수준, 데드락을 함께 이해해야 한다.

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
SQL 요청
  → 구문·의미 검사
  → 최적화(접근경로·조인순서·조인방법)
  → 실행
  → 버퍼/저장장치 접근
  → 트랜잭션·로그·잠금/MVCC로 일관성과 복구 보장

학습 목표

  • DBMS의 질의 처리기, 저장 관리자, 버퍼, 로그·복구, 트랜잭션 관리 기능을 설명합니다.
  • SQL 처리와 애플리케이션 데이터 액세스의 병목 지점을 구분합니다.
  • ACID와 동시성 이상 현상, 표준 격리 수준을 연결합니다.
  • 잠금과 MVCC의 관계, 데드락 조건과 대응을 사례에 적용합니다.

1. 개념 설명

1.1 DBMS의 주요 기능

기능역할대표 산출·상태
메타데이터·카탈로그 관리테이블, 열, 제약, 통계, 권한 정의 보관데이터 사전, 통계정보
질의 처리SQL 파싱·검증·최적화·실행실행계획, 행 집합
저장·버퍼 관리페이지·파일·메모리 버퍼와 입출력 관리데이터 페이지, 캐시 상태
트랜잭션·동시성 관리여러 작업의 원자성과 동시 접근 제어잠금, 버전, 스냅샷
로그·복구장애 후 커밋 결과 재현과 미완료 작업 취소REDO/WAL, UNDO, 체크포인트
보안·무결성인증·권한·제약·감사권한, 제약 위반, 감사기록

구성요소 이름과 내부 구조는 제품마다 다르지만 기능적 구분은 공통 학습 틀로 사용할 수 있다.

1.2 SQL 처리 흐름

  1. 구문 분석: SQL 문법과 객체 이름을 확인한다.
  2. 의미·권한 확인: 열·자료형·권한·제약과의 정합성을 확인한다.
  3. 최적화: 통계와 비용 모델을 이용해 접근 경로, 조인 순서·방법을 선택한다.
  4. 실행: 연산자를 수행하고 버퍼·저장장치에서 데이터를 읽고 변경한다.
  5. 결과·상태 반환: 행, 영향 건수, 오류와 트랜잭션 상태를 애플리케이션에 돌려준다.

동일한 결과를 만드는 SQL도 계획과 데이터 분포에 따라 비용이 다르다. 실행계획은 예상 또는 실제 실행 통계와 함께 해석해야 한다.

1.3 데이터 액세스 설계

  • 연결 풀(Connection Pool): 연결 생성 비용을 줄이지만 크기가 지나치면 DB 동시 세션·메모리·잠금 경합이 늘어난다.
  • 바인드/준비 문장: 값과 SQL 구조를 분리해 안전성과 반복 실행 효율을 높인다. 모든 SQL을 하나의 형태로 강제하면 데이터 편향에 따른 계획 문제는 별도로 검토해야 한다.
  • 배치 처리: 다수의 유사 DML을 묶어 네트워크 왕복과 호출 오버헤드를 줄인다.
  • Fetch 크기·페이지 처리: 결과를 지나치게 작은 단위로 반복 수신하거나 전체를 한 번에 메모리에 적재하는 양 극단을 피한다.
  • N+1 접근: 목록 1회 조회 후 각 행마다 추가 SQL을 실행하는 패턴으로 왕복과 실행 횟수가 급증한다.
  • 트랜잭션 경계: 업무 원자성보다 작으면 부분 완료가 생기고, 지나치게 크면 잠금·버전·로그 보유 시간이 늘어난다.

1.4 ACID

속성의미오해하기 쉬운 점
원자성(Atomicity)트랜잭션 작업이 전부 반영되거나 전부 취소여러 독립 트랜잭션을 묶지 않으면 업무 전체 원자성은 보장되지 않음
일관성(Consistency)트랜잭션 전후에 정의된 제약·업무 규칙을 만족DBMS가 모든 업무 규칙을 자동으로 안다는 뜻이 아님
격리성(Isolation)동시 실행의 상호 간섭을 허용 수준으로 통제항상 모든 트랜잭션을 직렬 실행한다는 뜻이 아님
지속성(Durability)커밋한 결과가 장애 후에도 복구 가능설정·저장장치·동기 커밋 정책과 무관한 절대 명제가 아님

1.5 동시성 이상과 격리 수준

이상 현상설명
Dirty Read다른 트랜잭션이 아직 커밋하지 않은 값을 읽음
Non-repeatable Read같은 행을 다시 읽었을 때 다른 커밋 값이 보임
Phantom Read같은 조건 재조회 시 행 집합이 늘거나 줄어듦
Lost Update두 갱신 중 하나가 다른 갱신을 덮어씀

SQL 표준의 일반적 구분은 다음과 같다. 실제 DBMS는 MVCC 구현과 수준 명칭의 의미가 다를 수 있으므로 제품 문서를 확인해야 한다.

격리 수준Dirty ReadNon-repeatable ReadPhantom Read
READ UNCOMMITTED가능가능가능
READ COMMITTED방지가능가능
REPEATABLE READ방지방지표준상 가능할 수 있음
SERIALIZABLE방지방지방지

SERIALIZABLE은 동시성이 사라진다는 뜻이 아니라 결과가 직렬 순서와 동등하도록 보장하는 수준이다. 충돌 시 대기뿐 아니라 직렬화 실패와 재시도가 발생할 수 있다.

1.6 잠금, MVCC, 데드락

  • 잠금은 충돌하는 작업을 대기시켜 객체·행의 동시 변경을 조정한다. 잠금 모드·범위·획득 순서가 중요하다.
  • MVCC는 여러 버전을 이용해 읽기 스냅샷을 제공하고 읽기-쓰기 충돌을 줄인다. 그러나 쓰기-쓰기 충돌, 명시적 잠금, DDL, 자원 경합까지 제거하지는 않는다.
  • 데드락은 트랜잭션들이 서로 가진 자원을 기다리는 순환 대기다. DBMS는 보통 하나를 희생시켜 해소하지만 애플리케이션은 롤백과 재시도를 처리해야 한다.
CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
T1: A 잠금 보유 → B 대기
T2: B 잠금 보유 → A 대기
          = 순환 대기(Deadlock)

2. 구성요소와 관계

업무 요구DBMS·액세스 설계 연결잘못된 설계의 증상
주문과 결제를 함께 완료하나의 명확한 트랜잭션 경계주문만 저장되고 결제 실패
다수 사용자의 재고 차감조건부 갱신·잠금·격리와 재시도음수 재고, lost update
대량 적재배치·커밋 주기·로그·오류 격리과도한 왕복 또는 거대한 롤백
짧은 API 응답연결 풀·SQL 횟수·fetch·계획풀 고갈, N+1, 긴 잠금
장애 후 복구로그·체크포인트·커밋 정책커밋 데이터 유실 또는 긴 복구

3. 판단 흐름

  1. 업무적으로 함께 성공·실패해야 할 작업을 식별한다.
  2. 읽기·쓰기 충돌과 허용할 수 없는 이상 현상을 정의한다.
  3. 트랜잭션 경계와 격리·잠금 전략을 선택한다.
  4. 연결 수, SQL 실행 횟수, 왕복, 배치와 결과 크기를 설계한다.
  5. 실제 동시 부하에서 대기·데드락·직렬화 실패·재시도를 측정한다.
  6. 오류 시 롤백·재시도·멱등성·사용자 응답을 검증한다.

4. 사례·텍스트 다이어그램

사례: 재고 1개에 두 주문이 동시에 접근

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
T1 읽기: 재고=1          T2 읽기: 재고=1
T1 재고=0 갱신           T2 재고=0 갱신
T1 COMMIT                T2 COMMIT

애플리케이션이 ‘읽고 계산한 뒤 갱신’만 하면 두 주문이 모두 성공할 수 있다. 해결 후보는 다음과 같다.

  • 재고수량 > 0 조건을 포함한 원자적 갱신 후 영향 건수 확인
  • 필요한 행에 대한 명시적 잠금과 짧은 트랜잭션
  • 충돌을 탐지하는 버전 열·낙관적 동시성 제어
  • 더 높은 격리 수준과 직렬화 실패 재시도

하나의 해법을 무조건 적용하지 말고 충돌 빈도, 대기 비용, 실패 처리와 DBMS 동작을 비교한다.

5. 비교와 구분

구분잠금 중심 제어MVCC 중심 읽기낙관적 버전 검사
기본 원리충돌 작업을 대기시킴스냅샷·행 버전으로 읽기 제공갱신 시 버전이 동일한지 확인
강점충돌을 즉시 직렬화읽기-쓰기 경합 감소충돌이 드문 업무에 유리
위험대기·데드락오래된 버전·스냅샷 오해충돌 시 애플리케이션 재시도
공통점트랜잭션 경계와 실패 처리 필요트랜잭션 경계와 실패 처리 필요트랜잭션 경계와 실패 처리 필요

시험 판단 포인트

  • DBMS의 일관성은 선언된 제약과 애플리케이션 업무 규칙이 함께 만들어 낸다.
  • READ COMMITTED는 일반적으로 dirty read를 막지만 같은 행·조건의 재조회 결과까지 고정하지는 않는다.
  • MVCC는 ‘잠금이 전혀 없음’이 아니라 읽기 스냅샷을 통해 일부 경합을 줄이는 방식이다.
  • 데드락은 단순 장시간 대기와 달리 순환 대기이며, 잠금 획득 순서를 일관되게 하면 위험을 낮출 수 있다.
  • 연결 풀은 클수록 좋은 것이 아니라 DB가 감당할 동시 작업량과 애플리케이션 대기 전략에 맞춰야 한다.

자주 틀리는 부분

  • Auto-commit 상태의 여러 SQL이 하나의 업무 트랜잭션이라고 생각한다.
  • 격리 수준을 높이면 애플리케이션의 모든 동시성 오류가 자동으로 사라진다고 단정한다.
  • MVCC에서는 UPDATE끼리도 대기하지 않고 데드락이 없다고 오해한다.
  • 연결 풀 고갈을 DB 연결 수만 늘려 해결하고 긴 트랜잭션·느린 SQL을 확인하지 않는다.
  • 바인드 변수를 사용하면 SQL 주입뿐 아니라 모든 실행계획 문제까지 해결된다고 본다.
스스로 확인하기

개념 확인 문제

문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.

01[객관식] DBMS의 SQL 처리 순서로 가장 적절한 것은? ① 실행→구문검사→최적화 ② 구문·의미검사→최적화→실행 ③ 최적화→커밋→구문검사 ④ 저장장치 접근→권한부여→파싱
정답 및 해설

정답: ②

  • ① 실행 전에 문법·객체·권한 확인과 계획 선택이 필요하다.
  • ② 일반적인 흐름은 구문·의미 검사, 최적화, 실행이다.
  • ③ 커밋은 SQL 최적화 순서의 중간 단계가 아니다.
  • ④ 저장장치 접근은 실행 과정에서 발생하며 권한 부여는 SQL 처리 순서가 아니다.
02[객관식] READ COMMITTED의 일반적 설명으로 옳은 것은? ① 다른 트랜잭션의 미커밋 값을 항상 읽는다. ② 같은 행을 두 번 읽으면 항상 같은 값이다. ③ dirty read는 방지하지만 non-repeatable read는 발생할 수 있다. ④ 모든 실행이 직렬 순서와 동등하다.
정답 및 해설

정답: ③

  • ① READ COMMITTED는 일반적으로 미커밋 값 읽기를 방지한다.
  • ② 문장 사이에 다른 트랜잭션이 커밋하면 값이 달라질 수 있다.
  • ③ dirty read는 막지만 non-repeatable read와 phantom은 가능할 수 있다.
  • ④ 직렬 실행과 동등한 보장은 SERIALIZABLE의 목표다.
03[참/거짓] “MVCC를 사용하는 DBMS에서는 읽기와 쓰기가 항상 서로 막지 않으므로 잠금과 데드락을 고려할 필요가 없다.”의 참·거짓과 이유를 쓰세요.
정답 및 해설

정답: 거짓.

  • MVCC는 버전과 스냅샷을 이용해 읽기-쓰기 경합을 줄이지만, 쓰기-쓰기 충돌·명시적 잠금·DDL 잠금은 여전히 존재한다.
  • 서로 다른 순서로 자원을 갱신하면 MVCC 환경에서도 데드락이 발생할 수 있다.
04[사례 판단] 목록 100건을 조회한 뒤 각 건마다 상세 SQL을 한 번씩 실행한다. 병목 유형과 개선 방법 두 가지를 제시하세요.
정답 및 해설

모범 답안:

  • 병목은 N+1 데이터 액세스와 과도한 네트워크/DB 왕복이다.
  • 개선은 필요한 상세를 조인·IN·배치 조회로 묶기, 애플리케이션에서 필요한 열만 한 번에 조회하기, fetch/페이지 크기 조정 중 두 가지를 제시할 수 있다.
  • 단, 무조건 하나의 거대한 결과로 합쳐 중복 행과 메모리 사용이 폭증하지 않는지도 확인한다.
05[동시성 설계] 재고 1개에 두 주문이 동시에 접근하는 사례에서 lost update 또는 초과 판매를 막는 방법 두 가지와 실패 처리 방식을 설명하세요.
정답 및 해설

모범 답안:

  • 방법 1: UPDATE ... SET 재고=재고-1 WHERE 상품ID=? AND 재고>0처럼 조건부 원자 갱신 후 영향 건수가 1인지 확인한다.
  • 방법 2: 대상 행을 잠근 뒤 짧은 트랜잭션에서 검증·갱신하거나, 버전 열로 낙관적 충돌을 탐지한다.
  • 충돌·데드락·직렬화 실패 시 전체 트랜잭션을 롤백하고 제한된 횟수로 재시도하며, 중복 주문이 생기지 않도록 요청 식별자와 멱등성을 적용한다.