SpringAopImplement_1_3
์คํ๋ง AOP ๊ตฌํ - V1
@Aspect ์ฌ์ฉ
์คํ๋ง AOP๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ @Aspect๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
@Slf4j
@Aspect
public class AspectV1 {
@Around("execution(* hello.aop.order..*(..))")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("[log] {}", joinPoint.getSignature());
return joinPoint.proceed();
}
}@Around์ด๋ ธํ ์ด์ ์ ๊ฐ์ธexecution(* hello.aop.order..*(..))๊ฐ ํฌ์ธํธ์ปท์ด ๋๋ค.hello.aop.orderํจํค์ง์ ๊ทธ ํ์ํจํค์ง(..)๋ฅผ ์ง์ ํ๋ AspectJ ํํ์์ด๋ค.
@Around์ด๋ ธํ ์ด์ ์ ๋ฉ์๋์ธdoLog๋ ์ด๋๋ฐ์ด์ค(Advice)๊ฐ ๋๋ค.
@Slf4j
@SpringBootTest
@Import(AspectV1.class)//์ถ๊ฐ
public class AopTest {
@Autowired OrderService orderService;
@Autowired OrderRepository orderRepository;
@Test
void aopInfo() {
log.info("isAopProxy, orderService={}", AopUtils.isAopProxy(orderService));//true
log.info("isAopProxy, orderRepository={}", AopUtils.isAopProxy(orderRepository));//true
}
@Test
void success() {
orderService.orderItem("itemA");
}
@Test
void exception() {
assertThatThrownBy(() -> orderService.orderItem("ex"))
.isInstanceOf(IllegalStateException.class);
}
}@Aspect๋ ์ ์คํํธ๋ผ๋ ํ์์ผ ๋ฟ ์ปดํฌ๋ํธ ์ค์บ์ด ๋๋ ๊ฒ์ ์๋๋ค.AspectV1์ ์คํ๋ง AOP๋ก ์ฌ์ฉํ๋ ค๋ฉด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ผ ํ๋ค.์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค.
@Bean์๋ ๋ฑ๋ก@Component์๋ ๋ฑ๋ก@Import์ฃผ๋ก ์ค์ ํ์ผ์ ์ถ๊ฐํ ๋ ์ฌ์ฉ(@Configuration)
@Import๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํ ์๋ ์๋ค.
์ฝ์ ๊ฒฐ๊ณผ
hello.aop.order.aop.AspectV1 : [log] void hello.aop.order.OrderService.orderItem(String)
hello.aop.order.OrderService : [orderService] ์คํ
hello.aop.order.aop.AspectV1 : [log] String hello.aop.order.OrderRepository.save(String)
hello.aop.order.OrderRepository : [orderRepository] ์คํjoinpoint์๊ทธ๋์ฒ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ค.

