최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.
 


ApsectJ 문법으로 Pointcut 을 만들때 문법...


execution([public|protected|private] [return Type] [className][메소드이름](parameter) 
수식어패턴? 리턴타입패턴 클래스이름패턴?이름패턴(파라미터패턴)

- 수식어패턴 : public protected ... (생략가능)
- 리턴타입패턴 : 리턴타입명시
- 클래스이름패턴 / 이름패턴 : 클래스이름 및 메서드 이름을 패턴으로 명시한다. 
- 파라미터패턴 : 매칭될 파라미터에 대해서 명시한다.

각 패턴은 "*" 로 표현가능하다
'..' 을 이용하여 0개 이상의 의미를 나타낼 ㅅ수 있다.


execution(public void set*(..)) 
: 리턴타입이 void , 메서드이름이 set으로 시작하고 파라미터가 0개 이상인 메소드 호출함

execution(* madvirus.spring.chap05.*.*())
:  madvirus.spring.chap05 패키지의 파라미터가 없는 모든 메소드 호출

execution(* madvirus.spring.chap05..*.*())
: madvirus.spring.chap05 패키지 및 하위패키지에 있는, 파라미터가 0개 이상인 메소드 호출

execution(Integer madvirus.spring.chap05..WriteArticleService.write(..))
: 리턴타입이 Integer인, WriteArticleService 인터페이스의 write() 메소드 호출

execution(* get*(*))
: 이름이 get으로 시작하고 1개의 파라미터를 갖는 메소드 호출

execution(* read*(Integer,..))
: 이름이 read로 시작하고, 첫번째 파라미터 타입이 Integer이며, 1개 이상의 파라미터를 갖는 클래스




within 명시자는 메소드가 아닌 특정 타입에 속하는 메소드를 Pointcut으로 설정할때 사용된다.

within(madvirus.spring.chap05.board.service.WriteArticleService)
:WriteArticleService 인터페이스의 모든 메소드 호출

within(madvirus.spring.chap05.board.service.*)
: madvirus.spring.chap05.board.service 패키지에 있는 모든 메소드 호출


bean 명시자는 스프링빈 이름을 이용하여 Pointcut을 정의한다.
bean(writeArticleService)
: 이름이 writeArticleService 인 빈의 메소드 호출

bean(*ArticleService)
: 이름이 ArticleService로 끝나는 빈의 메소드 호출




 

'IT > 스프링' 카테고리의 다른 글

AspectJ in Spring?  (0) 2012.01.09
weaving??  (0) 2012.01.09
JointPoint ..?  (0) 2012.01.06
Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
흐음... AOP 의 용어인데 그건 집어치우고... (가 아니라 알아보고 와라 )
 아무튼 JointPoint 가 필수인 Advice ( Around ) 나 옵션이 것들에서... 아규먼트의 순서는 반드시 첫번째여야 한다.

JointPoint가 제공하는 메소드는

Signature getSignature() : 호출되는 메소드의 정보
Object getTarget() : 대상 객체를 구함
Object[] getArgs[] : 넘겨받은 파라미터를 구함
proceed() : 대상 객체 실행

Signature 가 제공하는 메소드는
String getName() : 메소드이름
Strong toLongString() : 메소드를 풀네임으로 보여줌 (리턴타입 파라미터 모두)
String toShortString() : 메소드를 줄여서 보여줌

 

'IT > 스프링' 카테고리의 다른 글

weaving??  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06
Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
AOP 몇가지..  (0) 2012.01.05

Before Advice
After Returning Advice
After Throwing Advice
After Advice
Around Advice 

이런것들이 Advice 인것이다. 

이런 advice들이  pointcut-ref 를 이용해서 pointcut을 설정하는것이고....  

그러면 pointcut으로 정해진 메소드들이 실행되려는 순간 적절한 Advice 들이 실행된다. 

'IT > 스프링' 카테고리의 다른 글

Pointcut 표현식... execution , within  (0) 2012.01.06
JointPoint ..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
AOP 몇가지..  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
@Aspect 어노테이션을 이용한 AOP 설정


우선 xml 정의에서 <aop:aspectj-autoproxy /> 를 선언해야 @Aspect 어노테이션이 적용된 빈객체를 Aspect 로 사용하게 된다.





@Aspect
@Order(3)
public class ProfilingAspect {

// 포인트 컷을 정의하고 그 포인트컷에서 호출할 
@Pointcut("execution(public * madvirus.spring.chap05.board..*(..))")
// 아래의 method 는 Pointcut 대상메소드가 호출될때 실행될 공통기능으로 정의된 빈클래스의 어떤 메소드가 호출될지를 정의함  
private void profileTarget() {}

 
// Around Advice를 구현... 
// @Around 어노테이션 값으로 @Pointcut 어노테이션을 적용한(할) 메소드의 이름을 지정함
@Around("profileTarget()")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
String signatureString = joinPoint.getSignature().toShortString();
System.out.println(signatureString + " 시작");
long start = System.currentTimeMillis();
try {
Object result = joinPoint.proceed();
return result;
} finally {
long finish = System.currentTimeMillis();
System.out.println(signatureString + " 종료");
System.out.println(signatureString + " 실행 시간 : " + (finish - start)
+ "ms");
}
}
}


