Whiteship's Note


Aspect-Oriented Programming with Spring AOP and AspectJ



Interface 21의 아드리안이 발표한 PPT인것 같습니다. 구글에서 "spring aop aspectj"로 검색했더니 나왔습니다. 굉장히 멋진 발표였을 것 같은데 중간 중간 데모를 못보는 것이 너무 아쉽습니다.

Spring AOP에서 AsepctJ와 연동하는 부분이 막혀서 구글링을 하던 중이였는데 AspectJ의 aj 파일을 컴파일 해서 class 파일로 만들어야 할 것 같습니다. 안그러면 Spring 컨테이너에서 Bean으로 읽어 들일 때 ClassNotFoundException이 떨어지게 됩니다. 물론 그걸 Spring이 잡아서 CannotLoadBeanClassException이라고 좀 더 명확하게 이야기를 해줍니다.ㅋ

2006년 7월에 PPT 파일명을 보니.. Free Seminar... Interface 21에서 무료 세미나도 해주나 봅니다. 우워..... 부럽..
지만 한국에는 KSUG가 있죠.

top


POJO기반 Spring AOP



참조 : http://en.wikipedia.org/wiki/Plain_Old_Java_Object

문득 POJO가 궁금해 졌습니다. 대체 어떤 객체를 Plain Old Java Object라고 하는 것인지...말이죠. 어떤 클래스에 종속성을 가지면 안되는 것인지? 그런건 너무 규약이 심하니까(혼자서 하면 뭘 얼마나 혼자서 하겠습니까.) 그건 아닌거 같고, 특정한 인터페이스를 구현하면 안 되는 건가? 흠.. 이건 왠지 그럴듯하네.. 라고 생각만하다가 그냥 검색을 해봤습니다.


원문을 보시면 아시겠지만, 특정한 클래스를 상속 받거나, (스펙같은 역할을 하는)특정 인터페이스를 구현 해야만 하거나, 특정 애노테이션을 붙여야만 하는 클래스는 POJO가 아닙니다.

따라서 Spring AOP 중에서 aop 네임 스페이스를 사용하는 방법만이 POJO를 사용하는 Spring AOP라고 할 수 있겠습니다. Classic Spring AOP는 특정 인터페이스를 구현해야만 하고, @AspectJ는 특정 애노테이션을 붙여줘야 하기 때문이죠.
top


1장 발표 자료 및 소스 코드



'Spring In Action > 1. Springing into action' 카테고리의 다른 글

1장 발표 자료 및 소스 코드  (0) 2007.09.02
스프링 구성요소(모듈)  (0) 2007.08.29
스프링이란 무엇인가?  (2) 2007.08.29
top


Spring AOP 사용 방법



간추리면 세 가지. 크개는 두 가지

1. 옛날 방법

- Spring AOP API를 사용하는 방법.

2. 2.0 방법

- @AsepctJ를 사용하는 방법
- <aop />를 사용하는 방법

옛날 방법이 훨씬 복잡하지만 그걸 알고 나면 2.0 방법은 누워서 떡먹기 입니다. 여기에 하나 더 추가하자면 AspectJ를 사용하는 방법이 있는데 특별히 필드 Jointpoint나 생성자 Jointpoint 또는 Spring에서 지원하지 않는 AspectJ Pointcut 표현식이 필요한 상황이 아니라면 위의 Spring AOP 만으로도 충분할 것 같습니다.
top


Classic 스프링 Aspect 만들기



1. Advice 만들기(Aspect에서 할 일을 모아 높은 클래스 입니다.)
Spring AOP(old) Advice

2. Pointcut 정의하기(XML에서 합니다. 정규 표현식과 AspectJ 표현식을 사용할 수 있습니다.)
Spring AOP(old) Pointcu
Spring AOP(old) Pointcut Implementationt

3. Advisor 만들기(XML에서 합니다. 1번과 2번에서 만든것을 묶어 주면 됩니다. 특화된 Advisor를 사용하면 2번을 굳이 만들지 않아도 됩니다.)
Spring AOP(old) Advisor

4. Proxy 만들기(XML에서 합니다. 이것이 바로 프록시 기반의 Aspect에 해당하게 됩니다. ProxyFactoryBean을 사용하여 타겟 클래스, 인터셉터(advisor), 인터페이스 속성을 지정해 줍니다.)
6.6. Proxying mechanisms
Spring AOP(old) ProxyFactoryBean 불편한 점


단점으로 설정할 내용이 많고, 몇 일 지나면 어떻게 만들었는지 잊어버리게 됩니다.
top


AOP 소개



객체 지향에서의 재사용에 관한 두 가지 기술, 상속(inheritance)과 위임(delegation)의 한계
- 상속 : 특정 타입에 얽매이게 된다. "왜 상속이 나쁜가?" 라는 아티클이 있슴.
- 위임 : 애플리케이션이 복잡해진다. 데메테르의 법칙에 위배 될 가능성이 높아짐.

Aspect를 사용하여 상속과 위임을 대체하여 좀 더 나은 애플리케이션을 만들 수 있다.
- 크로스 커팅 concern들을 모듈화 할 수 있다.
    - 흩어져 있는 concern과 관련된 코드를 한 곳에 모을 수 있다.
    - 서비스 계층이 깨끗해 진다.

AOP 용어 정리
  1. 2006/12/29 1. AOP 용어 정리 (2)
