'spring'에 해당되는 글 5건

  1. 2009.12.13 Spring에서 iBatis 연동하기 7
  2. 2009.12.13 AOP : Aspect Oriented Programming
  3. 2009.12.13 빈 라이프 사이클
  4. 2009.12.13 Spring Framework의 개요
  5. 2009.12.12 Spring Framework 특징

Database 연동

-       스프링은 JDBC를 비롯하여 ORM 프레임워크를 직접적으로 지원하고 있기 때문에 간단하게 JDBC뿐만 아니라 ORM 프레임워크를 스프링과 연동할 수 있다.

-       스프링은 JDBC, ORM 프레임워크 등의 다양한 기술을 이용해서 손쉽게 DAO클래스를 구현할 수 있도록 지원한다.

-       템플릿 클래스 지원

n  개발자가 중복된 코드를 입력해야 하는 성가신 작업을 줄일수 있도록 한다.

n  JDBC : JdbcTemplate

n  iBatis : SqlMapClientTemplate

n  Hibernate : HibernateTemplate

-       DaoSupport 클래스 지원

n  DAO에서 기본적으로 필요로 하는 기능을 제공한다.

n  JDBC : JdbcDaoSupport

n  iBatis : SqlMapClientDaoSupport

n  Hibernate : HibernateDaoSupport

n  이러한 DaoSupport 클래스를 상속받아 DAO클래스를 구현한 뒤, DaoSupport 클래스가 제공하는 기능을 사용하여 보다 편리하게 코드를 작성할 수 있게 된다.

-       의미 있는 예외 클래스 제공한다.

-       스프링은 데이터베이스 처리 과정에서 발생한 예외가 발생했는지를 구체적으로 확인 있도록 하기위해, 데이터베이스 처리와 관련된 예외 클래스를 제공하고 있다.

n  데이터베이스 처리 과정에서 SQLException 발생하면 스프링이 제공하는 예외 클래스 알맞은 예외 클래스로 변환해서 예외를 발생 시킨다.

n  스프링의 모든 예외 클래스들은 DataAccessException 상속 받는다.

n  BadSqlGrammerException, DataRetrievalFailureException

 

 

 

DataSource 설정

-       스프링은 DataSource를 통해서 Connection을 제공한다.

-       따라서, DataSource 정보를 설정해야 한다.

-       스프링은 다음과 같은 3가지 설정 방식을 제공한다.

1.     커넥션 풀을 이용한 DataSource 설정

2.     JNDI를 이용한 DataSource 설정

3.     DriverManager를 이용한 DataSource 설정

 

스프링의 iBatis지원

-       스프링은 SqlMapClient를 스프링 설정 파일에서 쉽게 설정하도록 돕는 SqlMapclientFactoryBean클래스를 제공한다.

-       이 클래스를 사용하면 SqlMapClient를 스프링의 빈으로 설정할 수 있다.

 

DataSource설정

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xmlns:p="http://www.springframework.org/schema/p"

        xsi:schemaLocation="http://www.springframework.org/schema/beans                            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

 

        <bean id="dataSource"

               class="org.apache.commons.dbcp.BasicDataSource"

               p:driverClassName="com.mysql.jdbc.Driver"

               p:url="jdbc:mysql://127.0.0.1:3306/struts"

               p:username="scott"

               p:password="tiger" />

       

</beans>

 

 

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

 

<!DOCTYPE sqlMapConfig     

    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     

    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

 

<sqlMapConfig>

        <sqlMap resource="movie/Director.xml"/>

</sqlMapConfig>

 

 

SqlMapClientTemplate 클래스이용

-       SqlMapClient를 사용할 때에 관련된 반복적인 코드를 제거 할 수 있도록 해준다.

-       SqlMapClientTemplate클래스를 제공한다.

-       SqlMapClientTemplate클래스는 내부적으로 iBatisSqlMapClient를 사용한다.

-       SqlMapClientTemplate클래스를 빈으로 설정하고 이미 설정한 SqlMapClient빈을 설정한다.

 

SqlMapConfig.xml

<bean id="sqlMapClient"

        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"

        p:dataSource- ref="dataSource"

        p:configLocation="SqlMapConfig.xml />

 

