[멋사 클라우드 5기] Day 13 - DML, DDL, DCL, TCL

2026. 2. 8. 00:57·Learning Log

1. DML (Data Manipulation Language)

개요

  • 테이블에 저장된 데이터를 조작하는 SQL
  • 데이터의 삽입 / 수정 / 삭제 작업에 사용
  • 주요 키워드: INSERT, UPDATE, DELETE, SELECT

특징

  • DML은 실행 시 즉시 DB에 반영되지 않음
  • COMMIT 이전 상태로 ROLLBACK 가능
  • 트랜잭션의 영향을 받음

기본 문법

-- INSERT
INSERT INTO table명 (column1, column2, column3)
VALUES (value1, value2, value3);

-- UPDATE
UPDATE table명
SET column1 = value1, column2 = value2
WHERE condition;

-- DELETE
DELETE FROM table명
WHERE condition;

 


2. DDL (Data Definition Language)

개요

  • 데이터베이스의 구조를 정의하는 SQL
  • 테이블, 컬럼, 제약 조건 등의 스키마 관리 담당
  • 주요 키워드: CREATE, ALTER, DROP, TRUNCATE

특징

  • 구조 자체를 변경
  • 대부분의 DBMS에서 자동 COMMIT
  • 실행 결과 되돌리기 어려움

기본 문법

-- Database
CREATE DATABASE database명;
DROP DATABASE database명;

-- CREATE TABLE
CREATE TABLE table명 (
    column1 datatype,
    column2 datatype,
);

-- DROP TABLE
DROP TABLE table명;

-- ALTER TABLE
ALTER TABLE table명 ADD column명 datatype;
ALTER TABLE table명 DROP COLUMN column명;
ALTER TABLE table명 MODIFY column명 datatype;

제약 조건 (Constraints)

  • 테이블에 저장되는 데이터의 규칙을 정의
  • 데이터의 무결성과 일관성을 보장하기 위한 장치

주요 제약 조건

NOT NULL        : NULL 값 허용 안 함
UNIQUE          : 중복 값 허용 안 함
PRIMARY KEY     : 기본키 (NOT NULL + UNIQUE)
FOREIGN KEY     : 다른 테이블의 컬럼 참조
CHECK           : 값의 범위 / 조건 제한
DEFAULT         : 값 미입력 시 기본값 지정
AUTO_INCREMENT  : 값 자동 증가

 

컬럼 레벨 제약 조건

CREATE TABLE person (
    empno INT PRIMARY KEY,
    ename VARCHAR(10) UNIQUE,
    age INT CHECK (age BETWEEN 1 AND 100),
    gender CHAR(1) DEFAULT 'F'
);

 

테이블 레벨 제약 조건

CREATE TABLE person (
    empno INT NOT NULL,
    ename VARCHAR(10),
    age INT,
    gender CHAR(1) DEFAULT 'F',

    CONSTRAINT pk_person PRIMARY KEY (empno),
    CONSTRAINT uk_person_ename UNIQUE (ename),
    CONSTRAINT ck_person_age CHECK (age BETWEEN 1 AND 100)
);

 

제약 조건 네이밍 컨벤션

pk_테이블명
uk_테이블명_컬럼명

 

제약 조건 추가 / 삭제

-- PRIMARY KEY 추가
ALTER TABLE 테이블명
ADD CONSTRAINT pk_제약조건명 PRIMARY KEY (컬럼명);

-- FOREIGN KEY 추가
ALTER TABLE 테이블명
ADD CONSTRAINT fk_제약조건명
FOREIGN KEY (컬럼명) REFERENCES dept01(컬럼명);

-- PRIMARY KEY 삭제
ALTER TABLE 테이블명 DROP PRIMARY KEY;

-- FOREIGN KEY 삭제
ALTER TABLE 테이블명 DROP FOREIGN KEY fk_제약조건명;

 

제약 조건 정리

제약 조건 설명 비고
PRIMARY KEY 중복 불가, NULL 불가 테이블당 1개
NOT NULL NULL 허용 안 함 컬럼 레벨
UNIQUE 중복 불가 NULL 여러 개 허용
CHECK 값 제한 MySQL 8.0.16+
DEFAULT 기본값 설정 값 미입력 시
FOREIGN KEY 다른 테이블 참조 참조 무결성

 

FK 옵션

옵션 의미
CASCADE 부모 변경/삭제 시 자식도 변경/삭제
SET NULL 자식 컬럼을 NULL로 변경
RESTRICT 부모 변경/삭제 불가
NO ACTION RESTRICT와 동일
(미지정) 기본값 = RESTRICT

 


3. DCL (Data Control Language)

개요

  • 데이터베이스 접근 권한 및 보안을 제어하는 SQL
  • 사용자 계정 및 권한 관리 담당
  • 주요 키워드: GRANT, REVOKE

