CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /AOP๋ž€? ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

AOP๋ž€? ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•, ๋‚จ์ž์™€ ์—ฌ์ž! ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ธ AOP( Aspect-Oriented Programming) ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค . AOP๋ž€?  ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ - 1์ด ์ฃผ์ œ๋Š” ์‰ฝ์ง€ ์•Š๊ณ  ์ง์ ‘์ ์œผ๋กœ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ธฐ์ˆ ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๊ฐ€๋” ์ธํ„ฐ๋ทฐ๋ฅผ ํ•  ๋•Œ ์ด๊ฒƒ์ด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ง์Šน์ด๋ฉฐ ์–ด๋””์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด๋กœ ์„ค๋ช…ํ•˜๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Java์—์„œ AOP ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค . ์ด์ œ AOP๋Š” Aspect-Oriented Programming ์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค., ๊ต์ฐจ ์ ˆ๋‹จ ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ๋ชจ๋“ˆ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์›๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ์ฝ”๋“œ์— ์ถ”๊ฐ€ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ์™€ ํด๋ž˜์Šค ์œ„์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋งค๋‹ฌ์•„ ๋†“์€ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์กฐ๋งŒ๊ฐ„ ์ผ๋ฐ˜์ ์ธ ๊ฐ์ฒด ์ง€ํ–ฅ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ญ์ƒ ํšจ๊ณผ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ˆœ๊ฐ„์ด ์˜ค๋ฉด AOP๊ฐ€ ๋„์›€์ด ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์„ ์œ„ํ•œ ์ถ”๊ฐ€ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ ๋„๊ตฌ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ์œ ์—ฐ์„ฑ ์ฆ๊ฐ€๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ด๋Š” ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋” ๋งŽ์€ ์˜ต์…˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

AOP ์ ์šฉ

Aspect ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ต์ฐจ ์ ˆ๋‹จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ ์™„์ „ํžˆ ๊ตฌ์กฐํ™”๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ AOP์—์„œ๋Š” ์ด๋ฅผ ๋ฉ”์ธ ์ฝ”๋“œ ์™ธ๋ถ€์— ์œ ์ง€ํ•˜๊ณ  ์ˆ˜์ง์œผ๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด์•ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—ฌ๋Ÿฌ ์š”์†Œ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ ์ •์ฑ…์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๊ธฐ์กด ๋ถ€๋ถ„๊ณผ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ์‚ฌ์šฉ ์ค‘์ธ ๋ณด์•ˆ ์ •์ฑ… ์ž์ฒด๊ฐ€ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ AOP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์™„๋ฒฝํ•œ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค . ๋˜ํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ๋กœ๊น… ์ž…๋‹ˆ๋‹ค.. ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹  ๋กœ๊น…์— ๋Œ€ํ•œ AOP ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ๋กœ๊น…์„ ์œ„ํ•œ ์ฝ”๋“œ๋Š” ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ธก๋ฉด์˜ ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  2. ๋กœ๊น…์„ ์œ„ํ•œ ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ๋Š” ํ•œ ๊ณณ์— ๋ณด๊ด€๋˜๋ฏ€๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ณณ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”์ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  3. ๋กœ๊น… ์ฝ”๋“œ๋Š” ์ด๋ฏธ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ ๋ฐ ํด๋ž˜์Šค ๋˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ์ƒ๊ด€์—†์ด ์–ด๋””์—๋‚˜ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝ”๋”ฉ ์˜ค๋ฅ˜์˜ ์ˆ˜๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

    ๋˜ํ•œ ๋””์ž์ธ ๊ตฌ์„ฑ์—์„œ ์ธก๋ฉด์„ ์ œ๊ฑฐํ•  ๋•Œ ๋ชจ๋“  ์ถ”์  ์ฝ”๋“œ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ์•„๋ฌด ๊ฒƒ๋„ ๋ˆ„๋ฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. Aspect๋Š” ๊ณ„์†ํ•ด์„œ ๊ฐœ์„ ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
AOP๋ž€?  ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ - 2AOP๋Š” ๋˜ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์บ์‹ฑ ๋ฐ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํŠน์ • ๊ธฐ๋Šฅ์„ ์ถ”์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

AOP์˜ ๊ธฐ๋ณธ ์›์น™

