[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