기본 문법

-- USER
CREATE USER '계정명'@'IP주소' IDENTIFIED BY '비밀번호';
DROP USER '계정명'@'IP주소';

-- GRANT
GRANT 권한 ON 데이터베이스명.테이블명
TO '계정명'@'IP주소';

-- REVOKE
REVOKE 권한 ON 데이터베이스명.테이블명
FROM '계정명'@'IP주소';

-- 권한 적용
FLUSH PRIVILEGES; -- 보통 필요없다

 

MySQL에서 계정은 단순히 ID 하나로만 구분되지 않는다.
실제로 MySQL이 인식하는 계정의 단위는 다음과 같다.

계정명 + 접속 host(IP) = 하나의 MySQL 계정

즉, 아래 두 계정은 이름은 같아 보여도 완전히 다른 계정이다.

'someone'@'203.0.113.%'   -- 회사 IP
'someone'@'118.xxx.xxx.%' -- 집 IP

 

사용자는 동일한 노트북에서,
같은 ID와 비밀번호로 로그인하더라도

  • 회사에서 접속하면 → '계정명'@'회사IP'
  • 집에서 접속하면 → '계정명'@'집IP'

👉 MySQL 서버는 접속한 IP를 기준으로 자동으로 다른 계정을 선택한다.

따라서,

  • 회사 IP 계정에는 ALL PRIVILEGES
  • 집 IP 계정에는 SELECT만 부여하는 식의
    권한 분리가 가능하다.

권한 옵션

ALL PRIVILEGES : 모든 권한
CREATE, DROP, ALTER : DDL 권한
SELECT, INSERT, UPDATE, DELETE : DML / DQL 권한
USAGE : 권한 없음 (계정 생성 시 사용)

 

IP 주소 의미

%           : 모든 IP 허용
127.0.0.1   : 로컬 접속
localhost   : 로컬 접속

 


4. TCL (Transaction Control Language)

트랜잭션이란 무엇인가

트랜잭션(Transaction)은 데이터베이스에서 여러 작업을 하나의 묶음으로 처리하는 단위다.
쉽게 말해 “여기부터 여기까지는 하나의 작업”이라고 묶어 처리하는 개념이다.

예를 들어 은행 계좌 이체를 생각해보면,

  1. A 계좌에서 돈을 뺀다.
  2. B 계좌에 돈을 넣는다.

이 두 작업은 반드시 함께 성공하거나, 함께 실패해야 한다.
중간에 하나만 실행되면 데이터가 꼬이게 된다.
이처럼 여러 작업을 하나의 논리적 단위로 묶은 것이 트랜잭션이다.


COMMIT의 의미

COMMIT은 지금까지 트랜잭션에서 수행한 작업을 최종 확정하는 명령어다.

INSERT INTO products VALUES (1, '키보드', 50000);
COMMIT;

COMMIT이 실행되면:

  • 변경 사항이 데이터베이스에 영구 반영된다.
  • 다른 세션에서도 변경된 데이터가 보인다.
  • 이후에는 ROLLBACK으로 되돌릴 수 없다.

한 문장으로 정리하면,

COMMIT은 지금까지의 작업을 “확정 저장”하는 명령어다.


ROLLBACK의 의미

ROLLBACK은 트랜잭션에서 수행한 작업을 취소하고 이전 상태로 되돌리는 명령어다.

INSERT INTO products VALUES (1, '키보드', 50000);
ROLLBACK;

이 경우:

  • INSERT 작업이 취소된다.
  • 데이터는 원래 상태로 돌아간다.

즉,

ROLLBACK은 마지막 COMMIT 시점으로 되돌리는 명령어다.


COMMIT과 ROLLBACK의 기준점

트랜잭션에서 되돌아갈 수 있는 기준은 마지막 COMMIT 시점이다.

예를 들어:

COMMIT;     -- 기준점
UPDATE A;
UPDATE B;
UPDATE C;

ROLLBACK;

이 경우:

  • UPDATE A, B, C는 모두 취소된다.
  • 마지막 COMMIT 시점으로 돌아간다.

중요한 점은,

트랜잭션은 여러 개의 COMMIT 지점을 스택처럼 쌓아두지 않는다.

즉,

  • 브라우저 뒤로가기처럼 여러 단계로 되돌아가는 구조가 아니다.
  • 항상 “마지막 COMMIT” 하나만 기준점이 된다.

부분 롤백: SAVEPOINT

트랜잭션 내부에서 특정 지점까지만 되돌리고 싶을 때는 SAVEPOINT를 사용한다.

START TRANSACTION;

INSERT A;

SAVEPOINT s1;

INSERT B;
UPDATE C;

ROLLBACK TO s1;

이 경우:

  • INSERT B, UPDATE C는 취소된다.
  • INSERT A는 유지된다.

