Aspect Orient Programming 사전적의미는 관점 지향 프로그래밍이다. AoP Aspect는 관점이라는 해석보다는 기능, 관심정도로 해석하는게 더 알맞다. 기능, 관심 지향 프로그래밍은 Cross Cuttiong Concerns 을 해결해주는 기법이라고도 할 수 있다. Cross Cuttiong Concerns은 어플리케이션을 만들다보면 Presentation Layer, Business Layer, Data Access Layer 에서 Loggin / Transaction Management / Security - Cross Cuttiong - 등과 같은 공통으로 고민해야하는 내용을 분리해서 프로그래밍을 만들 수 있게해주는 방식이라고 보면된다.
아래와 같은 코드가 있다고 생각해보자. 이체() 메서드와 계좌확인() 메서드에서 비즈니스 로직을 실행하기 전, 후로 부가적이면서 동일한 코드를 반복하고 있다.
class 계좌이체서비스 {
method 이체() {
a()
비즈니스 로직
b()
}
method 계좌확인() {
a()
비즈니스 로직
b()
}
}
이렇게 흩어져있는 부가적인 코드를 분리를 한 뒤
그럼 부가기능을 어떤식으로 적용할 수 있을까? 그 부분을 AoP를 이용하여 적용할 수 있다.
Proxies에는 두가지 방식이 있다.
스프링 AoP 방식으로는 xml 기반(현재는 잘 안쓴다고 함) 또는 AspectJ 어노테이션을 이용하는 방식이 있다.
AoP를 사용하려면 @EnableAspectJAutoProxy과 빈을 설정해줘야 한다.
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Around("execution(Pointcut)")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("Before method called. {}", joinPoint.getSignature().toString());
Object result = joinPoint.proceed();
logger.info("After method called with result => {}", result);
return result;
}
}
@SpringJUnitConfig
@ActiveProfiles("dev")
public class AopTests {
@Configuration
@ComponentScan(
basePackages = {package}
)
@EnableAspectJAutoProxy
static class Config {
}
}
@Around("execution(Pointcut)")
@Pointcut("execution(matcher)")
public void methodName() {};
@Around("methodName()")
package org.prgrms.kdt.aop;
import org.aspectj.lang.annotation.Pointcut;
public class CommonPointcut {
@Pointcut("execution(* org.prgrms.kdt..*Repository.*(..))")
public void repositoryPublicMethodPointcut() {};
@Pointcut("execution(* org.prgrms.kdt..*Service.*(..))")
public void servicePublicMethodPointcut() {};
@Pointcut("execution(* org.prgrms.kdt..*Repository.save(..))")
public void repositorySaveMethodPointcut() {};
}
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Around("org.prgrms.kdt.aop.CommonPointcut.repositorySaveMethodPointcut()")
public Object log(ProceedingJoinPoint joinPoint) {
...
}
}
leetcode Verify Preorder Serialization of a Binary Tree
08.27.(금) W4D4 SpringBoot Part2 학습 내용 발표 범위
- Embedded DataBase - 효희님
- NamedParameterJdbcTemplate(1) - 동섭님
- NamedParameterJdbcTemplate(2) - 연재님
- NamedParameterJdbcTemplate(3) - 다희님