강좌/Spring 3.0

014. 애너테이션 기반 DI, AOP, 스프링 설정 파일

여름나라겨울이야기 2013. 1. 23. 17:07
728x90

기존 소스를 가지고 애너테이션을 이용해서 스프링 설정이 얼마나 간편해지는지 알아보도록 하겠습니다.

유지보수는? 더 힘들어집니다. ㅡㅡ;

 

앞의 강좌들을 쭈욱 보신 분들만 이해 가능합니다.

 

aop006 패키지를 만들고 기존 aop005 패키지 밑에 모든 파일들을 복사 붙여 넣고 수정하시면 빠릅니다.

 

먼저. expert.xml 입니다.

 

 

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 입니다.

 

package aop006;

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 도 똑 같겠군요.

 

package aop006;

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 는 변화가 없습니다.

 

package aop006;

public interface IPerson {
 void housework();
}

 

역시 테스트용 Start.java 역시 변화가 없습니다.

 

package aop006;

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"?>
<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"
 xsi:schemaLocation="...">

 

 <aop:aspectj-autoproxy /> 
 
 <bean id="myAspect" class="aop004.MyAspect" />
 <bean id="boy" class="aop004.Boy" />
 <bean id="girl" class="aop004.Girl" />

 
 <aop:config>
  <aop:pointcut expression="execution(* housework())" id="iampc"/>
  
  <aop:aspect ref="myAspect">   
   <aop:before method="before" pointcut-ref="iampc" />
   <aop:after method="lockDoor" pointcut-ref="iampc" />
  </aop:aspect>
 </aop:config>
</beans>

<?xml version="1.0" encoding="UTF-8"?>
<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=".....">

 <aop:aspectj-autoproxy />

 <context:component-scan base-package="aop006" />
</beans>

 나머지 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