RDBMS

RDBMS

2025. 2. 6. 21:38Tools & Skills/SQL

RDBMS - 도서관 관리 시스템

출처 대학일기

 

SQL을 공부하기로 결심하고 도서관에 갔는데, 정리 상태가 엉망진창이라면?

책들이 아무렇게나 쌓여 있고, 원하는 책을 찾으려면 몇 시간씩 뒤져야 한다면?

 

이런 혼란을 방지하기 위해 도서관은 체계적인 데이터 관리 시스템을 갖추고 있다.

  • 책들은 카테고리(소설, 과학, 역사 등)로 정리됨 ✅
  • 각각의 책에는 고유한 도서번호(Primary Key)가 있음 ✅
  • 저자, 출판사, 출판 연도 등의 정보가 표로 정리됨 ✅
  • 회원들은 대출 기록(이력)을 통해 언제, 어떤 책을 빌렸는지 관리됨 ✅

이처럼 도서관이 체계적으로 데이터를 관리하는 시스템과 같은 역할을 하는 것이

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

 

 


 

테이블 — 책장 & 도서목록 

RDBMS에서는 데이터를 테이블(Table)이라는 구조로 저장하고,

각 테이블은 행(Row)열(Column)로 구성된다.

 

이걸 도서관에 비유하면?

 

책 정보 테이블 (Books)

도서번호 (ID) 책 제목 (Title)  저자 (Author) 출판 연도 (Year)
101 데이터 사이언스 입문 홍길동 2022
102 머신러닝 기초 이몽룡 2023
103 클라우드 개론 성춘향 2021

 

즉, 테이블은 책장인 것이다! 📖 

 

책장을 보면, 특정 카테고리의 책들이 일정한 기준에 맞춰 정리되어 있다.

도서관 직원이 쉽게 책을 찾고 관리할 수 있는 것처럼,

RDBMS에서는 데이터를 테이블 형태로 정리해서 관리한다.

 

그렇기 때문에 특정 데이터를 찾을 때 빠르고 효율적이다.

 

 


관계(Relation) — 대출 기록

만약 도서관에 책 정보만 있고,
회원들이 언제, 어떤 책을 빌렸는지 저장하는 대출 기록 테이블이 없다면?

도서관에서 책이 없어져도 누가 빌려 갔는지 알 수 없을 것이다.

따라서, 도서관에는 대출 기록을 관리하는 테이블도 필요하다.

 

📌 대출 기록 테이블

대출번호 (LoanID)    회원 ID (UserID) 도서번호 (BookID) 대출 날짜 (BorrowDate) 반납 날짜 (ReturnDate)
1 U1001 101 2024-02-01 2024-02-10
2 U1002 102 2024-02-03 2024-02-12
3 U1001 103 2024-02-05 2024-02-15

 

여기서 중요한 개념이 하나 있다.

  • 도서번호(BookID)책 정보 테이블(Books)의 대추번호(ID)와 연결됨 📖
  • 회원 ID(UserID)회원 정보 테이블(Users)의 ID와 연결됨 🙋‍♂️

 

 

Table Books {
  ID INT [primary key] // 도서 고유 번호 (PK)
  Title VARCHAR // 책 제목
  Author VARCHAR // 저자
  Year INT // 출판 연도
}

Table Users {
  ID INT [primary key] // 회원 고유 번호 (PK)
  Name VARCHAR // 회원 이름
  Email VARCHAR // 이메일 (유니크)
}

Table BorrowedBooks {
  LoanID INT [primary key] // 대출 고유 번호 (PK)
  UserID INT // 대출한 회원 ID (FK -> Users.ID)
  BookID INT // 대출판 도서 ID (FK -> Books.ID)
  BorrowDate DATE // 대출일
  ReturnDate DATE // 반납일
}

Ref: BorrowedBooks.UserID > Users.ID // 대출 기록과 회원 관계
Ref: BorrowedBooks.BookID > Books.ID // 대출 기록과 도서 관계

 

이런 테이블 간의 관계(Relation) 덕분에,

"U1001 회원이 대출한 책 제목이 뭐지?" 같은 질문에 빠르게 답할 수 있다.

 

 

이를 MySQL로 표현하면

SELECT Users.Name, Books.Title, BorrowedBooks.BorrowDate
FROM BorrowedBooks
JOIN Users ON BorrowedBooks.UserID = Users.ID
JOIN Books ON BorrowedBooks.BookID = Books.ID
WHERE Users.ID = 'U1001';

 

👉 회원이 빌린 책을 쉽게 조회할 수 있는 것, 이것이 RDBMS의 강력한 기능임을 기억하자.

 

 


트랜잭션(Transaction) — 도서 대출 시스템의 안정성

만약 누군가가 책을 빌리는 도중에 도서관 서버가 다운된다면?

  • 책 대출이 완료되지 않았는데 회원에게 대출 완료 메시지가 발송된다? ❌
  • 같은 책이 두 번 대출된 걸로 기록된다? ❌

 

이런 문제를 방지하기 위해, 트랜잭션(Transaction) 개념이 필요하다.

 

트랜잭션이란?

트랜잭션(Transaction)은 데이터베이스에서 논리적으로 하나의 작업 단위

처리되어야 하는 일련의 연산(읽기 & 쓰기) 집합을 의미한다.

 

즉, 데이터베이스의 일관된 상태(Consistency)에서

또 다른 일관된 상태로 변환하는 최소 단위(Logical Unit of Work)이다.

 

 

도서관 시스템에서 트랜잭션 예시

1. 사용자가 책을 대출 요청하면,
2. 시스템이 해당 도서의 재고를 확인하고,
3. 대출 기록을 생성한 뒤,
4. 대출 상태를 업데이트하고,
5. 성공적으로 처리되면 커밋(Commit)

 

 

