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๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ๊ฐ์ฒด ํ˜•ํƒœ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.)

image

@Transactional์€ AOP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ๋‹ค. transaction์˜ begin๊ณผ commit์„ ๋ฉ”์ธ ๋กœ์ง ์•ž ๋’ค๋กœ ์ˆ˜ํ–‰์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค. @Transactional๊ฐ€ ๋ถ™์€ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ์ „ begin์„ ํ˜ธ์ถœํ•˜๊ณ , ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  commit์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ๋•Œ Spring AOP๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ PROXY ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค.

  1. @Transactional ์• ๋…ธํ…Œ์ด์…˜์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ทธ ๋นˆ์˜ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋ก์‹œ๋ฅผ ์ƒ์„ฑ.
  2. ๊ทธ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €์— ์ ‘๊ทผํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์ด๋‚˜ ์ปค๋„ฅ์…˜์„ ์—ด๊ณ  ๋‹ซ๋„๋กœ ์š”์ฒญ
  3. ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋Š” 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)

๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ : ๊ฐ์ฒด๋ฅผ ํ•ต์‹ฌ๊ด€์‹ฌ๊ณผ ํšก๋‹จ๊ด€์‹ฌ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ• image

  • ํ•ต์‹ฌ ๊ธฐ๋Šฅ(Core Concerns, Primary Concerns): ํ•ต์‹ฌ ์—…๋ฌด ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ
  • ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ(Cross-cutting Concerns): ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ๋„์™€์ฃผ๋Š” ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ(๋กœ๊น…, ๋ณด์•ˆ ๋“ฑ)

[ ์šฉ์–ด ] image

  • 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์— ๋น„ํ•ด ๋ณต์žกํ•˜๋‹ค
Last update: October 30, 2022 23:52
Contributors: jaesungahn91