정리하면,

  • 기본 ROLLBACK → 마지막 COMMIT으로 이동
  • ROLLBACK TO SAVEPOINT → 특정 지점으로 이동

START TRANSACTION은 왜 필요한가

처음 보면 이런 의문이 생길 수 있다.

어차피 ROLLBACK은 마지막 COMMIT으로 돌아가는데
START TRANSACTION은 왜 필요한가?

 

핵심은 자동 커밋(auto-commit) 때문이다.

MySQL은 기본적으로 auto-commit이 켜져 있어서,

INSERT INTO products VALUES (1, 'A', 100);

이 한 줄이 실행되는 순간 자동으로 COMMIT이 된다.

이 상태에서는:

ROLLBACK;

을 해도 이미 COMMIT된 상태라 되돌릴 수 없다.


START TRANSACTION의 역할

START TRANSACTION;

INSERT INTO products VALUES (1, 'A', 100);
UPDATE products SET price = 200 WHERE id = 1;

ROLLBACK;

이 경우:

  • INSERT와 UPDATE가 하나의 트랜잭션으로 묶인다.
  • ROLLBACK 시 두 작업이 모두 취소된다.

즉,

START TRANSACTION은 자동 커밋을 잠시 멈추고
여러 작업을 하나의 트랜잭션으로 묶기 위한 명령어다.


DDL과 COMMIT의 관계

DDL 명령어는 대부분 자동 COMMIT이 발생한다.

CREATE TABLE test (...);

이 명령은 실행과 동시에 COMMIT이 발생한다.

따라서,

CREATE TABLE test (...);
ROLLBACK;

을 해도 테이블은 삭제되지 않는다.

정리하면,

  • DML (INSERT, UPDATE, DELETE) → COMMIT 필요
  • DDL (CREATE, DROP, ALTER) → 자동 COMMIT 발생

ACID: 트랜잭션의 4가지 핵심 특성

트랜잭션은 단순히 묶음 작업이 아니라, 반드시 지켜야 하는 네 가지 성질이 있다.
이를 ACID 특성이라고 한다.


Atomicity (원자성)

트랜잭션의 작업은 전부 성공하거나, 전부 실패해야 한다는 성질이다.

예:

  • 계좌 이체에서 출금만 되고 입금이 안 되면 안 된다.
  • 둘 다 성공하거나, 둘 다 취소되어야 한다.

이 성질은 주로 ROLLBACK으로 보장된다.


Consistency (일관성)

트랜잭션 실행 전과 후에 데이터는 항상 일관된 상태를 유지해야 한다는 성질이다.
("데이터가 논리적으로 맞는 상태인가?")

예:

  • 계좌 총합이 100만 원이었다면,
  • 트랜잭션 이후에도 총합은 여전히 100만 원이어야 한다.

이 성질은 다음 요소들이 함께 보장한다.

  • 제약조건 (PK, FK, CHECK 등)
  • 트랜잭션 처리
  • 애플리케이션 로직

Isolation (격리성)

동시에 여러 트랜잭션이 실행되더라도
서로 간섭하지 않는 것처럼 동작해야 한다는 성질이다.

예:

  • A가 수정 중인 데이터를
  • B가 중간 상태로 읽어버리면 안 된다.

이 성질은:

  • 락(lock)
  • 격리 수준(Isolation Level)

등으로 보장된다.


Durability (지속성)

COMMIT이 완료된 트랜잭션의 결과는
시스템이 갑자기 종료되더라도 반드시 보존되어야 한다는 성질이다.
("저장된 결과가 물리적으로 안전한가?")

예:

  • COMMIT 후 전원이 꺼져도
  • 데이터는 사라지지 않아야 한다.

이 성질은:

  • 로그 파일
  • 디스크 기록
  • 복구 시스템

등으로 보장된다.


트랜잭션에서 락(Lock)

데이터베이스는 여러 사용자가 동시에 접근한다.
이때 같은 데이터를 동시에 수정하거나 조회하면 데이터가 꼬일 수 있다.

예를 들어:

  1. 사용자 A가 상품 가격을 1000원으로 수정
  2. 사용자 B가 동시에 가격을 2000원으로 수정
  3. A의 변경이 B에 의해 덮어쓰기 됨

이처럼 동시 작업으로 인해 발생하는 문제를 막기 위해
데이터베이스는 락(Lock) 이라는 장치를 사용한다.

락은 간단히 말해,

특정 데이터에 대해 다른 트랜잭션의 접근을 제한하는 장치다.


 

락의 기본 종류

MySQL(InnoDB 기준)에서는 크게 두 가지 단위의 락이 존재한다.

행 락(Row Lock)

특정 행(row)만 잠그는 방식이다.

  • 동시성 좋음
  • 여러 사용자가 동시에 작업 가능
  • InnoDB의 기본 방식

