@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 대신 다른 타입을 써도된다. 다만... 그렇게 큰 타입을 지정할 필요가 있을지 의문된다면 위와같이 처리해도 된다. 


1. root 패스워드
mysqladmin -u root -p password xxxxxx

이때 패스워드를 물어오는데 처음에 설치시 정한게 없다면 그냥 엔터치면된다.

 2. DB 생성
mysql> create database devdb
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> 

3. DB 권한주기
root 로 접속한뒤에

grant select,insert,update,delete,create,drop
on DB명.* to '사용자계정'@'localhost'
identified by '루트패스워드';

ex)
grant select,insert,update,delete,create,drop
on devdb.* to 'xxxxx'@'localhost'
identified by 'xxxxx'; 

4. 사용할 DB 선정...
use DB명


5. 테이블 생성
create table users (
id varchar(10) primary key,
name varchar(20) not null,
password varchar(10) not null
)

마약 utf8 로 사용한다면?
create table users (
id varchar(10) primary key,
name varchar(20) character set utf8 not null,
password varchar(10) not null
)
로  name 에 대해 별도 지정 가능하다. 
 

 


from http://www.ibm.com/developerworks/kr/library/0609_alcott/0609_alcott.html

자바 VM에 스레드를 만들고 등록해 셧다운에 실행해 ApplicationContext를 닫는 퍼블릭 메서드인 registerShutdownHook이 있다

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

Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
AOP 몇가지..  (0) 2012.01.05
스프링3.0 어노테이션 .. annotation  (0) 2011.12.28
Spring Filter components in auto scanning  (0) 2011.12.28

아래의 내용은 최범균의 스프링3.0 책과 인터넷 내용등을 찾아서 만든것임을 밝힌다.


1. @Component
클래스의 상단에 적용하는것으로 해당 어노테이션을 적용하면 <context:component-scan> 태그를 이용해서 해당 적용된 클래스들을 빈으로 자동 등록하게 된다.
원래 해당 클래스의 첫 문자를 소문자로 만들어서 빈이름으로 쓰는데 뒤에("xxx") 를 주면   "xxx" 로 이름을 정하게 된다.

2. @Resource
말그대로 리소스를 가져오는 역할이다.
@Resource(name = "camera3") 같은 경우는 xml에 id 가 camera3 의 것을 가져온다. 

메소드에 선언하면 해당 메소드의 파라미터에 전달될 자원을 가져와서 대입해주는게 된다.

3. @Autowired 
의존관계를 자동으로 설정할때 사용한다.
생성자,필드,메소드 3곳에 적용 가능하다. (프로퍼티 setXxxx에도 가능)

메소드에 정의하면 메소드의 아규먼트 값의 타입을보고 해당 빈을 생성해서 파라미터에 전달한다.  (즉 파라미터에 적용됨)
멤버필드에 직접 적용하면 역시 해당 타입의 빈을 생성해서 할당한다. (선언에 대해 new 해서 할당하는 꼴임)

 
해당 어노테이션을 쓰려면 xml에 클래스빈을 등록해줘야하는데 (설정) 
AutowiredAnnotationBeanPostProcessor ...
그냥 <context:annotation-config /> 태그를 해도 된다. (알아서 관련 빈이 등록됨)
 
만약 (required = false) 를 선언하면 해당 타입의 빈 객체가 없어도 예외를 발생하진 않는다.

4. @Qualifier 
3번의 오토와이어드는 타입을 기반으로 하므로 자동설정할 타입이 두개 이상 존재하면 예외가 발생된다.(즉 등록빈중 타입이 같지만 이름이 다르게 된거... 가 여러개 있을때)

이때 @Qualifier("test3") 를 붙여주면 해당 빈을 가져온다.
물론 xml에 
<bean id=' recorder ' calss='.,..'>
    <qualifier value='test3'//>
</beawn> 

라고 정의되어있다고 가정하고 말이다.

@Autowired
@Qualifier(" test3 ")
private Recorder recorder;


단 만약 여러개의 빈에 같은 qualifier 가 정의되어있으면 그거 모두 를 참조하게 된다.. 어떻게?  담기는게 .. List 로 되어있으면 List로 담기더라.
다른건 안해봐서 모르겠다 ㅠㅜ

-----------------------------------------------------------------------------------
2,3,4 추가 설명


@Resource 는 자바6에서 추가된것으로
@Resource : 어플리케이션에서 필요로 하는 자원을 자동 연결할때 사용된다.

이걸 스프링에서는 의존하는 빈 객체를 전달할때 사용된다. 

즉 스프링에서는 객체 전달임 (생성되어있는 객체를...  지정하는 할당)
(name="xxx1") 식으로 빈 지정이 가능하다.



@Autowired 는 의존관계를 자동으로 설정할때 사용한다.
생성자, 필드, 메소드(e.g setXxx) 3군데 적용 가능하다.

메소드에 할때는 해당 파라미터를 자동 연결하는것이다.

멤버필드에 할때는.. 그전에 알아야 하는것이 Autowired 는 타입을 기준으로 연결한다.



@Autowired
public void setDisplay(DisplayStrategy displayStrategy) { ... }
되어있으면 DisplayStrategy타입의 빈 객체를 전달하는것이다.



