기존 소스를 가지고 애너테이션을 이용해서 스프링 설정이 얼마나 간편해지는지 알아보도록 하겠습니다.
유지보수는? 더 힘들어집니다. ㅡㅡ;
앞의 강좌들을 쭈욱 보신 분들만 이해 가능합니다.
aop006 패키지를 만들고 기존 aop005 패키지 밑에 모든 파일들을 복사 붙여 넣고 수정하시면 빠릅니다.
먼저. expert.xml 입니다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:component-scan base-package="aop006" />
<aop:aspectj-autoproxy />
</beans>
component-scan 이 들어오면서 <bean.. > 태그들이 몽땅 사라졌습니다. 헐...
<bean id="myAspect" class="aop005.MyAspect" />
<bean id="boy" class="aop005.Boy" />
<bean id="girl" class="aop005.Girl" />
component-scan 은 <bean.. > 으로 설정 파일에 등록했던 내용들을 별도의 등록없이, 주어진 base-package 밑에 스캔(처음부터 끝까지 살펴보며)하며 자동으로 bean 으로 등록해 줍니다. 자동이기 하지만 Bean 되어야할 클래스가 무엇인지 표식은 해줘야겠지요.
그럼 기존에 Bean 으로 등록되어 있던 Boy.java, Girl.java, MyAspect.java 에 표식을 해야겠군요.
Boy.java 입니다.
import org.springframework.stereotype.Component;
@Component
public class Boy implements IPerson {
public void housework() {
System.out.println("컴퓨터로 게임을 한다.");
}
}
오호라 @Component 애너테이션이 보이네요.
흠흠 @Componet 애너테이션의 실제 구현은 org.springframework.stereotype.Component 이것이겠군요. 딱 패키지명만 봐도 SpringFramework 가 제공하는 것이군요. 이로써 이 Boy.java 는 POJO 가 아닌 스프링 의존 객체가 되었군요.
뭐 그렇다고 해도 스프링프레임워크가 사실 상 표준이니 그러려니 하고 갑시다.
Girl.java 도 똑 같겠군요.
import org.springframework.stereotype.Component;
@Component
public class Girl implements IPerson {
public void housework() {
System.out.println("요리를 한다.");
}
}
이제 기존 소스에서 Bean 으로 등록되었던 마지막 하나는 뭐였던가요?
네 MyAspect.java 입니다.
package aop006;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class MyAspect {
@Pointcut("execution(* housework())")
private void iampc() {
// 여긴 무엇을 작성해도 의미가 없어요.
}
@Before("iampc()")
public void before(JoinPoint joinPoint){
System.out.println("얼굴 인식 확인: 문을 개방하라");
//System.out.println("열쇠로 문을 열고 집에 들어간다.");
}
@After("iampc()")
public void lockDoor(JoinPoint joinPoint){
System.out.println("주인님 나갔다: 어이 문 잠궈!!!");
//System.out.println("자물쇠를 잠그고 집을 나선다.");
}
}
IPerson.java 는 변화가 없습니다.
public interface IPerson {
void housework();
}
역시 테스트용 Start.java 역시 변화가 없습니다.
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Start {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/aop006/expert.xml");
IPerson romeo = (IPerson)context.getBean("boy");
IPerson juliet = (IPerson)context.getBean("girl");
romeo.housework();
juliet.housework();
}
}
순수 XML 기반 스프링 설정 파일과 애너테이션 기반과 연동된 XML 설정 파일을 비교해보겠습니다.
순수 XML 기반 설정 파일 |
애너테이션 기반 XML 설정 파일 |
<?xml version="1.0" encoding="UTF-8"?>
<aop:aspectj-autoproxy /> |
<?xml version="1.0" encoding="UTF-8"?> <aop:aspectj-autoproxy /> |
나머지 java 파일은 순수 POJO |
일부 java 파일은 스프링프레임워크에 의존 |
개발시점 - 편집기에서 xml 과 java 파일을 오가며 작성
유지보수시점 - xml 파일만 보면 Bean 들 사이의 관계를 쉽게 알 수 있음 |
개발시점 - xml 파일을 위와 같이 설정한 후 다시 볼 일 없음
유지보수시점 - xml 파일만 봐서는 Bean 들 사이의 관계를 알 수 없음 - 모든 java 파일을 열어서 확인해야 정확한 구조 파악이 가능 (애너테이션 확인) |
자 여러분 이라면 둘 중에 어느 것을 선택하시렵니까?
정답은 없습니다. 다만 각자의 모범 답안이 있을 뿐.. ^^
복습 차원에서 돌이켜 보죠.
<aop:aspectj-autoproxy /> 의 역할은?
<context:component-scan base-package="aop006" /> 의 역할은?
<context:annotation-config /> 의 역할은?
실무에서 아주 아주 중요할 수 있는 내용입니다. ^^
답은...
<aop:aspectj-autoproxy /> 의 역할은?
Spring AOP 에서 사용하는 Proxy 를 자동 생성하도록 해준다.
<context:component-scan base-package="aop006" /> 의 역할은?
@Component 애너테이션이 붙은 클래스들을 Bean 으로 자동 등록해 준다.
<context:annotation-config /> 의 역할은?
@Resource 또는 @Autowired 로 애너테이션이 붙어 있는 속성에 Bean 객체를 자동 할당해 준다.
추가로..
@Component
XML 설정 파일의 <bean ...> 태그 대체
@Resource / @Autowird
XML 설정 파일의 <property ...> 태그 대체
이 외에도 다양한 애너테이션들이 존재하는데 역시 책 ^^/
'강좌 > Spring 3.0' 카테고리의 다른 글
016. OOP 추상화 = 모델링 (40) | 2013.02.07 |
---|---|
015. 추상 / 추상화 (15) | 2013.02.06 |
013. AOP - 기초 완성 (14) | 2013.01.23 |
012. AOP 일단 덤벼 보자 - POJO & XML 기반 AOP (16) | 2013.01.23 |
011. AOP 일단 덤벼 보자 - 용어편 (16) | 2013.01.23 |