<bean id="sqlMapClientTemplate"

        class="org.springframework.orm.ibatis.SqlMapClientTemplate"

        p:sqlMapClient- ref="sqlMapClient />

 

<bean id="directorDao"

        class="myspring.ibatis.DirectorDAOImpl1"

        p:sqlMapClientTemplate- ref="sqlMapClientTemplate />

DAO 작성시 SqlMapClientTemplate 클래스를 주입 받을 수 있도록 프로퍼티와 setter메소드를 작성한다.

SqlMapClientTemplate 클래스가 제공하는 메소드를 이용해서 DAO를 작성한다.

DAO 클래스를 빈으로 설정하고 미리 설정한 SqlMapClientTemplate 빈을 전달 받도록 설정한다.

 

DirectorDAOImpl1.java

public class DirectorDAOImpl1 implements DirectorDAO {

       

        private SqlMapClientTemplate sqlMapClientTemplate;

       

        public void setSqlMapClientTemplate(SqlMapClientTemplate qlMapClientTemplate){

               this.sqlMapClientTemplate = sqlMapClientTemplate;

        }

        public List<Director> selectAllDirector() {

                sqlMapClientTemplate.queryForList("selectAllDirector");

        }

}

 

 

SqlMapClientDaoSupport 클래스이용

-       SqlMapClientTemplate 클래스를 DAO 클래스에서 좀 더 쉽게 사용할 수 있도록 SqlMapClientDaoSupport 클래스를 제공한다.

-       SqlMapClientDaoSupport 클래스가 제공하는 getSqlMapClientTemplate() 메소드를 이용해서 SqlMapClientTemplate 객체를 얻어내어 DAO를 작성한다.

-       따라서, SqlMapClientTemplate객체를 주입받을 생성자나 setter메소드가 필요 없다.

-       DAO 클래스를 빈으로 설정하고 미리 설정한 SqlMapClient빈을 전달 받도록 설정한다.

 

DirectorDAOImpl2.java

public class DirectorDAOImpl2 extends SqlMapClientDaoSupport implements DirectorDAO {

       

        public List<Director> selectAllDirector() {

               return getSqlMapClientTemplate().queryForList("selectAllDirector");

        }

              

}

 

applicationContext.xml

<bean id="sqlMapClient"

        class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"

        p:dataSource- ref="dataSource"

        p:configLocation="SqlMapConfig.xml />

 

<bean id="directorDao2"

        class="myspring.ibatis.DirectorDAOImpl2"

        p:sqlMapClient- ref="sqlMapClient />

Posted by 피곤키오
,

Aspect Oriented Programming

AOP는 프로그램 구조에 대한 다른 방식의 생각을 제공함으로써 OOP를 보완한다.

-       AOP는 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법을 말한다.

-       문제를 해결하기 위한 핵심 관심 사항[1]과 전체에 적용되는 공통관심 사항[2]을 기준으로 프로그래밍함으로써 공통모듈을 여러 코드에 쉽게 적용할 수 있도록 도와준다.

-       AOP에서 중요한 개념은 「횡단 관점의 분리(Separation of Cross- Cutting Concern)」이다.

-       OOP를 더욱 OOP답게 만들어 준다.

 

OOP

OOP에서는 황단관점 분리를 위해 공통기능들을 하나의 클래스라는 단위로 모으고 그것들을 모듈로부터 분리함으로써 재사용성과 보수성을 높인다

각 모듈로부터 공통기능으로 분리하는 것으로 성공했지만 그 기능을 사용하기 위해 공통 기능을 호출하는 코드까지는 각 모듈로부터 분리할 수 없다. 그렇기 때문에 분리한 공통 기능을 이용하기 위한 코드가 각 모듈에 횡단으로 산재하게 된다.

 

AOP

AOP에서는 핵심 로직을 구현한 코드에서 공통 기능을 직접적으로 호출하지 않는다.

AOP에서는 분리한 공통 기능의 호출까지도 관점으로 다룬다. 그리고 이러한 각 모듈로 산재한 관점을 횡단 관점이라 부르고 있다.

AOP에서는 이러한 횡단 관점까지 분리함으로써 각 모듈로부터 관점에 관한 코드를 완전히 제거하는 것을 목표로 한다.