위처럼 포인트컷과 어드바이스를 분리하지 않고 
       @Before("execution(public * madvirus.spring.chap05..*(..))")

또는...

@Before("PublicPointcut.publicMethod()")
public void before() {
System.out.println("[LA] 메서드 실행 전 전처리 수행");

@Before 어노테이션 값으로 포인트컷 표현식이나 포인트컷 어노테이션이 적용된 메소드 이름이 올 수 있다. 


 

'IT > 스프링' 카테고리의 다른 글

JointPoint ..?  (0) 2012.01.06
Advice..?  (0) 2012.01.06
AOP 몇가지..  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
스프링3.0 어노테이션 .. annotation  (0) 2011.12.28


aop 설정을 자주 잊어버리는데 잊지 않기 위한...


1. 우선 aspect 를 정의 한다. 그리고 정의할때 기능이 담긴 advice를 ref 로 둔다.

<aop:aspect id="traceAspect1" ref="performanceTraceAdvice"> .... </aop:aspect>  .... 부분의 내용을 채우면된다.

2. 두번째로는 pointcut을 정의 한다. express 에는 포인터컷의 대상이될 대상들을 AspectJ의 표현식으로 정의한다.

         <aop:pointcut id="publicMethod" expression="execution(public * madvirus.spring.chap05.board..*(..))"/>

3. 세번째로는 2번에서 선언한 포인트컷을 적용할 차례이다. 이때 적용할 .. 선언되어있는 포인트컷을 pointcut-ref 에 대입한다.
method는 pointcut 대상 메소드가 호출될때 실행될 공통기능으로, 정의된 빈 .. advice 클래스의 어떤 메소드가 호출될지를 정의한다.
즉 performanceTraceAdvice 로 선언된 bean id의 클래스에 trace 라는 메소드가 있어야 한다.

        <aop:around pointcut-ref="publicMethod" method="trace"/>



XML 설정을 통한 AOP 설정

최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.

<aop:config>
 // Aspect 설정에서 <aop:aspect> 태그는 한 개의 Aspect를 설정함 , 
// ref 는 적용할 공통기능을 구현한 빈을 설정함 즉, 어드바이스? advice
<aop:aspect id="traceAspect1" ref="performanceTraceAdvice">  (1. 어스팩트 선언)
// Advice를 적용할 pointcut은 <aop:pointcut> 태그를 이용하여 설정한다.id는 식별값, expression 은 포인트컷을 정의하는 AspectJ의 표현식 ( 2. 포인트컷 정의)
<aop:pointcut id="publicMethod"
expression="execution(public * madvirus.spring.chap05.board..*(..))" />
// 아래는 Advice가 적용될 포인트컷의 정의중하나이다.  pointcut or pointcut-ref 속성으로 Advice가 적용될 포인트컷을 지정하는것이다.
//pointcut-ref는 <aop:pointcut> 태그를 이용하여 설정한 Pointcut을 참조할때 사용되고, pointcut 속성은 직접 AspectJ 표현식을 이용하여 
//Pointcut을 지정할때 사용된다.  ( 3. 포인트컷 적용 )

// 즉 aop:around pointcut  또는  aop:around pointcut-ref  둘중하나인데 포인트컷을 선언하고 그걸 쓰는건 아래 
<aop:around pointcut-ref="publicMethod" method="trace" />
</aop:aspect>


/////////////////////////////////////////////////////////////////////////////////////////////////////////////


// 아래는 포인트컷을 안만들고 aop:around pointcut 으로 해서 표현식으로 대상을 정하는 방식
<aop:aspect id="traceAspect2" ref="performanceTraceAdvice">
<aop:around pointcut="execution(public * madvirus.spring.chap05.member..*(..))" 
// method 는 Pointcut 대상메소드가 호출될때 실행될 공통기능으로 정의된 빈클래스의 어떤 메소드가 호출될지를 정의함 
method="trace" />
</aop:aspect>
</aop:config>

위 내용을 간단히 풀어보자면....

난 performanceTraceAdvice 메소드에 대한 aspect를 만들건데, 그 대상은 포인트컷 publicMethod 에 정의했어.
그리고 그 포인트컷을 사용하도록 aop:around 를 선언할거야. 

==========================================

Before Advice 는 대상객체가 실행되기 전에 호출된다.
즉, 만약 Before Advice 에서 에러가 나면 원래 실행되어야 할 객체가 실행되지 않을 수 도 있게 된다.
이를 잘 이용하면, 권한 검사이 접근권한이 없으면 예외를 발생시켜서 호출을 막는 형태의 구현도 가능하다나 뭐라나...

After Advice 는... try catch finally 에서 finally랑 비슷하다. 즉 메서드 실행됐는지, 예외를 발생시켰는지의 여부에 상관없이 메서드 실행이
종료된 이후에 적용된다.


Around Advice 는 다른 모든 어드바이스를 한번에 구현할 수 있는 Advice 라고 보면된다. 
(즉 실행될 객체를 조인트포인트로 가져오므로 원하는 내용을 실행될 객체 앞뒤에 쉽게 배치할 수 있다)

 
혹은
<bean id="logging" class="madvirus.... LoggingAspect"/>

<aop:config>
    <aop:pointcut id="servicePointcut"
        expression="execute(* *..*Service.*(..))" />

    <aop:aspect id="logginAspect" ref="logging">
        <aop:around pointcut-ref="servicePointcut" method="logging"/>
    </aop>
</aop:config>

처럼 포인트컷 만들고 (express 설정) 그 포인트컷을 쓰는 aspect를 만든다고 생각해도 간단하다

Service로 끝나는 인터페이스를 구현한 모든 클래스의 모든 메소드에 LoggingAspect 가 적용된다는의미이다.



'IT > 스프링' 카테고리의 다른 글

Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
스프링3.0 어노테이션 .. annotation  (0) 2011.12.28
Spring Filter components in auto scanning  (0) 2011.12.28
http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=183005
 


SELECT TO_CHAR(yyyymmdd, 'YYYYMMDD') yyyymmdd 

  FROM ( 
        SELECT start_date + level - 1 yyyymmdd 
          FROM (SELECT TO_DATE('20110101', 'YYYYMMDD') start_date, TO_DATE('20111231', 'YYYYMMDD') end_date FROM DUAL) 
        CONNECT BY level <= end_date - start_date + 1 
      ) 
 WHERE TO_CHAR(yyyymmdd, 'd') in (1,7)
http://www.okjsp.pe.kr/seq/181480

이미 $를 Prototype같은 라이브러리가 사용하고 있어서 그렇습니다. 

아래처럼 사용하시면 됩니다. 내용 부분에서는 $ 사용가능합니다. 
jQuery.noConflict(); 
jQuery(document).ready(function($){ 
// 내용 
});

'IT > jquery' 카테고리의 다른 글

toggle...  (0) 2012.04.27

mysql 을 db로 하고 jdbc로 접속하여 insert 를 한다고 가정하자.


이런 경우는 토비의 스프링의 예제로 나오는데 ... 그대로 생성했다간

Exception in thread "main" java.sql.SQLException: Incorrect string value: '\xEB\xB0\xB1\xEA\xB8\xB0...' for column 'name' at row 1
이런 에러가 나와버린다. 딱봐도... 한글캐릭터 문제인데, 토비의 예제에서 접속캐릭터셋을 UTF8 로 해놓은걸 볼 수 있다.

해서 찾아보니... 생성시에 해당 컬럼에 대해서 문제셋지정이 가능했다. 아래와같이 처리해서 테스트 결과는 성공.

create table users (
id varchar(10) primary key,
name varchar(20) character set utf8 not null,
password varchar(10) not null
)


이게 아니면 varchar 대신 다른 타입을 써도된다. 다만... 그렇게 큰 타입을 지정할 필요가 있을지 의문된다면 위와같이 처리해도 된다. 


+ Recent posts