AOP
AOP는 관점지향프로그래밍으로 Aspect Oriented Programming의 약자이다.
불특정 다수의 객체(클래스 또는 메소드)에 코드를 탈부착하도록 만드는 기능을 지닌다.
공통적으로 사용되는 부분을 별도로 분리하는 기술이다.
- 횡단관심사 (Crosscutting Concerns)
모든 영역에 공통적으로 적용
모든 클래스를 가로로 관통하여 횡단할 수 있는 관심사이며, 특정 클래스 혹은 메소드에 적용 가능하다.
- 조인트포인트 (JointPoint)
AOP에서 애플리케이션이 실행될 특정 지점을 의미한다.
- 어드바이스 (Advice)
지정한 특정 JointPoint에 구현할 코드이다.
- 포인트컷 (PointCut)
여러 JointPoint의 집합체로, 언제 어느 시점에 어디에(메소드) Advice를 실행할 지 표시한다.
- 애스팩트 (Aspect)
Advice와 PointCut을 합하여 횡단관심사에 대한 코드와 이를 적용할 위치를 지정한다.
AOP 예제
어노테이션을 사용하여 AOP 사용법을 확인해보겠다!
TargetA
@Component("targetA")
public class TargetA {
public void doSomething1() {
System.out.println("TargetA.doSomething1");
}
@Component 어노테이션을 통해 객체 생성을 해준다.
콘솔창에 출력할 것이기 때문에 doSomething1메소드를 입력해준다.
MyBeforeAdvice
@Aspect
@Component
public class MyBeforeAdvice {
@Before("execution(public void com..aop.*.*(..))")
public void beforeMethodCall() {
System.out.println("메소드 실행전(BeforeAdvice)...");
}
}
@Aspect를 붙임으로써 해당클래스가 Aspect라는 것으로 지정한다.
execution
execution은 어드바이스를 적용하려는 범위이다.
execution(메소드접근지정자 반환값 패키지.클래스.메소드명(인수)
가 입력 순서이며, '*'를 입력하면 전체 범위인 것이다.
패키지명에 중간에 ..을 입력한 것은 com으로 시작해 aop로 끝나는 모든 패키지를 의미하는 것이다.
인수에 String을 입력 시 타입이 String일 때만 해당되며, '*,*'을 입력하면 타입 상관없이 2개인 것만 해당된다.
Advice 어노테이션
@Before 어노테이션을 통해 메소드가 실행되기 전에 진행되도록 한다.
추가로,
@After는 메소드가 실행된 이후
@AfterReturning 정상적으로 실행되고난 후
@AfterThrowing 에러가 발생한 후
의 Advice이다.
MyAroundAdvice
@Aspect
@Component
public class MyAroundAdvice {
@Around("execution(public void com..aop.*.*(..))")
public Object aroundMethodCall(ProceedingJoinPoint jointPoint) {
Object result = null;
try {
System.out.println("메소드 실행전(AroundAdvice)...");
result = jointPoint.proceed();
System.out.println("메소드 실행후(AroundAdvice)...");
} catch (Throwable e) {
// TODO: handle exception
}
return result;
}
}
@Around는 특정 메소드 전후로 Advice를 실행하는 것이다. before와 after를 모두 합친 꼴이다.
메소드 전후를 구분하기 위해 메소드의 return값을 받아야 한다.
따라서 어떤 타입의 반환값이 올 지 모르니 타입은 Object이다.
ProceedingJoinPoint는 메소드를 실행시켜 준다.
proceed 메소드를 호출하여 result에 넣어준다.
app-context.xml
<beans xmlns:aop="http://www.springframework.org/schema/aop">
<context:component-scan base-package="com.exe.aop" />
<aop:aspectj-autoproxy/>
</beans>
설명할 부분만 가져왔다.
aop를 사용해야 하므로 맨 위에 aop도 입력했으며
마지막 줄은 어노테이션으로 AOP 사용하기 위한 코딩이다. 저 내용을 입력해주면 어노테이션으로 가능해진다.
AopMain
public class AopMain {
public static void main(String[] args) {
GenericXmlApplicationContext context = new GenericXmlApplicationContext("app-context.xml");
TargetA ta = (TargetA)context.getBean("targetA");
ta.doSomething1();
}
}
콘솔창에서 확인할 곳이다.
먼저 xml파일을 연결하기 위한 코딩을 입력해준다.
TargetA에서 입력한 메소드를 가져오면, 어노테이션한 AOP가 콘솔창에 나오게 된다!
3월 28일 수업 🌕
'개발 교육 TIL > back-end' 카테고리의 다른 글
[Spring Boot] 스프링 부트 - 세팅, DB 연결(SqlSessionFactory, mapper) (0) | 2022.03.30 |
---|---|
[Spring] 스프링 마이바티스 MyBatis (0) | 2022.03.29 |
[Spring] 스프링 JDBC - JdbcTemplate, db연결, sql문 (0) | 2022.03.25 |
[Spring] 의존성 주입 방법 (수동) - Dependency Injection (3) | 2022.03.24 |
[Spring] 게시판 입력/수정창 만들기, annotation 어노테이션 (0) | 2022.03.23 |