지난번 간단하게 개념만 알아 보았습니다.
간단한 실습과 함께 스프링의 기능 중 AOP에 대해 알아 보겠습니다.
AOP는 Aspect Oriented Programming의 약자 입니다. 해석 하자면 관점 지향 프로그래밍이라는 뜻입니다.
그럼 그게 뭔데? 라는 의문이 생깁니다.
AOP란?
위키백과에서는 AOP의 개념을 컴퓨팅에서 관점 지향 프로그래밍(aspect-oriented programming, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.
어렵네요...
좀 더 쉽게 말하자면 어떤 로직의 기능에서 핵심적인 관점의 기능과 부가적인 관점의 기능을 분리하여 그 관점을 기준으로 각각 모듈화 시키겠다는 뜻입니다.
더 쉽게 말하자면 핵심 기능과 보조 기능을 분리 한 후 메서드에 선택적으로 적용한다는 개념 입니다.
*모듈화는 기능적인 분리를 뜻합니다. 상세한 설명은 아래 링크를 참고 하세요.*https://iwuooh.com/entry/%EB%AA%A8%EB%93%88Module%EA%B3%BC-%EB%AA%A8%EB%93%88%ED%99%94Modularization%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EC%9D%98%EC%99%80-%EC%9D%B4%ED%95%B4
모듈(Module)과 모듈화(Modularization)에 대한 정의와 이해
모듈(Module) 모듈이란 프로그램을 구성하는 시스템을 기능 단위로 독립적인 부분으로 분리한 것이다. 단순히 규모가 큰 것을 작게 여러 개로 나눈 조각이 아니라, 하나 이상의 논리적인 기능을
iwuooh.com
AOP를 적용한 쇼핑몰 구조도
AOP기능 실습 코드
코드를 통해 이해 하도록 하겠습니다.
일단 위와 같이 실습할 클래스 파일과 AOP를 설정할 AOPTest.xml 파일을 생성합니다
1. AOPTest.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<!--타킷 클래스 빈을 지정, 로그 기능울 하는 어드바이스 빈을 지정 -->
<bean id="calcTarget" class="com.spring.ex01.Calculator"/>
<bean id="logAdvice" class="com.spring.ex01.LoggingAdvice"/>
<!--스프링 프레임워크에서 제공하는 ProxyFactoryBean을 이용해 타깃과 어드바이스를 엮어줍니다. -->
<bean id="proxyCal" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="calcTarget"/>
<property name="interceptorNames">
<list>
<value>logAdvice</value>
</list>
</property>
</bean>
</beans>
<bean> 태그를 통해서 타깃클래스와 로그인기능을 하는 어드바이스 빈을 지정합니다.
ProxyFactoryBean을 통해서 calcTarget 빈을 지정하고, intertceptorNames 속성에 logAdivice 빈으로 설정하여
타킷 클래스의 메서드 호출 시 logAdvice를 실행 합니다.
2. Calculator.java
package com.spring.ex01;
public class Calculator {
public void add(int x, int y) {
int result = x + y;
System.out.println("결과 :" + result);
}
public void subtract(int x, int y) {
int result = x - y;
System.out.println("결과 :" + result);
}
public void multiply(int x, int y) {
int result = x * y;
System.out.println("결과 :" + result);
}
public void divide(int x, int y) {
int result = x / y;
System.out.println("결과 : " + result);
}
}
3. LoggingAdvice.java
package com.spring.ex01;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class LoggingAdvice implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("[메서드 호출 전 : LogginAdvice");
//메서드 호출 전에 실행하는 구문
System.out.println(invocation.getMethod() + "메서드 호출 전");
//invocation을 이용해 메서드를 호출(타깃)
Object object = invocation.proceed();
//메서드 호출 후 에 수행하는 구문
System.out.println("[메서드 호출 후 : loggingAdvice");
System.out.println(invocation.getMethod() + "메서드 호출 후");
return object;
}
}
먼저 MethodInterceptor 구현합니다.
Object object = invocation.proceed(); 기준으로 메서드 호출 전, 후를 분리하여 로그를 출력합니다.
타깃 메서드 호출 전,후로 나눌 수 있습니다.
4. CalcTest.java
package com.spring.ex01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CalcTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("AOPTest.xml");
Calculator cal = (Calculator)context.getBean("proxyCal");
cal.add(100, 200);
}
}
AOPTest.xml을 읽어 들여 빈을 생성 합니다.
getBean("proxyCal")을 통해 id가 proxyCal인 빈에 접근합니다.
5. CONSOL 결과
cal.add(100, 200) 뿐 만 아니라 Calculator의 모든 메서드에 적용됩니다.
실제 스프링에서는 특정 패키지 이름이나 특정 클래스 이름 또는 특정 메서드 이름에만 AOP를 적용할 수도 있습니다.
지금은 개념에 대해서만 확실히 이해하는게 좋겠습니다. 감사합니다.
'개발 > 스프링' 카테고리의 다른 글
7. 스프링 프레임워크-MVC 실습-2[자바웹을 다루는 기술] (0) | 2022.05.12 |
---|---|
6. 스프링 프레임워크-MVC 실습-1[자바웹을 다루는 기술] (0) | 2022.05.11 |
4. 스프링 프레임워크-DI와 IoC[자바웹을 다루는 스킬] (0) | 2022.05.09 |
3. 스프링 프레임워크 - 스프링MVC[자바웹을 다루는 기술] (0) | 2022.05.08 |
2. 스프링 프레임워크-[자바웹을 다루는 기술] (0) | 2022.05.03 |