해당 어노테이션을 배열에 적용하면 해당 타입의 모든 빈객체를 가져오게된다. (배열이니까) 
이건 메소드도 마찬가지다.(메소드에서 받는 파라미터가 배열이면 역시 다 가져온다)

Autowired는 타입을 이용해서 자동연결하므로 타입에 해당하는 빈이 존재하지 않거나 두개이상이면 에러가 난다.
해서 필수 속성을 줄 수 있다. 
@Autowired (requied=false)

이러면 해당빈이 없어도 예외가 발생되진 않는다.(기본값은 true임)

만약 생성자에 해당 어노테이션을 적용할때는 하나의 생성자는 required=true 이어야하고 나머지는 false이어야 한다.



@Qualifier
오토와이어드 어노테이션은 해당 타입의 빈이 두개 이상 존재하면 에러가 난다.
이때 특정 빈과 연결되도록 해주는 어노테이션이다 (오토와이어드와 함께 사용??)
















------------------------------------------------------------------------ 

5. @Configuration  

1번의 Component 는 스캔과  같이 사용하여 이미 정해진 대상중 가져오는것이지만
이번 2개의 어노테이션은 새로운 빈객체를 그냥 등록할 수 있는 기능이다.
즉 자바코드를 이용해서 xml에 정의한 효과를 내는것이다.

해서 ... 원한다면 xml 없이 해당 어노테이션만으로 빈등록하여 구동이 가능하다.

@Bean
@Configuration
public class SpringConfig {
  @Bean
  public AlarmDevice alarmDevice() {
    return new SmsAlarmDevice();
  }
}

외와 같은 경우
<bean id = 'alarmDevice' class='xxx.xxx.xxx.SmsAlramDevice" />
라고 등록한것과 같은 의미가 된다.

물론 Bean 뒤에 (name="smsAlarmDevice") 처럼 정의하면 이름을 정할 수 도 있다.

그리고 Bean 을 이용한 생성시에도 autowired 속성을 이용하여 자동 연관 여부를 설정할 수 있다.

@Bean(autowired= Autowired.BY_NAME)
이는 <bean id='xxxx' class='xxxxx' autowired='byName'/> 과 같다.

근데 막상 위의 5번을 이용하려면 .. 우선 빈으로 만들 내용이 담긴 클래스(Configuration 과 Bean 어노테이션으로 정의된) 와
이를 자원화할 할 수 있는 클래스를 이용해야한다.

2가지 방법이 있는데, AnnotationConfigApplicationContext 클래스를 이용한(new 생성) .. 생성저에 빈등록내용클래스를 넣어줘서 자원을 꺼내오는 방법과
xml에 ConfigurationClassPostProcessor 를 이용하는방법이 있다.


@Configuration
public class SpringConfig {

@Bean
public Camera camera1() {
return new Camera();
}

@Bean
public Camera camera2() {
return new Camera();
}
... 이런 설정 클래스를 만들고

이를...

ApplicationContext context  =new AnnotationConfigApplicationContext(SpringConfig.class);
HomeController homeController = context.getBean("homeController",HomeController.class);

이렇게 말이다.

XML 에서는
<bean class='org.spring..... ConfigurationClassPostProcessor"/>
<bean class="....SpringConfig"/>
하면된다.

참고로 <bean class='org.spring..... ConfigurationClassPostProcessor"/> 선언은 따로 할 필요 없이 그냥
<context:annotation-config/> 를 해줘도  위의 빈등록이 자동으로 된다 (추가적으로 몇개 더 된다)
 

@Import( { ArticleServiceConfig.class, ArticleRepositoryConfig.class })
Bean 말고 Import도 있다.  위와 같이 설정클래스를 별도로 가져와서 등록한다.

@Configuration
public class ArticleServiceConfig {

@Autowired
private ArticleRepositoryConfig repositoryConfig;
@Bean
public ArticleService articleService() {
return new ArticleServiceImpl(repositoryConfig.articleRepository());
}
}
 
@Configuration
public class ArticleRepositoryConfig {

@Bean
public ArticleRepository articleRepository() {
return new ArticleRepositoryImpl();
}
}
 

 
6. @PostConstruct , @PreDestory
PostConstruct 은 의존객체를 설정한 이후에 호출되는 메소드이고
PreDestroy 는 컨테이너에서 객체를 제거하기 전에 호출되는 메소드이다.
 


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BeanDefinition 몇가지

1. (initMethod='init') 

: 빈이 생성되고 DI를 마친 뒤에 실행할 초기화 메소드의 이름 , 예에서는 init 메소드가 호출됨
이때... Config... Bean... 으로 빈을 등록하게 하는 구조이고, Bean 설정에 이를 추가했다면?
해당 리턴될 자원의 클래스(현재의 설정클래스가 아니라) 에 초기화메소드라고 선언한  init 메소드가 있어야한다.
 
해당 초기화 선언없이 알아서 호출하는 자원의 특정 메소드에 @PostConstruct   를 해서 초기과정 진행하도록 해도 된다.  
 


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

Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
AOP 몇가지..  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
Spring Filter components in auto scanning  (0) 2011.12.28

+ Recent posts