Implementing AOP in Spring
관점 지향 프로그래밍(AOP)은 항상 Spring프레임워크의 기본적인 구성 요소가 되고 있습니다. 이 프로그래밍 모델은 하위 수준 설계로 인해 스프링 개발자들에게 어렵고 복잡하게 사용되어 왔습니다. 아마 이런 이유 때문에 Spirng AOP의 프로그래밍은 상급 개발자들에게만 친숙했습니다.
최근 스프링과 AOP는 많은 진화를 하였습니다. 이 기사에서는 표준적인 AOP를 설명하고 스프링에서는 어떻게 구현하고 있는지 설명합니다.
Functional Programming
함수형 프로그래밍(FP)의 문제는 특정 작업 단위를 수행 기능의 모듈로 분해됩니다. 함수 호출을 통해 각각의 함수는 개별적으로 실행됩니다. 전체의 컨셉은 함수의 응집 모듈에 문제 영역을 분리하는 것입니다.
지금부터 함수 호출의 복잡한 네트워크 구조의 상태를 상상해 보십시오 당신의 스파게티 코드를!
Spaghetti code
Object Oriented Programming
객체지향프로그래밍을(OOP) 통해서 응용프로그램 설계하는 과정은 패러다임의 변화를 가져 옵니다. 다른 작업들은 각각의 함수로 모델링 되지 않고 개별의 오브젝트로 모델링이 됩니다. 이는 문제공간의 또 다른 엔티티 를 반영하고 있습니다.
복잡한 코드를 설계한 결과는 매우 깨끗한 관심의 분리를 얻었습니다. 그러나 아직.
커플의 문제는 여전히 남아있습니다.
모든 작업이 개체로 분류 되거나 개체가 비즈니스 규약을 준수하지 않고 구현될 수 있는 문제가 발생합니다.
메시지를 로깅하는 객체를 일부/전체에서 사용되는 일반적인 절차가 있다고 가정하고. 이것을 구현해보면 각 객체의 멤버 함수로 logMessage를 하나 하나 정의 하여 로그 메시지를 기록하거나 새로운 로거 클래스를 만들어 멤버 정적/비정적 함수를 사용할 수 있다. 그리고 프로그래머가 사용하기 위해 어느 한 쪽을 상속하거나 로거 객체를 만들거나 정정 멤버 함수를 호출하여 사용하거나 스프링을 통해 의존성 주입의 기능을 사용하는 것입니다.
어쨌든 이 케이스는 아주 좋은 생각은 아닙니다. 위의 경우, 범위에서 가장 많이 사용되는 객체가 실제로 가장 중요합니다. Logger객체는 비즈니스 관심에 아무것도 추가되지 않습니다. 그것은 아직 객체의 상호 작용으로부터 최대한의 주의를 가져옵니다. OOP만으로도 만족하지만 모듈의 다른 수준을 횡단 관심사로 순수 분리하는 문제를 해결하기 위한 것이 요구되고 있습니다.
Aspect Oriented Programming
AOP는 완전히 새로운 수준으로 OOP 패러다임 모듈을 활용 합니다. 그것은 관점이라고 불리는 모듈화의 새 유닛 을 도입함으로써, 수평적 관심사의 분리를 제공합니다. 관점은 특정 횡단적 기능에 초점을 맞추어 횡단적 관심사를 응용프로그램 코어비즈니스 클래스에 부하를 주지 않습니다. 이것은 weaving이라 불리는 프로세스를 통해 핵심 클래스와 횡단 적인 측면을 조합함으로 써 최종적인 시스템을 구성하는 weaver를 사용하여 수행됩니다. AOP는 OOP보다 더 나아가 설계, 구현, 유지보수 하기가 쉽습니다.
AOP in Spring Framework
Spring 의 핵심영역은 의존성 주입, 엔터프라이즈 서비스의 주상화와 관점지향 프로그래밍입니다. 의존성 주입은 서로 다른 구성 요소를 선언적 방식으로 완전히 작동하는 응용 프로그램에 연결될 수 있으며, 엔터프라이즈 서비스 추상화는 휘발성 인프라 코드에서 안정적인 응용 프로그램 논리를 분리하고 AOP는 비즈니스 문제에서 크로스 커팅 문제의 구현을 분리 할 수 있습니다. 이 트리오는 Spring에 강력한 솔루션을 제공하기 위해 통합 할 수 있습니다.
AOP implementation in Spring
Software Dependencies:
For Aspectj programming
- Aspectj: AspectJ 컴파일러는 자바 플랫폼의 모든 프로그램을 생성하지만, 컴파일러 자체는 Java2을(1.4이후) 필요합니다.
- Cglib: 런타임에 Java클래스 및 구현 인터페이스를 확장하는데 사용하는 코드 생성 라이브러리
- Aopalliance : Guice 와 Spring 같은 다중 프레임 워크에서 사용되는 인터페이스 집합입니다.,
- asm: 모든 유형의 자바 바이트 코드 및 바이너리 형태로 기존 클래스를 수정하거나 생성하는데 사용되는 분석 프레임 워크입니다.
- For Spring framework
· Spring: 오픈 소스 어플리케이션 프레임워크 와 IOC 자바 플랫폼
· Common-logging: 로깅 정보 라이브러리
Configuring Your Project for AOP
Java SE와 Eclipse를 설치 합니다 아래 JAR 파일을 이클립스에서 포함 시킵니다.
Create aspectj user library and import the following jars
1. aopalliance-x.x.x.jar
2. cglib-nodep-x.x.x.jar
3. aspectjrt.jar, aspectjweaver.jar (you may have to unzip aspectj-x.x.x.jar to get these two files)
4. asm-x.x.jar
Create Spring user library and include the following jars
1. commons-logging-x.x.x.jar
2. All jar files from spring-framework-x.x.x/dist
이클립스에서 한번 사용자 라이브러리를 생성하면 Aspectj 기능을 포함하는 다른 프로젝트에서도 라이브러리를 재사용 할 수 있습니다.
Examples
이 예제는 4개의 클래스가 포함되어 있습니다. 직원 과 부서 모델 클래스, 어플리케이션 메인은 시작 포인트가 되고 LoggingAspect 는 aspect class가 됩니다.
packageorg.simpleaop.model;
publicclass Employee {
private String name;
...
//Getters and Setters
}
packageorg.simpleaop.model;
publicclass Department {
private String location;
...
//Getters and Setters
}
Main 클래스는 스프링 의존성 주입을 보여줍니다.
package org.simpleaop.app;
//...import statements
public class Main {
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring.xml");
Employee emp = context.getBean("employee", Employee.class);
emp.setName("Jerry Mouse");
Department dept = context.getBean("department", Department.class);
dept.setLocation("Disney Land");
System.out.println("Name :"+emp.getName());
System.out.println("Department :"+dept.getLocation());
}
}
설정 파일 spring.xml은 의존성 주입과 AOP 설정을 보여줍니다.
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<aop:aspectj-autoproxy/>
<beanname="employee"class="org.simpleaop.model.Employee"/>
<beanname="department"class="org.simpleaop.model.Department"/>
<beanname="loggingAspect"class="org.simpleaop.aspect.LoggingAspect"/>
</beans>
LogginAspect 클래스는 스프링 AOP를 구현하는 방법을 보여줍니다. 이 클래스는 간단한 POJO에 어노테이션 @Aspect를 사용한 클래스 입니다. 이 클래스에서 많은 advice를 사용할 수 있습니다. (advice는 AOP에서 사용하는 용어 입니다. 함수의 접두사 보다 더 의미하는게 없습니다.) @Before, @After, @Within, @Around, @Pointcut etc.
packageorg.simpleaop.aspect;
//..import statements
@Aspect
public class LoggingAspect {
@Before("execution(public String getName())")
public void beforeAdvice(){
System.out.println("Before advice. Runs before the function called");
}
//...other advices
}
@Before 어노테이션은 public String getName 함수가 실행 되기 전에 실행 됩니다. @Before 어노테이션의 또 다른 예제 입니다.
@Before("execution(public
String org.simpleaop.Employee.getName())")
이것의 차이는 직원 클래스의 getName 함수가 실행 되기 전에 advice 되어 aop가 실행됩니다.
@Before("execution(public * get*())")
get으로 시작하고 인자가 없는 함수 이면서 어떠한 결과를 반환하는 public 접근자의 함수를 호출 합니다.
@Before("execution(public * get*(..))")
get으로 시작하고 인자가 있을 수 도 있고 없을 수 도 있는 함수 이면서 어떠한 결과를 반환하는 public 접근자의 함수를 호출 합니다. .
@Before("execution(public * get*(*))")
get으로 시작하고 인자가 있는 함수 이면서 어떠한 결과를 반환하는 public 접근자의 함수를 호출 합니다. .
For more examples and explanation visit the Spring aspect-oriented programming documentation.
더 많은 예제와 설명은 Spring aspect-oriented programming 문서를 참고하시면 됩니다.
AOP Usage
AOP는 매우 유용하게 사용할 수 있는 몇가지 경우가 있는데, 가장 일반적으로 로깅 및 프로파일링을 사용 할 수 있습니다.
AOP는 요청 처리를 하는 메소드에 @Around advice를 사용하여 트랜잭션 실패 즉시 롤백을 할 수 있어 매우 유용하게 트랜잭션을 관리 할 수 있습니다.
비즈니스 메소드에서 예외가 발생 했을 때, 예외를 반환할 수 있습니다. @After throwing advice 를 사용해 예외 상황을 핸들러 할 수 있습니다. 예를 들면 하나는 데이터 액세스 계층의 SQLException을 래핑하고 모든 DAO 메서드에서 이것을 처리하지 않고 서비스 계층에서 핸들러 하고 싶을 때 유용하게 사용할 수 있습니다.
Aaop는 수많은 용도로 사용하고 있습니다. 위 내용은 그냥 겉보기에 지나지 않습니다.
Conclusion
Spring은 엔터프라이즈 어플케이션을 위한 인기 있는 경량 프레임 워크 입니다. 인터셉터와 프록시 디자인 패턴에 기반한 AOP 시스템은 엔터프라이즈 어플리케이션의 요구 사항을 보충하기 위해 프레임 워크에 포함되어 있습니다. Spring 2.0 이전에 Spring AOP는 더 복잡하였습니다. AspectJ를 기반으로하는 새로운 프로그래밍 모델은 더 나은 프로그래밍 환경을 제공하고 더 나은 코드를 작성하고 어려움 없이 사용자 정의 관점 지향 프로그래밍을 할 수 있게 되었습니다.