능글맞은 구렁이

Spring-AOP(간략한 흐름) 본문

Framework/Spring

Spring-AOP(간략한 흐름)

보라색츄르 2021. 6. 21. 09:41

1. AOP이해하기

 

1.AOP란?

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다.

 

2. AOP 이해하기

AOP를 이해하는 데에 가장 중요한 핵심 개념이 바로 관심 분리(Separation of Concerns)이다.

AOP에서는   1) 메소드마다 공통으로 등장하는 로깅이나 예외, 트랙잭션 처리 같은 코드들을 횡단 관심이라고 하고, 

                  2) 사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직을 핵심 관심이라고 한다.

이 두 관심을 완벽하게 분리할 수 있다면, 우리가 구현하는 메소드에는 실제 비즈니스로직만으로 구성할 수 있으므로 더욱 간결하고 응집도가 높은 코드를 유지할 수 있다.

 

3. AOP설정하기

    1) AOP라이브러리추가

      pom.xml부분에      <dependency>
                                     <groupId>org.aspectj</groupId>
                                     <artifactId>aspectjweaver</artifactId>
                                     <version>1.8.8</version>
                               </dependency>

      을 추가해 준뒤 'Maven Dependencies'라이브러리에 'aspectjrt' 그리고 'aspectjweaver'가 추가되었는지 확인한다.

<!-- AspectJ -->
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjrt</artifactId>
	<version>${org.aspectj-version}</version>
</dependency>	
<!-- Aspect추가부분-->
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.8.8</version>
</dependency>

 

 

 

    2 ) 네임스페이스 추가 및 AOP설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

	<context:component-scan base-package="com.jbr.biz"></context:component-scan>
</beans>

 

 

 


2. AOP용어 정리

 

1. 조인포인트(Joinpoint)

    클라이언트가 호출하는 모든 비즈니스 메소드로서, ~~Impl 클래스의 모든 메소드를 조인포인트라고 생각하면된다. 

    조인포인트를 '포인트컷대상' 또는 '포인트컷 후보'라고도 하는데, 이는 조인포인트 중에서 포인트컷이 선택되기

    때문이다.

     *Joinpoint 메소드*

메소드 설명
Signature getSignature ( ) 클라이언트가 호출한 메소드의 시크니처(리턴타입, 이름, 매개변수) 정보가 저장된
Signature 객체 리턴

    *Signature 메소드*
      -String getName( ) : 클라이언트가 호출한 메소드 이름 리턴
      -String toLongString( ) : 클라이언트가 호출한 메소드의 리턴타입, 이름, 매개변수
                                      패키지 경로까지 포함하여 리턴
      -String toShortString( ) : 클라이언트가 호출한 메소드 시그니처를 축약한
                                       문자열로 리턴 (간단하게 표현한 것)
Object getTarget( ) 클라이언트가 호출한 비즈니스 메소드를 포함하는 비즈니스 객체 리턴
Object[ ] getArgs( ) 클라이언트가 메소드를 호출할 때 넘겨준 인자 목록을 Object 배열로 리턴

 

 

 

2. 포인트컷(Pointcut)

    필터링된 조인포인트를 의미한다. 수많은 비즈니스 메소드 중에서 원하는 특정 메소드에서만 횡단 관심에 해당하는 

    공통 기능을 수행시키기 위해서 포인트컷이 필요하다. 포인트컷을 이용하면 메소드가 포함된 클래스와 패키지는

    물론이고 메소드 시그니처까지 정확하게 지정할 수 있다.

    포인트컷은 <aop:pointcut>엘리먼트로 선언하며, id 속성으로 포인트컷을 식별하기위한 유일한 문자열을 선언한다.

    이 id가 나주에 포인트컷을 참조할 때 사용된다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

	<context:component-scan base-package="com.jbr.biz"></context:component-scan>
    
	<!-- AOP -->
	<bean id="log" class="com.jbr.biz.common.LogAdvice"></bean>
	
	<aop:config>
		<aop:pointcut expression="execution(* com.jbr.biz..*Impl.*(..))" id="allPointcut"/>
		<aop:pointcut expression="execution(* com.jbr.biz..*Impl.get*(..))" id="getPointcut"/>
		<aop:aspect ref="log">
			<aop:before method="printLog" pointcut-ref="getPointcut"/>
		</aop:aspect>
	</aop:config>
</beans>

       ※expression속성※

       이 값을 어떻게설정하느냐에 따라 필터링되는 메소드가 달라진다. 

*(띄어쓰기) com.jbr.biz.. *Impl . *(..)
*(띄어쓰기) com.jbr.biz.. *Impl . get*(..)
↑리턴타입 패키지 경로 클래스명   메소드명 및 매개변수

 

 

3. 어드바이스(Advice)

    어드바이스는 횡단 관심에 해당하는 공통 기능의 코드를 의미하며, 독립된 클래스의 메소드로 작성된다.

    그리고 어드바이스로 구현된 메소드가 언제 동작할지 스프링 설정 파일을 통해서 지정할 수 있다. 

    스프링에서는 어드바이스의 동작 시점을 'before', 'after', 'after-returning','after-throwing', 'around' 등 

    다섯 가지로 지정할 수 있다.

    *트랜잭션을 공부하면서 더 깊게 알아보도록하자*

 

 

 

4. 위빙(Weaving)

    위빙은 포인트컷으로 지정한 핵심 관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 

    과정을 의미한다. 이 위빙을 통해서 비즈니스 메소드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나

    변경할 수 있다. 

    위빙을 처리하는 방식은 크게

    1) 컴파일타임 위빙

    2) 로딩타임 위빙

    3) 런타임 위빙       

    이 있지만 스프링에서는 런타임 위빙 방식만 지원한다.

 

 

 

5. 애스팩트(Aspect) 또는 어드바이저(Advisor)

    AOP의 핵심인 애스팩트는 포인트컷과 어드바이스의 결합으로서, 어떤 포인트컷 메소드에 대해서 어떤 어드바이스

    메소드를 실행할지 결정한다. 이 애스팩트 설정에 따라 AOP의 동작방식이 결정되므로 AOP용어 중 가장 중요하다.

     (어떤 포인트컷 메소드에 대해서 어떤 어드바이스 메소드를 실행할지 결정하는것)

    Aspect를 설정할 때는 <aop:aspect> 엘리먼트를 사용하는데 트랜잭션 설정일때는 <aop:advisor>를 사용한다.

 

 

 

6. AOP용어 종합

      1) 비즈니스 컴포넌트의 여러 조인포인트를 호출

      2) 이때 특정 포인트컷으로 지정한 메소드가 호출

      3) 어드바이스객체의 어드바이스 메소드가 실행

      4) 포인트컷으로 지정한 메소드가 호출될 때, 어드바이스메소드를 삽입하도록 하는 설정을 애스팩트라고 한다.

      5) 애스팩트의 설정에 따라 위빙

 

 

 

 

'Framework > Spring' 카테고리의 다른 글

Spring-AOP(XML 기반)  (0) 2021.06.22
Spring-AOP(advice)  (0) 2021.06.21
Spring-DI/AOP정리!  (0) 2021.06.18
Spring-Annotation(어노테이션)  (0) 2021.06.15
Spring-의존성주입(인젝션)  (0) 2021.06.15
Comments