프밍일기

AOP - XML 본문

Spring

AOP - XML

스에조theLED 2017. 3. 24. 00:43

AOP(Aspect Oriented Programming)는 비즈니스 로직에서 반복되는 공통기능을 분리하기 위한 방법이다. 일반적으로 하나의 비즈니스 로직에는 핵심 비즈니스 로직 외에 로깅, 예외처리, 트랜젝션 처리와 같은 부가적이지만 없어서는 안될 코드들을 포함하게 되며 많은 경우에 이런 코드들이 실제 비즈니로 로직보다 더 많은 양을 차지하고 있다.


businessMethod() {


Logging...


실제 비즈니스 로직


Exception Handle...


Transaction Handle...


Logging...


}


AOP는 이런 공통 부가기능들을 관심 분리하여 별도로 구현할 수 있도록 하여 개발자가 비즈니스 로직 구현에만 전념할 수 있도록 해준다.



■ 용어정의


# Joinpoint

클라이언트가 호출 가능한 모든 비즈니스 메소드.


# Pointcut

Joinpoint중 특정 공통기능 처리 목적으로 필터링된 대상들.


# Advice

Pointcut 대상들에 대해 실제 실행할 공통 기능들을 정의한 클래스.


# Weaving

Poingcut으로 지정한 메소드가 호출될 때, Advice에 해당하는 공통메소드가 삽입되는 과정. 크게 3가지 방식(컴파일타임, 로딩타임, 런타임)의 Weaving이 있으며 스프링에서는 런타임만 지원.


# Aspect or Advisor

Pointcut 과 Advice 의 결합. 이 두가지를 결합하여 공통기능들을 분리해내고 별도로 정의하여 실행시킬 수 있다.



■ XML을 이용한 AOP 설정

	<!-- 공통기능을 구현하는 Advice Class. id속성으로 aspect 엘리먼트와 연결 -->
	<bean id="log" class="com.fannell.site.polymorphism.LogAdvice"></bean>
	
	<!-- AOP Root -->
	<aop:config>

		<!-- Pointcut 선언. Advice가 실행될 대상을 필터링. id속성으로 Advice 실행시점 정의 엘리먼트(여기서는 <aop:before>) 와 연결 -->
		<aop:pointcut expression="execution(* com.fannell.site.polymorphism..*Impl.*(..))" id="allPointcut"/>

		<!-- Aspect 선언. Pointcut 과 Advice 를 결합. ref속성으로 Advice Bean을 지정 -->
		<aop:aspect ref="log">

			<!-- Advice를 기준으로 실행시점 과 실행메소드 설정. pointcut-ref속성으로 Pointcut을 지정. method속성으로 실행할 Advice의 메소드를 지정 -->
			<aop:before pointcut-ref="allPointcut" method="printLog"/>
		</aop:aspect>
	</aop:config>

# AOP XML 설정의 루트 엘리먼트는 <aop:config> 이며 하위에는 <aop:pointcut>과 <aop:aspect>가 올수 있다.

# Pointcut을 정의하기 위하여 <aop:pointcut> 엘리먼트를 사용한다.

# Pointcut 과 Advice를 결합하기 위해 <aop:aspect> 엘리먼트를 사용한다. 필터링된 Advice를 기준으로 언제 실행될지를 정의하는 엘리먼드들을 가진다.

- <aop:before> : Advice 실행전에 동작

- <aop:after-returning> : Advice 실행후 정상적으로 리턴되었을때 동작

- <aop:after-throwing> : Advice 실행중 예외 발생했을때 동작

- <aop:after> : finally 구문처럼 정상/예외 모두에서 동작

- <aop:around> : Advice 실행 전후 모두에서 동작




'Spring' 카테고리의 다른 글

Spring과 MyBatis 연동 예제  (2) 2017.04.07
AOP - Annotation  (0) 2017.03.24
스프링 컨테이너 <beans> 설정 유의사항  (0) 2017.03.03
DI(Dependency Injection, 의존성주입)  (0) 2017.01.28
IoC(Inversion of Control, 제어역전)  (0) 2017.01.28
Comments