AOP(Aspect-Oriented Programming) ๊ด์ ์งํฅ ํ๋ก๊ทธ๋จ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ต์ฐจ ์ ๋จ ๋ฌธ์ ๋ฅผ ๋ชจ๋ํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋๋ค. ์ฆ, ๊ฐ๋ฐ์๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ ๋์์ ํน์ ๋ถ๋ถ์ ์ฐ๊ฒฐ๋์ง ์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
์คํ๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ถ๋ถ MVC ์น์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํฉ๋๋ค. Web Layer, Business Layer, Data Layer๋ก ์ ์ํฉ๋๋ค.
Web Layer : REST API๋ฅผ ์ ๊ณตํ๋ฉฐ, Client ์ค์ฌ์ ๋ก์ง์ ์ ์ฉํฉ๋๋ค.
Business Layer : ๋ด๋ถ ์ ์ฑ ์ ๋ฐ๋ฅธ ๋ก์ง์ ๊ฐ๋ฐํ๋ฉฐ, ์ฃผ๋ก ํด๋น ๋ถ๋ถ์ ๊ฐ๋ฐํฉ๋๋ค.
Data Layer : ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๋ฐ ์ธ๋ถ์์ ์ฐ๋์ ์ฒ๋ฆฌํฉ๋๋ค.
Spring AOP๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ ์บก์ํํ๋ ํด๋์ค์ธ Aspect๋ฅผ ์ ์ํ๊ณ ํฌ์ธํธ์ปท๊ณผ ์ด๋๋ฐ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ด๋ฌํ aspect๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ํฌ์ธํธ์ปท์ ๊ด์ ์ด ์ ์ฉ๋์ด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํน์ ์ง์ ์ธ ๊ฒฐํฉ ์ง์ ์ ์ ์ํ๊ณ ์ด๋๋ฐ์ด์ค๋ ์ด๋ฌํ ๊ฒฐํฉ ์ง์ ์์ ์ทจํด์ผ ํ๋ ์กฐ์น๋ฅผ ์ ์ํฉ๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก Spring์ AOP๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ฝ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
1. Aspect ๊ฐ๋ก์ฑ๊ธฐ
Aspect๋ฅผ ํตํด ๋ฉ์๋ ํธ์ถ์ ๊ฐ๋ก์ฑ ๋ฉ์๋ ์ด์ , ์ดํ, ๋๋ ๊ฐ๋ก์ฑ ํธ์ถ์ ์ฒ๋ฆฌํ๋ ๋งค์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ํ์ฉํ์ฌ ๋ฉ์๋์ ๋ก๊น ๋ฐ ๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฌ์ฉ ๋ฐ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์์ต๋๋ค.
2. ํฌ์ธํธ ์ปท ํํ์
AOP๋ ํฌ์ธํธ์ปท ํํ์์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํฌ์ธํธ์ปท ํํ์์ ์กฐ์ธ ํฌ์ธํธ ๋๋ ๊ด์ ์ด ์ ์ฉ๋์ด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ํน์ง ์ง์ ๊ณผ ์ผ์นํ๋ ํจํด์ ๋๋ค.
๐ ์ข ๋ฅ
3.๋์ ,์ ์ธ์
AOP๋ ๋ฐํ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ธก๋ฉด์ ์ ์ฉํ ์ ์๋ค๋ ์ ์ ๋์ ์ ๋๋ค. ๋น๋ช ๋ น์ ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค๋ ์ ์์ ์ ์ธ์ ์ ๋๋ค.
4.Cross-Cutting Concerns์ ๋ชจ๋ํ
AOP๋ ๋ก๊น , ๋ณด์ ๋ฐ ํธ๋์ญ์ ๊ด๋ฆฌ์ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์ ๊ณตํต์ ์ธ ๋ฌธ์ ๋ฅผ aspect๋ผ๋ ์ฌ์ฌ์ฉ ๋ฐ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋ ๋จ์๋ก ๋ชจ๋ํ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
**๐ AOP๋ ๊ต์ฐจ ์ ๋จ ๋ฌธ์ ๋ฅผ ๋ชจ๋ํํ๊ณ ํต์ฌ ์์ฉํ๋ก๊ทธ๋จ ๋ก์ง์์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋๋ฅผ ๋ณด๋ค ์ฒด๊ณํ -> ์ ์ง ๊ด๋ฆฌ ๋ฐ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค.
Spring์ Context์์ AOP๋ ์ฌ๋ฌ ์์น์์ ๋์ผํ ์ฝ๋๋ฅผ ๋ฐ๋ณตํ ํ์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์์ ํ์ํ ๋ณด์, ๋ก๊น , ํธ๋์ญ์ ๊ด๋ฆฌ์ ๊ฐ์ ๊ณตํต ์๋น์ค, ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
aspect ๊ฐ๋ก์ฑ๊ธฐ ๋ฉ์ปค๋์ฆ์ด ๋ฉ์๋ ํธ์ถ์ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ์ฌ ์คํ ์๊ฐ์ ๋ฆ์ถ ์ ์์ด ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ๋์ ํ ์ ์์ต๋๋ค
AOP๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ฒ๊น ๋ฐ ํ ์คํธ๊ฐ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. aspect๋ฅผ ์ฌ์ฉํ์ฌ ์์ฉํ๋ก๊ทธ๋จ์ ๋์์ ์๊ธฐ์น ๋ชปํ ๋ฐฉ์์ผ๋ก ์ํฅ์ ์ค ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, AOP์ ๋ํ ์ดํด๋๊ฐ ๋์์ผํ๋ฉฐ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํ ์คํธํ๊ธฐ ๋ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
api ์คํ์๊ฐ์ ์ถ๋ ฅํ๋ aop๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Timer
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Timer {
}
Timer ์ด๋ ธํ ์ด์ ์ ๋ง๋ค์ด api ํธ์ถ ํ ๋ ์คํ๋๊ฒ ํฉ๋๋ค.
@Target์ annotation์ด ์ด๋์ ์ ์ฉ๋ ์ง ์ ํ๋ ์ญํ ์ ๋๋ค. ElementType.METHOD๋ ๋ฉ์๋์ ์ ์ฉํ๋ค๋ ์๋ฏธ์ ๋๋ค.
@Retention ์ค์ ๋ก ์ ์ฉ๋๊ณ ์๋ ๋ฒ์๋ฅผ ์ ํ๋ ์ด๋ ธํ ์ด์ ์ด๋ฉฐ RetentionPolicy.RUNTIME์ ์ปดํ์ผ ์ดํ์๋ JVM์ ์ํด ์ง์๋๋ค๋ ๋ด์ฉ์ ๋๋ค.
controller
api ํธ์ถํ ๋ ์ด์ ์ ๋ง๋ @Timer๋ฅผ ์จ์ค๋๋ค.
@RestController
@RequestMapping("/api")
public class RestApiController {
@Timer
@DeleteMapping("/delete")
public void delete() throws InterruptedException {
Thread.sleep(1000L * 2);// db logic 1 sec ๋ผ๊ณ ๊ฐ์
}
}
TimerAop
@Aspect
@Component
public class TimerAop {
@Pointcut("execution(* com.example.aoptest.controller..*.*(..))")
private void cut() {
}
//annotation์๋ง ๋ก๊น
@Pointcut("@annotation(com.example.aoptest.annotation.Timer)")
private void enableTimer() {
}
//๋๊ฐ์ง ์กฐ๊ฑด ๋ค ๋ณธ๋ค๋ ์๋ฏธ
@Around("cut() && enableTimer()")
public void around(ProceedingJoinPoint point) throws Throwable {
StopWatch stopWatch = new StopWatch(); //์คํ ์
stopWatch.start();
Object obj = point.proceed();
stopWatch.stop();
System.out.println("total time : " + stopWatch.getTotalTimeSeconds());
}
}
@Aspect๋ฅผ ์ฌ์ฉํ์ฌ AOP ํด๋์ค์์ ์ ์ํด์ค๋๋ค.
@Component๋ฅผ ์ฌ์ฉํ์ฌ bean๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌ ๊ถํ์ Spring์๊ฒ ์์ํด์ค๋๋ค.
ํฌ์ธํธ์ปท ํํ์์ ์ฌ์ฉ๋ฐฉ์์ ์ ์ํฉ๋๋ค.
ํด๋น ๋ฉ์๋์์ ์คํ์์น๊ฐ ์คํ๋๊ณ @Timer๋ฅผ ์ฌ์ฉํ controller์ ๋๋ ํฐ๋ฆฌ์ ๋ฉ์๋ ์คํ๋๊ณ ๋๋ง์น ๊ธฐ๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ ๋ฉ์๋ ์ ๋๋ค.
ProceedingJoinPoint : JoinPoint์ ํ์ฅ ๋ฉ์๋์ด๋ฉฐ proceed()๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. Joinpoint์ ์ญํ ์ Advice๊ฐ ์ ์ฉ๋ ์์น, ๋ผ์ด๋ค ์ ์๋ ์ง์ . ๋ฉ์๋ ์ง์ ์ง์ , ์์ฑ์ ํธ์ถ ์์ , ํ๋์์ ๊ฐ์ ๊บผ๋ด์ฌ ๋ ๋ฑ ๋ค์ํ ์์ ์ ์ ์ฉ๊ฐ๋ฅํฉ๋๋ค.
์คํ๊ฒฐ๊ณผ
total time : 2.005126042
Thread.sleep(2000L)๋ฅผ ์ฌ์ฉํ์์ผ๋ ๋๋จธ์ง๊ฐ ์ง์ง ์คํ์๊ฐ์ด ๋ฉ๋๋ค.