์ด ์ฃผ์ œ์—์„œ ๋” ๋‚˜์•„๊ฐ€๊ธฐ ์œ„ํ•ด ๋จผ์ € AOP์˜ ์ฃผ์š” ๊ฐœ๋…์„ ์•Œ์•„๋ด…์‹œ๋‹ค. ์กฐ์–ธ โ€” ์กฐ์ธ ํฌ์ธํŠธ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ์ถ”๊ฐ€ ๋…ผ๋ฆฌ ๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์–ด๋“œ๋ฐ”์ด์Šค๋Š” ์กฐ์ธ ํฌ์ธํŠธ ์ด์ „, ์ดํ›„ ๋˜๋Š” ๋Œ€์‹ ์— ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ์ฐธ์กฐ). ๊ฐ€๋Šฅํ•œ ์กฐ์–ธ ์œ ํ˜• :
  1. ์ด์ „ โ€” ์ด ์œ ํ˜•์˜ ์–ด๋“œ๋ฐ”์ด์Šค๋Š” ๋Œ€์ƒ ๋ฉ”์„œ๋“œ, ์ฆ‰ ์กฐ์ธ ํฌ์ธํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. aspect๋ฅผ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•  ๋•Œ @Before ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ด์ „์— ์˜จ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค. aspect๋ฅผ .aj ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ด๊ฒƒ์€ before() ๋ฉ”์†Œ๋“œ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค .

  2. After โ€” ๋ฉ”์„œ๋“œ(์กฐ์ธ ํฌ์ธํŠธ) ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰๋˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์ž…๋‹ˆ๋‹ค. ์ •์ƒ ์‹คํ–‰ ์‹œ์™€ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋ชจ๋‘ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

    aspect๋ฅผ ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•  ๋•Œ @After ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์ด ๋’ค์— ์˜ค๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

    .aj ํŒŒ์ผ ๋กœ aspect๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด๊ฒƒ์€ after() ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.

  3. After Returning โ€” ์ด ์กฐ์–ธ์€ ๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋  ๋•Œ๋งŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

    ๊ด€์ ์ด ํด๋ž˜์Šค๋กœ ํ‘œํ˜„๋  ๋•Œ @AfterReturning ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์„ฑ๊ณต์ ์ธ ์™„๋ฃŒ ํ›„ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    aspect๋ฅผ .aj ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ด๊ฒƒ์€ (Object obj) ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” after() ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค .

  4. After Throwing โ€” ์ด ์กฐ์–ธ์€ ๋ฉ”์„œ๋“œ, ์ฆ‰ ์กฐ์ธ ํฌ์ธํŠธ๊ฐ€ ์˜ˆ์™ธ๋ฅผ throwํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์กฐ์–ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ข…๋ฅ˜์˜ ์‹คํŒจํ•œ ์‹คํ–‰์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ํ•„์š”ํ•œ ์ถ”์  ์ˆ˜์ค€์œผ๋กœ ์ „์ฒด ํŠธ๋žœ์žญ์…˜ ๋˜๋Š” ๋กœ๊ทธ ๋กค๋ฐฑ).

    ํด๋ž˜์Šค ์ธก๋ฉด์—์„œ @AfterThrowing ์–ด๋…ธํ…Œ์ด์…˜์€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„ ํ›„์— ์ด ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    aspect๋ฅผ .aj ํŒŒ์ผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ด๊ฒƒ์€ after() throw(์˜ˆ์™ธ e) ๋ฉ”์„œ๋“œ ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค .

  5. ์ฃผ๋ณ€ โ€” ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์œ ํ˜•์˜ ์กฐ์–ธ ์ค‘ ํ•˜๋‚˜์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์–ด์ง„ ์กฐ์ธ ํฌ์ธํŠธ ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋‘˜๋Ÿฌ์Œ‰๋‹ˆ๋‹ค.

    ์กฐ์ธ ํฌ์ธํŠธ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „๊ณผ ํ›„์— ์‹คํ–‰๋˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    around ์–ด๋“œ๋ฐ”์ด์Šค๋Š” ์กฐ์ธ ํฌ์ธํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ ๋ฆฌํ„ด ๊ฐ’์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด ์–ด๋“œ๋ฐ”์ด์Šค์—์„œ๋Š” ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๋Œ€์ƒ ๋ฉ”์†Œ๋“œ์˜ ์ž‘๋™์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹œ๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฒƒ์„ ๋ฆฌํ„ด ๊ฒฐ๊ณผ๋กœ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ธก๋ฉด์„ ํด๋ž˜์Šค๋กœ ์ง€์ •ํ•˜๋ฉด ์กฐ์ธ ํฌ์ธํŠธ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด @Around ์ฃผ์„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค . .aj ํŒŒ์ผ ํ˜•์‹์˜ ์• ์ŠคํŽ™ํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด ๋ฉ”์„œ๋“œ๋Š” around() ๋ฉ”์„œ๋“œ ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค .

์กฐ์ธ ํฌ์ธํŠธ โ€” ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ํฌ์ธํŠธ(์ฆ‰, ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ, ๊ฐ์ฒด ์ƒ์„ฑ, ๋ณ€์ˆ˜ ์•ก์„ธ์Šค). ์ฆ‰, ์ฝ”๋“œ ์ธ์ ์…˜์„ ํ•  ๊ณณ(์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•ด์•ผ ํ•  ๊ณณ)์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ผ์ข…์˜ ์ •๊ทœํ‘œํ˜„์‹์ด๋‹ค. Pointcut โ€” ์กฐ์ธ ํฌ์ธํŠธ ์„ธํŠธ . pointcut์€ ์ฃผ์–ด์ง„ ์กฐ์–ธ์ด ์ฃผ์–ด์ง„ ์กฐ์ธ ํฌ์ธํŠธ์— ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. Aspect โ€” ํฌ๋กœ์Šค ์ปคํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“ˆ ๋˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. Aspect๋Š” ์ผ๋ถ€ pointcut ์— ์˜ํ•ด ์ •์˜๋œ ์กฐ์ธ ํฌ์ธํŠธ ์— ์กฐ์–ธ์„ ์ ์šฉํ•˜์—ฌ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค . ์ฆ‰, Advice์™€ Join Point์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค. ์†Œ๊ฐœโ€” ์™ธ๋ถ€ ์ฝ”๋“œ์— aspect์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋ฐ/๋˜๋Š” ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ ๋ณ€๊ฒฝ. Target โ€” ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋  ๊ฐ์ฒด. ์œ„๋น™(Weaving) โ€” ์–ด๋“œ๋ฐ”์ด์Šค ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์• ์ŠคํŽ™ํŠธ๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด์— ์—ฐ๊ฒฐํ•˜๋Š” ํ”„๋กœ์„ธ์Šค. ์ด๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„, ๋กœ๋“œ ์‹œ๊ฐ„ ๋˜๋Š” ๋Ÿฐํƒ€์ž„์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์กฐ์—๋Š” ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Compile-time weaving โ€” aspect์˜ ์†Œ์Šค ์ฝ”๋“œ์™€ aspect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด AspectJ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์™€ aspect๋ฅผ ์ง์ ‘ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ปดํŒŒ์ผ ํ›„ ์œ„๋น™(๋ฐ”์ด๋„ˆ๋ฆฌ ์œ„๋น™) โ€” ์†Œ์Šค ์ฝ”๋“œ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์—ฌ aspect๋ฅผ ์ฝ”๋“œ๋กœ ์—ฎ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ด์ „์— ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ๋˜๋Š” jar ํŒŒ์ผ์„ ๊ฐ€์ ธ ์™€์„œ aspect๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Load-time weaving โ€” ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  JVM์— ๋Œ€ํ•œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ๊นŒ์ง€ ์ง€์—ฐ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์œ„๋น™์ž…๋‹ˆ๋‹ค.

    ์ด๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ํ•˜๋‚˜ ์ด์ƒ์˜ ์œ„๋น™ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณต๋˜๊ฑฐ๋‚˜ "์œ„๋น™ ์—์ด์ „ํŠธ"์— ์˜ํ•ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

AspectJ โ€” ํฌ๋กœ์Šค ์ปคํŒ… ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” AOP ํŒจ๋Ÿฌ๋‹ค์ž„ ์˜ ํŠน์ • ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค . ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

์ž๋ฐ”์˜ ์˜ˆ