AOP에서는 핵심 로직을 구현한 코드를 컴파일 하거나, 컴파일된 클래스를 로딩하거나 또는 로딩한 클래스의 객체를 생성할때 핵심 로직 구현 코드 안에 공통기능이 삽입된다.

-       Advice - Joinpoint에 삽입되어져 동작할 수 있는 코드.

-       Joinpoint - 「클래스의 인스턴스 생성 시점」, 「메소드 호출 시점」및 「예외 발생 시점」과 같이 애플리케이션을 실행할 때 특정 작업이 시작되는 시점으로 Advice를 적용 가능한 지점.

-       Pointcut - 여러 개의 Joinpoint를 하나로 결합한(묶은).

-       Advisor - Advice Pointcut를 하나로 묶어 취급한 것.

-       Weaving - Advice를 핵심 로직 코드에 삽입하는 것.

-       Target - 핵심 로직을 구현하는 클래스.

-       Aspect - 여러 객체에 공통으로 적용되는 공통 관점 사항.

 

스프링 API를 이용한 AOP

스프링에서 AOP를 구현하는 과정은 다음과 같다.

1.     Advice 클래스를 작성한다.

2.     설정 파일에 Pointcut을 설정한다.

3.     설정 파일에 Advice Pointcut을 묶어 놓는 Advisor를 설정한다.

4.     설정 파일에 ProxyFactoryBean 클래스를 이용하여 대상 객체에 Advisor를 적용한다.

5.     getBean( ) 메소드로 빈 객체(프록시 객체)를 가져와 사용한다.

 

 

Advice 작성

스프링 AOP는 메소드 호출 관련 Advice만 제공하며 이들 Advice는 인터페이스형태로 제공된다.

인터페이스

설명

MethodBeforeAdvice

대상 객체의 메소드를 실행하기 전에 공통기능을 실행할때 사용되는 Advice

AfterReturningAdvice

대상 객체의 메소드 실행 이후에 공통기능을 실행할때 사용되는 Advice.

ThrowsAdvice

대상 객체의 메소드가 실행하는 도중 예외가 발생할 경우 공통기능을 실행할 때 사용되는 Advice.

MethodInterceptor

위 세가지를 하나로 묶은 Advice로 메소드 실행 전, , 예외 발생시 공통 기능을 실행할 수 있다.

 

 

MethodInterceptorm로 구현하는 방법

 

PerformanceCheckAdvice.java

public class PerformanceCheckAdvice implements MethodInterceptor {

 

        public Object invoke(MethodInvocation invocation) throws Throwable {

              

               String methodName = invocation.getMethod().getName();

               long start = System.nanoTime();

               System.out.println("[Log]Method Before --> " + methodName + "time check start");

               Object o = null;

               try {

                       //대상 객체의 메소드를 실행하기 전에 사용되는 코드

                       o = invocation.proceed();

                       //대상 객체의 메소드 실행 이후에 사용되는 코드

               } catch (Exception e) {

                       e.printStackTrace();

                       System.out.println("[Log]Method Error --> " + methodName );

               }

               long end =  System.nanoTime();

               System.out.println("[Log]Method After --> " + methodName + "processing time is "+(end-start)+"ns");         

              

               return o;

        }

 

}

 

GreetingServiceImpl.java

public class GreetingServiceImpl implements GreetingService {

 

        private String greeting;

       

        public GreetingServiceImpl(String greeting) {

               this.greeting = greeting;

        }

        public void sayHello(String name) {

               System.out.println(greeting + "\t" + name);

        }

}

 

applicationContext.xml

<bean id="greetingTarget" class="myspring.aop.GreetingServiceImpl">

        <constructor-arg>

               <value>Hello</value>

        </constructor-arg>

</bean>

 

<!-- 1. Advice 빈으로 등록 -->

<bean id="performanceAdvice" class="myspring.aop.PerformanceCheckAdvice" />

 

<!-- 2. pointcut 빈으로 등록 -->

<bean id="helloPointCut"

        class="org.springframework.aop.aspectj.AspectJExpressionPointcut">

        <property name="expression">

               <value>execution(public void say*(..))</value>

        </property>

</bean>

 

<!-- 3. Advisor 설정 -->

<bean id="helloAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">

        <property name="advice">

               <ref bean="performanceAdvice" />

        </property>

        <property name="pointcut">

               <ref bean="helloPointCut" />

        </property>

