쓸만한 JSP 홈페이지 만들기

Spring 설정xml - aop-context.xml

엉으니 2019. 4. 25. 14:34

스프링의 aop를 이용하여 메소드 로거를 설정할 것이다.

로거는 모든 함수의 시작 전후에 실행되도록 한다.

이렇게 모든 함수에 대해 하나의 기능을 구현하는데는 Aop가 적합하다.

Aop는 스프링의 기반기능에 해당하는데, DI의 특성인 낮은 결합도를 위한것이라면

Aop는 비교적 높은 응집도를 위해 제공된다.

AOP 관련 용어 정의

...더보기

** AOP (Aspect Oriented Programming)

- 어플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스팩트라는 독특한 모듈로 만들어서 설계하고 개발하는 방법.

 

1. 타겟 (Target)

- 부가기능을 부여할 대상

 

2. 애스펙트 (Aspect)

- 부가기능 모듈을 애스펙트라 부르며, 핵심기능에 부가되어 의미를 갖는 특별한 모듈

- 애스펙트에는 부가될 기능을 정의한 어드바이스, 어디에 적용할지를 결정하는 포인트컷을 함께 갖고있다.

 

3. 어드바이스 (Advice)

- 실질적으로 부가기능을 담은 구현체

- 어드바이스의 경우 타겟 오브젝트에 종속되지 않기때문에 순수하게 부가기능에만 집중할 수 있는 장점이 있다.

- 어드바이스는 애스펙트가 '무엇'을 '언제'할지를 정의한다.

 

4. 포인트컷 (PointCut)

- 부가기능이 적용될 대상(메소드)를 선정하는 방법

- 어드바이스를 적용할 조인포인트를 선별하는 기능을 정의한다.

 

5. 조인포인트(JoinPoint)

-  어드바이스가 적용될 수 있는 위치

- Spring에서는 메소드 단위로만 조인포인트를 제공한다.

 

6. 프록시 (Proxy)

- 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑(Wrapping)오브젝트이다.

- 타겟 메소드 실행전에 선처리, 타겟 메소드 실행후 후처리를 실행시키도록 구성되어있음.

 

7. 인트로덕션 (Introduction)

- 타겟 클래스에 코드 변경없이 신규 메소드나 멤버변수를 추가하는 기능

 

8. 위빙 (Weaving)

- 지정된 객체에 애스팩트를 적용해서 새로운 프록시 객체를 생성하는 과정

- Spring AOP는 런타임에서 프록시 객체가 생성된다.

1. aop설정파일 만들기

aoplogger.xml을 통해 aop를 설정할 것이다.

스프링 설정파일은 필수로 xml파일 상단에 xmlns을 넣어줘야하는것을 잊지말자.

 

2. 메소드 로거를 찍기 위한 클래스 정의

aop로는 가장 적용하기 쉬운 메소드 로거를 설정 할 것인데,

설정파일 먼저 만들고 클래스 몸체를 만들것이다.

<bean id="methodLogAspect" class="com.youngeunweb.www.common.aoplogger.MethodLogAop" />

 

3. aop:config설정 추가

<aop:config>
	<aop:pointcut id="methodLogAspectPointcut" expression="execution(* com.youngeunweb.www..*Controller.*(..))"  />
	<aop:aspect id="methodLogAspectAdvisor" ref="methodLogAspect">
		<aop:around method="logging" pointcut-ref="methodLogAspectPointcut"/>
		<aop:before method="beforeMethod" pointcut-ref="methodLogAspectPointcut"/>
		<aop:after-returning method="afterMethod" returning="result" pointcut-ref="methodLogAspectPointcut"/>
		<aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref="methodLogAspectPointcut"/>
	</aop:aspect>
</aop:config>

포인트컷과 애스펙트를 정의한다.

포인트컷은 특정 패키지안에 있는 모든 컨트롤러 (컨트롤러 만들때는 일괄적으로 저 형식으로 만들것임)를 걸었다.

애스펙트는 참조로 methodLogAspect를 주입한다.

특히, 애스펙트는 다음과 같은 표현식이 존재한다. 참고

...더보기

- before (이전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능 수행

- after (이후) : 타겟 메소드의 결과에 관계없이 타겟 메소드가 완료되면 수행

- afterReturning (정상적 반환 이후) : 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능 수행

- afterThrowing (예외 발생 이후) : 타겟 메소드가 수행 중 예외를 던지면 수행

- around (메소드 실행 전후) : 어드바이스가 타겟 메소드를 감싸서 타겟메소드 호출전과 후에 어드바이스 수행

 

4. 프록시 설정

스프링AOP는 기본적으로 다이내믹 프록시 기법으로 동작한다.

다이내믹 프록시를 적용하려면 인터페이스가 있어야 한다.

하지만 특별한 경우 인터페이스를 구현하지 않고 클래스에 트랜잭션을 적용할 수 있다.

<aop:config proxy-target-class="true">
 	<aop:pointcut id="methodDaoLogAspectPointcut" expression="execution(* com.youngeunweb.www..*DAO.*(..))"  />
	<aop:aspect id="methodDaoLogAspectAdvisor" ref="methodLogAspect">
		<aop:around method="logging" pointcut-ref="methodDaoLogAspectPointcut"/>
	</aop:aspect>
</aop:config>	

이와같이 proxy-target-class를 true로 바꿔주면 되고

포인트컷의 선정대상을 클래스로 지정해주면 된다.

DAO logger같은 경우는 따로 인터페이스를 만들지 않고 프록시를 적용해 만들것이다.

 

aop-context.xml끝

 

참고 : 

https://jojoldu.tistory.com/71

https://springsource.tistory.com/134

반응형