Sql implements guide
SQL ํ์ฉ ์๋ฒฝ ๊ฐ์ด๋
์ถ์ ๋น๋: ์
๋น์ถ ํ๊ทธ: CASCADE, RESTRICT, ์ญ์ /์กฐํ/๊ถํ ๋ถ์ฌ ๋ฌธ๋ฒ
๋ฐ์ดํฐ ์ ์์ด (DDL)
CREATE
- ๊ฐ์ฒด(DB, TABLE, INDEX, VIEW ๋ฑ) ์์ฑ
- ๋ฉํ์ธ์ด ํํ:
CREATE <๊ฐ์ฒด์ ํ> <๊ฐ์ฒด๋ช > <์ต์ >;
< >
: ์ ๋ ฅ์์ (์๋ต๊ฐ๋ฅ)[ ]
: ์ ํ์์[, ...]
: ๋ฐ๋ณต๊ฐ๋ฅ|
: ์ ํ๊ฐ๋ฅ
ํ ์ด๋ธ ์์ฑ ๋ฌธ๋ฒ
CREATE TABLE <ํ
์ด๋ธ๋ช
> (
<์ปฌ๋ผ๋ช
> <๋ฐ์ดํฐ์ ํ> [<์ ์ฝ์กฐ๊ฑด>] [, ...],
[ํ
์ด๋ธ ์ ์ฝ์กฐ๊ฑด]
);
๋ฐ์ดํฐ ์ ํ๊ณผ ์ ์ฝ์กฐ๊ฑด
- ๋ฐ์ดํฐ ์ ํ:
INT
,DOUBLE
CHAR
- ๊ณ ์ ํฌ๊ธฐ ๋ฌธ์์ดVARCHAR(N)
- ๊ฐ๋ณํฌ๊ธฐ ๋ฌธ์์ดDATE
UNIQUE
- ์ ์ผํค ์๋ณ์NOT NULL
- ๊ณต๋ฐฑ ๋ถํCHECK
- ์กฐ๊ฑด์ ๋ง์กฑ๊ฐ๋ง ํ์ฉ
- ์ ์ฝ์กฐ๊ฑด:
PRIMARY KEY (<์ปฌ๋ผ๋ช >[, ...])
- ๊ธฐ๋ณธํคFOREIGN KEY (<์ปฌ๋ผ๋ช >[, ...]) REFERENCES (<์ปฌ๋ผ๋ช >[, ...])
ON UPDATE <์ฒ๋ฆฌ์ต์ >
ON DELETE <์ฒ๋ฆฌ์ต์ >
โญ์ฒ๋ฆฌ์ต์ โญ
NO ACTION
: ์๋ฌด ์์ ์ํจSET DEFAULT
: ๊ธฐ๋ณธ๊ฐ ์ง์ SET NULL
: ๊ณต๋ฐฑ ์ฒ๋ฆฌ- CASCADE: ๊ด๋ จ ํํ ๋ชจ๋ ์ฒ๋ฆฌ
- RESTRICT: ๊ด๋ จ ํํ ์๋ ๊ฒฝ์ฐ๋ง ์ฒ๋ฆฌ
NULLIFY
: NULL ๊ฐ์ผ๋ก ๋น์
ํ ์ด๋ธ ๊ตฌ์กฐ ๋ณต์ฌ
CREATE TABLE <ํ
์ด๋ธ๋ช
> AS <SELECT๋ฌธ>;
์์
CREATE TABLE ํ์(
ํ๋ฒ INT PRIMARY KEY,
์ด๋ฆ CHAR(10) NOT NULL,
์ฐ๋ฝ์ฒ CHAR(15) DEFAULT '๋น๊ณต๊ฐ'
);
CREATE TABLE ๋์๋์ฌ(
๋์ฌ์ผ DATE NOT NULL,
ํ๋ฒ INT,
๋์๋ช
CHAR(20) NOT NULL,
FOREIGN KEY(ํ๋ฒ) REFERENCES ํ์(ํ๋ฒ)
ON UPDATE CASCADE
ON DELETE RESTRICT
);
ALTER
- ์ปฌ๋ผ ๋ณ๊ฒฝ:
ALTER TABLE <ํ ์ด๋ธ๋ช > ADD <ํ๋๋ช > <๋ฐ์ดํฐํ์ > [<์์น์ต์ >]; ALTER TABLE <ํ ์ด๋ธ๋ช > MODIFY <์ปฌ๋ผ๋ช > <๋ฐ์ดํฐ์ ํ>; ALTER TABLE <ํ ์ด๋ธ๋ช > RENAME COLUMN <์๋ณธ์ปฌ๋ผ๋ช > TO <๋ณ๊ฒฝ์ปฌ๋ผ๋ช >;
- ์ปฌ๋ผ ์ญ์ :
ALTER TABLE <ํ ์ด๋ธ๋ช > DROP <์ปฌ๋ผ๋ช >;
- ์ ์ฝ์กฐ๊ฑด ๋ณ๊ฒฝ:
ALTER TABLE <ํ ์ด๋ธ๋ช > ADD CONSTRAINT <์ ์ฝ์กฐ๊ฑด๋ช > <์ ์ฝ์กฐ๊ฑด>; ALTER TABLE <ํ ์ด๋ธ๋ช > ENABLE|DISABLE|DROP CONSTRAINT <์ ์ฝ์กฐ๊ฑด๋ช >;
DROP
DROP <๊ฐ์ฒด์ ํ> <๊ฐ์ฒด๋ช
> [<์ญ์ ์ต์
>];
TRUNCATE TABLE <ํ
์ด๋ธ๋ช
>;
๋ฐ์ดํฐ ์กฐ์์ด (DML)
INSERT
-- ๋ชจ๋ ๊ฐ ์ฝ์
INSERT INTO <ํ
์ด๋ธ๋ช
> VALUES (<๊ฐ>[, ...]);
-- ํน์ ์ปฌ๋ผ ๊ฐ ์ฝ์
INSERT INTO <ํ
์ด๋ธ๋ช
> (<์ปฌ๋ผ๋ช
>[, ...]) VALUES (<๊ฐ>[, ...]);
-- ๋ค๋ฅธ ํ
์ด๋ธ์์ ๋ณต์ฌ
INSERT INTO <ํ
์ด๋ธ๋ช
> (<ํ๋>[, ...]) <SELECT๋ฌธ>
UPDATE
UPDATE <ํ
์ด๋ธ๋ช
> SET <์ปฌ๋ผ๋ช
>=<๊ฐ>[, ...] WHERE <์กฐ๊ฑด์>;
DELETE
DELETE FROM <ํ
์ด๋ธ๋ช
> WHERE <์กฐ๊ฑด์>;
DELETE * FROM <ํ
์ด๋ธ๋ช
> WHERE <์กฐ๊ฑด์>;
SELECT
SELECT [ALL|DISTINCT] <์ปฌ๋ผ๋ช
>[,...] FROM <ํ
์ด๋ธ๋ช
>
[WHERE <์กฐ๊ฑด์>
[GROUP BY <์ปฌ๋ผ๋ช
> [HAVING <์กฐ๊ฑด์>]]
[ORDER BY <์ปฌ๋ผ๋ช
> [ASC | DESC]]];
SELECT ํ์ฉ
AS (๋ณ์นญ)
- ์ง๊ณํจ์:
COUNT()
: ๋ ์ฝ๋ ๊ฐ์SUM()/AVG()
: ํฉ๊ณ/ํ๊ทMAX()/MIN()
: ์ต๋๊ฐ/์ต์๊ฐSTDDEV()
: ํ์คํธ์ฐจVARIAN()
: ๋ถ์ฐ
SELECT SUM(์ ์) AS ํฉ๊ณ FROM ํ์์ ๋ณด;
SELECT ์ด๋ฆ AS ํ์๋ช
, ์ ์-5 AS ์ฑ์ FROM ํ์์ ๋ณด;
โญ์๋์ฐ ํจ์โญ
- ์์ํจ์:
RANK
: ๋์ผ ์์๋งํผ ๋ค์ ์์ ๊ฑด๋๋DENSE_RANK
: ๋์ผ ์์๋ฅผ ํ๋๋ก ์ฒ๋ฆฌROW_NUMBER
: ์์ฐจ์ ์์ ๋ถ์ฌ
- ํ์์ ํจ์:
FIRST_VALUE
: ์ต์๊ฐLAST_VALUE
: ์ต๋๊ฐLAG
: ์ด์ N๋ฒ์งธ ํ์ ๊ฐLEAD
: ์ดํ N๋ฒ์งธ ํ์ ๊ฐ
์กฐ๊ฑด์
AND
SELECT * FROM ์ฑ์ WHERE ๊ตญ์ด>=80 AND ์์ด>=80;
-- BETWEEN ํ์ฉ
SELECT * FROM ์ฑ์ WHERE ์ํ BETWEEN 80 AND 89;
OR
SELECT * FROM ์ฑ์ WHERE ๋ฐ="1๋ฐ" OR ๋ฐ="3๋ฐ" OR ๋ฐ="5๋ฐ";
-- IN ํ์ฉ
SELECT * FROM ์ฑ์ WHERE ๋ฐ IN("1๋ฐ", "3๋ฐ", "5๋ฐ");
IS NULL
SELECT * FROM ์ฑ์ WHERE ๋ฒ์ IS NULL;
LIKE
SELECT * FROM ์ฑ์ WHERE ์ด๋ฆ LIKE <ํจํด>;
LIKE %๋
: ๋์ผ๋ก ๋๋๋ ๋ฌธ์์ดLIKE ํ%
: ํ์ผ๋ก ์์ํ๋ ๋ฌธ์์ดLIKE %๊ธธ%
: ๊ธธ์ ํฌํจํ๋ ๋ฌธ์์ดLIKE ๊ฐ_
: ๊ฐ์ผ๋ก ์์ํ๋ 2๊ธ์LIKE _๊ฐ_
: ๊ฐ์ด ๊ฐ์ด๋ฐ์ธ 3๊ธ์LIKE ๊ฐ__
: ๊ฐ์ผ๋ก ์์ํ๋ 3๊ธ์
ํ์ ์ง์ (Sub Query)
์๋ธ ์ฟผ๋ฆฌ ๊ธฐ๋ณธ
- ๋ฉ์ธ ์ฟผ๋ฆฌ ์ด์ ์ ํ๋ฒ๋ง ์คํ
- ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ์ธ์ฟผ๋ฆฌ์ ๋ด๋ถ ์์
์ ์์ฌํญ:
- ๋น๊ต์ฐ์ฐ์ ์ค๋ฅธ์ชฝ์ ๊ธฐ์
- ์๊ดํธ()๋ก ๊ฐ์ธ๊ธฐ
- ๋ฉ์ธ์ฟผ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ ํ/์ปฌ๋ผ ์์ ์ผ์น
- ORDER BY ์ฌ์ฉ ๋ถ๊ฐ
๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ
- ํ๋์ ํ์ผ๋ก ๊ฒฐ๊ณผ ๋ฐํ
- ์ฌ์ฉ ์ฐ์ฐ์:
=
,<>
,>
,>=
,<
,<=
SELECT * FROM ์ฑ์
WHERE ํ๊ณผ=(SELECT ํ๊ณผ FROM ์ฑ์ WHERE ์ด๋ฆ="๊ถ์์");
๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ
- ์ฌ๋ฌ ํ์ผ๋ก ๊ฒฐ๊ณผ ๋ฐํ
- ์ฌ์ฉ ์ฐ์ฐ์:
IN
,ANY
,SOME
,ALL
,EXISTS
-- IN ์ฐ์ฐ์ ์์
SELECT ์ฑ๋ช
, ํ๋
FROM ๋ฐ์ดํฐ๋ฒ ์ด์ค
WHERE ํ๋ฒ IN (SELECT ์ธ๊ณต์ง๋ฅ.ํ๋ฒ FROM ์ธ๊ณต์ง๋ฅ);
-- EXISTS ์ฐ์ฐ์ ์์
SELECT ์ฑ๋ช
, ํ๋
FROM ๋ฐ์ดํฐ๋ฒ ์ด์ค
WHERE EXISTS (SELECT * FROM ์ธ๊ณต์ง๋ฅ
WHERE ๋ฐ์ดํฐ๋ฒ ์ด์ค.ํ๋ฒ = ์ธ๊ณต์ง๋ฅ.ํ๋ฒ);
์ ๋ ฌ๊ณผ ๊ทธ๋ฃนํ
์ ๋ ฌ (ORDER BY)
-- ๋จ์ผ ์ ๋ ฌ
SELECT * FROM ์ฑ์ ORDER BY ์ ์ DESC;
-- ๋ค์ค ์ ๋ ฌ
SELECT * FROM ์ฑ์ ORDER BY ์ฑ๋ณ ASC, ์ฑ์ DESC;
๊ทธ๋ฃนํ (GROUP BY)
-- ๊ธฐ๋ณธ ๊ทธ๋ฃนํ
SELECT ์ฑ๋ณ, COUNT(*) FROM ์ฑ์ GROUP BY ์ฑ๋ณ;
-- HAVING ์ ์ฌ์ฉ
SELECT ์ฑ๋ณ, COUNT(*) FROM ์ฑ์
GROUP BY ์ฑ๋ณ HAVING COUNT(*)<3;
โญ๊ทธ๋ฃน ํจ์โญ
ROLLUP()
: ์ฒซ ์นผ๋ผ์ ๊ฐ ๊ทธ๋ฃน ํฉ๊ณ์ ์ ์ฒด ํฉ๊ณCUBE()
: ๋ชจ๋ ์นผ๋ผ์ ๊ฐ ๊ทธ๋ฃน ํฉ๊ณ์ ์ ์ฒด ํฉ๊ณGROUPING SETS()
: ๊ฐ ๊ทธ๋ฃน๋ณ ์ด ํฉ๊ณ๋ง ํ์GROUPING()
: ์ง๊ณ ํจ์ ์ง์
์กฐ์ธ (JOIN)
INNER JOIN
SELECT * FROM <์ผ์ชฝ ํ
์ด๋ธ>
JOIN <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>
ON <์ผ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
> = <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
>;
OUTER JOIN
SELECT * FROM <์ผ์ชฝ ํ
์ด๋ธ>
OUTER JOIN <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>
ON <์ผ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
> = <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
>;
LEFT/RIGHT JOIN
-- LEFT JOIN
SELECT * FROM <์ผ์ชฝ ํ
์ด๋ธ>
LEFT JOIN <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>
ON <์ผ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
> = <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
>;
-- RIGHT JOIN
SELECT * FROM <์ผ์ชฝ ํ
์ด๋ธ>
RIGHT JOIN <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>
ON <์ผ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
> = <์ค๋ฅธ์ชฝ ํ
์ด๋ธ>.<์ปฌ๋ผ๋ช
>;
๋ฐ์ดํฐ ์ ์ด์ด (DCL)
๊ถํ ์ ์ด
GRANT
GRANT <๊ถํ ์ ํ> TO <๋์>
[WITH GRANT OPTION | WITH ADMIN OPTION];
WITH GRANT OPTION
: ๊ถํ ๋ถ์ฌ/ํ์ ๊ฐ๋ฅWITH ADMIN OPTION
: ๊ถํ ๋ถ์ฌ๋ง ๊ฐ๋ฅ
REVOKE
REVOKE <๊ถํ ์ ํ> FROM <๋์>;
ROLE
- ์ฌ์ฉ์ ๊ทธ๋ฃน ๊ด๋ฆฌ
- RBAC(Role Based Access Control) ๋ฐฉ์ ์ฌ์ฉ
ํธ๋์ญ์ ์ ์ด
ํธ๋์ญ์ ํน์ง
- ๋ ผ๋ฆฌ์ ์ฐ์ฐ๋ค(DML)์ ์ต์ ๋จ์
- ํน์ง: ์์์ฑ, ์ผ๊ด์ฑ, ๊ณ ๋ฆฝ์ฑ, ์ง์์ฑ
ํธ๋์ญ์ ์ํ
- ํ๋(Active)
- ์๋ฃ(Committed)
- ์คํจ(Failed)
- ์ฒ ํ(Aborted)
- ์คํ ์ทจ์(Undo)
- ๋ค์ ์คํ(Redo)
์ ์ด ๋ช ๋ น์ด
COMMIT
: ๋ณ๊ฒฝ์ฌํญ ์ต์ข ๋ฐ์ROLLBACK
: ์ด์ ์ํฉ์ผ๋ก ๋ณต๊ตฌSAVEPOINT
: ROLLBACK ์ง์ ์ง์
์ ์ฐจํ SQL
๊ธฐ๋ณธ ๊ตฌ์ฑ์์
DECLARE
: ์ ์ ์์ญBEGIN~END
: ์ค์ ๊ตฌํ ์์ญOR REPLACE
: ๊ธฐ์กด ์ฝ๋ ๋ฎ์ด์ฐ๊ธฐ
ํ๋ก์์ (Procedure)
- ํธ์ถ์ ํตํด ์คํ
- ๋ฐํ๊ฐ ์์
- ๊ตฌ์ฑ: CONTROL, EXCEPTION, SQL, TRANSACTION
์ฌ์ฉ์ ์ ์ ํจ์
- ํธ์ถ์ ํตํด ์คํ
- ๋ฐํ๊ฐ ์กด์ฌ
- ๊ตฌ์ฑ: CONTROL, EXCEPTION, SQL, RETURN
โญํธ๋ฆฌ๊ฑฐ (Trigger)โญ
- ์ด๋ฒคํธ ๋ฐ์ ์ ์๋ ํธ์ถ
- ์ ์ถ๋ ฅ/๋ฐํ๊ฐ ์์
๊ตฌ์ฑ์์
- EVENT: ์คํ ์กฐ๊ฑด (ํ์)
- CONTROL: ์์ฐจ/๋ถ๊ธฐ/๋ฐ๋ณต ์ฒ๋ฆฌ
- EXCEPTION: ์์ธ ์ฒ๋ฆฌ
- SQL: ์ฃผ๋ก DML ์ฌ์ฉ
์ํ ์์
AFTER
: ํ ์ด๋ธ ๋ณ๊ฒฝ ํ ์คํBEFORE
: ํ ์ด๋ธ ๋ณ๊ฒฝ ์ ์คํFOR EACH NOW
: ๋ ์ฝ๋๋ง๋ค ํธ๋ฆฌ๊ฑฐ ์ํNEW
: ์๋ก์ด ๋ฐ์ดํฐOLD
: ๊ธฐ์กด ๋ฐ์ดํฐ
์ธ๋ฑ์ค์ ๋ทฐ
์ธ๋ฑ์ค
- ๋น ๋ฅธ ๊ฒ์์ ์ํ ์๋ฃ๊ตฌ์กฐ
- ๊ธฐ๋ณธํค ์ค์ ์ ์๋ ์์ฑ
- ์์ ์ด ์ฆ์์๋ก ๋นํจ์จ์
๊ตฌํ
-- ์์ฑ
CREATE [UNIQUE] INDEX <์ธ๋ฑ์ค๋ช
>
ON <ํ
์ด๋ธ๋ช
>(<์ปฌ๋ผ๋ช
>[, ...]);
-- ๋ณ๊ฒฝ
ALTER [UNIQUE] INDEX <์ธ๋ฑ์ค๋ช
>
ON <ํ
์ด๋ธ๋ช
>(<์ปฌ๋ผ๋ช
>[, ...]);
-- ์กฐํ
SHOW INDEX FROM <ํ
์ด๋ธ๋ช
>;
๋ทฐ (View)
- ๋ ผ๋ฆฌ์ ๊ฐ์ ํ ์ด๋ธ
- ์์คํ ์นดํ๋ก๊ทธ์ ์ ์ฅ
- ์ข ์ ํ ์ด๋ธ ์ ๊ฑฐ ์ ํจ๊ป ์ ๊ฑฐ
์ฅ์
- ๋ ผ๋ฆฌ์ ๋ ๋ฆฝ์ฑ ์ ์ง
- ์ ๊ทผ ๋ฐฉ๋ฒ ๋จ์ํ
- ๋ฐ์ดํฐ ๋ณด์ ์ ์ง
๋จ์
- ์ธ๋ฑ์ค ์ฌ์ฉ ๋ถ๊ฐ
- ์์ /๋ณ๊ฒฝ ๋ถ๊ฐ
๊ตฌํ
-- ์์ฑ
CREATE VIEW <๋ทฐ ์ด๋ฆ>(<์ปฌ๋ผ ๋ชฉ๋ก>)
AS SELECT๋ฌธ [์ต์
];
-- ์ญ์
DROP VIEW <๋ทฐ ์ด๋ฆ>;
-- ์กฐํ
SELECT * FROM <๋ทฐ ์ด๋ฆ>;
์ฃผ์ ์ต์
REPLACE
: ์ฌ์์ฑFORCE
: ๋ฌด์กฐ๊ฑด ์์ฑNOFORCE
: ์๋ณธ ํ ์ด๋ธ ์กด์ฌ ์์๋ง ์์ฑWITH CHECK OPTION
: ์กฐ๊ฑด ์ปฌ๋ผ ์์ ๋ถ๊ฐWITH READ ONLY
: ์ ์ฒด ์์ ๋ถ๊ฐ
์์คํ ์นดํ๋ก๊ทธ
ํน์ง
- DBMS๊ฐ ์๋ ์์ฑ
- ์กฐํ๋ง ๊ฐ๋ฅ (์ง์ ๋ณ๊ฒฝ ๋ถ๊ฐ)
- DDL ์คํ ์ ์๋ ๊ฐฑ์
SQL ์ง์๋๊ตฌ
PL/SQL
: ํ์ฅ SQL๋๊ตฌSQL*Plus
: Oracle ์ ๊ณต ๋๊ตฌAPM
: ์ฑ๋ฅ ๋ชจ๋ํฐ๋งTKPROF
: SQL ์ถ์ /๋ถ์EXPLAIN PLAN
: SQL ์คํ๊ฒฝ๋ก ๋ถ์
๋ณํ์ ์ด
๋ฌธ์ ์
- ๋ถ์ค๋ ๊ฐฑ์
- ๋ชจ์์ฑ
- ์ฐ์ ๋ณต๊ท
- ๋น์๋ฃ ์์กด์ฑ
๋กํน (Locking)
- ๋ค๋ฅธ ํธ๋์ญ์ ์ ๊ทผ ์ ํ
- ๋กํฌ ๋จ์๊ฐ ํด์๋ก:
- ๋ณํ์ฑ ๋ฎ์
- ์ค๋ฒํค๋ ๊ฐ์
- ๋กํฌ ๋จ์๊ฐ ์์์๋ก:
- ๋ณํ์ฑ ๋์
- ์ค๋ฒํค๋ ์ฆ๊ฐ
๋กํน ๊ธฐ๋ฒ
- ํ์ ์คํฌํ: ์ง๋ ฌ ์ฒ๋ฆฌ
- ๋๊ด์ ๋ณํ ์ ์ด: ์ข ๋ฃ ์ ์ผ๊ด ๊ฒ์ฌ
- ๋ค์ค ๋ฒ์ ๋ณํ ์ ์ด: ํ์ ์คํฌํ ๊ธฐ๋ฐ ๋ฒ์ ์ ํ
ํ๋ณต
- ์ฅ์ ๋ฐ์ ์ด์ ์ํ๋ก ๋ณต์
- ์ฐ์ฐ์: Undo, Redo
ํ๋ณต ๊ธฐ๋ฒ
- ๋ก๊ทธ ์ด์ฉ:
- ์ฆ์ ๊ฐฑ์ : ์ฆ์ ๋ฐ์ + Undo
- ์ง์ฐ ๊ฐฑ์ : ์๋ฃ ์ ๋ฐ์ + Redo
- ๊ฒ์ฌ ์์ :
- CheckPoint ์ด์ : Redo
- CheckPoint ์ดํ: Undo
- ๊ทธ๋ฆผ์ ํ์ด์ง: ๋ณต์ฌ๋ณธ ๊ธฐ๋ฐ ํ๋ณต