[Spring] AOP (Aspect-Oriented Programming) ๊ธฐ๋ณธ๊ณผ ๊ฐ๋
Spring์๋ AOP(Aspect-Oriented Programming, ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ)์ด๋ผ๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์? OOP(๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ)๋ผ๋ ๊ฒ์ ๋ค์ด๋ดค๋๋ฐ, AOP๋ ๋ฌด์์ผ๊น์?
AOP vs OOP ?
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(AOP)์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๋๊ฐ ์ค๋ณต๋๊ณ ๊ฐ๋ ฅํ๊ฒ ๊ฒฐํฉ๋์ด ๋ค๋ฅธ ๋ก์ง๊ณผ ๋ถ๋ฆฌํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง๋ค์ ๋ณ๋์ ๊ด์ฌ์ฌ๋ก ๋ถ๋ฆฌํ์ฌ ๋ชจ๋ํ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋ณดํต ์ด๋ฌํ ๋ก์ง์ ๋ง๋ฌ์ ๋ ์ฝ๋๋ฅผ ๋ณต์ ํ์ฌ ์์กด์ฑ์ ๋ง๋ค๊ฒ ๋๋๋ฐ, AOP๋ ์ด๋ฌํ ์์กด์ฑ ์์ด๋ ๋์ํ๊ฒ ํด์ค๋๋ค. ๋ํ์ ์ผ๋ก logging ์ฝ๋๋ค์ด ์ฌ๊ธฐ์ ํด๋นํฉ๋๋ค.
๊ทธ๊ฒ์ ์๋๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๋ OOP๋ง์ ๊ฐ์ง๊ณ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์์ง๋ง AOP๋ง ๊ฐ์ง๊ณ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ AOP๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ํด์๋ ๋ฐ๋์ OOP์ ๋ํ ๊ฐ๋ ์ ํ์คํ ์์งํ ๋ค์ ๊ณต๋ถํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
๋จ์ํ๊ฒ ๋ณธ๋ค๋ฉด ์ ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ก ๋ฐ๊พธ๊ณ ํด๋น ํด๋์ค๋ฅผ ์์ํ ๋ super ํค์๋๋ฅผ ์ฌ์ฉํด ๋ฃ์ ์๋ ์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ฌ์ ํ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ฐ์๋๋ ๊ฒ์ ๋์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ 'ํฉ์ด์ง ๊ด์ฌ์ฌ(Crosscutting concerns)'๋ผ๊ณ ํฉ๋๋ค.
์ฆ, ์ฝ๊ฒ ์๊ธฐํ๋ฉด ์ด ํด๋์ค์ ํต์ฌ ๋ก์ง์ด ์๋์ง๋ง ๋ฐ๋ณตํด์ ์ฐ์ด๋ ๊ด์ฌ ๋ก์ง์ ๋๋ค.
AOP ๊ฐ๋
๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ์๋ ์ฐ์ด๋ ๊ณ ์ ์ ๊ฐ๋ ๊ณผ ์ฉ์ด๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
- Aspect
์ ํ๋ฆฌ์ผ์ด์ ์ ํฌํจํด์ผ ํ๋ ๋ก์ง๊ณผ ํด๋น ๋ก์ง์ด ์ด๋์ ์คํํด์ผ ํ๋์ง๋ฅผ ์ ์ํ ์ฝ๋ - Target
Aspect๋ฅผ ์ ์ฉํ ๊ฐ์ฒด (์ข ์ข adviced object๋ผ๊ณ ๋ ํจ) - Advice
ํน์ ์กฐ์ธํฌ์ธํธ์ ์คํ๋๋ ์ฝ๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค ๋ด ๋ฉ์๋๋ก ์ ์ (์: before, after) - JoinPoint
์ ํ๋ฆฌ์ผ์ด์ ์คํ ๊ณผ์ ์ค Advice๊ฐ ์ ์ฉ๋ ์ง์
์) ๋ฉ์๋ ๋ช ์์ ํธ์ถ(call), ๋ฉ์๋ ์ฐธ์กฐ ํธ์ถ(invoke), ํด๋์ค ์ด๊ธฐํ, ๊ฐ์ฒด ์ธ์คํด์ค ์์ฑํ ๋ ๋ฑ - PointCut
์ธ์ Advice๋ฅผ ์คํํ ์ง๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ ์กฐ์ธํฌ์ธํธ์ ๋ชจ์์ผ๋ก ์์์ ์ค๋ช ํ ์์ ์ํฉ ์ธ์ ๋ค๋ฅธ ๋ณ๋์ ์ํฉ์ ๋ช ์ํ ์ ์์.
์) ํน์ ๋ฉ์๋ ํธ์ถ์, ํน์ ํด๋์ค์ ๋ณ์๊ฐ ์ด๋ ํ ๊ฐ์ผ ๋ ๋ฑ - Weaving
์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ์ ์ ํ ์์น์ Aspect๋ฅผ ์ฝ์ ํ๋ ๊ณผ์ .
์ผ๋ฐ์ ์ผ๋ก AOP ์๋ฃจ์ ์์ ์ปดํ์ผ ์์ ์์ ์๋น์ ๋น๋ ์์ ์ ์ํํ๊ณ , ๋ฐํ์ ์์ ์์๋ ๋ฐํ์์ ๋์ ์ผ๋ก ์คํ.
AspectJ์์๋ ์ ์์ ์ธ์ ๋ก๋ ์์ ์๋น(Load-Time Weaving)์ด๋ผ๋ ๋งค์ปค๋์ฆ ์ ๊ณต,
์ด ๋ฐฉ์์ ๋ด๋ถ JVM Class Loader๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ก๋ฉํ ๋ ํด๋น ๋ฐ์ดํธ ์ฝ๋์ ์๋น ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์. - Introduction
์ถ๊ฐ ๋ฉ์๋๋ ํ๋๋ฅผ ๋์ ํด ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์์ ํ๋ ๊ณผ์ .
์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ์์ ์ผ๋ก ํน์ ์ธํฐํ์ด์ค ๊ตฌํ ์์ด ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์.
AOP ์ค์
๊ทธ๋ผ ์ด์ AOP๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ๊ฐ๋จํ๊ฒ AOP๋ฅผ ์ฌ์ฉํด์ Hello World๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ์ฃ .
์ ์๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ์ ์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ ๋ฉ์๋์ธ print ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์คฌ์ต๋๋ค. ์ฌ๊ธฐ์ ์ํ๋ ๊ฒ์ ์ ์ ์ด๋ฆ์ ์ถ๋ ฅํ ๋ ๋ฐ๋์ ์ ์ ์ด๋ฆ ์์ "Author"๊ฐ ๊ฐ์ด ์ถ๋ ฅ๋๋๋ก ํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฆ์ ์ถ๋ ฅํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์์ "Author"๋ฅผ ์ถ๋ ฅํ๋๋ก Advice๋ฅผ ํ๋ ์ถ๊ฐํฉ๋๋ค.
์ด๋ฅผ ์ํด MethodInterceptor๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. MethodInterceptor๋ ๋ฉ์๋ ํธ์ถ JoinPoint์ ์ ์ฉํ Around Advice๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉํ๋ ํ์ค AOP Aliance Interface์ ๋๋ค. ์ด์ ๋น์ทํ ๋ ์์ผ๋ก Enhancer๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฉ์๋ ์ธ์๋ก ์ฌ์ฉ๋๋ MethodInvocation์ Advice๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋ ํธ์ถ์ ๋ํ๋ด๋ฉฐ ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ฉ์๋ ํธ์ถ๋๋ ์์ ์ ์ ์ดํ ์ ์์ต๋๋ค.
์ฝ๋์ ๋ณด๋ฉด retVal(return value)์ด๋ผ๋ ๋ณ์๊ฐ ๋ณด์ ๋๋ค. ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ Target ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ ๋ ๋ฐํ๋๋ ๊ฐ์ผ๋ก ํด๋น ๋ฉ์๋๋ฅผ ์ถ์ ํด๋ณด๋ฉด ์ด ๋ฉ์๋๊ฐ JoinPoint์ ๋ฉ์๋์์ ์ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์๋๋ก ์งํํด๋ณด๋ฉด N.K๋ฅผ ๊ฐ๋จํ ์ถ๋ ฅํ๊ธฐ ์ , Author๋ฅผ ์ถ๋ ฅํ๊ณ ๊ทธ ๋ค์์๋ !๋ฅผ ์ถ๋ ฅํ๋ ํํ๊ฐ ๋๋ ๊ฒ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก AuthorDecorator ์ด๋๋ฐ์ด์ค๋ฅผ ์ฝ๋์ ์๋นํด์ผ ํฉ๋๋ค. Advice๋ฅผ ์๋นํ ๋๋ ๋จผ์ Advice ์ ์ฉ ๋์์ธ Author์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ํด๋น ์ธ์คํด์ค์ ์ ์ฉํ ํ๋ก์๋ฅผ ์์ฑํ ๋ค์ ProxyFactory๊ฐ AuthorDecorator ์ด๋๋ฐ์ด์ค๋ฅผ ์๋นํ๋๋ก ํ๋ฉด ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ProxyFactory ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๊ฐ์ฒด์ ํ๋ก์๋ฅผ ์์ฑํจ๊ณผ ๋์์ ์ด๋๋ฐ์ต์ค๋ฅผ ์๋นํ๋ค๋ ์ ์ด๋ฉฐ Enhancer๋ฅผ ์ด์ฉํ ๋์๋ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค.
addAdvice๋ฅผ ํธ์ถํ์ฌ ProxyFactory์ AuthorDecorator ์ด๋๋ฐ์ด์ค๋ฅผ ์ ๋ฌํ๊ณ setTarget์ ํธ์ถํด ์๋น ๋์์ ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
์ถ๋ ฅ ํ๋ฉด์ ๋ณด๋ฉด ์์ ํ์ง ์์ Target ๊ฐ์ฒด์์ print()๋ฅผ ํธ์ถํ๋ฉด ํ์ค ๋ฉ์๋ ํธ์ถ์ด ์ด๋ค์ง๊ณ , ํ๋ก์๋ฅผ ์ฌ์ฉํด ํธ์ถํ๋ฉด AuthorDecorator์ ์ฝ๋๊ฐ ์คํ๋์ด ์์ "Author"๊ฐ ํ์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์์ธํ ๋ณด๋ฉด ๊ด์ฌ๋ ๋ก์ง์ ์ํ๋ ํด๋์ค์ ์ ์ฉํ๊ธฐ ์ํด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ , ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค์ ํด๋์ค์์๋ ์ด๋ ํ ์์กด์ฑ๋ ๊ฐ๊ณ ์์ง ์์ต๋๋ค.
๊ทธ์ ํด๋น ๊ด์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ณ๋์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ด์ฌ ๋ก์ง์ ์ ์ฉํด ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ ํํ๊ฒ๋ Author๋ผ๋ ๊ฐ์ฒด๋ฅผ ์์๋ฐ์ ์๋ก์ด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํธ์ถํ ๋ฉ์๋๋ฅผ Overridingํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํด๋์ค๋ฅผ final class๋ก ์ ์ํ๊ฑฐ๋ ํธ์ถํ๋ ๋ฉ์๋๋ฅผ final๋ก ์ ์ธํ๋ ๊ฒฝ์ฐ, IllegalArgumentException์ ๋ฐ์ํ๊ฑฐ๋ ์์ ๋ฉ์๋๊ฐ ํธ์ถ๋์ง ์์ต๋๋ค.
๋ง์น๋ฉฐ...
Spring์์ ์ ๊ณตํ๋ AOP๋ฅผ ๋ค๋ค๋ณด๊ธฐ ์ ์ ์ค์ AOP๊ฐ ๋ฌด์์ธ์ง์ ๋ํด ๊ฐ๋ ์ ์์๋ดค์ต๋๋ค. ์ค์ ๋ก Spring AOP๋ DI ๊ฐ๋ ์ ์ด์ฉํด Bean์ ์์ฑํ๋ ๋ฑ ์ผ๋ฐ์ ์ธ Java๋ฅผ ์ฌ์ฉํ ๋์ ์ข ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ด์ฉํฉ๋๋ค.
ํ์ง๋ง Spring boot์์ ์ ๊ณตํ๋ AOP๋ ์ด๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ ์ด๋ ธํ ์ด์ (Annotation)์ ์ด์ฉํด ๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ AOP๋ฅผ ํ ์ ์๋๋ก Bean ์์ฑ ๋ฑ์ ์์ฃผ ๊ฐ์ํ ํ์์ผ๋ฉฐ ์ด๋ฌํ ํจ์ถ๋ ๊ฐ๋ ์ ์ข ๋ ์ดํด๋ณด๊ธฐ ์ํด ์ด ๊ธ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
๋ค์ ๊ธ์์๋ Spring AOP์ ์ํคํ ์ฒ์ ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.