1017 ~ 1030
# 1017 ~ 1030
# 1018 - MySQL Explain ์คํ๊ณํ ์ฌ์ฉ๋ฒ ๋ฐ ๋ถ์
# MySQL Explain๋?
MySQL ํ๋์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฟผ๋ฆฌ์ ์คํค๋ง ์ต์ ํ์ด๋ค. ์คํค๋ง ์ค๊ผ๋ ํ๋ฒ ์งํ๋๋ฉด ๊ทธ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ ์ข์ฒ๋ผ ๋ณ๊ฒฝํ๊ธฐ ํ๋ค์ง๋ง ์ฟผ๋ฆฌ๋ ํด๋น ์ฟผ๋ฆฌ๋ง ์์ ํ๋ฉด ๋๋ฏ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ฝ๋ค. Slow Query๋ฅผ ์์ ๋ ๊ฒ์ ์ฑ๋ฅ์ ํฅ์ ์ํค๊ธฐ ์ํ ๋งค์ฐ ์ค์ํ ์๋จ์ด๋ฏ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์ถ๋ค๋ฉด ์ฐ์ ์ ์ผ๋ก ์ฟผ๋ฆฌ์ ํ๋์ ์ปดํ ํด๋ด์ผ ํ๋ค.
์ฑ๋ฅ ์ง๋จ์ ๊ฐ์ฅ ์ฒซ๊ฑธ์์ ์คํํ SQL์ด DB์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๋์ง๋ฅผ ํ์ ํ๋ ๊ฒ์ด๋ค. ์ฌ๋์ด ์ดํดํ ์ ์๋ ์ธ์ด๋ก ๊ตฌ์ฑ๋ SQL์ ์คํํ๋๋ก DB์ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด DB๋ ๋ด๋ถ์ ์ผ๋ก SQL ํ์ฑ(๋ฌธ๋ฒ ์ฒดํฌ ๋ฐ DB์์ ์คํํ๊ธฐ ์ํ ํํ๋ก ๋ณํํ๋ ๋จ๊ณ)์ ํ๊ณ ์ตํฐ๋ง์ด์ง(๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด๋ ๋จ๊ณ)์ ๊ฑฐ์น ํ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค. ์ฌ์ฉ์๊ฐ ๋๋ผ๊ธฐ์๋ SQL๋ง์ผ๋ก ๋ชจ๋ ์กฐ์์ด ์ด๋ฃจ์ด์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ค์ ๋ก๋ ์กฐ๊ธ์ด๋ผ๋ ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๋ด๊ธฐ ์ํด DB ๋ด๋ถ์ ์ผ๋ก๋ ์์ธ๋ก ๋ง์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค.
MySQL Explain ์ด๋ DB๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ๋ ์ผ๋ จ์ ๊ณผ์ ์ ์ฌ๋์ด ์์๋ณด๊ธฐ ์ฝ๊ฒ DB ๊ฒฐ๊ณผ ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋๊ฒ์ด๋ค. MySQL Explain์ ํ์ฉํ์ฌ ๊ธฐ์กด์ ์ฟผ๋ฆฌ๋ฅผ ํ๋ํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ฑ๋ฅ ๋ถ์, ์ธ๋ฑ์ค ์ ๋ต ์๋ฆฝ ๋ฑ๊ณผ ๊ฐ์ด ์ฑ๋ฅ ์ต์ ํ์ ๋ํ ์ ๋ฐ์ ์ธ ์ ๋ฌด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
# MySQL Explain ์ฌ์ฉ๋ฐฉ๋ฒ
EXPLAIN [EXTENDED] SELECT ... FROM ... WHERE ...
# MySQL Explain ๊ฒฐ๊ณผ์ ๊ฐ ํญ๋ชฉ ๋ณ ์๋ฏธ
- id : select ์์ด๋๋ก SELECT๋ฅผ ๊ตฌ๋ถํ๋ ๋ฒํธ
- table : ์ฐธ์กฐํ๋ ํ ์ด๋ธ
- select_type : select์ ๋ํ ํ์
- type : ์กฐ์ธ ํน์ ์กฐํ ํ์
- possible_keys : ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ DB์์ ์ฌ์ฉํ ์ ์๋ ์ธ๋ฑ์ค ๋ฆฌ์คํธ
- key : ์ค์ ๋ก ์ฌ์ฉํ ์ธ๋ฑ์ค
- key_len : ์ค์ ๋ก ์ฌ์ฉํ ์ธ๋ฑ์ค์ ๊ธธ์ด
- ref : Key ์์ ์ธ๋ฑ์ค์ ๋น๊ตํ๋ ์ปฌ๋ผ(์์)
- rows : ์ฟผ๋ฆฌ ์คํ ์ ์กฐ์ฌํ๋ ํ ์๋ฆฝ
- extra : ์ถ๊ฐ ์ ๋ณด
# [ id ]
ํ์ด ์ด๋ค SELECT ๊ตฌ๋ฌธ์ ๋ํ๋ด๋ ์ง๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ์ผ๋ก ๊ตฌ๋ฌธ์ ์๋ธ ์ฟผ๋ฆฌ๋ UNION์ด ์๋ค๋ฉด SELECT๋ ํ๋๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํ์ ๋ํด 1์ด๋ ๊ฐ์ด ๋ถ์ฌ๋์ง๋ง ์ด์ธ์ ๊ฒฝ์ฐ์๋ ์ ๊ตฌ๋ฌธ์์ ์์์ ๋ฐ๋ผ ๊ฐ SELECT ๊ตฌ๋ฌธ๋ค์ ์์ฐจ์ ์ผ๋ก ๋ฒํธ๊ฐ ๋ถ์ฌ๋๋ค.
# [ table ]
ํ์ด ์ด๋ค ํ ์ด๋ธ์ ์ ๊ทผํ๋ ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ผ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ํ ์ด๋ธ ์ด๋ฆ์ด๋ SQL์์ ์ง์ ๋ ๋ณ๋ช ๊ฐ์ ๊ฐ์ ๋ํ๋ธ๋ค.
# [ select_type ]
- SIMPLE : ๋จ์ SELECT (Union์ด๋ Sub Query๊ฐ ์๋ SELECT ๋ฌธ)
- PRIMARY : Sub Query๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ Sub Query์ ์ธ๋ถ์ ์๋ ์ฟผ๋ฆฌ(์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ) UNION์ ์ฌ์ฉํ ๊ฒฝ์ฐ UNION์ ์ฒซ ๋ฒ์งธ SELECT ์ฟผ๋ฆฌ
- UNION : UNION ์ฟผ๋ฆฌ์์ Primary๋ฅผ ์ ์ธํ ๋๋จธ์ง SELECT
- DEPENDENT_UNION : UNION๊ณผ ๋์ผํ๋, ์ธ๋ถ์ฟผ๋ฆฌ์ ์์กด์ ์ (๊ฐ์ ๊ณต๊ธ ๋ฐ์)
- UNION_RESULT : UNION ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฌผ
- SUBQUERY : Sub Query ๋๋ Sub Query๋ฅผ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ์ฟผ๋ฆฌ ์ค ์ฒซ๋ฒ์งธ SELECT๋ฌธ
- DEPENDENT_SUBQUERY : Sub Query์ ๋์ผํ๋, ์ธ๊ณฝ์ฟผ๋ฆฌ์ ์์กด์ ์ (๊ฐ์ ๊ณต๊ธ ๋ฐ์)
- DERIVED : SELECT๋ก ์ถ์ถ๋ ํ ์ด๋ธ (FROM ์ ์์์ ์๋ธ์ฟผ๋ฆฌ ๋๋ Inline View)
- UNCACHEABLE SUBQUERY : Sub Query์ ๋์ผํ์ง๋ง ๊ณต๊ธ๋๋ ๋ชจ๋ ๊ฐ์ ๋ํด Sub Query๋ฅผ ์ฌ์ฒ๋ฆฌ. ์ธ๋ถ์ฟผ๋ฆฌ์์ ๊ณต๊ธ๋๋ ๊ฐ์ด ๋์ด๋ผ๋๋ผ๋ Cache๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ ์ ์์.
- UNCACHEABLE UNION : UNION๊ณผ ๋์ผํ์ง๋ง ๊ณต๊ธ๋๋ ๋ชจ๋ ๊ฐ์ ๋ํ์ฌ UNION ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฒ๋ฆฌ
# [ TYPE ]
- system : ํ ์ด๋ธ์ ๋จ ํ๊ฐ์ ๋ฐ์ดํฐ๋ง ์๋ ๊ฒฝ์ฐ
- const : SELECT์์ Primary Key ํน์ Unique Key๋ฅผ ์ด์๋ก ์กฐํํ๋ ๊ฒฝ์ฐ๋ก ๋ง์์ผ ํ ๊ฑด์ ๋ฐ์ดํฐ๋ง ์์
- eq_ref : ์กฐ์ธ์ ํ ๋ Primary Key
- ref : ์กฐ์ธ์ ํ ๋ Primary Key ํน์ Unique Key๊ฐ ์๋ Key๋ก ๋งค์นญํ๋ ๊ฒฝ์ฐ
- ref_or_null : ref์ ๊ฐ์ง๋ง null์ด ์ถ๊ฐ๋์ด ๊ฒ์๋๋ ๊ฒฝ์ฐ
- index_merge : ๋ ๊ฐ์ ์ธ๋ฑ์ค๊ฐ ๋ณํฉ๋์ด ๊ฒ์์ด ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ
- unique_subquery : ๋ค์๊ณผ ๊ฐ์ด IN ์ ์์ ์๋ธ์ฟผ๋ฆฌ์์ Primary Key๊ฐ ์ค๋ ํน์ํ ๊ฒฝ์ฐ
SELECT *
FROM tab01
WHERE col01 IN (SELECT Primary Key FROM tab01);
- index_subquery : unique_subquery์ ๋น์ทํ๋ Primary Key๊ฐ ์๋ ์ธ๋ฑ์ค์ธ ๊ฒฝ์ฐ
SELECT *
FROM tab01
WHERE col01 IN (SELECT key01 FROM tab02);
- range : ํน์ ๋ฒ์ ๋ด์์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๊ฒฝ์ฐ๋ก, ๋ฐ์ดํฐ๊ฐ ๋ฐฉ๋ํ์ง ์๋ค๋ฉด ๋จ์ SELECT์์๋ ๋์์ง ์์
- index : ์ธ๋ฑ์ค๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ฐพ์์ ๊ฒ์ํ๋ ๊ฒฝ์ฐ๋ก, ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฑ์ค ํ์ค์บ์ด๋ผ๊ณ ํจ
- all : ํ ์ด๋ธ์ ์ฒ์๋ถํฐ ๋๊น์ง ๊ฒ์ํ๋ ๊ฒฝ์ฐ๋ก, ์ผ๋ฐ์ ์ผ๋ก ํ ์ด๋ธ ํ์ค์บ์ด๋ผ๊ณ ํจ
# [ possible_keys ]
์ฟผ๋ฆฌ์์ ์ ๊ทผํ๋ ์ปฌ๋ผ๋ค๊ณผ ์ฌ์ฉ๋ ๋น๊ต ์ฐ์ฐ์๋ค์ ๋ฐํ์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์๋์ง๋ฅผ ํ์ํด์ค๋ค.
# [ key ]
ํ ์ด๋ธ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ต์ ํ ํ๊ธฐ ์ํด ์ด๋ค ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋์ง๋ฅผ ๋ํ๋ธ๋ค.
# [ key_len ]
MySQL์ด ์ธ๋ฑ์ค์ ์ผ๋ง๋ ๋ง์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง๋ฅผ ๋ณด์ฌ์ค๋ค. MySQL์์ ์ธ๋ฑ์ค์ ์๋ ์ปฌ๋ผ๋ค ์ค ์ผ๋ถ๋ง ์ฌ์ฉํ๋ค๋ฉด ์ด ๊ฐ์ ํตํด ์ด๋ค ์ปฌ๋ผ๋ค์ด ์ฌ์ฉ๋๋ ์ง๋ฅผ ๊ณ์ฐํ ์ ์๋ค.
# [ ref ]
ํค ์ปฌ๋ผ์ ๋์ ์๋ ์ธ๋ฑ์ค์์ ๊ฐ์ ์ฐพ๊ธฐ ์ํด ์ ํ ํ ์ด๋ธ์ ์ด๋ค ์ปฌ๋ผ์ด ์ฌ์ฉ๋์๋์ง๋ฅผ ๋ํ๋ธ๋ค.
# [ rows ]
์ํ๋ ํ์ ์ฐพ๊ธฐ ์ํด ์ผ๋ง๋ ๋ง์ ํ์ ์ฝ์ด์ผ ํ ์ง์ ๋ํด ์์ธก๊ฐ์ ์๋ฏธํ๋ค.
# [ extra ]
- using index : ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ผ๊ณ ํ๋ฉฐ ์ธ๋ฑ์ค ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ
- using where : where ์กฐ๊ฑด์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ. type์ด ALL ํน์ Index ํ์ ๊ณผ ํจ๊ป ํํ๋๋ฉด ์ฑ๋ฅ์ด ์ข์ง ์๋ค๋ ์๋ฏธ
- using filesort : ๋ฐ์ดํฐ ์ ๋ ฌ์ด ํ์ํ ๊ฒฝ์ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ํน์ ๋์คํฌ์์์์ ์ ๋ ฌ์ ๋ชจ๋ ํฌํจ. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ง์ ์ ์ธ ์ํฅ์ ์ค
- using temporary : ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์ ๋ด๋ถ์ ์ผ๋ก temporary table์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํจ
MySQL Explain ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ Using Filesort ์ Using Temporary ์ํ๋ ์ข์ง ์์ผ๋ฉฐ ์ฟผ๋ฆฌ ํ๋ ํย ๋ชจ๋ํฐ๋ง์ด ํ์ํ๋ค.
# 1026 - @Transactional ๋์์๋ฆฌ
ํธ๋์ญ์
์ฒ๋ฆฌ๋ฅผ ์ํ @Transactional
์ ๋
ธํ
์ด์
์ Spring AOP์ ๋ํ์ ์ธ ์์ด๋ค. @Transactional
์ญ์ Proxy ํํ๋ก ๋์ํ๋ค. (Spring์ JDK Proxy, Spring Boot๋ CGLib Proxy๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์, ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋ผ ์์ฑ๋ ํ๋ก์ ๊ฐ์ฒด ํํ๋ ๋ค๋ฅผ ์ ์๋ค.)
@Transactional
์ AOP๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ค. transaction์ begin
๊ณผ commit
์ ๋ฉ์ธ ๋ก์ง ์ ๋ค๋ก ์ํ์ฃผ๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ค.
@Transactional
๊ฐ ๋ถ์ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ์ begin
์ ํธ์ถํ๊ณ , ๋ฉ์๋๊ฐ ์ข
๋ฃ๋๊ณ commit
์ ํธ์ถํ๋ค. ์ด ๋ Spring AOP๋ ๊ธฐ๋ณธ์ ์ผ๋ก PROXY ํจํด
์ ์ฌ์ฉํ๋ค.
@Transactional
์ ๋ ธํ ์ด์ ์ ๋ฐ๊ฒฌํ๋ฉด ๊ทธ ๋น์ ๋ค์ด๋๋ฏน ํ๋ก์๋ฅผ ์์ฑ.- ๊ทธ ํ๋ก์ ๊ฐ์ฒด๋ ํธ๋์ญ์ ๋งค๋์ ์ ์ ๊ทผํ๊ณ ํธ๋์ญ์ ์ด๋ ์ปค๋ฅ์ ์ ์ด๊ณ ๋ซ๋๋ก ์์ฒญ
- ํธ๋์ญ์ ๋งค๋์ ๋ JDBC ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์คํ
# 1027 - @Transactional ์ ํ ๋ ๋ฒจ ์ ๋ฆฌ
@Transactional
์ ํด๋์ค ๋๋ ๋ฉ์๋ ๋ ๋ฒจ์ ๋ช
์ํ๋ฉด ํด๋น ๋ฉ์๋ ํธ์ถ์ ์ง์ ๋ ํธ๋์ญ์
์ด ์๋ํ๊ฒ ๋๋ค. ๋จ, ์กฐ๊ฑด์ด ์๋ค. ํด๋น ํด๋์ค์ Bean์ ๋ค๋ฅธ ํด๋์ค์ Bean์์ ํธ์ถํ ๋๋ง @Transactional์ ์ธ์งํ๊ณ ์๋ํ๊ฒ ๋๋ค. (๊ฐ์ ๋น ๋ด์์ @Transactional์ด ๋ช
์๋ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถํด๋ ์๋ํ์ง ์๋๋ค.) Spring Framework๋ ๋ด๋ถ์ ์ผ๋ก AOP๋ฅผ ํตํด ํด๋น ์ด๋
ธํ
์ด์
์ ์ธ์งํ์ฌ ํ๋ก์๋ฅผ ์์ฑํ์ฌ ํธ๋์ญ์
์ ์๋ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
# ์ ํ๋ ๋ฒจ(Propagation)
***[ Propagation.REQUIRED(๊ธฐ๋ณธ ๊ฐ) ]
@Transactional(propagation = Propagation.REQUIRED)
public void doSomething() { ... }
- ํน์ ๋ฉ์๋์ ํธ๋์ญ์
์ด
Propagation.REQUIRED
๋ก ์ค์ ๋์์ ๋์ ํธ๋์ญ์ ๋์์ ๋ค์๊ณผ ๊ฐ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ณณ์์ ๋ณ๋์ ํธ๋์ญ์ ์ด ์ค์ ๋์ด ์์ง ์์๋ค๋ฉด ํธ๋์ญ์ ์ ์๋ก ์์ํ๋ค.(์๋ก์ด ์ฐ๊ฒฐ์ ์์ฑํ๊ณ ์คํํ๋ค.) ๋ง์ฝ, ํธ์ถํ ๊ณณ์์ ์ด๋ฏธ ํธ๋์ญ์ ์ด ์ค์ ๋์ด ์๋ค๋ฉด ๊ธฐ์กด์ ํธ๋์ญ์ ๋ด์์ ๋ก์ง์ ์คํํ๋ค.(๋์ผํ ์ฐ๊ฒฐ ์์์ ์คํ๋๋ค.) ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑ์ด ๋๊ณ ํธ์ถํ ๊ณณ์๋ ๋กค๋ฐฑ์ด ์ ํ๋๋ค. ์ด๋ฌํ REQUIRED ๋์ ๋ฐฉ์์ ์ํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋ต๊ฐ๋ฅํ๋ค. - ๋ง์ฝ, ํด๋น ๋ฉ์๋๊ฐ ํธ์ถํ ๊ณณ๊ณผ ๋ณ๋์ ์ฐ๋ ๋๋ผ๋ฉด ์ ํ ๋ ๋ฒจ๊ณผ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ๋ณ๋์ ํธ๋์ญ์ ์ ์์ฑํ์ฌ ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๋ค. Spring์ ๋ด๋ถ์ ์ผ๋ก ํธ๋์ญ์ ์ ๋ณด๋ฅผ ThreadLocal ๋ณ์์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฐ๋ ๋๋ก ํธ๋์ญ์ ์ด ์ ํ๋์ง ์๋๋ค.
***[ Propagation.REQUIRES_NEW ]
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomething() { ... }
Propagation.REQUIRES_NEW
๋ก ์ค์ ๋์์ ๋์๋ ๋งค๋ฒ ์๋ก์ด ํธ๋์ญ์ ์ ์์ํ๋ค. (์๋ก์ด ์ฐ๊ฒฐ์ ์์ฑํ๊ณ ์คํํ๋ค.) ๋ง์ฝ, ํธ์ถํ ๊ณณ์์ ์ด๋ฏธ ํธ๋์ญ์ ์ด ์ค์ ๋์ด ์๋ค๋ฉด(๊ธฐ์กด์ ์ฐ๊ฒฐ์ด ์กด์ฌํ๋ค๋ฉด) ๊ธฐ์กด์ ํธ๋์ญ์ ์ ๋ฉ์๋๊ฐ ์ข ๋ฃํ ๋๊น์ง ์ ์ ๋๊ธฐ ์ํ๋ก ๋๊ณ ์์ ์ ํธ๋์ญ์ ์ ์คํํ๋ค. ์๋ก์ด ํธ๋์ญ์ ์์์ ์์ธ๊ฐ ๋ฐ์ํด๋ ํธ์ถํ ๊ณณ์๋ ๋กค๋ฐฑ์ด ์ ํ๋์ง ์๋๋ค. ์ฆ, 2๊ฐ์ ํธ๋์ญ์ ์ ์์ ํ ๋ ๋ฆฝ์ ์ธ ๋ณ๊ฐ์ ๋จ์๋ก ์๋ํ๋ค.
***[ Propagaion.NESTED ]
@Transactional(propagation = Propagation.NESTED)
public void doSomething() { ... }
Propagation.NESTED
๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ ์ค๋ช ํ Propagation.REQUIRED์ ๋์ผํ๊ฒ ์๋ํ๋ค. ์ค์ํ ์ฐจ์ด์ ์, SAVEPOINT๋ฅผ ์ง์ ํ ์์ ๊น์ง ๋ถ๋ถ ๋กค๋ฐฑ์ด ๊ฐ๋ฅํ๋ค. ์ ์ํ ์ ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ SAVEPOINT ๊ธฐ๋ฅ์ ์ง์ํด์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
# 1028 - AOP(Aspect Oriented Progamming)
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ : ๊ฐ์ฒด๋ฅผ ํต์ฌ๊ด์ฌ๊ณผ ํก๋จ๊ด์ฌ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
- ํต์ฌ ๊ธฐ๋ฅ(Core Concerns, Primary Concerns): ํต์ฌ ์ ๋ฌด ๋ก์ง์ ์ํํ๋ ๊ธฐ๋ฅ
- ๋ถ๊ฐ ๊ธฐ๋ฅ(Cross-cutting Concerns): ํต์ฌ ๊ธฐ๋ฅ์ ๋์์ฃผ๋ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ(๋ก๊น , ๋ณด์ ๋ฑ)
[ ์ฉ์ด ]
- Joinpoing
- ๋ฉ์๋๋ฅผ ํธ์ถํ๋ '์์ ', ์์ธ๊ฐ ๋ฐ์ํ๋ '์์ '๊ณผ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ๋ ํน์ ์์ ์ด ์คํ๋๋ '์์ '์ ์๋ฏธ
- Advice
- joinpoint์์ ์คํ๋์ด์ผ ํ๋ ์ฝ๋
- ํก๋จ๊ด์ ์ ํด๋นํจ(ํธ๋์ญ์ /๋ก๊ทธ/๋ณด์/์ธ์ฆ ๋ฑ)
- Target
- ์ค์ง์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๊ณ ์๋ ์ฝ๋
- ํต์ฌ๊ด์ ์ ํด๋นํจ(์ ๋ฌด๋ก์ง)
- Pointcut
- Target ํด๋์ค์ Advice๊ฐ ๊ฒฐํฉ(Weaving) ๋ ๋ ๋ ์ฌ์ด์ ๊ฒฐํฉ๊ท์น์ ์ ์ํ๋ ๊ฒ์ด๋ค.
- ์๋ก Advice๊ฐ ์คํ๋ Target์ ํน์ ๋ฉ์๋๋ฑ์ ์ง์
- Aspect
- Advice์ Pointcut์ ํฉ์ณ์ ํ๋์ Aspect๋ผ๊ณ ํ๋ค.
- ์ฆ ์ผ์ ํ ํจํด์ ๊ฐ์ง๋ ํด๋์ค์ Advice๋ฅผ ์ ์ฉํ๋๋ก ์ง์ํ ์ ์๋ ๊ฒ์ Aspect๋ผ๊ณ ํ๋ค.
- Weaving
- AOP์์ Joinpoint๋ค์ Advice๋ก ๊ฐ์ธ๋ ๊ณผ์ ์ Weaving์ด๋ผ๊ณ ํ๋ค.
- Weaving ํ๋ ์์ ์ ๋์์ฃผ๋ ๊ฒ์ด AOPํด์ด ํ๋ ์ญํ ์ด๋ค.
# 1029 - Spring AOP Weaving
# Weaving ์ด๋?
Weaving์ Pointcut์ ์ํด์ ๊ฒฐ์ ๋ ํ๊ฒ์ Join Point์ ๋ถ๊ฐ๊ธฐ๋ฅ(Advice)๋ฅผ ์ฝ์
ํ๋ ๊ณผ์ ์ ๋ปํ๋ค.
Weaving์ AOP๊ฐ ํต์ฌ๊ธฐ๋ฅ(ํ๊ฒ)์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ํ์ํ ๋ถ๊ฐ๊ธฐ๋ฅ(์ด๋๋ฐ์ด์ค)๋ฅผ ์ถ๊ฐํ ์ ์๋๋ก ํด์ฃผ๋ ํต์ฌ์ ์ธ ์ฒ๋ฆฌ๊ณผ์ ์ด๋ค.
- Pointcut : ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ ํ๊ฒ์ ๋ฉ์๋๋ฅผ ์ ๋ณํ๋ ์ ๊ทํํ์์ด๋ค.
- Advice : ์ด๋๋ฐ์ด์ค๋ ํ๊ฒ์ ์ ๊ณตํ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ด๊ณ ์๋ ๋ชจ๋์ด๋ค.
- Join Point : ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์ ์๋ ์์น๋ฅผ ๋งํ๋ค.
# Weaving์ ์ข ๋ฅ
[ Compile Time Weaving(CTW) ]
- AspectJ์๋ AJC(AspectJ Compiler)๋ผ๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋๋ฐ Java Compiler๋ฅผ ํ์ฅํ ํํ์ ์ปดํ์ผ๋ฌ์ด๋ค.
- AJC๋ฅผ ํตํด javaํ์ผ์ ์ปดํ์ผ ํ๋ฉฐ, ์ปดํ์ผ ๊ณผ์ ์์ ๋ฐ์ดํธ ์ฝ๋ ์กฐ์์ ํตํด Advisor ์ฝ๋๋ฅผ ์ง์ ์ฝ์ ํ์ฌ ์๋น์ ์ํํ๋ค.
- ์ฅ์ ์ผ๋ก๋ 3๊ฐ์ง ์๋น ์ค์์๋ ๊ฐ์ฅ ๋น ๋ฅธ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ฌ์ค๋ค. ํ์ง๋ง ์ปดํ์ผ ๊ณผ์ ์์ lombok๊ณผ ๊ฐ์ด ์ปดํ์ผ ๊ณผ์ ์์ ์ฝ๋๋ฅผ ์กฐ์ํ๋ ํ๋ฌ๊ทธ์ธ๊ณผ ์ถฉ๋์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ฃผ ๋๋ค.(๊ฑฐ์ ๊ฐ์ด ์ฌ์ฉ ๋ถ๊ฐ)
[ Runtime Weaving(RTW) ]
- Spring AOP์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก, Proxy๋ฅผ ์์ฑํด ์ค์ ํ๊น ์ค๋ธ์ ํธ์ ๋ณํ์์ด ์๋น์ ์ํํ๋ค.
- ์ค์ ๋ฐํ์์ Method ํธ์ถ ์์ ์๋น์ด ์ด๋ฃจ์ด์ง๋ ๋ฐฉ์์ด๋ค.
- ์์คํ์ผ, ํด๋์ค ํ์ผ์ ๋ณํ์ด ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง, Point Cut์ ๋ํ Advice ์๊ฐ ๋์ด๋ ์๋ก ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์๋ค.
[ Load Time Weaving(LTW) ]
- ClassLoader๋ฅผ ์ด์ฉํด ํด๋์ค๊ฐ JVM์ ๋ก๋๋ ๋ ๋ฐ์ดํธ ์ฝ๋ ์กฐ์์ ํตํด ์๋น๋๋ ๋ฐฉ์์ผ๋ก ์ปดํ์ผ ์๊ฐ์ ์๋์ ์ผ๋ก CTW๋ณด๋ค ์งง๋ค. ํ์ง๋ง ์ค๋ธ์ ํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ๊ณผ์ ์์ ์๋น์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ ์๊ฐ์ CTW๋ณด๋ค ์๋์ ์ผ๋ก ๋๋ฆฌ๋ค.
- Application Context์ ๊ฐ์ฒด๊ฐ ๋ก๋๋ ๋, ๊ฐ์ฒด ํธ๋ค๋ง์ด ๋ฐ์ํ๋ฏ๋ก ํผํฌ๋จผ์ค๊ฐ ์ ํ๋๋ค.
[ Post-Compile Weaving ]
- ์ปดํ์ผ ํ ๊ธฐ์กด ํด๋์ค ํ์ผ๊ณผ JARํ์ผ์ ์๋นํ๋๋ฐ ์ฌ์ฉ, Compile Time Weavng ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
# Spring AOP์ AspectJ
- AspectJ๊ฐ Compile ์์ ๊ณผ Load ์์ Weaving์ ์ฌ์ฉ.
- Spring AOP๋ RunTime Weaving์ ์ฌ์ฉ.
- Spring AOP๋ณด๋ค AspectJ๊ฐ ์๋์ ๊ธฐ๋ฅ์ ์ธ ์ธก๋ฉด์ ์กฐ๊ธ ์ข์ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง ๋ฐ์ดํธ ์ฝ๋ ์กฐ์์ ์ํด JVM์ ์คํ ์ต์ ์ ๋ณ๊ฒฝํ๊ฑฐ๋, ๋ณ๋์ ๋ฐ์ดํธ์ฝ๋ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉ ๋ฑ์ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ด ๋ฐ๋ฅด๋ฏ๋ก Spring AOP ์ฌ์ฉ ํ ๊ทธ ์ด์์ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ AspectJ๋ฅผ ํ์ฅํด์ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค.
# 1030 - Spring AOP์ AspectJ ๋น๊ต
[ Spring AOP ]
- ์์ Java๋ก๋ง์ผ๋ก๋ ๊ตฌํ๋จ
- ๋ณต์กํ ๊ณผ์ ์ด ํ์ ์์
- ๋ฐํ์ Weaving๋ง ๊ฐ๋ฅํจ
- ๋ฉ์๋ ๋ ๋ฒจ์ Weaving๋ง ์ง์ํจ
- Spring Container์ ์ํด ๊ด๋ฆฌ๋๋ ๋น์ฆ์๋ง ์ ์ํ ์ ์์
- ๋ฉ์๋ ์คํ Point cut๋ง ์ง์ํจ
- ๋์ ๊ฐ์ฒด์ Proxy๊ฐ ์์ฑ๋๊ณ Aspect๋ ์ด๋ฌํ Proxy๋ฅผ ๋์์ผ๋ก ์ ์ฉ๋จ
- AspectJ์ ๋นํด ํจ์ฌ ๋๋ฆฌ๋ค
- ๋ฐฐ์ฐ๊ณ ์ ์ฉํ๊ธฐ ์ฝ๋ค
[ AspectJ ]
- ์ถ๊ฐ ๋๊ตฌ(์๋ฐ ํ๋ก๊ทธ๋จ)๋ฅผ ํตํด ๊ตฌํ๋จ
- ๋ก๋ ์์ฆ Weaving์ ์ฌ์ฉํ๋๋ผ๋ AspectJ compiler(ajc)๊ฐ ํ์ํ๋ค
- ๋ฐํ์ Weaving์ด ๋ถ๊ฐ๋ฅํจ. ์ปดํ์ผ ์์ /์ปดํ์ผ ์ /๋ก๋ ์์ Weaving์ ์ง์ํจ
- ํ๋, ๋ฉ์๋, ์์ฑ์, finalํด๋์ค/๋ฉ์๋ ๋ฑ ๋ค์ํ๊ฒ ์ง์ํจ
- ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํจ
- ๋ชจ๋ Pint cut์ ์ง์ํจ
- Aspect๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ธฐ ์ ์ ์ฝ๋์ ๋ฐ๋ก Weaving๋จ(๋ฐํ์ ์ด์ )
- Spring AOP์ ๋นํด ์ข์ ์ฑ๋ฅ
- Spring AOP์ ๋นํด ๋ณต์กํ๋ค