예:

UPDATE products
SET price = price + 1000
WHERE id = 1;

→ id=1인 행만 잠금


테이블 락(Table Lock)

테이블 전체를 잠그는 방식이다.

  • 단순하지만 동시성 낮음
  • 다른 사용자가 해당 테이블에 접근하기 어려움

주로:

  • MyISAM 엔진
  • 명시적 LOCK TABLES 사용 시

발생한다.


락의 성격: Shared Lock vs Exclusive Lock

Shared Lock (공유 락, S 락)

읽기용 락이다.

  • 여러 트랜잭션이 동시에 읽기 가능
  • 수정은 불가능

즉,

“같이 읽는 건 괜찮지만, 수정은 안 된다”


Exclusive Lock (배타 락, X 락)

수정용 락이다.

  • 하나의 트랜잭션만 접근 가능
  • 다른 트랜잭션은 읽기나 수정이 제한됨

즉,

“이 데이터는 내가 수정 중이니 다른 사람은 접근하지 마라”


어떤 SQL이 락을 거는가

UPDATE / DELETE

데이터를 수정하거나 삭제하면 해당 행에
Exclusive Lock이 걸린다.

START TRANSACTION;

UPDATE products
SET price = price + 1000
WHERE id = 1;

이 시점부터:

  • id=1 행은 잠김
  • 다른 트랜잭션은 수정 불가
  • COMMIT 또는 ROLLBACK 시 락 해제

일반 SELECT는 락을 거의 걸지 않는다

InnoDB에서는 일반 SELECT가
스냅샷 기반(MVCC) 으로 동작한다.

즉,

SELECT * FROM products;
  • 다른 트랜잭션이 수정 중이어도
  • 과거 시점의 데이터를 읽는다
  • 그래서 락 없이 읽기가 가능하다

락을 걸고 읽기: Locking Read

조회하면서 락을 걸고 싶을 때는 다음 구문을 사용한다.

FOR UPDATE (배타 락)

SELECT *
FROM products
WHERE id = 1
FOR UPDATE;
  • 해당 행에 Exclusive Lock 발생
  • 이후 UPDATE를 안전하게 수행 가능

FOR SHARE (공유 락)

SELECT *
FROM products
WHERE id = 1
FOR SHARE;
  • 해당 행에 Shared Lock 발생
  • 다른 트랜잭션도 읽기는 가능
  • 수정은 불가능

데드락(Deadlock)

두 트랜잭션이 서로의 락을 기다리면서
영원히 진행되지 않는 상태를 데드락이라고 한다.

예:

트랜잭션 A:

  • 행 1 잠금
  • 행 2 기다림

트랜잭션 B:

  • 행 2 잠금
  • 행 1 기다림

→ 서로 기다리며 멈춤

InnoDB는 데드락을 감지하면:

  • 한 트랜잭션을 강제로 ROLLBACK
  • 시스템을 정상 상태로 복구

락은 언제 풀리는가

대부분의 락은 다음 시점에 해제된다.

  • COMMIT
  • ROLLBACK

즉, 트랜잭션이 끝나야 락이 풀린다.

그래서 실무에서는:

트랜잭션은 최대한 짧게 유지하는 것이 중요하다.

'Learning Log' 카테고리의 다른 글

[멋사 클라우드 5기] Day 15 - MVC & JDBC 구조 톺아보기  (0) 2026.02.11
[멋사 클라우드 5기] Day 14 - Modeling, JDBC 이해하기  (1) 2026.02.09
[멋사 클라우드 5기] Day 12 - Join, Subquery, Union  (0) 2026.02.06
[멋사 클라우드 5기] Day 11 - DBMS 기초(2), DQL  (0) 2026.02.05
[멋사 클라우드 5기] Day 10 - 객체 다루기, DBMS 기초(1)  (0) 2026.02.04
'Learning Log' 카테고리의 다른 글
  • [멋사 클라우드 5기] Day 15 - MVC & JDBC 구조 톺아보기
  • [멋사 클라우드 5기] Day 14 - Modeling, JDBC 이해하기
  • [멋사 클라우드 5기] Day 12 - Join, Subquery, Union
  • [멋사 클라우드 5기] Day 11 - DBMS 기초(2), DQL
allluck777
allluck777
allluck777
    • 분류 전체보기 (44) N
      • AWS (0)
      • Network (0)
      • Linux (0)
      • Docker (0)
      • Project (4)
        • CloudNote (4)
      • Learning Log (36) N
      • Lecture (3)
        • 스프링 입문 - 코드로 배우는 스프링 부트, 웹 .. (3)
  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.6
allluck777
[멋사 클라우드 5기] Day 13 - DML, DDL, DCL, TCL
상단으로

티스토리툴바