만약 위 과정 중 하나라도 실패하면?

→ 트랜잭션을 롤백(Rollback)하여 모든 변경 사항을 원래 상태로 되돌려야 한다.

 

 

 

트랜잭션 상태 개념도

 

구분 설명
활동(Active) 트랜잭션이 실행을 시작했거나 진행 중인 상태
부분 완료(Partial Committed) 마지막 명령문까지 실행되었지만, 아직 커밋되지 않은 상태
실패(Failed) 실행 중 오류가 발생하여 더 이상 진행할 수 없는 상태
철회(Aborted) 트랜잭션이 실패하여 취소되었으며, 롤백(Rollback)되어 원래 상태로 복구된 상태
완료(Committed) 트랜잭션이 정상적으로 완료되어 데이터베이스에 영구적으로 반영된 상태

 

 

 

트랜잭션의 4가지 핵심 원칙 (ACID)

RDBMS에서 트랜잭션은 ACID 원칙을 따라야 한다.

 

1️⃣ Atomicity (원자성)

  • "대출 요청"이 완전히 수행되거나, 전혀 수행되지 않음.
  • 도중에 서버가 다운되면 대출이 자동으로 취소됨 (Rollback).

예시

  • 사용자가 책을 빌리는 도중 장애가 발생하면, 대출 기록이 남지 않음.
  • "올바르게 빌려짐" 또는 "아예 빌려지지 않음" 둘 중 하나여야 함.

결론: 트랜잭션은 All or Nothing!

 


2️⃣ Consistency (일관성)

  • 대출 전에 책이 남아 있는지 확인해야 함.
  • 책이 없는데도 대출되거나, 대출된 책이 다시 대출 가능 상태로 남아 있으면 안 됨.

예시

  • 데이터베이스가 트랜잭션 전후로 항상 정합성(Consistency)을 유지해야 함.
  • 대출 기록이 생성되었는데, 대출 가능 도서 수가 줄어들지 않았다면 데이터 불일치 발생!

결론: 트랜잭션 수행 전후 데이터의 일관성이 유지되어야 함.

 


3️⃣ Isolation (고립성)

  • 여러 사람이 동시에 같은 책을 빌릴 때, 충돌 방지!
  • 한 사용자의 대출이 완료되기 전에 다른 사용자가 같은 책을 빌릴 수 없어야 함

예시

  • 사용자 A가 대출 중일 때, 사용자 B가 같은 책을 동시에 대출하려고 하면 대기해야 함
  • DBMS가 Isolation Level을 제공하여 동시성 문제를 해결할 수 있음

결론: 트랜잭션은 서로 독립적으로 실행되는 것처럼 보여야 함

 


4️⃣ Durability (지속성)

  • 트랜잭션이 완료되면, 대출 기록이 영구적으로 저장되어야 함
  • 정전이 나거나 시스템이 재부팅되더라도 정보가 손실되지 않아야 함

예시

  • "대출 완료" 메시지를 받은 후 시스템이 다운되더라도, 대출 기록이 유지되어야 함
  • DBMS는 데이터를 비휘발성 저장소(HDD, SSD)에 기록하여 보호함

결론: Commit된 트랜잭션은 영구적으로 유지됨

 


정리: 트랜잭션이 중요한 이유

💡 트랜잭션을 적용하지 않으면?

  • 대출 도중 장애 발생 시 데이터가 꼬여서 잘못된 정보가 저장될 수 있음
  • 같은 책이 두 명에게 동시에 대출되는 문제가 생길 수도 있음
  • 사용자 경험이 나빠지고, 데이터베이스 무결성이 깨짐

 

트랜잭션을 적용하면?

  • 데이터의 정확성과 신뢰성이 보장됨
  • 장애 발생 시 안전하게 복구 가능 (Rollback)
  • 여러 트랜잭션이 동시에 실행되어도 데이터가 정확하게 유지됨

 

결국, 트랜잭션 덕분에 도서관 시스템이 안정적으로 동작할 수 있는 것이다.

 

 


결론

지금까지 도서관을 비유로 RDBMS의 개념을 풀어봤다.

 

이를 정리하면 다음과 같다.

개념 도서관 예시 RDBMS 개념
테이블 책장 데이터를 저장하는 구조
행(Row) 개별 책 개별 데이터 항목
열(Column) 책 정보 (제목, 저자 등) 데이터 속성 (Attribute)
관계(Relation) 대출 기록 테이블 간의 연결 (Foreign Key)
트랜잭션(Transaction) 대출 처리 데이터의 안정적 저장과 관리

 

결국 RDBMS는 데이터를 체계적으로 저장하고 빠르게 검색할 수 있도록 도와주는 시스템이다.

 

 

👉  모든 웹 서비스의 핵심은 데이터 관리다.

  • 넷플릭스: 사용자의 시청 기록 & 추천 알고리즘
  • 배달의민족: 가게 정보 & 주문 내역 관리
  • 은행 시스템: 고객 정보 & 계좌 & 거래 기록 관리

이 모든 시스템은 RDBMS 개념을 활용해 동작하며,
마치 도서관이 책을 체계적으로 정리하듯, 데이터를 효율적으로 관리하는 것이 중요하다.

 

 

'Tools & Skills > SQL' 카테고리의 다른 글

[SQL] 프로그래머스 Lv.4 보호소에서 중성화한 동물  (0) 2025.04.05
[SQL] LeetCode #511 - Game Play Analysis  (0) 2025.03.19
정규화  (0) 2025.03.19
서브쿼리(Subquery)  (0) 2025.03.05