๋‹ค์Œ์œผ๋กœ AOP๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ "Hello World" ์Šคํƒ€์ผ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ง์ด ์˜ค๋ฅธ์ชฝ์—์„œ ์šฐ๋ฆฌ์˜ ์˜ˆ์ œ๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„ ์œ„๋น™์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค . ๋จผ์ € pom.xml ํŒŒ์ผ ์— ๋‹ค์Œ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.9.5</version>
</dependency>
์ผ๋ฐ˜์ ์œผ๋กœ ํŠน๋ณ„ํ•œ ajc ์ปดํŒŒ์ผ๋Ÿฌ๋Š” aspect๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. IntelliJ IDEA ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์„ ํƒํ•  ๋•Œ 5168 75 AspectJ ๋ฐฐํฌ์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๋‘ ๋ฒˆ์งธ๋Š” pom.xml ํŒŒ์ผ์— ๋‹ค์Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<build>
  <plugins>
     <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>aspectj-maven-plugin</artifactId>
        <version>1.7</version>
        <configuration>
           <complianceLevel>1.8</complianceLevel>
           <source>1.8</source>
           <target>1.8</target>
           <showWeaveInfo>true</showWeaveInfo>
           <<verbose>true<verbose>
           <Xlint>ignore</Xlint>
           <encoding>UTF-8</encoding>
        </configuration>
        <executions>
           <execution>
              <goals>
                 <goal>compile</goal>
                 <goal>test-compile</goal>
              </goals>
           </execution>
        </executions>
     </plugin>
  </plugins>
</build>
๊ทธ๋Ÿฐ ๋‹ค์Œ Maven ์—์„œ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ณ  mvn clean compile ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค . ์ด์ œ ์˜ˆ์ œ๋กœ ์ง์ ‘ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ 1

๋ฉ”์ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค . ์—ฌ๊ธฐ์—๋Š” ์ฝ˜์†”์— ์ „๋‹ฌ๋œ ์ด๋ฆ„์„ ์ธ์‡„ํ•˜๋Š” ์ง„์ž…์ ๊ณผ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

public class Main {
 
  public static void main(String[] args) {
  printName("Tanner");
  printName("Victor");
  printName("Sasha");
  }
 
  public static void printName(String name) {
     System.out.println(name);
  }
}
์—ฌ๊ธฐ์—๋Š” ๋ณต์žกํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜๊ณ  ์ฝ˜์†”์— ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
ํƒœ๋„ˆ ๋น…ํ„ฐ ์‚ฌ์ƒค
์ด์ œ AOP์˜ ์žฅ์ ์„ ํ™œ์šฉํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ์ด์ œ aspect ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” .aj ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ AOP ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค . ๋จผ์ € ํ™•์žฅ์ž๊ฐ€ .aj ์ธ ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

public aspect GreetingAspect {
 
  pointcut greeting() : execution(* Main.printName(..));
 
  before() : greeting() {
     System.out.print("Hi, ");
  }
}
์ด ํŒŒ์ผ์€ ํด๋ž˜์Šค์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ด…์‹œ๋‹ค. pointcut ์€ ์กฐ์ธ ํฌ์ธํŠธ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. greeting()์€ ์ด ํฌ์ธํŠธ์ปท์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค; : ์‹คํ–‰์€ Main.printName(...) ๋ฉ”์„œ๋“œ์˜ ๋ชจ๋“ ( * ) ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์ ์šฉํ•˜๋„๋ก ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค . ๋‹ค์Œ์€ ๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ํŠน์ • ์–ด๋“œ๋ฐ”์ด์Šค( before()) ์ž…๋‹ˆ๋‹ค. : greeting()์€ ์ด ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์‘๋‹ตํ•˜๋Š” ์ปทํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ์Œ, ์•„๋ž˜์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ดํ•ดํ•˜๋Š” Java ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฉ”์„œ๋“œ ์ž์ฒด์˜ ๋ณธ๋ฌธ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ธก๋ฉด์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ main์„ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ ์ฝ˜์†” ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
์•ˆ๋…•, ํƒœ๋„ˆ ์•ˆ๋…•, ๋น…ํ„ฐ ์•ˆ๋…•, ์‚ฌ์ƒค
printName ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์ด aspect ๋•๋ถ„์— ์ˆ˜์ •๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด์ œ ์• ์ŠคํŽ™ํŠธ๊ฐ€ ์ฃผ์„์ด ์žˆ๋Š” Java ํด๋ž˜์Šค๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Aspect
public class GreetingAspect{
 
