[Spring] Spring AOP; ์Šคํ”„๋ง AOP ๊ฐœ๋… ์ •๋ฆฌ

2023. 7. 15. 13:55ใ†๊ฐœ๋… ์ •๋ฆฌ ์ž‘์—…์‹ค/Java

728x90
๋ฐ˜์‘ํ˜•

 




 

์Šคํ”„๋ง ๋ถ€ํŠธ 3 ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ : ์ž๋ฐ” ํŽธ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

 

 

 

 

๐Ÿš€ ์Šคํ”„๋ง AOP ๊ฐœ๋… ์ •๋ฆฌ

    ๐Ÿ”ฝ ์ด๋ก 

        ๐Ÿ“ฆ AOP๋ž€?

AOP๋Š” Aspect Oriented Programming์˜ ์•ฝ์ž๋กœ ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์žˆ์–ด์š”.
์ด๊ฒƒ์€ ์–ด๋–ค ๋กœ์ง ๊ธฐ์ค€ ํ•ต์‹ฌ์ ์ธ ๊ด€์ ๊ณผ ๋ถ€๊ฐ€์ ์ธ ๊ด€์ ์„ ๋‚˜๋ˆ„๊ณ , ๊ฐ๊ฐ์˜ ๊ด€์ ์— ๋”ฐ๋ผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ์‹์„ ์ด์•ผ๊ธฐํ•ด์š”.

์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ํ•ต์‹ฌ์ ์ธ ๊ด€์ ์ด๋ž€ ์šฐ๋ฆฌ๊ฐ€ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์–ด์š”.
๋ถ€๊ฐ€์ ์ธ ๊ด€์ ์€ ํ•ต์‹ฌ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ–‰ํ•ด์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๋กœ๊น…, ํŒŒ์ผ ์ž…/์ถœ๋ ฅ ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”.

์ฆ‰, AOP์—์„œ ๊ฐ ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋กœ์ง์„ ๋ชจ๋“ˆํ™” ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๋“ค์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ชจ๋“ˆํ™” ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์—์š”.
์ด ๋•Œ, ์†Œ์Šค ์ฝ”๋“œ ์ƒ์—์„œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์— ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๋Š” ์ฝ”๋“œ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ Crosscutting Concerns ์ฆ‰, ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค.

 

 


์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ฅผ Aspect๋กœ ๋ชจ๋“ˆํ™”ํ•˜๊ณ , ํ•ต์‹ฌ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด AOP์—์š”.

AOP๋Š” ์–ด๋–ค ์–ธ์–ด๋ฅผ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ๊ธฐ์กด์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) ์–ธ์–ด๋ฅผ ๋ณด์™„ ๋ฐ ํ™•์žฅํ•˜๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์š”.

์ž๋ฐ” ์ง„์˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” AOP ๋„๊ตฌ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์œผ๋กœ AspectJ, JBossAOP, SpringAOP๊ฐ€ ์žˆ๋‹ต๋‹ˆ๋‹ค.

AOP๋Š” ๊ฒฐ๊ตญ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ ์ œ๊ฑฐ ๋ฐ ํšจ์ธŒ์ ์ธ ์œ ์ง€๋ณด์ˆ˜, ๋†’์€ ์ƒ์‚ฐ์„ฑ, ์žฌํ™œ์šฉ์„ฑ ๊ทน๋Œ€ํ™”, ๋ณ€ํ™” ์ˆ˜์šฉ๋“ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

AOP ๊ด€๋ จ ์šฉ์–ด ์ •๋ฆฌ

์šฉ   ์–ด ์ƒ ์„ธ ๋‚ด ์šฉ
JoinPoint โˆ™ Method๋ฅผ ํ˜ธ์ถœํ•˜๋Š” '์‹œ์ ', ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” '์‹œ์ '๊ณผ ๊ฐ™์ด Application ์‹คํ–‰ํ•  ๋•Œ, ํŠน์ • ์ž‘์—…์ด ์‹คํ–‰๋˜๋Š” '์‹œ์ ' ์˜๋ฏธ
โˆ™ Advice๊ฐ€ ์ ์šฉ๋  ์œ„์น˜, ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๋Š” ์ง€์ . Method ์ง„์ž… ์ง€์ , ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ , Field์—์„œ ๊ฐ’์„ ๊บผ๋‚ด ์˜ฌ ๋•Œ ๋“ฑ
    ๋‹ค์–‘ํ•œ ์‹œ์ ์— ์ ์šฉ
Advice โˆ™ JoinPoint์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ
โˆ™ ๋ถ€๊ฐ€์  ๊ด€์ ์— ํ•ด๋‹น (ํŠธ๋žœ์žญ์…˜, ๋กœ๊ทธ, ๋ณด์•ˆ, ์ธ์ฆ ๋“ฑ..)
โˆ™ ์‹ค์ œ ์–ด๋–ค ์ผ์„ ํ•ด์•ผํ• ์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ
Target โˆ™ ์‹ค์งˆ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ
โˆ™ ํ•ต์‹ฌ๊ด€์ ์— ํ•ด๋‹น
โˆ™ Aspect๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณณ (Class ํ˜น์€ Method)
PointCut โˆ™ Target Class์™€ Advice๊ฐ€ ๊ฒฐํ•ฉ(Weaving)๋  ๋•Œ, ๋‘˜ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ ๊ทœ์น™ ์ •์˜
   - Advice๊ฐ€ ์‹คํ–‰๋œ Target ํŠน์ • Method ์ง€์ •