</bean>

 

<!-- 4. target객체에 위빙 -->

<bean id="greeting" class="org.springframework.aop.framework.ProxyFactoryBean">

        <property name="target">

               <ref bean="greetingTarget" />

        </property>

        <property name="interceptorNames">

               <list>

                       <value>helloAdvisor</value>

               </list>

        </property>

</bean>

 

 

참고자료

-       객체지향을 넘어 관점지향으로 AOP - ZDNET

 



[1] 핵심관심사항(core concern)

-       핵심로직, 핵심 비즈니스 로직(계좌이체, 이자계산, 대출처리 등)

[2] 공통관심사항(cress-cutting concern)

-       공통기능으로 어플리케이션 전반에 걸쳐 필요한 기능(로깅, 트랜잭션, 보안 등)

Posted by 피곤키오
,

라이프 사이클

-       스프링 컨테이너에 저장되는 빈 객체는 최소한 생성,초기화, 소멸의 라이프 사이클을 갖게 된다.

-       스프링은 빈 객체의 생성, 초기화, 소멸뿐만 아니라 추가적인 단계를 제공하고 있으며 이를 통해 라이프 사이클에 따른 빈 객체의 상태를 정교하게 제어할 수 있다.

-       빈 객체의 라이프 사이클은 빈 클래스가 구현한 인터페이스와 관리되는 컨테이너에 따라 달라진다.

 

 

1.     빈의 인스턴스화(생성자 호출)

2.     필드값 설정

3.     setBeanName() 메소드 호출(BeanNameAware 인터페이스를 구현하고 있을 경우)

4.     setBeanFactory() 메소드 호출(BeanFactoryAware 인터페이스를 구현하고 있을 경우)

5.     BeanPostProcessorpostProcessBeforeInitialization() 메소드 호출 ( BeanFacotry BeanPostProcessor 클래스가 관련되어 있을 경우 )

6.     afterPropertiesSet() 메소드 호출(InitializingBean 인터페이스를 구현하고 있을 경우)

7.     Custom 초기화 메소드 호출(Custom 초기화 메소드가 정의되어 있을 경우)

8.     BeanPostProcessor postProcessAfterInitialization() 메소드 호출 (BeanFactory BeanPostProcessor 클래스가 관련되어 있을 경우)

9.     빈 사용

 

그리고 컨테이너가 종료할 때에는 다음 순서로 메소드가 호출된다.

1.     destroy() 메소드 호출 (DisposableBean 인터페이스를 구현하고 있을 경우)

2.     Custom Destroy 메소드 호출

 

BeanFactory일 때의 setBeanFactory() 단계 이후에 다음과 같은 4단계의 라이프 사이클을 추가로 수행한다.

1.     setResourceLoader() 메소드 호출 (ResourceLoaderAware 인터페이스를 구현하고 있을 경우)

2.     setApplicationEventPublisher() 메소드 호출 (ApplicationEventPublisherAware 인터페이스를 구현하고 있을 경우)

3.     setMessageSource() 메소드 호출(MessageSourceAware 인터페이스를 구현하고 있을 경우)

4.     setApplicationContext() 메소드 호출 (ApplicationContextAware 인터페이스를 구현하고 있을 경우)

 

Posted by 피곤키오
,

Spring Framework의 개요

Spring 7개의 잘 정의된 모듈들로 구성되며 전체적으로 이들 모듈은 엔터프라이즈 애플리케이션 개발에 필요한 모든 것을 제공한다. 이는 애플리케이션이 완전히 Spring 프레임워크를 기반으로 해야 하는 것은 아니다. , 애플리케이션에 적합한 모듈을 선택하여 적용하고 나머지 모듈들은 무시해도 된다. Spring 모듈은 모두 핵심 컨테이너 위에 구축되어있다. 핵심 컨테이너는 Bean 생성, 설정, 관리하는 방법을 정의하는데 이는 곧 Spring의 근본적인 기능이다.

 

 

 

Spring Core

-       Spring 프레임워크의 핵심 기능을 제공한다.

-       코어 컨테이너의 주요 컴포넌트는 Bean-Factory(Factory 패턴의 구현)이다. BeanFactory Inversion of Control (IOC) 패턴을 사용하여 애플리케이션의 설정 / 의존성 스팩을 실제 애플리케이션 코드에서 분리시킨다.

 