  @Pointcut("execution(* Main.printName(String))")
  public void greeting() {
  }
 
  @Before("greeting()")
  public void beforeAdvice() {
     System.out.print("Hi, ");
  }
}
.aj ์• ์ŠคํŽ™ํŠธ ํŒŒ์ผ ์ดํ›„์—๋Š” ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.
  • @Aspect๋Š” ์ด ํด๋ž˜์Šค๊ฐ€ ๊ด€์ ์ž„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • @Pointcut("execution(* Main.printName(String))") ์€ ์œ ํ˜•์ด String ์ธ ์ž…๋ ฅ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Main.printName ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ˜ธ์ถœ์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์ปทํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค .
  • @Before("greeting()")์€ greeting() ์ปทํฌ์ธํŠธ ์— ์ง€์ •๋œ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์ ์šฉ๋˜๋Š” ์กฐ์–ธ์ž…๋‹ˆ๋‹ค .
์ด ์ธก๋ฉด์œผ๋กœ main์„ ์‹คํ–‰ํ•ด๋„ ์ฝ˜์†” ์ถœ๋ ฅ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์•ˆ๋…•, ํƒœ๋„ˆ ์•ˆ๋…•, ๋น…ํ„ฐ ์•ˆ๋…•, ์‚ฌ์ƒค

์˜ˆ 2

ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๊ณ  ์ด ๋ฉ”์„œ๋“œ๋ฅผ main ์—์„œ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค .

public class Main {
 
  public static void main(String[] args) {
  performSomeOperation("Tanner");
  }
 
  public static void performSomeOperation(String clientName) {
     System.out.println("Performing some operations for Client " + clientName);
  }
}
@Around ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ "์˜์‚ฌ ๊ฑฐ๋ž˜"๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Aspect
public class TransactionAspect{
 
  @Pointcut("execution(* Main.performSomeOperation(String))")
  public void executeOperation() {
  }

  @Around(value = "executeOperation()")
  public void beforeAdvice(ProceedingJoinPoint joinPoint) {
     System.out.println("Opening a transaction...");
     try {
        joinPoint.proceed();
        System.out.println("Closing a transaction...");
     }
     catch (Throwable throwable) {
        System.out.println("The operation failed. Rolling back the transaction...");
     }
  }
  }
ProceedingJoinPoint ๊ฐœ์ฒด์˜ ์ง„ํ–‰ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋“œ๋ฐ”์ด์Šค์—์„œ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ž˜ํ•‘ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ๋ฉ”์†Œ๋“œ์˜ ์ฝ”๋“œ๋Š” joinPoint.proceed(); ๋Š” Before ์ด๊ณ  ๊ทธ ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” After ์ž…๋‹ˆ๋‹ค . main ์„ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
ํŠธ๋žœ์žญ์…˜ ์—ด๊ธฐ... ํด๋ผ์ด์–ธํŠธ Tanner์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ž‘์—… ์ˆ˜ํ–‰ ํŠธ๋žœ์žญ์…˜ ๋‹ซ๊ธฐ...
๊ทธ๋Ÿฌ๋‚˜ ์‹คํŒจํ•œ ์ž‘์—…์„ ์‹œ๋ฎฌ๋ ˆ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ณ  ์˜ˆ์™ธ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

public static void performSomeOperation(String clientName) throws Exception {
  System.out.println("Performing some operations for Client " + clientName);
  throw new Exception();
}
๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ์ฝ˜์†” ์ถœ๋ ฅ์„ ์–ป์Šต๋‹ˆ๋‹ค.
ํŠธ๋žœ์žญ์…˜ ์—ด๊ธฐ... Client Tanner์— ๋Œ€ํ•œ ์ผ๋ถ€ ์ž‘์—… ์ˆ˜ํ–‰ ์ค‘ ์ž‘์—…์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ๋กค๋ฐฑ ์ค‘...
๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋๋‚ธ ๊ฒƒ์€ ์ผ์ข…์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์˜ˆ 3

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์œ ์‚ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”๊ฐ€ํ•œ Main ์„ ์‚ดํŽด๋ณด์„ธ์š” .