โˆ™ JoinPoint์˜ ์ƒ์„ธ ์ŠคํŽ™ ์ •์˜ ํ•œ ๊ฒƒ์œผ๋กœ A๋ž€ Method์˜ ์ง„์ž… ์‹œ์ ์— ํ˜ธ์ถœํ•  ๊ฒƒ๊ณผ ๊ฐ™์ด ๋”์šฑ ๊ตฌ์ฒด์ ์œผ๋กœ Advice ์‹คํ–‰ ์ง€์  ๋ช…์‹œ
Aspect โˆ™ Advice์™€ PointCut์„ ํ•ฉ์ณ ํ•˜๋‚˜์˜ Aspect๋ผ๊ณ  ์ง€์นญ
   - ์ผ์ • ํŒจํ„ด์„ ๊ฐ€์ง€๋Š” Class์— Advice๋ฅผ ์ ์šฉํ•˜๋„๋ก ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ Aspect๋ผ๊ณ  ์ง€์ง•
โˆ™ ํฉ์–ด์ง„ ๊ดŒ์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™” ํ•œ ๊ฒƒ์œผ๋กœ ์ฃผ๋กœ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ๋ชจ๋“ˆํ™”
Weaving โˆ™ AOP์—์„œ JoinPoint๋“ค์„ Advice๋กœ ๊ฐ์‹ธ๋Š” ๊ณผ์ • ์ง€์นญ
โˆ™ Weaving ํ•˜๋Š” ์ž‘์—…์„ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด AOP ํˆด์ด ํ•˜๋Š” ์—ญํ• 
728x90

 

AOP ์ ์šฉ ๋ฐฉ๋ฒ•

์ œ   ๋ชฉ ์ƒ ์„ธ ๋‚ด ์šฉ
์ปดํŒŒ์ผ ํƒ€์ž„ ์ ์šฉ ์ปดํŒŒ์ผ ์‹œ์ ์— Byte Code๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ AOP๊ฐ€ ์ ์šฉ๋œ Byte Code ์ƒ์„ฑ
๋กœ๊ทธ ํƒ€์ž„ ์ ์šฉ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ปดํŒŒ์ผ ํ•œ ๋’ค, ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์ ์— ํด๋ž˜์Šค ์ •๋ณด ๋ณ€๊ฒฝ
๋Ÿฐํƒ€์ž„ ์ ์šฉ ์Šคํ”„๋ง AOP๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ A๋ผ๋Š” Class Type์˜ Bean์„ ๋งŒ๋“ค ๋•Œ,
A Type์˜ Proxy Bean์„ ๋งŒ๋“ค์–ด Proxy Bean์ด Aspect Code ์ถ”๊ฐ€ํ•˜์—ฌ ๋™์ž‘ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

 

 

 

Spring AOP

โˆ™ Spring์—์„œ ์ œ๊ณตํ•˜๋Š” Spring AOP๋Š” Proxy ๊ธฐ๋ฐ˜ AOP ๊ตฌํ˜„์ฒด
โˆ™ Proxy ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ‘๊ทผ ์ œ์–ด ๋ฐ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ
โˆ™ Spring AOP๋Š” Spring Bean์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅ
โˆ™ ๋ชจ๋“  AOP ๊ธฐ๋Šฅ ์ œ๊ณต ๋ชฉ์ ์ด ์•„๋‹Œ ์ค‘๋ณต ์ฝ”๋“œ, Proxy Class ์ž‘์„ฑ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€ ๋“ฑ ํ”ํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ ์œ„ํ•œ ์†”๋ฃจ์…˜ ์ œ๊ณต ๋ชฉ์ 
โˆ™ Spring AOP๋Š” ์ˆœ์ˆ˜ JAVA๋กœ ๊ตฌํ˜„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํ•œ ์ปดํŒŒ์ผ ๊ณผ์ • ๋ถˆ ํ•„์š”

 

Proxy Pattern

 

Proxy Pattern์—๋Š” Interface ์กด์žฌํ•˜๊ณ , Client๋Š” ์ด Interface Type์œผ๋กœ Proxy ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์š”.
Proxy ๊ฐ์ฒด๋Š” ๊ธฐ์กด Target Object (Real Subject)๋ฅผ ์ฐธ์กฐํ•œ๋‹ต๋‹ˆ๋‹ค.

Proxy ๊ฐ์ฒด์™€ ๊ธฐ์กด ํƒ€๊ฒŸ ๊ฐ์ฒด์˜ Type์€ ๊ฐ™๊ณ , Proxy๋Š” ์›๋ž˜ ํ•  ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Real Subject๋ฅผ ๊ฐ์‹ธ Client์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด์—์š”.

 

 

 

Annotaion

์ข…   ๋ฅ˜ ์ƒ ์„ธ ๋‚ด ์šฉ
@Around Target Method๋ฅผ ๊ฐ์‹ธ ํŠน์ • Advice ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
@Before Advice Tartget Method ํ˜ธ์ถœ ๋˜๊ธฐ ์ „ Advice ๊ธฐ๋Šฅ ์ˆ˜ํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ
@After Target Method ๊ฒฐ๊ณผ์— ๊ด€๊ณ„์—†์ด 
@AfterReturning Target Method๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ ๋’ค Advice ๊ธฐ๋Šฅ ์ˆ˜ํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ
@AfterThrowing Target Method๊ฐ€ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ Advice ๊ธฐ๋Šฅ ์ˆ˜ํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ
@Around Advice Target Method๋ฅผ ๊ฐ์‹ธ Target Method ํ˜ธ์ถœ ์ „๊ณผ ํ›„์— Adivce ๊ธฐ๋Šฅ ์ˆ˜ํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ

 

 

 

 

์Šคํ”„๋ง ๋ถ€ํŠธ 3 ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋˜๊ธฐ : ์ž๋ฐ” ํŽธ

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•