■ 핵심 관심 사항(core concern)과 공통 관심 사항 (cross-cutting concern)
■ 기존 OOP에서는 공통관심사항을 여러 모듈에서 적용하는데 중복된 코드를 양산과 같은 한계가 존재
- 이를 극복하기 위해 AOP가 등장
- 여러곳에서 공통으로 사용되는 메서드를 Spring이 호출
■ Aspect Oriented Proramming은 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통관심 사항 기준으로
프로그래밍함으로써 공통 모듈을 손쉽게 적용할 수 있게 해준다.
■ 공통적으로 사용하는 클래스의 메소드를 XML에 정의, Spring이 알아서 실행
=>
Login 클래스에 있는 loginCheck 기능을 여러 기능을 담당하는 메소드들이 사용할 때, 만약 새로운 메소드를 써야되는 일이
생긴다면 일일히 찾아서 다 수정해주어야 할 것이다. 이것을 간편하게 하기 위해 XML에 공통적으로 사용하는 메소드들을
정의해주어 Spring이 알아서 실행하도록 하면 일일히 찾아서 수정할 필요가 없을 것이다.
■ POJO 기반 AOP 구현 - 설정파일 작성
- Org.kosta.spring 패키지 : org.kosta,.spring 패키지의 모든메서드 호출시 자동으로 LogAspect의 logging 호출하고픔
- 언제 Spring이 자동으로 메소드를 호출하는가?
- AOP 설정 태그
1) <aop:config> : aop 설정의 root 태그. - weaving들의 묶음
2) <aop:aspect> : Aspect 설정 - 하나의 weaving에 대한 설정
3) <aop:pointcut> : Pointcut 설정
4) Advice 설정태그들
a. <aop:before> : 메소드 실행 전 실행될 Advice 객체의 메소드
b. <aop:after-returning> : 메소드 정상 실행 후 실행될 Advice
c. <aop:after-throwing> : 메소드에서 예외 발생시 실행될 Advice
d. <aop:after> : 메소드 정상 또는 예외 발생 상관없이 실행될 Advice - finally
e. <aop:around> : 모든 시점에서 적용시킬 수 있는 Advice 구현
※ AOP의 용어
ㆍ Advice : LogAspect 클래스. 즉, Spring이 자동으로 호출하는 메소드를 포함하고 있는 객체
ㆍ PointCut : 언제 어떤 클래스의 어떤 메소드를 자동으로 Spring이 호출할 때 어떤 Advice의 메소드를 호출해야 되는가.
ㆍ Aspect : Spring이 Advice의 어떤 메소드를 언제(메소드 실행직전, 메소드 실행직후, Exception 발생시, 메소드 대신) 실행하나
<bean id="writelog" class="c"/> |
■ <aop:aspect>
- 한개의 Aspect(공통 관심기능)을 설정
- ref 속성을 통해 공통기능을 가지고 있는 bean을 연결 한다.
- id는 이 태그의 식별자를 설정
- 자식 태그로 <aop:pointcut> advice 관련 태그가 올 수 있다.
- 어떤 Advice의 어떤 메소드를 호출
- TagetClass.method1()
=> 개발자가 호출한 메소드(Target 메소드)
메소드 실행직전 <aop:before>
메소드 실행직후 <aop:after>
Exception 발생시 <aop:-throwing>
예외와 상관없이 실행 <aop:after>
■ <aop:pointcut>
- Pointcut(공통기능이 적용될 곳)을 지정하는 태그
- <aop:config> 전역적으로 사용
- <aop:aspect> 내부에서 사용
- 속성
1) id : 식별자로 advice 태그에서 사영됨
2) expression : pointcut 지정
ㆍexcution(접근제어자 리턴타입 패키지.클래스.메서드이름(인자타입) )
ㆍexcution(public void org.spring.kosta.TargetClass.methd1(String, String) )
=> org.spring.kosta 패키지 TargetClass의 method1(String, String) 호출시 Advice의 메소드 호출
■ AspectJ 표현식
- AspectJ에서 지원하는 패턴 표현식
- 명시자
1) execution : 실행시킬 메소드 패턴을 직접 입력하는 경우
2) within : 메소드가 아닌 특정 타입에 속하는 메소드들을 설정할 경우
3) bean : 2.5버전에 추가됨. 설정파일에 지정된 빈의 이름(name 속성)을 이용해 pointcut 설정
- 표현
명시자(수식어패턴? 리턴타입패턴 패키지패턴? 클래스이름패턴.메소드이름패턴(파라미터패턴)) - ?는 생략가능
예) excution(public * abc.def..*Service.set*(..))
- 수식어 패턴에는 public, protected 또는 생략한다.
1) * : 1개이상 모든 값을 표현
ㆍ argument에서 쓰인 경우 : 1개 이상의 argument
ㆍ package에 쓰인 경우 : 1개 이상의 하위 package
2) .. : 0개 이상
ㆍ argument에서 쓰인 경우 : 0개 이상의 argument
ㆍ package에 쓰인 경우 : 0개 이상의 하위 package
※ 위 예 설명
적용 하려는 메소드들의 패턴은 public 제한자를 가지며 리턴 타입에는 모든 타입이 다 올 수 있다. 이름은 abc.def
패키지와 그 하위 패키지에 있는 모든 클래스 중 Service로 끝나는 클래스들에서 set으로 시작하는 메소드이며
argument는 0개 이상오며 타입은 상관 없다
'공부방 > JSP' 카테고리의 다른 글
Forward 와 Include (0) | 2013.03.14 |
---|---|
forward( ) vs. sendRedirect( ) (0) | 2013.03.14 |
DB접속 후 일반적인 작업 패턴 (0) | 2013.01.28 |
Oracle DAO (0) | 2013.01.28 |
글 리스트 페이징 만들기 [다음10개] (0) | 2013.01.24 |