public class Main {
  private String value;
 
  public static void main(String[] args) throws Exception {
     Main main = new Main();
     main.setValue("<some value>");
     String valueForCheck = main.getValue();
     main.checkValue(valueForCheck);
  }
 
  public void setValue(String value) {
     this.value = value;
  }
 
  public String getValue() {
     return this.value;
  }
 
  public void checkValue(String value) throws Exception {
     if (value.length() > 10) {
        throw new Exception();
     }
  }
}
main ์—์„œ setValue ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ value ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์— ๊ฐ’์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋Ÿฐ ๋‹ค์Œ getValue๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ checkValue๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ 10์ž๋ณด๋‹ค ๊ธด์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ฉ”์„œ๋“œ ์ž‘์—…์„ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ธก๋ฉด์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@Aspect
public class LogAspect {
 
  @Pointcut("execution(* *(..))")
  public void methodExecuting() {
  }
 
  @AfterReturning(value = "methodExecuting()", returning = "returningValue")
  public void recordSuccessfulExecution(JoinPoint joinPoint, Object returningValue) {
     if (returningValue != null) {
        System.out.printf("Successful execution: method โ€” %s method, class โ€” %s class, return value โ€” %s\n",
              joinPoint.getSignature().getName(),
              joinPoint.getSourceLocation().getWithinType().getName(),
              returningValue);
     }
     else {
        System.out.printf("Successful execution: method โ€” %s, class โ€” %s\n",
              joinPoint.getSignature().getName(),
              joinPoint.getSourceLocation().getWithinType().getName());
     }
  }
 
  @AfterThrowing(value = "methodExecuting()", throwing = "exception")
  public void recordFailedExecution(JoinPoint joinPoint, Exception exception) {
     System.out.printf("Exception thrown: method โ€” %s, class โ€” %s, exception โ€” %s\n",
           joinPoint.getSignature().getName(),
           joinPoint.getSourceLocation().getWithinType().getName(),
           exception);
  }
}
๋ฌด์Šจ ์ผ์ด์•ผ? @Pointcut("execution(* *(..))") ์€ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์˜ ๋ชจ๋“  ํ˜ธ์ถœ์— ์ฐธ์—ฌํ•ฉ๋‹ˆ๋‹ค. @AfterReturning(value = "methodExecuting()", Returning = "returningValue")๋Š” ๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋œ ํ›„ ์‹คํ–‰๋  ์–ด๋“œ๋ฐ”์ด์Šค์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ๋ฉ”์„œ๋“œ์— ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ โ€” if (returningValue! = Null) {
  2. ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†์„ ๋•Œ โ€” else {
@AfterThrowing(value = "methodExecuting()", Throwing = "exception")์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, ์ฆ‰ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ throwํ–ˆ์„ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์–ด๋“œ๋ฐ”์ด์Šค์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ main ์„ ์‹คํ–‰ํ•˜๋ฉด ์ผ์ข…์˜ ์ฝ˜์†” ๊ธฐ๋ฐ˜ ๋กœ๊น…์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„ฑ๊ณต์ ์ธ ์‹คํ–‰: method โ€” setValue, class โ€” Main ์„ฑ๊ณต์ ์ธ ์‹คํ–‰: method โ€” getValue, class โ€” Main, ๋ฐ˜ํ™˜ ๊ฐ’ โ€” <some value> ์˜ˆ์™ธ ๋ฐœ์ƒ: method โ€” checkValue, class โ€” ์ฃผ์š” ์˜ˆ์™ธ โ€” java.lang.Exception ์˜ˆ์™ธ ๋ฐœ์ƒ: method โ€” ๋ฉ”์ธ, ํด๋ž˜์Šค โ€” ๋ฉ”์ธ, ์˜ˆ์™ธ โ€” java.lang.Exception
์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ ์ถ”์ ์„ ๊ณ„์† ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ Java์˜ ์˜ˆ์™ธ ๋ฐ ์˜ˆ์™ธ: catch ๋ฐ ์ฒ˜๋ฆฌAOP๋ž€?  ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์›๋ฆฌ - 3 ๋ฌธ์„œ์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์˜ค๋Š˜์€ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” AOP ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  , ์ด ์ง์Šน์ด ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌด์„ญ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ์•ˆ๋…•!
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION