[java] java code annotation processing

친구가 알아봐달라는 @Multiline annotation processing 조사를 해보았는데

ECJ에 대해 관련 내용은 아래 블로그에 잘 정리 되어 있다.
http://blog.deepakazad.com/2010/05/ecj-eclipse-java-compiler.html

요약해보면 Eclipse IDE 말고 밖에서도 사용 수 있고(batch)처럼..

ECJ는 이미 Tomcat에서 JSP를 컴파일 할 때 사용하고 한다.

안에 있는 core 코드를 바로 들여다 보기 전에 일단 만들어진 코드를 감상해보자면…
https://github.com/benelog/multiline/tree/master/multiline-string/src/main/java/org/adrianwalker/multilinestring

결국에는 주석값을 읽어와서(docComment) 문자열상수로 만들어준다가 결론이다.

그 역할을 하는 Processor가 아래 2개

https://github.com/benelog/multiline/blob/master/multiline-string/src/main/java/org/adrianwalker/multilinestring/JavacMultilineProcessor.java

https://github.com/benelog/multiline/blob/master/multiline-string/src/main/java/org/adrianwalker/multilinestring/EcjMultilineProcessor.java

annotation processor 구현체를 간단히 만들려면 AbstractProcessor를 상속 받으면 된다.
http://docs.oracle.com/javase/6/docs/api/javax/annotation/processing/AbstractProcessor.html

1.6 이상만 지원이 되며 1.5버전 이하는 더이상 다루지 않겠다.

관련 java package 링크며 개발하기 전에 참고해볼만 하다.
http://docs.oracle.com/javase/6/docs/api/javax/annotation/processing/package-summary.html
http://docs.oracle.com/javase/7/docs/api/javax/annotation/processing/package-summary.html

이제 개발하기 위해 빠른 개념을 잡는 것이 중요한데 아래 링크를 읽어보면 감이 올 것이다.

http://docs.oracle.com/javase/6/docs/technotes/tools/windows/javac.html#processing
http://www.javabeat.net/2007/06/java-6-0-features-part-2-pluggable-annotation-processing-api/
http://www.angelikalanger.com/Conferences/Slides/JavaAnnotationProcessing-JSpring-2008.pdf

후루룩 읽어봤는데 -proc:none 옵션이 있으면 사용할 수 없다.

별도의 compile시켜주는 script가 필요할 것 같다.(IDE나 ant 등등 script)

END!

광고

[Spring] Stereotype Annotation 용도

정보는 스프링 3.0 document를 참고 하였으며

오역?이 있을지도 모르니 원문을 참고 하시면 정확하고 많은 정보를 얻어가실 수 있습니다.
이렇게 긴 글을 친절하게 stackoverflow 에 누군가 요약 해놓았습니다.

오늘은 스프링의 stereotype 어노테이션의 용도와 역사가 무엇인지에 대해 알아 보겠습니다.

일단 stereotype 이라는 사전적인 의미는 다음과 같습니다.

명사 : 고정관념, 정형화된 생각

동사 : 정형화하다.

ㅇ 본문 내용 요약

* 용도가 불문명한 컴포넌트 클래스를 위한 어노테이션

@Component :

Spring 2.5부터 등장.

스프링이 관리하는 컴포넌트라는 표시

* 용도가 분명한 컴포넌트 클래스를 위한 어노테이션 (Component와는 다르게 용도를 표시하기 위해 구별 한다고 합니다.)

@Repository :

Data Acess Object 역할을 하는 class에 표시하기 위해 spring 2.0에서 등장하였습니다.

등장한 이유는 JPI(Java Persistence API)의 Exception을 해석(Translation)하기 위한 용도 입니다.(automatic exception translation in your persistence layer)

보다 자세한 설명은 링크을 참고 하시기 바랍니다.

@Service :

Spring 2.5부터 등장.

용도 : Service Layer 표시.

@Controller :

Spring 2.5부터 등장.

용도 : Presentation Layer 표시.

용도 구분해서 사용한다면 어노테이션 종류 별로 Exception translation, 전후처리 등을 커스터마이징 처리 할 수 있을 것 같습니다. ^^

오늘은 여기까지 : )

[Spring] Custom Transactional Annotation in AOP

가끔 프로그래밍을 하다보면 다음과 같이 앞뒤로 (Before, After) Code duplication 이 발생한다. 이를 AOP를 이용하여 깔끔하게 코드 중복을 정리할 수 있는데 원리(rule)는  @Transactional Annotation과 비슷하다.

Before Job: begin Transaction

Processed : execute queries

After Job : end Transaction

Spring에서도 Interceptor를 위한 AOP를 구현해보자

Interceptor에 대해 이해가 잘 가지 않는다면 다음 wiki를 참고하길 바란다.

http://en.wikipedia.org/wiki/Interceptor_pattern

Step 1. xml bean configuration

<beans xmlns=”http://www.springframework.org/schema/beans&#8221;
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xmlns:p=”http://www.springframework.org/schema/p&#8221;
xmlns:mvc=”http://www.springframework.org/schema/mvc&#8221; xmlns:context=”http://www.springframework.org/schema/context&#8221;
xmlns:tx=”http://www.springframework.org/schema/tx&#8221; xmlns:aop=”http://www.springframework.org/schema/aop&#8221;
xsi:schemaLocation=”
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
default-autowire=”byName”>
<aop:aspectj-autoproxy />
<context:component-scan base-package=”org.simple.aop”> 

Step2. Annotation 생성

@Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TransactionApply {

}

Step3. Aspect Bean 만들기

package org.simple.aop;

@Aspect
@Component
public class SimpleAspect {

@Around(“execution(public * *(..)) && @annotation(txApply)“)
public Object transactionAround(ProceedingJoinPoint joinPoint, TransactionApply txApply) throws Throwable {

Object retVal = null;
// TODO : Begin Transaction
try {

retVal = joinPoint.proceed();

} catch (Throwable t) {

// TODO : Transaction Roll Back

throw t;

}

//TODO : end Transaction
return retVal;

}

}

package org.simple.aop;
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TransactionApply {
}

Step4. Apply Custom Annotation

@Service(“SimpleBO”)

public class SimpleBOImpl implements SimpleBO {

@TransactionApply
@Override
public Object updatePolicy(Object param) {

// TODO : select, update, delete in joinPoint.proceed

}

}

Tip : 만약 bean creation 시 다음과 같은 오류가 발생한다면 cglib의 version을 2.2 이상으로 올리는 것을 추천한다.

Caused by: java.lang.NoSuchMethodError: net.sf.cglib.proxy.Enhancer.setInterceptDuringConstruction(Z)V

위 issue의 원인은 cglib 2.0.2 version에서 setInterceptDuringConstruction이라는 Method가 없기 때문이다.

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-full</artifactId>
<version>2.0.2</version>
</dependency>

2.2 이상으로 설정하면 오류가 사라지며 bean 생성이 정상적으로 이루어짐을 확인할 수 있다.

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>

Attention : this exam requires cglib version higher than 2.2, aspectj dependency