Spring AOP ๊ณต์ ๋ฌธ์ ์ฝ๊ณ ์ค์ค๋ก ์ ๋ฆฌํจ.
๊นํ๋ธ์๋ ์ฌ๋ ค๋์
https://github.com/dalcheonroadhead/Spring-framework-theory/blob/main/AOP/relatedStudy/conceptOfAOP.md
Concept-of-AOP ์ค์ค๋ก ์ ๋ฆฌ
๋ชฉ์ฐจ
- AOP๋ ๋ฌด์์ธ๊ฐ?
- ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์์๋ณด๋ ์ฉ์ด ์ ๋ฆฌ
- Advice
- Join Point
- pointcut
- Aspect
- Introduction
- Target Object
- AOP proxy
- Weaving
- Cross-cutting concerns
1. AOP๋ ๋ฌด์์ธ๊ฐ?
Aop๋ ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Aspect Oriented Programming)์ ๋งํ๋ค. Java๋ผ๋ ์ธ์ด๋ฅผ ๋ฐฐ์ธ ๋ ์ฐ๋ฆฌ๋ ์๋ฐ๊ฐ ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ(Object Oriented Programming)์ ์งํฅํ๋ ์ธ์ด๋ผ๊ณ ๋ฐฐ์ ๋ค. ๊ฐ์ฒด๋ Class๋ผ๋ ํ๋์ ์ค๊ณ๋์์ ๋์จ ๊ตฌํ์ฒด์๋ค. ์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ์ด ๊ฐ์ฒด ํ๋ํ๋์ ์ง์คํ์ฌ ํ๋ก๊ทธ๋๋ฐ ํ๋ค.
"๊ทธ๋, ์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ํด์๋๋ฐ ์ AOP๊ฐ ํ์ํ ๊ฑฐ์ง?"
์ด์ ์ด ์ง๋ฌธ์ ๋ต์ ํ๋ ค๊ณ ํ๋ค. ์ฌ๋ฌ๋ถ์ด ์ค๊ณ๋๋ฅผ ๊ฐ์ง๊ณ ์๋์ฐจ, ๋นํ๊ธฐ ํน์ ์ธํ๊ธฐ๋ฅผ ๋ง๋๋๋ฐ, ๋ง๋ค๊ธฐ ์ ์ ๊ธฐํ๋ถ ์ง์์ด ์์ ์ค๊ณ ์ ๊ณผ์ ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธ๊ณ ์ถ๋ค๊ณ ํ๋ค. ์ ํํ ์๊ฐ์ ์ธก์ ํ๋ ค๋ฉด, ๊ตฌํ ์์ ์ง์ ์ ์คํฑ์์น๋ฅผ ๋๋ฅด๊ณ , ์์ฑ๋์๋ง์ ์คํฑ์์น๋ฅผ ์ ์งํด์ผ ํ๋ค. ๋ง์ฝ ์๋์ฐจ์ ๋นํ๊ธฐ, ์ธํ๊ธฐ๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ณต์ฅ์์ ๋ง๋ค์ด์ง๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด? ๊ธฐํ๋ถ์์๋ ๊ฐ ๊ณต์ฅ๋ง๋ค ์ง์์ ๋น์นํด์ผํ๋ค.
์ด์ ์ด ๋น์ ๋ฅผ ์ค์ ํ๋ก์ ํธ์ ๋์
ํด์ ์๊ฐํด๋ณด์. ์ธํ๊ธฐ, ๋นํ๊ธฐ, ์๋์ฐจ๋ฅผ ๋ง๋๋ ๊ฒ์ Service Logic ์ด๋ผ๊ณ ํ๊ณ , ์๊ฐ์ ์ธ๋ ๊ณผ์ ๋ํ ํ๋์ ๋ก์ง์ด๋ผ๊ณ ์๊ฐํด๋ณด์. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ๊ฐ ์๋น์ค ๋ก์ง๋ง๋ค ์์ ์๊ฐ๊ณผ ๋ ์๊ฐ์ ๋ค ์ธก์ ํ๊ณ ๊ทธ ์ฐจ๋ฅผ ๊ตฌํ๋ ๋ก์ง์ ์ ๋ถ ๋ฃ์ด์ผ ํ๋ค!!
์ด๋ ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ๋ ํฐ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด ์คํฑ์์น ๋ก์ง์ด ์ ๋๋ก ๋์ํ์ง ์๋๋ค๊ณ ํ์. ๊ทธ๋ฌ๋ฉด ์ฌ๋ฌ๋ถ์ ์ง์ง ์ค๊ณ๋ฅผ ๊ตฌํํ๋ ๋ก์ง์ ์ง์คํ์ง ๋ชปํ๊ณ ๊ทธ๊ฒ์ ํ๋ํ๋ ๊ณ ์น๋๋ฐ ์ฃผ๋ ฅํด์ผํ๋ค.
์ด์ฒ๋ผ OOP์์๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์๋น์ค ๋ก์ง๋ง๋ค ์ถ๊ฐํ๊ณ ์ถ์ ๋, ๋ค์๊ณผ ๊ฐ์ ๊ท์ฐฎ์ ์ ์ด ์๊ธด๋ค. ์ด๋ ์ด๋ฌํ OOP์ ๋จ์ ์ ๋ณด์ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก AOP์ด๋ค.
๋จผ์ ์์ ์คํฑ์์น ๊ธฐ๋ฅ ๊ฐ์ ๊ฒ์ ํก๋จ ๊ด์ฌ์ฌ (cut-acrossing concern)์ด๋ผ๊ณ ํ๋ค. ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ด ๊ณตํต์ผ๋ก ์คํํ๊ธธ ์ํ๋ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ปํ๋๋ฐ, AOP์์๋ ์ด ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ณธ๊ธฐ๋ฅ๊ณผ ๋ถ๋ฆฌํด๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. (๋ฐฉ์์ ํ์ ํ๊ฒ ๋ค.) ์ด๋ ๊ฒ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ณธ๊ธฐ๋ฅ๊ณผ ๋ถ๋ฆฌํ๊ฒ๋๋ฉด, ๋ถ๊ฐ๊ธฐ๋ฅ์ด ๋ณธ ๊ธฐ๋ฅ๋ค์ ๊ฐ๋ก์ง๋ฅด๋ฉฐ ์ ์ฌ์ ์์ ์์น์ ์คํ๋๋๋ฐ, ์ด ๋ชจ์ต์ด ํก๋จํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ณด์ฌ์ ๋ถ์ฌ์ง ์ด๋ฆ์ด๋ค.
*AOP๋ ๊ฐ์ฒด ํ๋ํ๋์ ์ง์คํ๋ ๊ธฐ์กด ๊ด์ ์์ ๋ฒ์ด๋, ๊ธฐ๋ฅ๊ฐ์ ๊ด๊ณ์ ์ง์คํ๊ณ , ๋ณธ๊ธฐ๋ฅ๊ณผ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ *์ ๋ปํ๋ค. ๊ฐ์ฒด์ ์ค๊ณ๋์ธ ํด๋์ค๋ ํ๋์ ๊ด์ฌ์ฌ์ ๋ํ ์ค๊ณ์ด๋ค. (ex- ์๋์ฐจ ์ค๊ณ, ๋นํ๊ธฐ ์ค๊ณ ๋ฑ), ํ์ง๋ง ์๋ฐํ ๋ฐ์ง๋ฉด ๊ฐ์ฒด ๋ด์์๋ ์์ฒ๋ผ ๊ด์ฌ์ฌ๊ฐ ๋๋ ์ ์๋ค. (ex - ์๋น์ค ๋ก์ง <-> ์๋น์ค ๋ก์ง์ ๋ถ์ฐ๋ฌผ์ DB์ ์ ์ฅํ ๋ ํธ๋์ญ์
์ฒ๋ฆฌ ๋ก์ง ๋ฑ) AOP๋ ์ด ๊ฐ์ฒด ๋ด๋ถ์์ ๋๋๋ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
AOP๋ฅผ ํ๋ก๊ทธ๋จ์ ๋์
ํ๋ฉด ๊ฐ๋ฐ์๋ ๋ณธ ๊ธฐ๋ฅ ์์ฒด์ ๋ ์ง์คํ ์ ์๋ค๋ ๊ฐ๋ ฅํ ์ด์ ์ ์ป๋๋ค. ์๋ํ๋ฉด ๋ถ๊ฐ ๊ธฐ๋ฅ ์ฝ๋๋ ๋ฑ ํ๋ฒ๋ง ์์ฑํ๊ณ ์ด๋ฅผ Spring AOP ํน์ AspectJ๊ฐ ์๋์ผ๋ก ๋ณธ๊ธฐ๋ฅ ์คํ ์ ํ์ ๋ถ์ฐฉํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
2. ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์์๋ณด๋ ์ฉ์ด ์ ๋ฆฌ
1. Advice
์ฐ๋ฆฌ๊ฐ ๋ณธ ๊ธฐ๋ฅ์ ๋ถ์ฐฉํ๊ณ ์ถ์ ๋ถ๊ฐ๊ธฐ๋ฅ ์์ฒด๋ฅผ ์๋ฏธํ๋ค. ๋ถ๊ฐ ๊ธฐ๋ฅ์ด ๋ถ์ฐฉ๋๋ ์์ (๋ณธ ๊ธฐ๋ฅ ์คํ ์ ์ด๋, ํ๋) ํน์ ๋ณธ ๊ธฐ๋ฅ์ ๋ฐํ ๊ฐ์ ๋ฐ๋ผ์ ๊ทธ ์ ํ์ด ๋๋๋ค. (์์ธํ ์ ํ์ ์ Concept of AOP ๋ฒ์ญ๋ณธ์ ์ ํ ์์ผ๋ ์๋ตํ๊ฒ ์ต๋๋ค.)
2. Join Point
Join Point๋ Advice๊ฐ ํฉ๋ฅํ๋ ์์ ์ ๋ปํ๋ค. ์์ Advice ์ ํ์ด Before ํน์ After๋ก ๋๋์ด์ง๋ ๊ฒ์ ์ด ๋ ์ ๋๋ฌธ์ด๋ค. Spring AOP์์ join Point๋ ์ธ์ ๋ ๋งค์๋ ์คํ ์์ (์คํ ์ ํน์ ์คํ ํ)๋ง์ผ๋ก ์ ํ๋๋ค.
3. pointcut
Join Point๊ฐ ์์น๋ผ๋ฉด pointcut์ ๊ทธ ์์น๋ฅผ ๋ํ๋ด๋ ์ฃผ์์ด๋ค. SpringAOP๋ ์ด pointcut์ด๋ ํํ์์ ํตํด ๋ถ๊ฐ๊ธฐ๋ฅ์ด ์คํ๋์ด์ผํ ์์น๋ฅผ ํ์ ํ๊ณ ๋ถ๊ฐ๊ธฐ๋ฅ์ ์ฐ๊ฒฐํ๋ค. pointcut ํํ์์ AspectJ์ ์ ๊ท์์ ๋ฐ๋ฅธ๋ค.
4. Aspect
๊ด์ -> AOP์์ ๋ชจ๋ํ๋ ๋ถ๊ฐ๊ธฐ๋ฅ ์์ฒด๋ฅผ ์๋ฏธํ๋ค. Aspect๋ Advice(๋ด์ฉ๋ฌผ) ๊ณผ pointcut(๋ด์ฉ๋ฌผ์ด ์คํ๋์ด์ผ ํ ์ฃผ์) 2๊ฐ์ง๋ฅผ ํฉ์น ๊ฐ๋ ์ด๋ค.
5. Introduction
AOP๋ ๋ณธ ๊ธฐ๋ฅ์ ์ด๋ ํ ๊ฐ์ญ๋ ํ์ง ์๋ ๊ฒ์ ์งํฅํ๋ค. ํ์ง๋ง ๋๋ฌผ๊ฒ, ๋ณธ ๊ธฐ๋ฅ ์คํ ์ ์ ๋ณธ ๊ธฐ๋ฅ์ field๊ฐ์ด Method๋ฅผ ๋ฃ์ด์ผํ๋ ์ผ์ด ์๊ธธ ์ ์๊ฒ ๋ค. (์ด๋ฐ ์ผ์ ๋๋๋ก ํผํ๋ ๊ฒ์ด ์ข๋ค!) ์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด AOP์ introduction์ด๋ผ๋ ๊ธฐ๋ฅ์ด๋ค. introduction์ ์ฌ์ ์ ์๋ฏธ ์ค ํ๋๋ '๋์ '์ด๋ ์๋ฏธ๊ฐ ์๋ค. ๊ทธ ๋ป ๊ทธ๋๋ก introduction์ ํตํด ์ฐ๋ฆฌ๋ ๋ณธ ๊ธฐ๋ฅ์ ์๋ก์ด ํ๋๋ ๋งค์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
6. Target Object
๋ถ๊ฐ๊ธฐ๋ฅ์ด ์ฅ์ฐฉ๋ ๋ณธ ๊ธฐ๋ฅ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ปํ๋ค. Spring AOP๊ฐ runtime์ ๋ณธ ๊ธฐ๋ฅ์ ๋๋ฆฌํ๋ Proxy ๊ฐ์ฒด๋ฅผ ๋ง๋๋๋ฐ ์ฑ๊ณตํ ํ ๋ถํฐ๋ Target Object๋ ์ง์ง ๋ณธ๋์ ๊ฐ์ฒด (real Object)๋ฅผ ๋ปํ๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ๊ฒ์ ๋๋ฆฌํ๋ ๊ฐ์ฒด (Proxy ๊ฐ์ฒด)๋ฅผ ์๋ฏธํ๋ค.
7. Weaving
weaving์ ๋ถ๊ฐ๊ธฐ๋ฅ์ ๋ณธ ๊ธฐ๋ฅ์ ์ฐ๊ฒฐ์ํค๋ ์์ ์์ฒด๋ฅผ ์๋ฏธํ๋ค. ํด๋น ์์ ์ด ์ํ๋๋ ๊ณผ์ ์ AspectJ๋ฅผ ์ฐ๋์ง, ์๋๋ฉด Spring AOP๋ฅผ ์ฐ๋์ง์ ๋ฐ๋ผ ๋๋๋๋ฐ ์์ธํ ๋ด์ฉ์ Weaving๊ณผ Proxy์ ๊ดํ์ฌ ์์ ๋ ์์๋ณด์๋ค.
8. AOP proxy
AspectJ๋ฅผ ์ฐ์ง ์๋ ํ Spring์ Spring AOP API๋ฅผ ์ด์ฉํด์, ๋ฐํ์์ Weaving์ ์ํํ๋ค. Spring Aop๋ Weaving ์ํ ์ ์ด proxy๋ผ๋ ๋๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค. ๋๊ฐ์ด ์์ธํ ๋ด์ฉ์ Weaving๊ณผ Proxy์ ๊ดํ์ฌ ์์ ์์๋ณด์๋ค.