2011년 7월 12일 화요일

Spring 3.x 객체 관리

Dependency Injection(DI)
객체 간의 의존 관계를 객체 자신이 아닌 외부의 조립기가 수행해 준다는 개념
실제로 의존하는 객체를 지정하는 가장 간단한 방법은 코드에 직접 명시하는 것, 그러나 단위 테스트를 어렵게 만드는 단점이 있다.- mock 객체를 활용하려면 코드를 직접 수정해야 한다. 또 다른 단점으로는 의존하는 클래스가 변경되는 경우 코드를 변경해야 하는 문제가 있다.
다른 방법으로는 Factory나 JNDI를 사용해서 의존 클래스를 검색하는 방법이다. 이 방법은 외부의 설정 파일을 사용할 수 있고, 시스템 프로퍼티를 사용할 수도 있다.
마지막 방법은 외부의 조립기를 사용하는 것, 의존 관계에 있는 객체가 아닌 외부의 조립기가 각 객체 사이의 의존 관계를 설정해 준다. 이와 같이 외부의 조립기가 의존 관계를 관리해 주는 방식을 Dependency Injection이라고 한다.
의존하는 객체를 조립기가 삽입(iinject)해 주기  때문에 이 방식을 DI 패턴이라 부른다. 비슷한 의미로 IoC(Inversion of Control)이라고도 표현한다.

AOP
여러 부분에 걸쳐서 공통으로 사용되는 기능이 필요한 경우, 예를 들어 로깅이나, 트랜책션 처리, 보안과 같은 기능.
핵심 로직을 구현한 클래스를 실행하기 전, 후에 Aspect를 적용하고, 그 결과로 핵심 로직을 수행하면 그에 앞서 공통 모듈을 실행하거나 또는 로직 수행 이후에 공통 모듈을 수행하는 방식으로 공통 기능을 실행하게 된다.
Aspect가 핵심 로직 구현 클래스에 의존하지 않는다는 점이 중요한 점이다.

Spring Container
객체를 담아두고, 필요할 때에 컨테이너로부터 객체를 가져와 사용
“org.springframework.beans.factory.BeanFactory” Interface는 빈 객체를 관리하고 각 빈 객체간의 의존 관계를 설정해 주는 기능을 제공하는 가장 단순한 컨테이너.

Resource Implement Class
  • FilesystemResource
  • InputStreamResource
  • ClassPathResource
  • UrlResource
  • ServletContextResource


“org.springframework.context.ApplicationContext” Interface는 BeanFactory Interface 상속, 빈 객체 라이프 사이클, 파일과 같은 자원 처리 추상화, 메시지 지원 및 국제화 지원, 이벤트 지원, XML 스키나 확장을 통한 편리한 설정 등 추가적인 기능을 제공.

“org.springframework.web.context.WebapplicationContext” Interface는 웹 어플리케이션을 위한 ApplicationContext로서 하나의 웹 어플리케이션마다 한개 이상의 WebApplicationContext를 가질 수 있다.

Bean 생성과 의존 관계 설정
  1. 싱글톤 패턴이 적용된 클래스인 경우 factory-method=”getInstance”
  2. 생성자 지정은 <constructor-arg>, Java 기본형인 경우 <value> 그 외는 <ref>을 사용
  3. 생성자 전달 파라미터가 2개이상이면 개수만큼 <constructor-arg>을 사용
  4. Spring은 <value>에 전달되는 값을 String 타입으로 처리한다. 지정하고 싶다면 <value type=”long”>과 같이 사용
  5. <constructor-arg>, <property> 태크에 <bean> 태그을 사용할 수 있음.
  6. property 설정 방식도 유사함


Lookup Method 사용방법
<bean id="processor" class="madvirus.spring.chap02.Processor">
<lookup-method name="getCommandFactory" bean="commandFactory" />
</bean>

- 접근 수식어가 public이나 protected 여야 한다.
- 리턴 타입이 void가 아니다.
- 인자를 갖지 않는다.
- 추상 메서드여도 된다.
- final이 아니다.

public class Processor {
public void process(String commandName) {
CommandFactory factory = getCommandFactory();
Command command = factory.createCommand(commandName);
command.execute();
}
protected CommandFactory getCommandFactory() {
return null;
}
}

의존 관계 자동 설정
스프링은 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정 할 수 있는 기능을 제공하고 있으며, 이를 통해 설정 파일의 크기를 줄일 수 있다.  하지만 코드를 리팩토링할 경우 올바르게 동작 하지 않을 수 있기 때문에 신중히 사용해야 한다.
  • byName: 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정한다.
  • byType: 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정한다.
  • constructor: 생성자 파라미터 타입과 같은 타입을 갖는 빈 객체를 생성자에 전달한다.
  • autodetect: constructor 방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정한다.


부모 Bean을 통한 설정 재사용
<bean>의 parent 속성을 이용하여 부모의 설정을 재사용 할 수 있다. parent의 속성중 변경하고 싶은 값이 있다면 추가로 입력해주면 된다.

Bean 객체 범위
Spring은 기본적으로 하나의 빈 설정에 대해 한 개의 객체만을 생성한다. 여기서 한 개의 객체란 싱글톤을 말하는게 아니고 bean의 id 또는 name에 따라 하나의 객체를 말한다. <bean>의 scope 속성을 이용하여 빈 객체에 범위를 지정해서 객체 생성 여부를 지정할 수 있다.
  • singleton: 스프링 컨테이너에서 한 개의 빈 사용
  • prototype: 빈을 사용할 때 마다 객체를 생성
  • request: HTTP 요청 마다 빈 객체를 생성
  • session: HTTP 세션 마다 빈 객체를 생성
  • global-session: 글로벌 HTTP 세션에 대해 빈 객체를 생성


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

외부 설정 프로퍼티
“PropertyPlaceholderConfigurer” 클래스을 빈으로 등록하거나  <context:property-placeholder> 태그를 사용하여 외부의 프로퍼티 파일에 저장된 정보를 스프링 설정 파일에서 사용할 수 있다.

<context:property-placeholder location="classpath:config/jdbc.properties" />

<bean id="dataSourceFactory" class="madvirus.spring.chap02.DataSourceFactory">
<property name="jdbcDriver" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>

컨테이너 간 계층
BeanFactory나 ApplicationContext는 컨테이너간 자식-부모의 계층 구조를 가질 수 잇다. 컨테이너간 계층 구조를 구성하면, 자식 컨테이너는 부모 컨테이너에 정의된 빈 객체에 접근할 수 있다. 반면에 부모 컨테이너에서는 자식 컨테이너에 정의된 빈 객체에 접근할 수 없다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...