스프링의 AOP 특징
- 스프링에서 AOP를 사용할 수 있는 방법은 여러가지다.
    - 프로그래밍을 통해 프록시 기반 AOP를 사용하는 방법(어떤 버전에서도 사용 가능함)
    - AspectJ와 연동하여 사용하는 방법(어떤 버전에서도 사용 가능함)
    - @AsepctJ 를 사용하는 방법(Spring 2.0부터 사용 가능)
    - 오직 POJO 만을 사용하는 방법(Spring 2.0부터 사용 가능)
- AspectJ와 연동하여 사용하는 방법을 제외 하면 모두 프록시 기반이다.
- 오직 메소드 호출 조인 포인트만 지원한다.
- 스프링 어드바이스는 자바로 작성한다.
- 런타임시 프록시 객체를 생성한다.
    - 프록시 객체를 만드는 두 가지 방법이 있다.
       - 인터페이스 기반으로 만들 때 : JDK 의 Proxy 클래스 사용 -> 별도의 라이브러리 필요 없슴.
       - Concrete 클래스 기반으로 만들 때 : CGLIB 사용 -> cglib.jar 필요함. -> final 메소드는 어드바이스 될 수 없다.

top


스프링 구성요소(모듈)



사용자 삽입 이미지

The Code Container
- provides the fundamental functionality of the Spring
- org.springframework.beans.factory.BeanFactory
    - 스프링의 가장 기본이 되는 컨테이너.
    - 스프링 DI를 제공하는 기반 시설.
- Chapter 2에서 자세히 다룬다.

Application context module
- context module is what makes it a framework.
    - BeanFactory를 확장하여 다음의 기능들을 추가함.
        - I18N 메시징
        - 이벤트 핸들링
        - Validation
- supplies many enterprise services
    - email
    - JNDI
    - EJB와의 연동
    - templating frameworks(Velocity, FreeMarker)와의 연동

Spring’s AOP module
- serves as the basis for developing your own aspects for your Spring enabled application.
- AOP Alliance 인터페이스에 기반하였다.
- AspectJ 지원.
- Chapter 4에서 자세히 다룬다.

JDBC abstraction and the DAO module
- 반복 되는 코드를 추상화 시켜서 코드 작성을 간결하고 깔끔하게 할 수 있다.
- 각 DB 벤더들의 에러 코드를 의미가 있는 에러 메시지로 변환하여 RuntimeException으로 던지는 추상화 계층 제공.
- Chapter 5에서 자세히 다룬다.

Object-relational mapping (ORM) integration module
- JDBC를 직접 사용하는 대신 ORM 사용을 선호하는 분들을 위해 만들어둔 추상화 계층.
- Hibernate, JPA, JDO, iBATIS SQL Maps 지원.
- Chapter 5에서 자세히 다룬다.

Java Management Extensions (JMX)
- makes it easy to expose your application’s beans as JMX Mbeans.
- makes it possible to monitor and reconfigure a running application.
- Chapter 12에서 자세히 다룬다.

Java EE Connector API (JCA)
- Java EE Connection API (JCA)는 여러 메인 프레임과 DB를 포함하고 있는 엔터프라이즈 시스템들을 통합하기 위한 표준 API.
- JDBC 지원 기능과 마찬가지로 JCA 코딩에서 반복되는 부분을 추상화 시키는 형태로 지원.

The Spring MVC framework
- Model, View, Controller(MVC) 패턴은 UI와 애플리케이션 로직을 분리하기 위한 접근 방법
- 자체 MVC 기능 구현 함.
- Chapter 14, 15에서 자세히 다룬다.

Spring Portlet MVC
- portlet-based applications aggregate several bits of functionality on a single web page.
- Spring Portlet MVC builds on Spring MVC to provide a set of controllers that support Java’s portlet API.

Spring’s web module
- Spring MVC 와 Spring Portlet MVC를 지원하기 위해 기반이 되는 클래스들.
- Apache Struts 또는 Java-Server Faces (JSF)와 연동 지원.

Remoting
- 자신의 자바 객체를 remote 객체로 공개할 수 있으며, 외부의 remote 객체를 애플리케이션에 엮어서 마치 local - POJO 인 것처럼 사용하기 쉽게 해준다.
- RMI, Hessian, Burlap, JAX-RPC, Spring의 Http Invoker
- Chapter 8에서 자세히 다룬다.

Java Message Service (JMS)
- Remoting에 비해 보다 신뢰성있는 통신이 가능.
- helps you send messages to JMS message queues and topics.
- helps message-driven POJOs that are capable of consuming asynchronous messages.
- Chapter 10에서 자세히 다룬다.

참조 : Spring In Action 2nd edition

'Spring In Action > 1. Springing into action' 카테고리의 다른 글

1장 발표 자료 및 소스 코드  (0) 2007.09.02
스프링 구성요소(모듈)  (0) 2007.08.29
스프링이란 무엇인가?  (2) 2007.08.29
top


스프링이란 무엇인가?



Spring is a lightweight dependency injection and aspect-oriented container and framework.

Lightweight
-2.5Mb Single JAR file
-Non intrusive

Dependency Injection
-loose coupling

Aspect-oriented
-enables cohesive development
-separation of concern

Container
-it contains and manages the lifecycle and configuration of application objects.

Framework
-configure and compose complex applications from simpler components.

참조 : Spring In Action 2nd edition

'Spring In Action > 1. Springing into action' 카테고리의 다른 글

1장 발표 자료 및 소스 코드  (0) 2007.09.02
스프링 구성요소(모듈)  (0) 2007.08.29
스프링이란 무엇인가?  (2) 2007.08.29
top