Spring Context

-       spring을 컨테이너로 만든 것이 핵심 모듈의 BeanFactory라면, Spring을 프레임워크로 만든 것은 컨텍스트 모듈이다. 이 모듈은 국제화된 메시지, 애플리케이션 생명주기 이벤트, 유효성 검증 등을 지원함으로써 BeanFactory의 개념을 확장한다.
이 모듈은 이메일, JNDI 접근, EJB 연계, 리모팅, 스케쥴링 등과 같은 다수의 엔터프라이즈 서비스를 추가로 제공한다. 또한 템플릿 프레임워크와의 통합도 지원한다.

 

Spring DAO

-       Spring JDBC DAO 추상 레이어는 다른 데이터베이스 벤더들의 예외 핸들링과 오류 메시지를 관리하는 중요한 예외 계층을 제공한다. 이 예외 계층은 오류 핸들링을 간소화하고, 예외 코드의 양도 줄여준다. Spring DAO JDBC 예외는 일반 DAO 예외 계층에 순응한다.

 

Spring ORM

-       선언적 트랜잭션 관리와 같은 Spring이 제공하는 다른 모든 기능을 사용해서 혼합하여 모든 O/R매퍼를 사용 할수 있다.

-       프레임워크는 여러 ORM 프레임워크에 플러그인 되어, Object Relational (JDO, Hibernate, iBatis SQL Map)을 제공한다. 이 모든 것은 Spring의 일반 트랜잭션과 DAO 예외 계층에 순응한다.

 

Spring AOP

-       AOP 제휴 호환 aspect-지향 프로그래밍 구현물을 제공 (코드를 명백하게 분리하기 위한 메소드-인터셉터와 pointcut은 논리적으로 구별되어야 할 기능을 구현)

-       소스레벨 메타데이터 기능을 사용하여 .NET속성과 다소 비슷한 모든 종류의 행위적 정보를 코드와 결합

-       설정 관리 기능을 통해 aspect 지향 프로그래밍 기능을 Spring 프레임워크와 직접 통합시킨다. 따라서 Spring 프레임워크에서 관리되는 모든 객체에서 AOP가 가능하다. Spring AOP 모듈은 Spring 기반 애플리케이션에서 객체에 트랜잭션 관리 서비스를 제공한다.

-       Spring AOP에서는 EJB 컴포넌트에 의존하지 않고도 선언적 트랜잭션 관리를 애플리케이션과 결합할 수 있다.

 

Spring Web

-       멀티 파티 기능, 서블릿 리스너를 사용한 컨텍스트 초기화 그리고 웹-기반 애플리케이션 컨텍스트와 같은 기본적인 웹-기반 통합 기능들을 제공한다.

-       웹 컨텍스트 모듈은 애플리케이션 컨텍스트 모듈의 상단에 구현되어, 웹 기반 애플리케이션에 컨텍스트를 제공한다. Spring 프레임워크는 Jakarta Struts와의 통합을 지원한다.

-       웹 모듈은 다중 요청을 핸들링하고, 요청 매개변수를 도메인 객체로 바인딩하는 작업을 수월하게 한다.

 

Spring Web MVC

-       웹 애플리케이션을 위한 Model-View-Controller 구현물을 제공 (도메인 모델 코드와 Web Form사이의 분명한 구분을 제공하고 유효성 체크와 같은 Spring 프레임워크의 다른 모든 기능을 사용하도록 허용한다.)

 

MVC 프레임워크는 완전한 기능을 갖춘 MVC 구현이다. MVC 프레임워크는 전략 인터페이스를 통해 설정할 수 있으며, JSP, Velocity, Tiles, iText, POI 같은 다양한 뷰 기술을 허용한다.

Posted by 피곤키오
,

Spring Framework

모든 Java 개발자를 대상으로 하지만 특히 Enterprise Java 개발자에 초점을 맞추고 있다.
Spring Framework
의 상당 부분이 Enterprise Java의 대안으로 활용될 수 있게 설계되었으며 이를 통해 보다 쉽게 개발할 수 있는 방법들을 제공한다.

참고로 Enterprise Java 개발자가 아닐지라도 Spring이 제공하는 기능들을 통해 보다 효율적이고 실용적인 개발을 할 수 있을 것이다.

 

