AOP어플리케이션 작성 (XML)이란?


Advice 클래스 작성에 대하여 이해

AOP 설정 및 테스트

PointCut 문법



SpringAOP의 구현방식

xml방식

@Aspect(어노테이션)방식


xml구현방식 절차

- Advice(부가기능)클래스 작성한다.

- xml파일에 <aop:config>를 이용해서 애스펙트를 설정한다.

(aspect애스펙트란? 어드바이스+포인트컷)


Advice의 종류

- Around어드바이스

타겟(핵심로직)메서드가 호출되기 이전(before) 시점과 이후(after) 시점에

모두 처리해야할 필요가 있는 부가기능을 정의한다.

Joinpoint 앞과 뒤에서 실행되는 Advice 이다.

- Before어드바이스

타겟(핵심로직)메서드가 호출되기 이전(before) 시점에 처리해야 할 

필요가 있는 부가기능을 정의한다.

Joinpoint 앞에서 실행되는 Advice 이다.

- After어드바이스

타겟(핵심로직)메서드가 정상적으로 실행된 이후(After)시점에 처리해야 할 

필요가 있는 부가기능을 정의한다.

Joinpoint 메서드호출이 정상적으로 종료된뒤 실행되는Advice 이다.

- AfterThrowing어드바이스

타겟(핵심로직)메서드가 예외를 발생된 이후(after)시점에 처리해야할 필요가 있는 부가기능을 정의한다.

예외가 던져질 때 실행되는 Advice 이다.


Advice클래스의 정보

클래스명 : PerformanceTraceAdvice.java

클래스 기능 : 이 어드바이스는 타겟 객체의 메서드 실행시간을 계산해서 출력해주는 부가기능을 제공한다.

advice유형 : Around 어드바이스

(타겟 객체의 메서드 실행 전, 후의 시간을 측정하여 계산하면 타겟객체의 메서드 실행시간을 알 수 있다.)

구현 메서드명:trace(ProceedingJoinPoint joinPoint)


JoinPoint인터페이스

- JoinPoint는 SpringAOP혹은 AspectJ에서 AOP가 적용되는 지점을 뜻한다.

- 해당지점을 AspectJ에서 JoinPoin라는 인터페이스로 나타낸다.

- JoinPoint에서 제공하는 메소드

 getArgs

 메소드 아큐먼트를 반환(오브젝트배열)

 getThis

 프록시 객체를 반환

 getTarget

 대상 객체를 반환(오브젝트형태)

 getSignature

 어드바이즈되는 메서드의 설명을 반환(메소드명,리턴타입)

 toString

 어드바이즈되는 메서드의 설명을 출력


- 모든 어드바이스는 org.aspectj.lang.JoinPoint 타입의 파라미터를 어드바이스 메서드에 첫 번째 매개변수로 선언해야한다.

- Around 어드바이스는 JoinPoint의 하위 클래스인 ProceedingJoinPorint를 필수적으로 선언해야한다.



JoinPoint(인터페이스)before,after사용한다.

    ↑

proccedingJoinPoint(상속받은 인터페이스) around사용한다.


proccedingJoinPoint 인터페이스란?

- around 조인포인트에서 사용한다.

- 계속해서 진행하다를 뜻이다.

- 타겟객체 앞뒤에서 모두사용할떄 사용한다.

- procced메서드 : 요청을 가로채 실행하고 타겟을 실행시킨다.

(아규먼트가 있는 메서드와 없는메서드가있음)



PerformanceTraceAdvice.class



bean설정방법

AOP설정




Advice를 정의하는 태그

<aop:before>

- 메서드 실행 전에 적요오디는 어드바이스를 정의한다.

<aop:after-returning>

- 메서드가 정상적으로 실행된 후에 적요오디는 어드바이스를 정의한다.

<aop:after-throwing>

- 메서드가 예외를 발생시킬 때 적용되는 어드바이스를 정의한다.

<aop:after>

- 메서드가 정상적으로 실행되는지 또는 예외를 발생시키는지 여부에 상관없이 어드바이스를 정의한다.

try-catch-finally에서 finally블록과 비슷하다.

<aop:aroung>

- 메서드 호출 이전, 이후, 예외발생 등 모든 시점에 적용가능한 어드바이스를 정의한다.



PointCut표현식



예제

