Abraham Silberschatz , Henry F. Korth , S. Sudarshan의 데이터베이스 시스템 7판 (ISBN 9791132108504) 내용을 개인적으로 정리한 포스팅입니다.
1. 데이터베이스를 왜 배워야 할까
데이터베이스는 단순히 데이터를 저장하는 공간이 아니다.
여러 사람이 공유해서 사용할 수 있도록 데이터를 체계적으로 통합하고 관리하는 방식이라고 보면 된다.
예를 들어 유튜브, 인스타그램, 쇼핑몰, 학교 수강신청 시스템 같은 서비스는 전부 엄청난 양의 데이터를 다룬다.
이때 데이터를 그냥 파일로만 저장하면 관리가 점점 어려워지고, 결국 중복, 비일관성, 보안 문제, 동시성 문제가 생긴다.
그래서 이런 문제를 해결하기 위해 DBMS(Database Management System) 가 등장했다.
2. 파일 시스템으로 데이터를 관리할 때의 한계

데이터를 파일로 저장하면 처음엔 단순해서 편해 보이지만, 규모가 커질수록 문제가 많아진다.
대표적인 문제점
- 데이터 중복과 비일관성
- 같은 정보가 여러 파일에 중복 저장될 수 있다.
- 한쪽만 수정되고 다른 파일은 수정되지 않으면 데이터가 서로 달라진다.
- 데이터 접근의 어려움
- 원하는 데이터를 찾으려면 새로운 프로그램을 따로 만들어야 하는 경우가 많다.
- 조건이 복잡해질수록 더 불편해진다.
- 데이터 고립
- 데이터가 여러 파일과 형식으로 흩어져 있으면 함께 다루기 어렵다.
- 무결성 문제
- 예를 들어 계좌 잔고는 0 이상이어야 한다는 규칙을 보장해야 하는데,
파일 시스템에서는 이런 제약을 응용 프로그램에서 일일이 처리해야 한다.
- 예를 들어 계좌 잔고는 0 이상이어야 한다는 규칙을 보장해야 하는데,
- 갱신의 원자성 문제
- 데이터를 수정하던 중간에 시스템이 멈추면 일부만 반영될 수 있다.
- 즉, 전부 반영되거나 전부 취소되는 성질이 보장되지 않는다.
- 동시 접근 문제
- 여러 사용자가 동시에 같은 데이터를 수정하면 이상한 결과가 생길 수 있다.
- 보안 문제
- 사용자마다 접근 권한을 다르게 주기 어렵다.
왜 이게 중요한가?
예를 들어 어떤 서비스에서 회원 정보가 여러 파일에 중복 저장되어 있다고 해보자.
사용자 전화번호를 바꿨는데 어떤 파일만 수정되고 나머지는 그대로면, 시스템 전체에서 같은 사람의 정보가 다르게 보이게 된다.
이게 바로 비일관성이다.
3. DBMS란?
DBMS(Database Management System) 는
데이터를 저장하고, 검색하고, 수정하고, 관리할 수 있게 해주는 소프트웨어다.
쉽게 말해서 데이터베이스를 편리하고 안전하게 다룰 수 있도록 도와주는 시스템이다.
DBMS의 구성
- 서로 관련된 데이터들의 집합
- 데이터에 접근하기 위한 프로그램의 집합
- 데이터와 프로그램을 편리하게 사용할 수 있는 환경
대표적인 DBMS
- Oracle, MySQL, PostgreSQL, IBM DB2, SQLite
그리고 관계형 데이터베이스가 아닌 NoSQL 계열도 있다. 차후 설명예정
DBMS의 단점도 있다
DBMS가 무조건 좋은 것만은 아니다.
- 구축에 더 많은 비용, 시간, 기술, 지식이 필요하다.
- 시스템이 복잡해져서 상황에 따라 성능 저하가 생길 수 있다.
즉, 소규모 단순 작업이라면 파일 처리 방식이 더 간단할 수도 있지만,
대부분의 실제 서비스 환경에서는 DBMS의 장점이 훨씬 크다.
4. 프로그래밍 언어와 데이터베이스의 차이
데이터베이스와 프로그래밍 언어는 비슷해 보여도 초점이 다르다.
| 객체 생성 효과 | 실제 데이터가 저장됨 | 프로그램 내부에서 추상적으로 존재 |
| 제약 조건 | 도메인 제약 조건, 참조 무결성 지원 | 직접 구현해야 함 |
| 권한 관리 | 사용자별 접근 권한 지원 | 제한적 |
| 타입 다양성 | 기본 타입 중심 | 더 풍부한 타입 시스템 |
| 설계 초점 | relation의 구조와 제약 | 객체와 로직 설계 |
- 프로그래밍 언어는 주로 동작과 로직을 다룬다.
- 데이터베이스는 데이터의 구조, 관계, 제약, 일관성을 다룬다.
둘은 경쟁 관계가 아니라 서로 역할이 다른 도구다.
5. 데이터베이스를 구축하는 과정
기업이나 서비스에서 데이터베이스를 만들 때는 보통 다음 순서로 진행한다.
DB 구축 단계
- 요구사항 명세
- 어떤 데이터가 필요한지, 시스템이 무엇을 해야 하는지 정리
- 데이터 모델 정의
- 데이터 유형과 데이터 간 관계 설계
- 무결성 제약조건 정의
- 어떤 값이 허용되고, 어떤 관계를 지켜야 하는지 정함
- 물리적 수준 정의
- 실제 저장 구조를 설계
- 사용자 인터페이스 및 응용 프로그램 작성
- 사용자가 데이터를 다루는 화면과 기능 구현
- DB 생성 및 초기화
- 실제 데이터베이스를 만들고 초기 데이터를 넣음
이 과정을 보면 데이터베이스 설계는 단순히 테이블 몇 개 만드는 작업이 아니라,
서비스 구조 자체를 설계하는 일이라는 걸 알 수 있다.
6. 데이터 모델, 스키마, 인스턴스
데이터 모델이란?
데이터 모델은 다음을 표현하기 위한 도구다.
- 데이터 자체
- 데이터들 사이의 관계
- 데이터의 의미
- 일관성 제약 조건
대표적인 데이터 모델
- 관계형 모델
- 개체-관계(ER) 모델
- 객체지향 데이터 모델
- 반구조형 데이터 모델
그중 가장 많이 쓰는 게 관계형 모델이다.
관계형 모델에서는 데이터를 테이블 형태로 표현한다.
- 열(column): 속성
- 행(row): 실제 데이터 한 개체
데이터 추상화 3단계

데이터베이스는 복잡한 내부 구조를 한 번에 다 보여주지 않고, 단계별로 추상화한다.
1) 물리적 단계
데이터를 저장장치에 어떻게 저장할지 다룬다.
2) 논리적 단계
데이터 간 논리적 관계를 다룬다.
3) 뷰 단계
사용자나 응용 프로그램이 필요한 부분만 보도록 한다.
이 구조 덕분에 내부 저장 방식이 바뀌어도 사용자는 큰 영향을 받지 않는다.
스키마와 인스턴스
이 부분은 시험에도 자주 나온다.
- 스키마(schema): 데이터베이스의 구조, 설계도
- 인스턴스(instance): 특정 시점에 실제 저장된 값
비유하면:
- 스키마 = 변수의 타입
- 인스턴스 = 변수의 실제 값
즉, 테이블 구조 자체는 스키마고,
그 테이블 안에 현재 들어 있는 데이터는 인스턴스다.
7. 데이터베이스 언어: DDL, DML, DCL
SQL은 역할에 따라 나눠서 이해하면 편하다.
1) DDL
Data Definition Language
데이터베이스 구조를 정의하는 언어다.
예:
- CREATE
- ALTER
- DROP
- TRUNCATE
2) DML
Data Manipulation Language
데이터를 조회, 삽입, 수정, 삭제하는 언어다.
예:
- SELECT
- INSERT
- UPDATE
- DELETE
3) DCL
Data Control Language
권한과 트랜잭션을 관리하는 언어다.
예:
- GRANT
- REVOKE
- COMMIT
- ROLLBACK
참고로 DDL, DML은 완전히 다른 언어가 아니라
보통 모두 SQL 안에서 표현되는 개념적 분류다.
8. SQL 기본 문법과 실행 순서
SQL 질의 언어의 두 가지 관점
절차적 언어
- 어떤 데이터를
- 어떻게 가져올지도 함께 지정
선언적 언어
- 어떤 데이터를 원하는지만 적음
- 어떻게 찾을지는 시스템이 결정
- 대표적으로 SQL
즉 SQL은 “무엇을 원한다”를 말하는 언어에 가깝다.
SELECT 기본 구조
SELECT A1, A2, ... , An
FROM r1, r2, ... , rm
WHERE 조건
ORDER BY 열;
추가로 자주 쓰는 것들:
- DISTINCT: 중복 제거
- ALL: 중복 포함
- AS: 별칭 부여
예:
SELECT salary / 12 AS monthly_salary
FROM instructor;
SQL의 논리적 실행 순서
이건 진짜 중요하다.
SQL은 우리가 적는 순서와 실제 처리 순서가 다르다.
실제 실행 순서
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
- LIMIT
왜 중요할까?
예를 들어 WHERE 절에서는 SELECT에서 만든 별칭을 사용할 수 없다.
왜냐면 WHERE가 먼저 실행되고, SELECT는 그 뒤에 실행되기 때문이다.
즉,
SELECT salary * 12 AS annual_salary
FROM instructor
WHERE annual_salary > 50000;
이건 안 된다.
annual_salary라는 별칭이 아직 만들어지지 않았기 때문이다.
9. 문자열 연산, 조건식, 집합 연산
문자열 검색: LIKE
- _ : 한 글자
- % : 0개 이상의 문자열
예:
문자열 함수
- LOWER(): 소문자 변환
- UPPER(): 대문자 변환
- LENGTH(): 길이 반환
- ||: 문자열 연결
예:
WHERE 절에서 자주 쓰는 조건
- BETWEEN
- 비교 연산자
- IS NULL
- 논리 연산자
예:
집합 연산
- UNION: 합집합
- INTERSECT: 교집합
- EXCEPT: 차집합
- UNION ALL: 중복 포함 합집합
관계형 데이터베이스는 결과 집합을 다루는 경우가 많아서 이런 연산도 중요하다.
10. NULL과 집계 함수
NULL이란?
NULL은 0이나 빈 문자열이 아니라, 값이 없음을 의미하는 특수한 상태다.
그래서 다음처럼 계산하면 결과도 NULL이 된다.
확인은 이렇게 한다.
= 로 비교하면 안 되고 반드시 IS NULL을 써야 한다.
집계 함수
- AVG()
- MIN()
- MAX()
- SUM()
- COUNT()
중요한 점은 대부분의 집계 함수가 NULL 값을 무시한다는 것이다.
예외적으로:
- COUNT(*) 는 NULL 포함해서 행 개수를 센다.
- SUM()은 모두 NULL이면 0이 아니라 NULL 이다.
11. GROUP BY와 HAVING
GROUP BY
같은 값을 기준으로 데이터를 묶는다.
FROM instructor
GROUP BY dept_name;
이 쿼리는 학과별 평균 급여를 구한다.
HAVING
그룹에 조건을 주는 절이다.
FROM instructor
GROUP BY dept_name
HAVING AVG(salary) > 42000;
이건 평균 급여가 42000보다 큰 학과만 보여준다.
WHERE와 HAVING 차이
이것도 자주 헷갈린다.
- WHERE: 그룹 만들기 전, 개별 행을 필터링
- HAVING: 그룹 만든 후, 그룹을 필터링
즉,
- 행 조건 → WHERE
- 집계 결과 조건 → HAVING
[이미지 위치 추천]
SQL 실행 순서 / WHERE vs HAVING 설명 그림
검색 키워드: sql execution order where group by having diagram
12. DDL 기본 정리
CREATE
CREATE USER user1 WITH PASSWORD '1234';
CREATE TABLE student (...);
테이블 생성 시 자주 쓰는 제약조건:
- PRIMARY KEY
- FOREIGN KEY
- CHECK
- NOT NULL
- DEFAULT
ALTER
테이블 구조를 수정할 때 사용한다.
ALTER TABLE r DROP column_name;
ALTER TABLE r ALTER COLUMN column_name TYPE new_type;
DROP
DROP USER user_name;
테이블 구조와 데이터 자체를 삭제한다.
13. DML 기본 정리
INSERT
INSERT INTO 테이블명 (컬럼1, 컬럼2) VALUES (...);
UPDATE
SET 컬럼 = 값
WHERE 조건;
여기서 WHERE를 빼먹으면 모든 행이 수정되니까 진짜 조심해야 한다.
DELETE
WHERE 조건;
14. DCL과 사용자 권한 관리
권한 관리는 실제 DB 운영에서 매우 중요하다.
모든 사용자가 모든 테이블을 수정할 수 있으면 큰일 난다.
자주 쓰는 명령어
REVOKE 권한 ON 테이블 FROM 사용자;
COMMIT;
ROLLBACK;
사용자 관련 예시
ALTER USER embery WITH PASSWORD '5678';
DROP USER embery;
권한 예시
REVOKE INSERT, UPDATE ON takes FROM embery;
15. PostgreSQL에서 자주 쓰는 psql 명령어
실습할 때 자주 보는 명령어들도 같이 정리해두면 좋다.
- \i [파일명] : SQL 파일 실행
- \cd [경로] : 작업 디렉토리 변경
- \! ls / \! dir : 현재 폴더 파일 목록 확인
- \c [데이터베이스명] [사용자명] : 접속 전환
- \conninfo : 현재 접속 정보 확인
- \l : 데이터베이스 목록
- \dt : 테이블 목록
- \d [테이블명] : 테이블 구조 확인
- \du : 사용자 목록 및 권한 확인
- \timing : 쿼리 실행 시간 표시
- \e : 외부 편집기 열기
AUTOCOMMIT
PostgreSQL은 기본적으로 AUTOCOMMIT on 상태다.
즉, 명령어 하나 실행할 때마다 바로 저장된다.
트랜잭션 단위로 묶고 싶으면:
- BEGIN;
- COMMIT;
- ROLLBACK;
이렇게 사용한다.
16. 유튜브 같은 서비스에서 DB가 왜 중요한가?
노트에 있던 유튜브 예시도 꽤 좋은 포인트라 같이 정리해보면 좋다.
비디오 플랫폼에서는 크게 두 종류의 데이터가 있다.
- 실제 비디오 파일
- 메타데이터
- 제목
- 업로더
- 태그
- 시청자 정보
- 권한 정보
여기서 실제 비디오 파일은 대용량이라 별도의 저장소에 둘 수 있지만,
검색, 추천, 사용자 관리, 시청 기록 관리 같은 건 전부 메타데이터 관리가 핵심이다.
특히 중요한 문제는:
- 메타데이터와 실제 파일의 원자적 저장
- 사용자별 접근 권한
- 대량 조회 처리
- 일관성 있는 검색 결과 제공
즉, 대규모 서비스일수록 DBMS의 필요성이 더 커진다.
17. 핵심 요약
이번 챕터에서 중요한 핵심만 다시 뽑아보면 이렇다.
- 데이터베이스는 여러 사용자가 공유하는 데이터를 체계적으로 관리하는 집합이다.
- 파일 시스템만으로 데이터를 관리하면 중복, 비일관성, 무결성, 원자성, 보안 문제가 생긴다.
- DBMS는 이런 문제를 해결하기 위한 시스템이다.
- 데이터베이스는 데이터 모델, 스키마, 인스턴스 개념으로 이해해야 한다.
- SQL은 크게 DDL, DML, DCL로 나눠서 볼 수 있다.
- SQL의 실제 실행 순서는
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT - WHERE는 행 필터링, HAVING은 그룹 필터링이다.
- NULL은 값이 없음을 의미하며, 집계 함수와 함께 나올 때 주의해야 한다.
마무리
데이터베이스 1장 정리: 왜 데이터베이스가 필요한지, 그리고 DBMS가 어떤 문제를 해결하는지 이해하는 챕터
- 파일 시스템엔 한계가 있다
- 그래서 DBMS가 필요하다
- DBMS는 데이터를 구조적으로 관리한다 그걸 다루는 언어가 SQL!