Spring Framework 특징

1) AOP(기능별 모듈화, 진정한 OOP 제공)

컨테이너는 일관성을 유지시켜 주고 투명한 환경 내에서 느슨한 컴포넌트(POJO)의 집합에서 복잡한 시스템을 조립할 수 있는 능력을 제공하며 조직을 해치지 않음.

-       AOP지원을 통해 주요 비즈니스 로직과 시스템 전반에 걸친 기능 모듈을 완벽히 분리해내도록 도와준다.

 

2) IOC(Inversion of Control: 역제) 컨테이

애플리케이션 객체를 연결해 주고 자동화된 설정 및 집중화된 설정을 제공하는 가장 완전한 경량 컨테이너.

-       개발자가 직접 객체를 생성을 하지 않고, 객체의 생성에서 소멸까지 컨테이너가 관리.

-       Dependency Injection 통해 객체간의 의존성 주입.

-       EJB 컨테이너에 비해 가벼운 Ioc 컨테이너.( Lightweight 컨테이너)

 

3) Test Unit(편리한 테스트) 제공

컨테이너는 민첩함을 제공하고 지렛대 역할을 하며 소프트웨어 컴포넌트를 먼저 개발하고 고립시켜 테스트할 수 있게 함으로써 테스트와 확장성을 향상시킨다.

-       작성된 코드에 대한 단위테스트를 쉽게 있도록 도와준다

 

4) 트랜잭션

트랜잭션 관리를 위한 공통의 추상화된 레이어, 트랜잭션 관리자를 플러그인할 수 있어서 저 수준 트랜잭션을 문제없이 처리한다.

-       선언적인 트랜잭션을 지원하여 코드를 수정하지 않고도 트랜잭션을 적용 변경 가능하도록 한다.

 

5) JDBC 추상화 레이어

중요한 예외 계층을 제공하며 예외처리를 단순화시켜 코드의 양을 덜어준다.

6) ORM 프레임워크 연동 제공

Hibernate, iBatis, JDO 등과 같은 ORM 프레임워크와 통합되어 있다.

7) 좀더 쉬운 J2EE 개발 지향(저비용 유연한 코드 유지)

-       계층화된 아키텍처를 갖고 있으며, 어떤 부분도 독립적으로 사용될 있도록 모듈화 되어있다.

-       EJB 사용하든 하지 않든 관계없이 비즈니스 객체들을 효과적으로 구성하고 관리할 있도록 한다.

-       컨테이너의 API 의존적이지 않은 POJO[1] 관리.

-       자바 이외에 빈쉘, 제이루비, 그루비과 같은 스크립트 언어를 지원한다.

-       다른 여러 프레임워크와의 연동을 지원한다.

 

8) 다양한 프리젠테이션 계층 제공(jsp, velocity, excel, pdf ...)

-       프리젠테이션 계층을 위해 다중 뷰기술을 지원한다.

 

9) 좋은 설계(아키텍처) 제공

-       서블릿 기반의 MVC 프레임워크를 지원한다.

 

10) 분산(원격) 서비스

-       RMI, JAX- RPC 등과 같은 기술을 이용하여 쉽게 원격 서비스 구현이 가능하다.

 

11) 보안

 

12) 기타

-       Timer클래스나 쿼츠 스케쥴링 엔진을 이용하여 Job 스케쥴링을 지원한다.

-       JavaMail이나 제이슨 헌터의 MailMessage 이용하여 메일(Email) 지원한다.

-       다국어를 통한 국제화를 지원한다.

 

Spring Framework는 비즈니스의 목적에 부합하기 위해 다양한 컴포넌트들의 집합체이며, 상호 의존성이 없는 유연한 구조를 통해 재사용과 단위 테스트를 쉽게 해준다. 이를 통해 연관관계를 관리할 책임이 없다. 그대신, 컨테이너에 의해 컴포넌트 간의 협업을 위한 참조가 주어질 뿐이다.


[1] POJO(Plain Old Java Object)

특정 인터페이스 또는 클래스를 상속하지 않는 일반 자바 객체

Cf) Servlet 개체는 HttpServlet 반드시 상속 , EJB 개체는 SessionBeane 반드시 구현

Posted by 피곤키오
,