execution([접근제한제 패턴] 타입패턴 [타입패턴.]이름패턴 (타입패턴|"..",...)


execution(* hello(..))

- hello라는 이름을 가진 메서드를 선정하는 것이다.

파라미터는 모든종류를 다허용한다.

execution(* hello())

- 위와동일하나 파라미터가없는것이다.


execution(* myspring.user.service.UserServiceImpl.*(..))

- myspring.user.service.UserServiceImpl 클래스를 직접 지정하여 

이 클래스가 가진 모든 메서드를 선택한다.


execution(* myspring.user.service.*.*(..))

- myspring.user.service 패키지의 모든 클래스에 적용한다.

하지만 서브패키지의 클래스는 포함되지 않는다.


execution(* myspring.user.service..*.*(..))

- myspring.user.service 패키지의 모든 클래스에 적용된다.

그리고 '..'를 사용해서 서브패키지의 모든 클래스까지 포함한다.


execution(* *..Target.*(..))

- 패키지에 상관없이 Target이라는 이름의 모든 클래스에 적용한다.

다른 패키지에 같은 이름의 클래스가 있어도 적용이 된다는 점에 유의해야한다.

'개발 소발 > 개발 Spring' 카테고리의 다른 글

MyBatis란?  (0) 2017.11.27
AOP어플리케이션 작성 (annotation)이란?  (0) 2017.11.27
AOP란?  (0) 2017.11.24
jdbc환경설정(mysql)이란?  (0) 2017.11.21
데이터엑세스개념(jdbc,springjdbc)이란?  (0) 2017.11.21

Bean등록 및 메타정보구성이란?


Bean등록 메타정보 구성전략


1. XML 단독 사용

- 모든 Bean을 명시적으로 XML에 등록하는 방법이다.

- XML장점:생성된 Bean을 XML에서 확인할 수 있는 장점이 있다.

- XML단점:Bean개수가 많아지면 XML관리가 번거로워진다.

- 여러개발자가 같은 설정파일을 공유해서 개발할시 설정파일을 동시에 수정하면 충돌문제가생긴다.

- DI에필요함 Setter,constructor가 코드내에 반드시 존재해야한다.

- 개발중 보다는 운영중에 적합하다.





2. XML과 빈 스캐닝((Bean Scanning)의 혼용

-Bean에 해당되는 클래스에 어노테이션을 부여해준다.

-어노테이션 붙은 클래스를 자동으로 찾아 빈스캐닝을 해준다.(자동스캔)

-어노테이션을 부여하고 자동 스캔하면 XML문서자 많이 줄어든다.

-단점:Bean설정 정보를 한번에 파악하기 어려움이 있다. (의존관계파악어려움)


적합한 환경

- XML 단독 사용 : 운영환경적합하다.(한눈에 확인가능)

- XML과 빈 스캐닝((Bean Scanning) : 개발환경에적합하다.(XML을 공유하는 상황이 줄어듬)




Bean등록 및 의존관계 설정(annotation)

-@Component

-일반적인 스테레오타입이다.

-<bean>태그와 동일한 역할을 한다.

-@Repository

-영속성을 가지는 속성(파일,DB)을 가진 클래스이다.

-@Service

-비지니스로직을 가지는 클래스를 말한다.

-@Controller

-프리젠테이션레이어에서 사용한다.(웹어플리케이션에서 웹요청과 응답처리) 화면과 연결


Bean의존관계를 주입 Annotation

-@autowired

- 정밀한 의존관계 주입(DI)이 필요한 경우에 사용한다.

- 프로퍼티,setter메서드,생성자,일반메서드에 적용된다.

- 의존 하는 객체를 주입할떄 주로 Type을 이용하게된다.

- XML에서 <property> ,<constructot-arg>태그와 동일한 역할이다.


-@Resource

-기능면에선 autowired와 동일하다.

-프로퍼티,setter에서 제한적 사용된다.

-해당되는 객체를 가져올때 주로 Name으로 이용하게된다.


-@Value

-단순한값줄때 사용한다.

-@Qualifier

-@Autowired와 같이 사용한다.

-@Autowired는 타입으로 찾아 주입하는데, 동일한타입의 Bean객체가 여러개 존재할 때 특정 Bean을 찾기위해 사용한다. 


Component Scan을 지원하는 태그

<context:component-scan>태그

- @Component를 통해 자동으로 Bean을 등록한다.

- @Autowired로 의존관계를 주입받는 어노테이션을 클래스에서 선언하여 사용했을 경우,

해당 클래스가 위치한 특정 패키지를 Scan하기위한 설정을XML에 해준다

- 즉 위에있는 어노테이션을 읽어줄수있게 패키지명을 XML에 등록한다.

ex><context:component-scan base-package="myspring.di.annot" />

<context:include-filter>태그 & <context:exclude-filter>태그

-자동 스캔될시 포함시킬클래스, 포함시키지않을 클래스 구체적으로 명시한다.



SpringPrinter클래스



Hello클래스



value.properties파일



annot.xml






+ Recent posts