Lightweight 컨테이너 아키텍처 = Spring Framework

2010. 8. 15. 15:49plming/Java - Spring

가벼우면서도 컨테이너 기능을 가지고 있는 아키텍처
Lightweight는 EJB 컨테이너와 비교하여 가벼운 컨테이너라는 것
컨테이너 기능을 가진다는 것은, 트랜잭션 처리, Security, 빈의 생명주기관리와 같은 컨테이너를 통해서 지원할 수 있는 기능들을 지원하는 것이 가능하다는 것

각 계층에서 사용하고 있는 기술들에 있어서 Non EJB 아키텍처와 별반 다르지 않다.
다른 부분은 계층별 인터페이스를 담당하는 POJO 빈들을 유기적으로 관리해주는 컨테이너를 가지고 있다는 것
POJO에 대한 컨테이너 기능을 지원하는 대표적인 프레임워크가 Spring 프레임워크

Spring 프레임워크는 POJO에 대한 컨테이너적인 역할을 할 뿐만 아니라 각 계층의 의존관계를 유기적으로 연결하고 관리하는 기능을 지원한다. 이는 Non EJB 아키텍처가 가지고 있는 장점과 EJB 아키텍처가 가지고 있는 장점을 모두 수용하는 것이 가능하게 한다.


 import net.javajigi.user.dao.UserDAO;
 import net.javajigi.user.model.User;
 import net.javajigi.user.service.UserService;

 public class SpringUserService implements UserService {

     private UserDAO userDAO = null;

     public void setUserDAO(UserDAO newUserDAO) {
         this.userDAO = newUserDAO;
     }

     public int addUser(User user) throws ExistedUserException {
         return userDAO.insert(user);
     }

     public int updateUser(User user) {
         return userDAO.update(user);
     }

     public User findUser(String userId) throws UserNotFoundException {
         User user = userDAO.findUser(userId);
         return user;
     }


UserService에서는 DAO인스턴스가 이미 존재하는 것처럼 사용
(new DAO(); 코드가 존재하지 않는다)
Spring 프레임워크가 가지고 있는 POJO 빈의 생성,소멸,의존관계까지 관리해 줄 수 있는 기능으로 이해 이와같이 개발하는 것이 가능하다.

Spring 프레임워크는 Properties 파일이나 XML 파일을 이용하여 POJO 빈에 대한 정보를 관리한다.

 applicationContext.xml

 <beans>
     <bean id="userDAO" class="net.javajigi.user.dao.MySQLUserDAO" />

     <bean id="userService"
         class="net.javajigi.user.spring.SpringUserService">
         <property name="userDAO">
             <ref local="userDAO"/>
         </property>
     </bean>
 </beans>



 web.xml

 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/applicationContext*.xml</param-value>
 </context-param>

 <listener>
     <listener-class>
         org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

Spring 프레임워크는 web.xml에 설정된 정보를 바탕으로 웹애플리케이션이 시작할 때 설정 파일(applicationContext.xml)에 담겨 있는 정보를 바탕으로 모든 POJO 빈에 대한 생성과 초기화 작업을 한다.

이렇게 생성된 POJO 빈은 Spring 프레임워크 WebApplicationContext에 의해서 관리되며,
이 WebApplicationContext는 웹 애플리케이션과 생명주기를 같이 하고 있는 ServletContext에 저정되어 관리된다.

 import net.javajigi.user.service.UserService;

 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.context.support.WebApplicationContextUtils;

 WebApplicationContext wac =
     WebApplicationContextUtils.getRequiredWebApplicationContext(ctx);

 return (UserService) wac.getBean("userService");

ServletContext에서 관리되고 있는 WebApplicationContext를 찾아서 사용자 관리 프로젝트의 비즈니스 계층에 해당하는 UserService에 접근하고 있다.  WebApplicationContext에서 UserService 인스턴스를 얻기 위하여 사용한 "userService"는 applicationContext.xml에서 사용한 POJO빈의 ID이다.


- 장점
1. EJB에 비해 배우기 쉬우며, 빈을 설정하는 방법도 쉽다.
2. 서블릿 컨테이너에서 실행하는 것이 가능하므로 이식성(Portability)이 뛰어나다.
3. 특정 인터페이스에 종속되지 않은 POJO를 기반으로 하기 때문에 테스트가 용이하다.
4. AOP(Aspect Oriented Programming)의 지원으로 EJB 컨테이너에서 지원 가능했던 컨테이너 기능들을 지원하는 것이 가능하다.
5. OOP(Object Oriented Programming) 형태로 개발하는데 제약사항이 없다.

- 단점
1. 분산 환경을 지원하지 못한다.  하지만, 웹 서비스등으로 극복할 수 있다.
2. 아직까지 Lightweight 컨테이너에 대한 표준이 없다.
3. 대부분의 개발자들이 Non EJB 아키텍처와 EJB 아키텍처에 친숙한 상태이다.
   Lightweight 컨테이너 아키텍처를 새로 배워야 한다는 부담이 있다.


컨테이너에 배포하지 않은 상태에서도 테스트가 가능
각 계층 사이의 의존관계를 줄이기 위하여 Factory 클래스와 Singleton 패턴을 사용하지 않아도 같은 효과를 얻을 수 있다.
모든 POJO는 디폴트로 Singleton처럼 관리된다.

Spring 프레임워크는 EJB 컨테이너가 가지고 있던 기능들을 모두 포함하면서도 다양한 프레임워크들의 GLUE(연결체) 역할을 하고 있다.  또한, 수없이 많은 J2EE API들에 대한 추상 API를 제공함으로써 J2EE API를 더 쉽게 사용하는 것이 가능하도록 지원하고 있다.


[출처] Spring 프레임워크 워크북

'plming > Java - Spring' 카테고리의 다른 글

Spring IoC (Inversion of Control)  (0) 2010.08.15
Spring Framework 설치 및 개발 환경  (0) 2010.08.15
EJB 아키텍처  (0) 2010.08.15
Non EJB 아키텍처  (0) 2010.08.15
DataSource Lookup  (0) 2010.08.15