416. DML (Data Manipulation Language) - 데이터 조작어
⚠️ 이 문서는 이미 뼈대가 완성된 데이터베이스 테이블 안에, **사용자가 진짜 데이터(회원 정보, 주문 내역 등)를 집어넣고, 고치고, 지우고, 검색할 때 사용하는 '데이터 조작어(DML)'**를 다룹니다. 백엔드 개발자가 평생 치는 쿼리의 99%가 이 DML에 해당합니다.
핵심 인사이트 (3줄 요약)
- 본질: 테이블이라는 그릇 안에 담긴 '내용물(데이터)'을 건드리는 명령어다.
- 명령어 종류:
SELECT(조회),INSERT(삽입),UPDATE(수정),DELETE(삭제) 4가지가 대표적이며, 흔히 CRUD라고 부른다.- 치명적 특징 (트랜잭션 종속): DDL(415번 문서)과 달리, DML은 엔터를 치는 순간 디스크에 바로 박히는 게 아니라 일단 임시 메모리(메모장)에만 적힌다.
COMMIT을 쳐야 비로소 영구 저장되고, 실수하면ROLLBACK으로 취소(되돌리기)할 수 있다.
Ⅰ. 개요: 붕어빵을 굽는 시간 (Context & Necessity)
DBA(데이터베이스 관리자)가 DDL로 '회원 테이블'이라는 붕어빵 틀을 예쁘게 만들어 주었다. 이제 그 틀에 밀가루와 팥을 붓고 붕어빵을 구워낼 차례다.
고객이 회원가입 버튼을 누르면 서버는 DB에 INSERT를 날린다.
고객이 비밀번호를 바꾸면 UPDATE를 날린다.
회원 탈퇴를 하면 DELETE를 날린다.
내 정보를 보여달라고 하면 SELECT를 날린다.
이 4가지 마법의 주문이 바로 **DML(데이터 조작어)**이며, 애플리케이션의 핵심 비즈니스 로직을 구성하는 알파이자 오메가다.
📢 섹션 요약 비유: DML은 이사 갈 집에 **'가구를 채워 넣고(INSERT), 소파 위치를 바꾸고(UPDATE), 안 쓰는 의자를 버리는(DELETE) 작업'**과 같습니다. 맘에 안 들면 언제든지
ROLLBACK이라고 외치고 이사 오기 전으로 방을 싹 되돌릴 수 있죠.
Ⅱ. DML의 핵심 명령어 4형제 ★
정보처리기사 실기 시험에서는 이 명령어들의 문법을 직접 손으로 쓰게 하므로, 괄호 위치와 키워드를 완벽하게 외워야 한다.
1. INSERT (삽입)
- 문법:
INSERT INTO 테이블명 (컬럼1, 컬럼2) VALUES (값1, 값2); - 특징: 컬럼명을 생략할 수 있지만, 그러면 테이블의 모든 컬럼 순서에 맞춰서 빠짐없이 값을 다 넣어야 한다. (실무에서는 에러 방지를 위해 무조건 컬럼명을 명시한다.)
2. UPDATE (수정)
- 문법:
UPDATE 테이블명 SET 컬럼1 = 새값 WHERE 조건; - 위험성:
WHERE조건을 빼먹고 쿼리를 날리면, 해당 테이블의 100만 명 고객 데이터가 전부 똑같은 값으로 바뀌어 버리는 대참사가 발생한다. (주니어 개발자가 가장 많이 치는 사고)
3. DELETE (삭제)
- 문법:
DELETE FROM 테이블명 WHERE 조건; - 특징: 데이터를 지워도 테이블의 뼈대는 그대로 남는다. 그리고 DDL의
TRUNCATE와 달리 한 줄 한 줄 지우기 때문에 속도가 느린 대신ROLLBACK이 가능하다.
4. SELECT (조회 / 검색)
- 가장 복잡하고, 데이터베이스 성능의 90%를 좌우하는 명령어다.
- (※ 중요도 때문에 정보처리기사에서는 DML 안에 포함하기도 하지만, 학술적으로는 데이터를 변형하지 않으므로 **DQL(Data Query Language)**이라는 별도 그룹으로 빼서 부르기도 한다.)
Ⅲ. 실무 주의점: Auto Commit의 함정
DML의 가장 큰 특징은 **"치자마자 저장되지 않는다(ROLLBACK 가능)"**는 것이다.
- 내가
DELETE FROM Users WHERE id = 1을 쳤다고 해서 DB 디스크에서 바로 날아가는 게 아니다. - 내 컴퓨터(세션) 화면에서만 지워진 것처럼 보일 뿐, 다른 사람 화면에는 여전히 보인다.
- 내가
COMMIT;명령어를 쳐야 비로소 모두의 화면에서 완전히 지워진다.
하지만 주의할 점: MySQL을 깔고 아무 설정을 안 하면, 디폴트로 **오토 커밋(Auto Commit)**이 켜져 있다. 즉, DML을 치는 순간 내 의지와 상관없이 숨겨진 COMMIT이 자동으로 같이 실행된다. 실무에서 데이터 수정 작업을 할 때는 반드시 오토 커밋을 끄고 작업해야 대참사를 막을 수 있다.
┌──────────────────────────────────────────────────────────────┐
│ DML과 트랜잭션(COMMIT / ROLLBACK)의 관계 시각화 │
├──────────────────────────────────────────────────────────────┤
│ │
│ [ 👨💻 개발자 ] │
│ "DELETE FROM Users WHERE name='김철수';" │
│ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ 🧠 트랜잭션 임시 메모리 │ ◀── (아직 디스크에 저장 안 됨) │
│ │ - 김철수 삭제 예약됨 │ │
│ └───────┬───────┬───────┘ │
│ │ │ │
│ (결정) ▼ ▼ (결정) │
│ [ COMMIT ] [ ROLLBACK ] │
│ │ │ │
│ ▼ ▼ │
│ 💾 영구 저장 🔄 취소하고 원상복구 (철수 생존!) │
└──────────────────────────────────────────────────────────────┘
Ⅳ. 결론
"DML은 비즈니스의 혈관이다."
현대의 백엔드 개발자들은 ORM(JPA)을 쓰기 때문에 INSERT, UPDATE 같은 쿼리를 손으로 직접 칠 일이 거의 없어졌다. 자바 코드에서 user.setName("이영희")라고 치면 하이버네이트가 알아서 UPDATE 쿼리를 만들어 DB에 쏘아주기 때문이다. 하지만 그 마법 같은 자동화 이면에, 데이터베이스 엔진이 WHERE 조건을 어떻게 타고 들어가서 데이터를 찾고 락(Lock)을 거는지, 그 DML의 물리적인 동작 원리를 모르면 수만 명이 몰리는 이벤트 날에 쏟아지는 데드락(Deadlock)의 폭풍을 막아낼 수 없을 것이다.
📌 관련 개념 맵
- SQL 3대장: DML (조작어), DDL (정의어 - 415번 문서), DCL (제어어 - 417번 문서)
- 보안 공격: SQL Injection (371번 문서 - DML의
WHERE조건을 조작하는 해킹) - 제어어: TCL (Transaction Control Language - COMMIT, ROLLBACK / 418번 문서)
- 주의점:
UPDATE,DELETE시WHERE절 누락 주의!
👶 어린이를 위한 3줄 비유 설명
- DML은 일기장에 '연필'로 글씨를 쓰는 것과 같아요. (
INSERT) - 글씨를 썼다가 마음에 안 들면 언제든지 지우개로 싹싹 지우고 원래 빈 종이로 되돌릴 수 있죠. (
ROLLBACK) - 하지만 글씨가 마음에 들어서 '네임펜'으로 꾹꾹 덧칠해 버리면(
COMMIT), 그땐 영원히 지워지지 않고 일기장에 남게 된답니다!