Aspext Oriented Programming
AOP 목적
DI 어플리케이션 객체간의 결합도를 낮추고
AOP는 횡단 관심사와 이에 영향받는 객체간의 결합도를 낮춘다.
AOP 장점
관심사들이 하나의 장소로 응집된다
코드들의 가독성이 좋아진다.
AOP 적용
-중복없이 관심모듈을 독립적인 모듈로 작성한다.
프록시 패턴
- 어떤 객체 사용하고자 할때, 해당 객체를 직ㅈ버저긍로 참조하는것이 아니라 , 대행하는 객체를 통해 접근하는 방식
AOP: 프록시 패턴 방식
applicationContext.xml ----------------
xml 설정 방식----------
aspect 클래스 bean 등록
<bean id="memberAspect" class="org.tukorea.aop.MemberAspect">
</bean>
<aop:config>
<aop:aspect id="testAspect" ref="memberAspect">
<aop:pointcut id="readMethod" expression="execution(* read(String))"/>
<aop:before pointcut-ref="readMethod" method="beforeMethod" />
<aop:after pointcut-ref="readMethod" method="afterMethod"/>
<aop:after-returning pointcut-ref="readMethod" method="afterReturningMethod" returning="member"/>
<aop:around pointcut-ref="readMethod" method="aroundMethod"/>
<aop:after-throwing pointcut-ref="readMethod" method="afterThrowingMethod" throwing="ex"/>
</aop:aspect>
</aop:config>
public class MemberAspect {
public void beforeMethod(JointPonit jp){
System.out.println("메소드 호출전");
}
}
ex) <aop: pointcut id = readMethod " expression = "execution(*read(String))"/>
Execution ( 메서드 수식자(public, private), 패키지. 클래스.메서드 명(인수..) throws)
Execution ( org.tukorea.di.persistence..read(..))
Execution (* read(..))
패키지, 클래스 명은 생략 가능
throws 생략 가능
'*'와일드 카드 사용가능
해당 패키지 및 하위 패키지를 포함하여 일치시키려면 '.. '을 이용
예시 1)
execution(* org.tukorea.di.persistence.MemberDAOImpl.write(..))
리턴 타입과 파라미터 상관없이, 해당 클래스에 메소드 명을 포인트컷으로 선정
예시 2)
execution(* write(int, int))
리턴타입 과 파라미터 상관없이, 모든 패키지, 클래스내, 메소드 이름이 write이며, 두개의 int 타입의 파라미터를 가진 모든 메소드를 선정하는 포인트컷
예시 3)
execution( ** (..))
리턴 타입과 파라미터의 종류, 개수에 상관없이 모든 패키지, 클래스 내의 모든 메서드를 선정하는 포인트컿ㅅ
특정 타입에 속하는 메소드를 포인트커스으로 설정할때 사용
execution()의 여러 조건중에서, 타입 패턴만 적용하기 때문에 더 간단
예시 1)
within(org.tukorea.aop..*)
org.tukorea.aop 및 모든 서브패키지가 포함하고있는 모든 메서드
예시 2)
within(org.tukorea.aop.*)
org.tukorea.aop 패키지의 인터페이스와 클래스에 있는 모든 메서드
예시 3)
within(org.tukorea.aop.xml)
org.tukorea.aop 패키지의 xml 클래스의 모든 메서드
----------applicationContext.xml
--------Annotaion 설정방식
///Annttaion Component Scan으로 DI 주입
<context:component-scan base-package="org.tukorea.aop"></context:component-scan>
////@Aspect annotation이 적용된 객체를 Aspect로 사용
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
Aspect.java
------Aspect.java
public void beforeMethod(JoinPoint jp)
-----Aspect.java
@Aspect
@Component
@Before("execution(* read(String))")
Annotaion은 따로 pointcut을 aop:config로 지정해줄필요가 없다.
aspectj-autoproxy로 자동 설정이 가능하다
또한 aop 빈 객체를 componentscan을 활용해서 주입시켜준다.
---------Java-config
@Configuration : application-context 대체
@EnableAspectJAutoProxy : aspectj-autoproxy 태그와 같은 역할