구리

TIL_210617_AOP 정의, 적용하는 법, 용어, 엘리먼트 본문

SPRING FRAMEWORK

TIL_210617_AOP 정의, 적용하는 법, 용어, 엘리먼트

guriguriguri 2021. 6. 17. 21:24

목차

AOP 정의
AOP 적용하는 법
AOP 용어
AOP 엘리먼트

 

 

 

AOP

예를 들면 포털 사이트가 있다고 할 때, 사용자에게는 글 작성, 검색, 물품 구매 등 여러 가지의 중요한 기능(비즈니스 로직)들이 있다면 관리자의 입장에서는 사용자가 글을 작성할 시 로그인을 하였는지, 물품 구매시 보안처리가 잘 되었는지 확인하는 과정들(부가적인 로직)이 존재할 것입니다.. 이처럼 AOP에서는 메소드마다 공통으로 등장하는 로깅,예외, 트랜잭션 처리 같은 코드들(부가적인 로직)을 횡단 관심, 사용자의 관점에 따라 실제로 수행되는 핵심 비즈니스 로직핵심 관심이라 합니다.

여기서 가장 중요한 핵심이 관심 분리입니다.

 

기존의 OOP 언어에서는 완벽한 관심 분리가 어렵기에 스프링에서는 AOP가 사용됩니다. 

 

AOP 적용하는 법

1. AOP 라이브러리 추가 (pom.xml에 추가)

<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.8</version>
		</dependency>

AOP 설정 추가시 라이브러리 추가된다

 

2. applicationContext.xml에 aop 네임스페이스 추가 후 설정

(JDBC 관련 코드는 생략)

<?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.springbook.biz"></context:component-scan>
	
	<bean id="log" class="com.springbook.biz.common.Log4jAdvice"></bean>
	
	<aop:config>
		<aop:pointcut expression="execution(* com.springbook.biz..*Impl.*(..))" id="allPointcut"/>
		
        <aop:aspect ref="log">
			<aop:before pointcut-ref="allPointcut" method="printLogging" />
		</aop:aspect>
	</aop:config>
 </beans>

해당 코드를 살펴보면 insertBoard() , getBoard() 메소드 실행 직전 Log4jAdvice 클래스의 printLogging() 메소드가 실행되는 것을 볼 수 있습니다.

 

 

AOP 용어

1. 조인포인트 (JoinPoint)

클라이언트가 호출하는 모든 비즈니스 메소드로, 위 코드를 보면 BoardSerivceImpl과 UserSerivceImpl 클래스의 모든 메소드를 조인포인트인 것입니다.

 

1-2. 포인트컷(Pointcut)

필터링된 조인포인트의 의미로 예를 들면 트랜잭션을 처리하는 공통 기능이 있을 때 등록, 수정, 삭제 기능의 비즈니스 메소드에 대해서만 동작하고 검색 기능의 메서드에서는 트랜잭션과 무관하므로 동작할 필요가 없습니다.

이처럼 특정 메소드에만 횡단 관심에 해당하는 공통 기능을 수행시키기 위해서 포인트 컷이 필요합니다.

<aop:pointcut> => id : 포인트컷 식별위한 문자 / expression 속성 : 적용할 메소드에 대한 조건 설정 

 

expression 속성값 설명

예시

<bean id="log" class="com.springbook.biz.common.Log4jAdvice"></bean>
	
	<aop:config>
		<aop:pointcut expression="execution(* com.springbook.biz..*Impl.*(..))" id="allPointcut"/>
		<aop:pointcut expression="execution(* com.springbook.biz..*Impl.get*(..))" id="getPointcut"/>	
			
		<aop:aspect ref="log">
			<aop:after pointcut-ref="getPointcut" method="printLogging" />
		</aop:aspect>
	</aop:config>

getPointcut이라는 포인트 컷 뒤에 printLogging() 메소드를 실행한 코드로 Impl로 끝나는 클래스 (BoardServiceImpl)에서 getBoardList() 메소드 실행 후에만 반응한 것을 볼 수 있습니다.

 

 

1-3. 어드 바이스(Advice)

횡단 관심에 해당하는 공통 기능의 코드를 의미하며, 독립된 클래스의 메소드로 작성되며 어드바이스 관련 메소드가 언제 동작할지 스프링 설정을 통해서 지정할 수 있습니다.

(before, after, after-running, after-throwing, around)

 

1-4. 위빙(Weaving)

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

비즈니스 메소드 수정 없이도 횡단 관심에 해당하는 기능을 추가하거나 삭제할 수 있습니다.

위빙 처리 방식은 컴파일타임 위빙, 로딩타임 위빙, 런타임 위빙이 있지만 스프링에서는 런타임 위빙 방식만 지원합니다.

 

 

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

Aspect는 Advisor와 Pointcut의 결합으로, 어떤 포인트컷 메소드에 대해 어떤 어드바이스 메소드를 실행할 지 결정합니다.

 

용어 정리 

① 시스템을  사용하면서 비즈니스 컴포넌트의 여러 조인트를 호출

② 이때 특정 포인트컷으로 지정된 메소드가 호출되는 순간

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

④ 포인트컷으로 지정한 메소드가 호출될 때, 어드바이스 메소드를 삽입하도록 하는 설정 = Aspect

⑤ Aspect 설정에 따라 위빙 처리

 

 

AOP 엘리먼트

1. <aop:config> 엘리먼트

스프링 설정 파일 내에 여러 번 사용할 수 있으며, 자식 엘리먼트로 <aop:pointcut>, <aop:aspect>가 올 수 있습니다.

 

2. <aop:pointcut> 엘리먼트 

포인트컷을 지정하기 위해 사용하며 <aop:config> , <aop:aspect>의 자식 엘리먼트가 될 수 있지만 <aop:aspect> 하위에 설정되었다면 해당 범위 내에서만 사용 가능합니다.

 

3. <aop:aspect> 엘리먼트

핵심 관심에 해당하는 포인트컷 메소드와 횡단 관심에 해당하는 어드바이스 메소드를 결합하기 위해 사용합니다.

 

4. <aop:adviser>

애스팩트와 같은 기능을 하지만 어드바이저는 드바이스 객체의 아이디를 모르거나 메소드 이름을 확인할 수 없을 때도 사용이 가능합니다. (애스펙트는 불가능)

 

예시

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"></property>
	</bean>
	
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" />
			<tx:method name="*" />
		</tx:attributes>
	</tx:advice>
	
	<aop:config>
		<aop:pointcut expression="execution(* com.springbook.biz..*Impl.*(..))" id="allPointcut"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="allPointcut"/>

스프링 컨테이너는 설정 파일에 등록된 <tx:advice> 엘리먼트를 해석하여 트랜잭션 관리 기능의 어드바이스 객체를 메모리에 생성하게 됩니다. 그런데 아이디는 확인되지만 메소드 이름은 알 수 없기에 <aop:aspect>가 아닌 <aop:advice> 엘리먼트를 사용해야 합니다.

 

<포인트컷 표현식> 

리턴타입

 

패키지타입

클래스타입

메소드타입

매개변수타입