3-7 연습 문제 — 실행하고 나면
무엇이 남을까
이번 강의에서 배운 것 — ALTER TABLE · DELETE · TRUNCATE · DROP, 그리고 실행 전에 확인할 세 가지. 오늘은 명령을 외우는 게 아니라 각 명령을 실행한 뒤 테이블에 무엇이 남는지를 직접 판정해 봅니다.
섹션 3 에서의 위치
완료 ✓
강의 완료 ✓
지금 여기
섹션 3 마무리
아래 명령들은 실제로 실행하지 마세요. 실습 shop DB 가 망가집니다. 머릿속
으로 결과를 판정하는 게 오늘의 훈련이에요. — 혹시 이미 실행해서 망가뜨렸다면
2-3 에서 쓴 init.sql 을 다시 실행하면 원래대로 복구됩니다.
2-4 에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 정답부터 묻지 말고 — “이 명령을 실행하면 행과 구조 중에 무엇이 남는지 판단하는 기준만 알려줘” 처럼 판단 기준을 물어보세요. 다 푼 뒤에는 본인의 판정과 근거를 적어서 검증받는 게 가장 많이 남습니다.
문제 1. 실행 뒤에 무엇이 남을까요
회원 20명이 그대로 들어 있는 가상의 복사본 테이블 members_temp 가 있다고 해봅시다. 구조는 실제 members 와 같지만, 이 테이블을 참조하는 자식 테이블은 하나도 없습니다.
| member_id | member_name | gender | age | joined_at |
|---|---|---|---|---|
| 1 | 김철수 | M | 35 | 2025-01-15 |
| 2 | 이영희 | F | 28 | 2025-02-03 |
| 3 | 박민수 | M | 42 | 2025-02-10 |
| ⋮ | ||||
| 20 | 백서윤 | F | 21 | 2026-04-02 |
이 테이블에 아래 네 명령을 각각 따로 실행했다고 할 때, 실행 뒤에 남는 행 수와 테이블 구조가 어떻게 되는지 표를 채워보세요.
| # | 실행한 명령 | 남는 행 수 | 테이블 구조 |
|---|---|---|---|
| ① | DELETE FROM members_temp WHERE age >= 40; | ? | ? |
| ② | DELETE FROM members_temp; | ? | ? |
| ③ | TRUNCATE TABLE members_temp; | ? | ? |
| ④ | DROP TABLE members_temp; | ? | ? |
명령 이름을 떠올리지 말고 사라지는 범위로 생각하세요 — 행인가, 모든 행인가, 테이블 자체인가.
정답 보기
| # | 명령 | 남는 행 수 | 테이블 구조 |
|---|---|---|---|
| ① | DELETE — 조건 있음 | 15행 | 그대로 남음 |
| ② | DELETE — 조건 없음 | 0행 | 그대로 남음 |
| ③ | TRUNCATE | 0행 | 그대로 남음 |
| ④ | DROP | 테이블이 없음 | 함께 사라짐 |
① 15행이 남습니다. 40살 이상인 회원은 박민수(42) · 조성민(45) · 오지은(40) · 권현석(50) · 안소영(44) 다섯 명입니다. DELETE 는 조건을 붙이면 원하는 행만 지울 수 있으니 20 − 5 = 15행이 남고, 컬럼과 규칙은 손대지 않으니 구조는 그대로예요.
②와 ③은 결과가 똑같아 보입니다. 둘 다 행이 0개인 빈 테이블이 남습니다. 차이는 방식이에요 — DELETE 는 조건을 붙일 수 있고, TRUNCATE 는 항상 모든 행이 대상이라 일부만 고를 수 없습니다.
④ 만 성격이 다릅니다. DROP 은 데이터만 지우는 명령이 아니라 테이블 자체를 지웁니다. 데이터와 컬럼, 제약조건이 전부 사라지고 그 이름의 테이블은 더 이상 존재하지 않아요. ②③ 뒤에는 새 데이터를 넣을 수 있지만, ④ 뒤에는 넣을 그릇조차 없습니다.
TRUNCATE 의 내부 처리 방식과 되돌리기 가능 여부는 데이터베이스에 따라
달라질 수 있습니다. “TRUNCATE 는 무조건 되돌릴 수 없다” 같은 문장으로
외우지 마세요. 지금 확실한 건 하나 — 모든 행이 사라지고 구조는 남는다.
문제 2. 구조를 바꾸면 데이터에는 무슨 일이 생길까요
이번에는 ALTER TABLE 입니다. 아래 세 가지 구조 변경이 이미 저장된 데이터에 어떤 일을 만드는지 각각 설명해보세요.
| # | 무엇을 바꾸나 |
|---|---|
| ① | products 에 재고를 담을 stock 컬럼을 추가한다 |
| ② | products.product_name 을 VARCHAR(100) → VARCHAR(6) 으로 줄인다 |
| ③ | members 에서 gender 컬럼을 삭제한다 |
②번은 아래 상품명으로 직접 확인해보세요. 어떤 값이 새 길이에 맞지 않을까요?
| product_name | 글자 수 |
|---|---|
| 립스틱 | 3 |
| 패딩 점퍼 | 5 |
| 무선 이어폰 | 6 |
| 프리미엄 그래놀라 | 9 |
| USB-C 케이블 | 9 |
정답 보기
① 컬럼 추가 — 모든 행에 칸이 하나 늘어납니다
상품 30개 전부에 stock 칸이 생깁니다. 그런데 그 칸에 들어갈 값은 아무도 모릅니다. 그래서 새 컬럼을 추가할 때는 3-2 에서 배운 규칙을 함께 정해야 해요 — 비워둘 수 있는 컬럼인지(NULL 허용), 아니면 기본값(DEFAULT)을 정해둘 것인지. 기존 행이 이미 30개 있는 상태에서 아무 대비 없이 NOT NULL 을 붙이면 — 데이터베이스가 알아서 정한 값(MySQL 이라면 숫자 0)이 상품 30개에 그대로 채워지거나, 채울 값이 없다며 명령이 거부될 수 있습니다. 어느 쪽이든 내가 의도한 재고 값은 아니에요.
② 길이 축소 — 이미 저장된 값이 새 규칙을 어깁니다
| 상품명 | 글자 수 | 판정 |
|---|---|---|
| 립스틱 | 3 | 맞음 |
| 패딩 점퍼 | 5 | 맞음 |
| 무선 이어폰 | 6 | 맞음 — 딱 6글자 |
| 프리미엄 그래놀라 | 9 | 맞지 않음 |
| USB-C 케이블 | 9 | 맞지 않음 |
새 길이에 맞지 않는 값이 있으면 데이터베이스는 그 명령을 거부하거나, 값을 잘라서 저장할 수 있습니다. 어느 쪽이든 실행 전에 확인하지 않으면 문제가 됩니다. 상품명이 조용히 프리미엄 그 로 잘려 있는 걸 나중에 발견하는 것보다, 지금 SELECT 로 가장 긴 상품명을 한 번 확인하는 게 훨씬 낫죠.
③ 컬럼 삭제 — 값도 함께 사라집니다
gender 컬럼을 지우면 컬럼 정의 한 줄만 없어지는 게 아니라, 회원 20명의 M · F 값이 전부 함께 사라집니다. 그리고 아차 싶어서 gender 컬럼을 다시 추가해도 — 돌아오는 건 빈 칸뿐입니다. 값은 백업에서 되살리거나 처음부터 다시 입력해야 해요.
구조 변경은 구조만 바꾸는 일이 아닙니다. 컬럼을 추가하면 채울 값을 정해야 하고, 규칙을 좁히면 기존 값이 걸리며, 컬럼을 지우면 그 안의 값이 함께 사라집니다.
문제 3 (도전). AI가 준 명령, 실행 전에 무엇을 물어야 할까요
실습을 하다가 AI 에게 이렇게 부탁했습니다 — “테스트하면서 쌓인 데이터 좀 정리해줘.” 그랬더니 명령 세 개가 돌아왔습니다.
세 가지 질문에 답해보세요.
다 번 문제는 3-5 의 외래키를 떠올리세요. orders 는 누구의 자식이고 누구의
부모인가요? 부모를 지우려 할 때 데이터베이스가 어떻게 반응하는지가 열쇠입니다.
정답 보기
가. 실행 전 확인 세 가지
여기에 하나 더 붙일 게 있습니다. 내 요청의 범위가 명확했는가. 저는 “테스트하면서 쌓인 데이터” 를 정리해달라고 했는데, ③번은 실제 회원 20명이 들어 있는 진짜 테이블을 지우는 명령입니다. AI 가 틀린 게 아니라 요청이 모호했던 거예요 — AI 는 내 데이터베이스에 지금 무엇이 들어 있는지 모릅니다.
나. 가장 위험한 것은 ③ DROP TABLE members
| # | 명령 | 사라지는 것 | 남는 것 |
|---|---|---|---|
| ① | DELETE FROM order_items | 주문상세 64줄 전부 | 테이블 구조 |
| ② | TRUNCATE TABLE orders | 주문 40건 전부 | 테이블 구조 |
| ③ | DROP TABLE members | 회원 20명 + 컬럼 + 제약조건 + 테이블 자체 | 없음 |
①과 ②도 되돌리기 어려운 명령이지만, 적어도 데이터를 다시 넣을 그릇은 남습니다. ③은 그릇까지 사라져요. 컬럼 정의와 기본키·외래키 설정까지 전부 없어지므로, 되살리려면 CREATE TABLE 부터 다시 해야 합니다. 그리고 백업이 없다면 복구가 어렵거나 불가능합니다.
다. 실제 shop DB 에서는 ②와 ③이 그대로 실행되지 않습니다
| # | 시도 | 실제로 일어나는 일 |
|---|---|---|
| ① | DELETE FROM order_items | 실행됨 — order_items 는 아무도 참조하지 않는 자식이다 |
| ② | TRUNCATE TABLE orders | 차단 — orders 는 order_items 가 참조하는 부모다 |
| ③ | DROP TABLE members | 차단 — members 는 orders 가 참조하는 부모다 |
3-5 에서 배운 참조 무결성이 여기서 안전장치로 작동합니다. orders 는 members 의 자식이면서 동시에 order_items 의 부모예요. 자식이 참조하고 있는 부모를 통째로 비우거나 지우려는 시도는 데이터베이스가 막아줍니다. 주인 없는 주문이나 존재하지 않는 회원의 주문이 생기지 않도록요.
외래키가 막아주는 건 참조 관계가 걸린 경우뿐입니다. ①번은 아무것도 막지
않았죠 — order_items 는 누구의 부모도 아니니까요. 참조하는 자식이 없는
테이블은 경고 없이 그대로 사라집니다.
AI 가 만든 명령을 읽을 때는 문법이 맞는지 보는 게 아닙니다. 딱 두 가지만 보세요 — 어느 테이블인가, 그리고 실행 뒤에 무엇이 남는가.
다 풀었다면
삭제 명령을 볼 때 이름을 떠올리는 대신 “실행하면 행이 사라지나, 모든 행이 사라지나, 테이블이 사라지나” 를 자동으로 묻게 됐다면
오늘 목표는 달성입니다.
아무것도 지우지 않고 확인만 하는 방법이 있습니다. DBeaver 좌측 트리에서 shop →
Tables → orders 를 더블클릭한 뒤 Foreign Keys 탭과 References 탭을
열어보세요. orders 가 누구를 참조하고, 누가 orders 를 참조하는지 한눈에
보입니다. — 지우기 전에 관계부터 확인하는 습관, 오늘 배운 게 바로 이겁니다.
이제 섹션 3 의 조각이 모두 모였습니다. 테이블·행·열·값, 컬럼의 약속, 데이터 타입, 기본키, 외래키, CREATE TABLE, 그리고 구조 변경과 삭제까지 — 다음 강의에서는 이 전부를 하나로 묶어 처음 보는 테이블 구조를 읽어내는 법을 정리합니다.