프레임워크 AOP

robin Han·2023년 6월 8일
0

Spring

목록 보기
12/13

AOP

Aspext Oriented Programming

  • 관심사 : 어플리케이션 구현 기능을 관심사
  • 횡단 관심사 : 여러 모듈에 공통적이고 반복적으로 필요한 처리내용을 횡단 관심사로고 한다.
  • 횡단 관심사 분리 : 횡단 관심사를 한곳으로 모으고 관점 지향 프로그래밍이라고 한다.
    관점 지향 프로그래밍
    **여러 비즈니스 모듈에서 공통적으로 사용되는 기능을 중심으로 설계/개발 하는 기법

AOP 목적

  • DI 어플리케이션 객체간의 결합도를 낮추고

  • AOP는 횡단 관심사와 이에 영향받는 객체간의 결합도를 낮춘다.
    AOP 장점

  • 관심사들이 하나의 장소로 응집된다

  • 코드들의 가독성이 좋아진다.
    AOP 적용
    -중복없이 관심모듈을 독립적인 모듈로 작성한다.

    AOP 주요 용어

    Advice 유형

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>

Advice 코드 실행 흐름

before adivce

  1. 빈객체를 사용하는 코드에서 스프링 생성한 AOP 프록시의 메서드를 호출
  2. AOP 프록시는 <aop: before> 에서 지정한 메서드를 호출
public class MemberAspect {
	public void beforeMethod(JointPonit jp){
    	System.out.println("메소드 호출전");
    }
}
  1. AOP 프록시는 aspect 기능실행 후, 실제 빈 객체의 메서드를 호출

Pointcut : execution() 표현식

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( ** (..))

  • 리턴 타입과 파라미터의 종류, 개수에 상관없이 모든 패키지, 클래스 내의 모든 메서드를 선정하는 포인트컿ㅅ

    Pointcut within() 표현식

  • 특정 타입에 속하는 메소드를 포인트커스으로 설정할때 사용

  • 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 클래스의 모든 메서드

Annotation AOP 설정

----------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>

XML AOP vs Annotation AOP

Aspect.java

XML 설정:

------Aspect.java

public void beforeMethod(JoinPoint jp)

Annotation /Java 설정

-----Aspect.java
@Aspect
@Component
@Before("execution(* read(String))")
Annotaion은 따로 pointcut을 aop:config로 지정해줄필요가 없다.
aspectj-autoproxy로 자동 설정이 가능하다
또한 aop 빈 객체를 componentscan을 활용해서 주입시켜준다.

Java-config

---------Java-config
@Configuration : application-context 대체
@EnableAspectJAutoProxy : aspectj-autoproxy 태그와 같은 역할

0개의 댓글