์คํ๋ง AOP ๊ตฌํ - V2
ํฌ์ธํธ์ปท ๋ถ๋ฆฌ
@Around์ ํฌ์ธํธ์ปท ํํ์์ ์ง์ ๋ฃ์ ์๋ ์์ง๋ง @Pointcut์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด์ ๋ณ๋๋ก ๋ถ๋ฆฌํ ์ ์๋ค.
@Slf4j
@Aspect
public class AspectV2 {
@Pointcut("execution(* hello.aop.order..*(..))")
private void allOrder(){} //ํฌ์ธํธ์ปท ์๊ทธ๋์ฒ
@Around("allOrder()")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("[log] {}", joinPoint.getSignature());
return joinPoint.proceed();
}
}@Pointcut์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.๋ฉ์๋ ์ด๋ฆ๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ํฉ์ณ์ ํฌ์ธํธ์ปท ์๊ทธ๋์ฒ๋ผ ํ๋ค.
๋ฉ์๋์ ๋ฐํ ํ์ ์
void์ฌ์ผ ํ๋ค.์ฝ๋ ๋ด์ฉ์ ๋น์๋์ด์ผ ํ๋ค.
ํฌ์ธํธ์ปท ์๊ทธ๋์ฒ๋
allOrder()๋ค. ์ฃผ๋ฌธ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋์์ผ๋ก ํ๋ ํฌ์ธํธ์ปท ์ด๋ผ๋ ๋ป์ด๋ค.(์ด๋ฆ์ผ๋ก ์๋ฏธ๋ฅผ ๋ถ์ฌํ ์ ์๋ค.)์ ๊ทผ ์ ์ด์๋ ๋ด๋ถ์์๋ง ์ฌ์ฉํ๋ฉด
private์ ์ฌ์ฉํ๊ณpublic์ผ๋ก ์ด์ด๋์ด ๋ค๋ฅธ ์ ์คํํธ์์ ์ฐธ๊ณ ํ๋๋ก ํ ์๋ ์๋ค.
@Slf4j
@SpringBootTest
@Import(AspectV2.class)//๋ณ๊ฒฝ
public class AopTest { ... }AspectV2๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋๋ก ๋ณ๊ฒฝํ๋ค.
์คํ๋ง AOP ๊ตฌํ - V3
์ด๋๋ฐ์ด์ค ์ถ๊ฐ
๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐ๋ก ํธ๋์ญ์ ์ ์ ์ฉํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด๋ณด์.
ํต์ฌ ๋ก์ง ์คํ ์ง์ ์ ํธ๋์ญ์ ์ ์์
ํต์ฌ ๋ก์ง ์คํ
ํต์ฌ ๋ก์ง ์คํ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์ปค๋ฐ
ํต์ฌ ๋ก์ง ์คํ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑ
@Slf4j
@Aspect
public class AspectV3 {
@Pointcut("execution(* hello.aop.order..*(..))")
private void allOrder(){} //ํฌ์ธํธ์ปท ์๊ทธ๋์ฒ
//ํด๋์ค ์ด๋ฆ ํจํด์ด *Service
@Pointcut("execution(* *..*Service.*(..))")
private void allService(){}
@Around("allOrder()")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("[log] {}", joinPoint.getSignature());
return joinPoint.proceed();
}
//hello.aop.order ํจํค์ง์ ํ์ ํจํค์ง ์ด๋ฉด์ ๋์์ ํด๋์ค ์ด๋ฆ ํจํด์ด *Service
@Around("allOrder() && allService()")
public Object doTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
try {
log.info("[ํธ๋์ญ์
์์] {}", joinPoint.getSignature());
Object result = joinPoint.proceed();
log.info("[ํธ๋์ญ์
์ปค๋ฐ] {}", joinPoint.getSignature());
return result;
} catch (Exception e) {
log.info("[ํธ๋์ญ์
๋กค๋ฐฑ] {}", joinPoint.getSignature());
throw e;
} finally {
log.info("[๋ฆฌ์์ค ๋ฆด๋ฆฌ์ฆ] {}", joinPoint.getSignature());
}
}
}allOrder()ํฌ์ธํธ์ปท์hello.aop.orderํจํค์ง์ ๊ทธ ํ์ ํจํค์ง๋ฅผ ๋์์ผ๋ก ํ๋ค.allService()ํฌ์ธํธ์ปท์ ํ์ ์ด๋ฆ ํจํด์ด(*Service)๋ฅผ ๋์์ผ๋ก ํ๋ค.(ํด๋์ค, ์ธํฐํ์ด์ค์ ๋ชจ๋ ์ ์ฉ)@Around("allOrder() && allService()")ํฌ์ธํธ์ปท์ ์กฐํฉํ ์๋ ์๋ค.
&&(AND),||(OR),!(NOT) ๋ชจ๋ ๊ฐ๋ฅํ๋ค.๊ฒฐ๊ณผ์ ์ผ๋ก
doTransaction()์ด๋๋ฐ์ด์ค๋orderService์๋ง ์ ์ฉ๋๋ค.
@Import(AspectV3.class) //๋ณ๊ฒฝ
@SpringBootTest
public class AopTest { ... }## success() ์คํ ๊ฒฐ๊ณผ ์ฝ์
[log] void hello.aop.order.OrderService.orderItem(String)
[ํธ๋์ญ์
์์] void hello.aop.order.OrderService.orderItem(String)
[orderService] ์คํ
[log] String hello.aop.order.OrderRepository.save(String)
[orderRepository] ์คํ
[ํธ๋์ญ์
์ปค๋ฐ] void hello.aop.order.OrderService.orderItem(String)
[๋ฆฌ์์ค ๋ฆด๋ฆฌ์ฆ] void hello.aop.order.OrderService.orderItem(String)
๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ์์๊ฐ
doLog()->doTransaction()์์๋ก ์๋ํ๋ค.์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋๋ ์์๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์คํ ์๊ฐ์ ์ธก์ ํด์ผ ํ๋๋ฐ ํธ๋์ญ์ ๊ณผ ๊ด๋ จ๋ ์๊ฐ์ ์ ์ธํ๊ณ ์ธก์ ํ๊ณ ์ถ๋ค๋ฉด ํธ๋์ญ์ ์ดํ์ ๋ก๊ทธ๋ฅผ ๋จ๊ฒจ์ผ ํ ๊ฒ์ด๋ค.
Last updated