본문 바로가기

[Spring]

[Spring]11월 11일 Spring Aop설정을 어노테이션(annotation)을 이용한 예제

Spring에서 AOP 구현 방법


● AOP 구현

-POJO Class를 이용한 AOP구현

*Spring 설정 파일을 이용한 설정

*어노테이션(Annotation)을 이용한 설정

-스프링 API를 이용한 AOP구현


요번엔 어노테이션(annotation)을 이용한 설정방법 예제를 보겠다.


http://smjava.tistory.com/68 ← 여기서 다뤘던 예제를 활용해서 annotation을 이용해 AOP를 구현해보자

위 글에서 Animal 인터페이스, Cat, Dog, MyAspect 클래스만 복사 붙혀놓기 해서 해보자.

(위글에서는 스프링 설정파일을 이용해 AOP를 구현해보았던 예제 이다.) 


위 클래스들을 긁어와서 우선 스프링 설정파일을 만들어 준다.

스프링 설정 파일을 만들고 namespaces 에서 aop, context 채크해주고

다음과 같이 태그달아준다.

<?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:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">

   <context:component-scan base-package="aop6"></context:component-scan>

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>


</beans>


Dog, Cat, MyAspect 클래스 위에 Component 를 박아줌으로써 빈객체에 등록해준다.


Dog

package aop6;


import org.springframework.stereotype.Component;


@Component

public class Dog implements Animal{

public void doSomething(){

System.out.println("꼬리를 흔들며 반긴다");

}

}


Cat

package aop6;


import org.springframework.stereotype.Component;


@Component

public class Cat implements Animal{

public void doSomething(){

System.out.println("들어오던지 말던지 신경안쓴다");

}

}


MyAspect클래스에서는 Component 등록 후 이쪽에 공통관심사항 메소드들이 들어있으니 여기서 Aspect 해주자.

MyAspect 

package aop6;


import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.AfterReturning;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.stereotype.Component;


@Component

@Aspect

public class MyAspect {

@Pointcut("execution (public void aop6.*.doSomething())")

public void pt(){

}

@Before("pt()")

public void before(){

System.out.println("주인을 기다린다");

System.out.println("주인이 집에 들어온다");

}

@After("pt()")

public void after(){

System.out.println("밥을 맛있게 먹는다");

}

@AfterReturning(pointcut="pt()")

public void after_returning(){

System.out.println("밥을 준다");

}

@AfterThrowing(pointcut="pt()")

public void after_throwing(){

System.out.println("밤새 운다");

}

}

Aspect는 pointcut + advice 니까 여기서 pointcut 메소드를 만들어서 위와 같이 등록해주고

advice들에 대해서 pointcut을 지정한 메소드 pt()를 지정해준다.


AfterReturning과 AfterThrowing에서 는 pointcut 이라고 지정해주고 pt() 를달아준 이유는

저둘은 반환할 수 있는 다른것 들이 있을 수 있기때문에.



여기서 Around advice를 사용해보면

around advice는 JoinPoint의 하위클래스인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 첫 파라미터로 선언해야 한다.

MyAspect 클래스에서 수정해주자.

package aop6;


import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.stereotype.Component;


@Component

@Aspect

public class MyAspect {

@Pointcut("execution (public void aop6.*.doSomething())")

public void pt(){

}

@Around("pt()")

public void around(ProceedingJoinPoint pj){

System.out.println("주인을 기다린다");

System.out.println("주인이 집에 들어온다");

try{

pj.proceed();

System.out.println("밥을 준다");

}

catch(Throwable e)

{

System.out.println("밤새 운다");

}

System.out.println("밥을 맛있게 먹는다");

}

}



이제 테스트 해볼 테스트 클래스를 만들어서 돌려보자

스프링 컨테이너 빌드하고~ 빈(bean)객체 받아와서~

package aop6;


import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;


public class Test {


public static void main(String[] args) {

ApplicationContext context 

= new FileSystemXmlApplicationContext("src/aop6/applicationContext.xml");

Animal a = context.getBean("dog", Animal.class);

a.doSomething();

}

}



출처 : 삼성SDS멀티캠퍼스

강사 : 홍승길

Email : iccack70@gmail.com