DevLog ๐ถ
[MySQL] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์ง์ ํ ์คํธํด๋ณด๊ธฐ ๋ณธ๋ฌธ
[MySQL] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ์ฟผ๋ฆฌ๋ฅผ ํตํด ์ง์ ํ ์คํธํด๋ณด๊ธฐ
dolmeng2 2023. 6. 21. 17:53๐ฑ ๋ค์ด๊ฐ๊ธฐ ์
์ง๋ ๋ฆฌ๋งํ ํฌ์คํ ์์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํ๋ 'CREW' ํ ์ด๋ธ์ ๋ํด์ ์ง์ ์ฝ๋ ๋ ๋ฒจ๋ก ์์ฑํด๋ณด๊ณ ์ ํ๋ค.
CREATE TABLE `CREW` (
`id` bigint NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
์ฌ์ ์ค์ ์ ์ํด์ ์คํ ๋ฆฌ์ง ์์ง์ innoDB๋ก ์ค์ ํ 'CREW' ํ ์ด๋ธ์ ์์ฑํด์ค๋ค.
SET AUTOCOMMIT = false;
โญ๏ธ ๊ทธ๋ฆฌ๊ณ , autocommit ๋ชจ๋๋ ๊ผญ OFF๋ก ์ค์ ํด๋๊ณ ์งํํ์.
๋๋ ์ด๋ฒ์ 2๊ฐ์ ์ธ์ ์ ์ด์ด์ ์งํํ์๋ค.
๐ฑ READ UNCOMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
๊ธ๋ก๋ฒ ์ค์ ์ผ๋ก ๊ฒฉ๋ฆฌ ์์ค์ ๋ณ๊ฒฝํ๋ฉด ์ฌํ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ธ์ ์ ๋ํด์ ์์ ๊ฐ์ด READ UNCOMMITTED๋ฅผ ์ง์ ํด์ฃผ์๋ค.
SELECT @@SESSION.transaction_isolation;
์ค์ ๋ก ์ธ์ ์ ๋ณด๋ฅผ ํ์ธํด๋ณด๋ฉด ์์ ๊ฐ์ด READ-UNCOMMITTED๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ฌ Dirty Read ํ์ธํด๋ณด๊ธฐ - INSERT
START TRANSACTION;
INSERT INTO CREW (id, name) VALUES (1, 'hello');
commit;
๊ทธ๋ฆฌ๊ณ , ๊ทธ๋ฆผ์ด๋ ๋๊ฐ์ด ๋ง๋ค๊ธฐ ์ํด์ ์ฐ์ 1๋ฒ ๋ ์ฝ๋์ธ 'hello'๋ฅผ ์ฝ์ ํด๋์. (์ด๋ค ์ธ์ ์ด๋ ์๊ด ์๋ค)
# ์ธ์
1
START TRANSACTION;
INSERT INTO CREW (id, name) VALUES (2, 'journey');
์ดํ, ์ธ์ 1์์ Commit ํ์ง ์๊ณ ๋จ์ํ 2๋ฒ ๋ ์ฝ๋ 'journey'๋ฅผ ์ฝ์ ํ์.
# ์ธ์
2
select * from CREW;
์ธ์ 2์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด, ์ธ์ 1์์ ์์ง ์ปค๋ฐ์ ํ์ง ์์์์๋ ์ฝ์ ์ด ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. (Dirty Read)
๊ทธ๋ผ, ์ด ์ํ์์ ์ธ์ 1์ ๋กค๋ฐฑ์ํค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
# ์ธ์
1
ROLLBACK;
๋กค๋ฐฑ ์ฌํญ์ด ๋ฐ์๋์ด ๋ฐ์ดํฐ๊ฐ ๋์ค์ง ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฆ, ์ด์ ์๋ ๊ฐ์ด ๋ณด์๋๋ฐ ๋ค์ ์กฐํํ๋ ๊ฐ์ด ์ฌ๋ผ์ง๋ ํ์์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํ๋ค.
๐ฌ Dirty Read ํ์ธํด๋ณด๊ธฐ - UPDATE
โญ๏ธ ์์ ๊ฒฝ์ฐ๋ณด๋ค update ์์ ๋ ๋ช ํํ๊ฒ ๋๋ฌ๋๋ ๊ฒ ๊ฐ์์ ํ ๊ฐ์ง ๋ ํ ์คํธ๋ฅผ ํ๊ณ ์ ํ๋ค.
# ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ฝ์
ํ ์ปค๋ฐ
START TRANSACTION;
INSERT INTO CREW (id, name) VALUES (1, 'hello');
COMMIT;
# ํด๋น ๋ฐ์ดํฐ์ ๋ํด์ ์
๋ฐ์ดํธ
START TRANSACTION;
UPDATE CREW SET name = 'hi' where id = 1;
์๊น์ฒ๋ผ hello๋ผ๋ ๋ ์ฝ๋๊ฐ ์ฝ์ ๋ ๋ค์, ์ ๋ฐ์ดํธ์ ๋ํ ํธ๋์ญ์ ์ ์์ํ๊ณ ์ปค๋ฐ์ ํ์ง ์์ ์ํ์ด๋ค.
# ์ธ์
2
SELECT * FROM CREW;
ํ์ง๋ง, READ UNCOMMITTED๋ก ์ธํด์ ์ปค๋ฐ๋์ง ์์ ์ฌํญ์ ๋ํด์๋ ๋ณ๊ฒฝ๋ ๋ ์ฝ๋ ๊ฐ์ด ์กฐํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
# ์ธ์
1
ROLLBACK;
์ด ์ํ์์ ์ธ์ 1์ ๋ํด ๋กค๋ฐฑ์ ํ๋ค๋ฉด hello๋ผ๋ ๊ฐ์ ๋ฐ๊ฒ ๋๋ค...!
๐ฑ READ COMMITTED
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
์ด๋ฒ์๋ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ๋ ๋ฒจ์ Read committed๋ก ๋ณ๊ฒฝํ๊ณ ์ดํด๋ณด์.
๐ฌ ํด๊ฒฐ๋ Dirty Read ํ์ ํ์ธํ๊ธฐ
START TRANSACTION;
INSERT INTO CREW (id, name) VALUES (1, 'hello');
INSERT INTO CREW (id, name) VALUES (2, 'journey');
COMMIT;
๋จผ์ , ๊ทธ๋ฆผ๊ณผ ๊ฐ์ ์ํฉ์ ๋ง๋ค๊ธฐ ์ํด 2๊ฐ์ ๋ ์ฝ๋๋ฅผ ์ฝ์ ํด๋์. (์ด์ ์ ์คํ ๊ฒฐ๊ณผ๋ TRUNCATE๋ก ์ ๊ฑฐํ์๋ค.)
# ์ธ์
1
START TRANSACTION;
UPDATE CREW SET name = 'hi' WHERE id = 1;
์ดํ, ์ธ์ 1์์ 1๋ฒ ๋ ์ฝ๋ 'hello'์ ๋ํด hi๋ก ์ ๋ฐ์ดํธํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค. ๋จ, ์ปค๋ฐํ์ง ์๋๋ค.
# ์ธ์
2
SELECT * FROM CREW;
์ด๋ ์ธ์ 2์์ ์กฐํํด๋ณด๋ฉด ์ธ๋ ์์ญ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ hi๊ฐ ์๋ hello๋ก ๋ณด์ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
โญ๏ธ ์ด์ ์ read uncommitted ์์ ์ ๋ฌ๋ผ์ง ๊ฒ์ ํ์ธํ ์ ์๋ค. (dirty read ํด๊ฒฐ)
์ดํ, ์ธ์ 1์์ ์ปค๋ฐ์ ํ๊ณ ๋๋ฉด ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ํ ๋ฐ์๋๋ค.
# ์ธ์
1
COMMIT;
# ์ธ์
2
SELECT * FROM CREW;
๐ฌ NON-REPEATABLE READ ํ์ธํ๊ธฐ
ํ์ง๋ง, ์ฌ๊ธฐ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
์์ ๊ฐ์ ์ํฉ์์ ์ธ์ 2์ ์กฐํ ์ฟผ๋ฆฌ 2๋ฒ์ด ํ๋์ ํธ๋์ญ์ ์์ ์ํ๋๋ค๋ฉด ์ด๋จ๊น?
# ์ธ์
1
START TRANSACTION;
UPDATE CREW SET name = 'hi' WHERE id = 1;
# ์ธ์
2
START TRANSACTION;
SELECT * FROM CREW; # 1๋ฒ ๊ฒฐ๊ณผ
# ์ธ์
1
COMMIT;
# ์ธ์
2
SELECT * FROM CREW; # 2๋ฒ ๊ฒฐ๊ณผ
ํ์ฌ๋ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ๋ ๋ฆฌ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์๋ณด๊ธฐ ์ด๋ ต์ง๋ง, ๋ง์ฝ ์คํ๋ง์์ ๊ฐ๋ฐ์ ์งํํ๋ ์ํฉ์ด๋ผ๊ณ ํด๋ณด์.
ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ฌ ์๊ณ , ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ธ์์๋ ์์ ๊ฐ์ด ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ฌ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ด ์ฃผ์ํด์ผ ํ๋ค. (non-repeatable read ๋ฐ์)
๐ฑ REPEATABLE READ
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฒ์๋ ๊ฒฉ๋ฆฌ ์์ค์ repeatable read๋ก ์ค์ ํด์ค๋ค.
๐ฌ ํด๊ฒฐ๋ NON-REPEATABLE READ ํ์ธํ๊ธฐ
START TRANSACTION;
INSERT INTO CREW (id, name) VALUES (1, 'hello');
INSERT INTO CREW (id, name) VALUES (2, 'journey');
COMMIT;
์ํ ๋ ์ฝ๋๋ ์ฝ์ ํด๋๋ค.
# ์ธ์
2
SELECT * FROM CREW;
๋จผ์ , ์ธ์ 2์์ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋๋ฉด ์ฝ์ ํ 2๊ฐ์ ๋ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
# ์ธ์
1
START TRANSACTION;
UPDATE CREW SET name = 'hi' where id = 1;
# ์ธ์
2
SELECT * FROM CREW;
์ด ์ํ์์ ์ธ์ 1์ด 1๋ฒ ๋ ์ฝ๋์ ๋ํด ์ ๋ฐ์ดํธ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๊ณ , ์ธ์ 2์์ ์กฐํํ๋ฉด ๊ทธ๋๋ก 'hello'๋ผ๋ ๋ ์ฝ๋๊ฐ ๋ฌ๋ค.
# ์ธ์
1
COMMIT;
# ์ธ์
2
SELECT * FROM CREW;
ํ์ง๋ง, read committed์ ๋ค๋ฅด๊ฒ ์ธ์ 1์์ ์ปค๋ฐ์ ํ๋๋ผ๋ ์ธ์ 2์ ๊ฒฐ๊ณผ๋ hi๊ฐ ์๋ hello๊ฐ ๊ทธ๋๋ก ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
โญ๏ธ ์ฆ, ์ด์ ์ ๋ฐ์ํ์๋ non-repeatable read๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ค.
# ์ธ์
2
COMMIT;
# ๋ค์ ์กฐํ
SELECT * FROM CREW;
์ดํ, ์ธ์ 2๊ฐ ์์ํ์๋ ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ ๋ค์ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด๋ฉด ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ฌํญ์ ์ฝ์ด์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ฌ PHANTOM READ ํ ์คํธํ๊ธฐ
CREATE TABLE `ISAM_CREW` (
`id` bigint NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
์ฐ์ , innoDB์์๋ Phantom Read๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๊ธฐ ๋๋ฌธ์ ์๋ก์ด ํ ์ด๋ธ์ ๋ง๋ค์.
START TRANSACTION;
INSERT INTO ISAM_CREW (id, name) VALUES (1, 'hello');
INSERT INTO ISAM_CREW (id, name) VALUES (2, 'journey');
COMMIT;
๊ทธ๋ฆฌ๊ณ , ๋ง์ฐฌ๊ฐ์ง๋ก ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋์.
# ์ธ์
2
START TRANSACTION;
SELECT * FROM ISAM_CREW WHERE id >= 2 FOR UPDATE;
์ธ์ 2์์ SELECT FOR UPDATE ๊ตฌ๋ฌธ์ ํ์ฉํ์ฌ ๋ ์ฝ๋๋ฅผ ์กฐํํด๋ณด์. ํ์ฌ 'journey' ๋ ์ฝ๋๋ง ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
# ์ธ์
1
START TRANSACTION;
INSERT INTO ISAM_CREW(id, name) VALUES (3, 'cat');
COMMIT;
์ดํ, ์ธ์ 1์์ ์๋ก์ด ๋ ์ฝ๋๋ฅผ ์ฝ์ ํ๊ณ ์ปค๋ฐ์ ํด๋ณด์.
# ์ธ์
2
SELECT * FROM ISAM_CREW WHERE id >= 2 FOR UPDATE;
์์ ๊ฐ์ด journey์ ์ด์ด cat์ด๋ผ๋ 3๋ฒ ๋ ์ฝ๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ฐ์ ํธ๋์ญ์ ๋ด์ธ๋ฐ๋ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ 'phantom read' ํ์์ด ๋ฐ์ํ๊ฒ ๋ ๊ฒ์ด๋ค.
๐ฌ PHANTOM READ - innoDB์์๋ ์ ๋ง ๋ฐ์ํ์ง ์์๊น?
์์ ์ฌ์ฉํ๋ innoDB ์คํ ๋ฆฌ์ง ์์ง์ผ๋ก ์์ฑ๋ 'CREW' ํ ์ด๋ธ์ ๋ค์ ํ ๋ฒ ๊ฐ์ ธ์ค์.
์์์ ์งํํ๋ ์คํ๊ณผ ๋์ผํ๊ฒ ์ํ ๋ ์ฝ๋ ์ฝ์ ํ SELECT FOR UPDATE๋ฅผ ์งํํด์ฃผ์.
# ์ธ์
2
START TRANSACTION;
SELECT * FROM CREW WHERE id >= 2 FOR UPDATE;
# ์ธ์
1
START TRANSACTION;
INSERT INTO CREW(id, name) VALUES (3, 'cat'); # ์ฝ์
๋๊ธฐ
innoDB์์๋ ์ธ์ 2์ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๊ธฐ ์ ๊น์ง โญ๏ธ ๋ฅ์คํธ ํค๋ฝ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฝ์ ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ํ์์์์ด ๋ฐ์ํ๊ฒ ๋๋ค.
# ์ธ์
2
COMMIT;
ํ์์์์ด ๋ฐ์ํ๊ธฐ ์ ์ ์ธ์ 2์์ ์ปค๋ฐ์ ์งํํ๊ฒ ๋๋ฉด insert๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์งํ๋๋ค.
# ์ธ์
1 - ์ด์ ์ ์์ฑํ์๋ insert query
START TRANSACTION;
INSERT INTO CREW(id, name) VALUES (3, 'cat');
# ์ด ํธ๋์ญ์
์์ ์กฐํ ์งํ
SELECT * FROM CREW;
# ์ธ์
3 - ์ธ์
1์ ์ปค๋ฐ ์ ์ ์กฐํ ์งํ
SELECT * FROM CREW;
# ์ธ์
1 ์ปค๋ฐ
COMMIT;
# ์ธ์
3 ์ฌ์กฐํ
SELECT * FROM CREW;
์ฌ๊ธฐ์ insert์ ์งํํ๋ ํธ๋์ญ์ ์์ select๋ฅผ ์์ฑํ๋ฉด ์ฝ์ ์ด ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
๋ฌผ๋ก commit ์ด์ ์๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ๊ฐ์ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ commit ํ์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
๐ฌ PHANTOM READ - SELECT FOR UPDATE
ํ์ง๋ง, innoDB๋ฅผ ์ฌ์ฉํ๋๋ผ๋ select for update๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฐ์ดํฐ์ ๋ถ์ ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ํ ๋ ์ฝ๋ ์ฝ์ ํ ์๋์ ๊ฐ์ด ์งํํด์ฃผ์.
# ์ธ์
2
START TRANSACTION;
SELECT * FROM CREW WHERE id >= 1;
# ์ธ์
1
START TRANSACTION;
UPDATE CREW SET name = 'hi' where id = 1;
COMMIT
# ์ธ์
2 (๊ธฐ์กด์ ํธ๋์ญ์
์์ ์งํ)
SELECT * FROM CREW WHERE id >= 1 FOR UPDATE;
๊ทธ๋ผ ์์ ๊ฐ์ด ์ฒ์์๋ hello, journey๊ฐ ์กฐํ๋๋ค๊ฐ insert๊ฐ ์งํ๋์ undo ์์ญ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์๋ณธ ํ ์ด๋ธ์ ๋ด์ฉ์ ์ฝ์ด hi, journey๊ฐ ์กฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ฑ SERIALIZABLE
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
๊ฐ์ฅ ๋ง์ง๋ง์ผ๋ก serializable์ ๋ํด์ ์์๋ณด์.
# ์ธ์
2
START TRANSACTION;
select * from CREW;
ํ ์ด๋ธ์ ์๋ฌด๊ฒ๋ ์ฝ์ ํ์ง ์์ ์ํ์์, ์ธ์ 2๊ฐ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ธ๋ค. ๋น์ฐํ ์๋ฌด๊ฒ๋ ์กฐํ๋์ง ์๋๋ค.
# ์ธ์
1
START TRANSACTION;
INSERT INTO CREW (id, name) VALUES (1, 'hello');
์ดํ, ์ธ์ 1์ด ์ฝ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ ค๊ณ ํ๋ฉด ์ค๋ฅธ์ชฝ๊ณผ ๊ฐ์ด ๊ณ์ ๋๊ธฐ ์ํ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. (์ฟผ๋ฆฌ ์คํ 16s)
์ธ์ 2๊ฐ ์ปค๋ฐํ์ง ์์ผ๋ฉด ๊ณ์ ๋๊ธฐํ๋ค๊ฐ ์์ ๊ฐ์ด ํ์์์์ด ๋ฐ์ํ๋ค.
์ฆ, ์ธ์ 2๋ ๋จ์ํ ์กฐํ ์ฟผ๋ฆฌ๋ง ๋ ๋ ธ๋๋ฐ๋ ์ธ์ 1์ด ์ฝ์ ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ธฐ์ ๋ํด์๋ ๋ฝ์ด ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค์ ๋ํด์ ์ ๋ถ ํ ์คํธ๋ฅผ ์๋ฃํ์๋ค.
ํ ๋ฒ์ฏค ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค๋ณด๋ฉฐ ์ง์ ํ ์คํธํด๋ณด๊ณ ์ถ๋ ๋ด์ฉ์ด์๋๋ฐ, ์ด๋ ๊ฒ ์งํํ๋๊น ๋งค์ฐ ์ฌ๋ฐ์๋ค ๐
์ข ์ข ๊ณต๋ถํ๋ฉด์ ๋ค์ ๋ณต์ตํด์ผ๊ฒ ๋ค.
'โ๏ธ > CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Web] JWT๋ฅผ ํตํ ์ธ์ฆ ๊ณผ์ ์์๋ณด๊ธฐ (0) | 2023.05.14 |
---|---|
[Web] ์ธ์ฆ๊ณผ ์ธ๊ฐ๋? - ์ฟ ํค์ ์ธ์ ์ ๋ํด์ ์์๋ณด์! (2) | 2023.05.03 |
[HTTP] GET vs POST, GET์ body ๊ฐ์ ๊ฐ์ง๋ฉด ์ ๋ ๊น? (4) | 2023.04.19 |
[MSA] MicroService, SoA (0) | 2022.10.20 |