Spring DI(Dependency Injection)와 AOP(Aspect Oriented Programming) 맛보기

[출처] http://suecream.tistory.com/entry/Spring-DIDependency-Injection%EC%99%80-AOPAspect-Oriented-Programming-%EB%A7%9B%EB%B3%B4%EA%B8%B0

Spring

Spring이란 무엇인가?엔터프라이즈 어플리케이션에서 필요로 하는 기능을 제공하는 프레임 워크이다.

J2EE에서 제공하는 다양한 기능 뿐만 아니라, DI, AOP와 같은 기능도 지원하고 있다.

특징

1. 스프링은 경량 컨테이너 이다.

스프링은 자바 객체를 담고 있는 컨테이너이다. 스프링은 이들 자바 객체의 생성, 소멸과 같은 라이프 사이클을 관리하며, 스프링으로부터 필요한 객체를 가져와 사용할 수 있다.

2. 스프링은 DI패턴을 지원한다.

스프링은 설정 파일을 통해서 객체간의 의존 관계를 설정할 수 있도록 하고 있다. 따라서 객체는 직접 의존하고 있는 객체를 생성하거나 검색할 필요가 없다.

3. 스프링은 AOP를 지원한다.

스프링은 자체적으로 AOP를 지원하고 있기 때문에 트랜잭션이나 로깅 보안과 같이 여러 모듈에서 공통적으로 필요로 하지만 실제 모듈의 핵심이 아닌 기능들을 분리해서 각 모듈에 적용할 수있다.

4. 스프링은 POJO를 지원한다.

스프링 컨테이너에 저장되는 자바 객체는 특정한 인터페이스를 구현하거나, 클래스를 상속받지 않아도 된다. 따라서 기존에 작성한 코드를 수정할 필요없이 스프링에서 사용할 수 있다.

5. 트랜잭션 처리를 위한 일관된 방법을 제공한다.

JDBC를 사용하든, JTA를 사용하든 또는 컨테이너가 제공하는 트랜잭션을 사용하든, 설정 파일을 통해 트랜잭션 관련 정보를 입력하기 때문에, 트랜잭션 구현에 상관없이 동일한 코드를 여러 환경에서 사용할 수 있다.

6. 영속성과 관련된 다양한 API를 제공한다.

스프링은 JDBC를 비롯하여 iBatis, 하이버네이트등 데이터베이스 처리와 관련하여 널리 사용되는 라이브러리와의 연동을 지원하고 있다.

7. 다양한 API에 대한 연동을 지원한다.

스프링은 JMS, 메일, 스케쥴링등 엔터프라이즈 어플리케이션을 개발하는데 필요한 다양한 API를 설정 파일을 통해서 손쉽게 사용할 수 있도록 하고 있다.

8. 자체적으로 MVC프레임워크를 제공한다.

때문에 스프링만 사용하면 MVC기반의 웹어플리케이션을 어렵지 않게 개발할수 있다.

Spring Framework의 설치와 모듈 구성

1. http://Springframework.org/download 에서 최신 버전을 다운 받는다 (현재: 2.5.6)

2. 압축을 푼다

dist폴더 : 스프링 Jar파일을 포함하고 있는 폴더

lib폴더 : 스프링을 사용하는 필요한 모든 외부 라이브러리를 포함하고 있는 폴더

docs폴더 : 스프링 레퍼런스 및 API Javadoc를 포함하고 있는 폴더

DI(Dependency Injection과 Spring Framework)

객체사이의 의존 관계를 객체끼리 직접하는것이 아니라, 외부 조립기가 수행한다는 개념

의존 관계 처리 방법 3가지

1. 코드에 직접 의존 객체 명시 AbstractDAO dao = new LoginDAO();

2. Factory 패턴이나 JNDI등을 사용해 클래스를 명시 (EJB같은곳에서 사용)

AbstractDAO dao = DAOFactory.create();

3. 외부 조립기를 사용 (Dependency Injection - DI 패턴 ~Inversion of Control)

외부 조립기를 사용하는 이 방법은 불필요한 의존 관계를 없애주는 좋은 방법이다.

DI패턴을 이용하면 직접적으로 객체에 의지 하지 않고 인터페이스에만 의존하게 된다.

DI패턴 적용 두가지 방법

1. 생성자 방식을 이용하여 설정

2. 설정 메소드를 이용하여 설정 (setter)

2. 스프링 설정 파일을 이용하여 의존 관계 설정(applicationContext.xml))

<bean name="writeArticleService"

class="kame.spring.chap01.WriteArticleServiceImpl">

<constructor-arg>

<ref bean="articleDao" />

</constructor-arg>

</bean>

<bean name="articleDao"

class="kame.spring.chap01.MysqlArticleDao">

</bean>

의 의미는

MySqlArticleDao articleDao = new MyArticleDao();

WriteArticleServiceImpl writeArticleService = new WriteArticleServiceImpl (articleDao);

위와 같은 xml 선언을 통해 WriteArticleServiceImpl객체와 MySqlArticleDao객체 사이의 의존 관계를 설정하였다.

//이렇게 설정하면 스프링 컨테이너로 부터 빈 객체를 가져와서 사용 할 수 있다.

Resource resource = new ClassPathResource("applicationContext.xml");

BeanFactory beanFactory = new XmlBeanFactory(resource);

WriteArticleService articleService =

(WriteArticleService) beanFactory.getBean("writeArticleService");

articleService.write(new Article);

이것을 제어 역행이라고 하는데, 스프링 프레임 워크의 핵심이다.

의존성을 띄는 객체를 내가 생성하는 것이 아니라,
내가 주입 받는것이다. 따라서 내가 원래 그 객체를 생성하고 살리고 하는 주제 제어자 였는데,

Dependency Injection에 의하여 내가 주입을 받는 대상자가 되어 버렷다.

따라서 저어가 역행하게 된것이다.

결합된 코드 즉, 밀접하게 연관이 된 코드는 테스트하고 재 사용 시 어려우며 이해하기도 어렵다. 때문에 결합도를 낮추어서 의존하는 객체들 간 협업을 조정하는 책임이 객체 자체로부터 분리되어 나간 을 말한다.

스피링에서 AOP

1. POJO AOP

기존 우리 클래스() 공통적으 사용 필요성 있을

, 트랜잭, 공통 (Common Class, Common Method ) 여러 객체들에 접근하 사용하 일일 생성하 메소드 러서 써야 .

사용자 입력(, , , 개인정보 대하 필드 통해 입력 받을) String객체 암호 프로세스 간단 프로그램 있다 가정할, 각각 정보들 대하 일일 암호화하(동일 암호 알고리즘으..) 프로세스 거쳐 (적절 예인지 모르겠;;) 생성 객체 대하 일일 메소드 넣은 받아 와야 번거로움 생기, 복잡 의존성 불필요하 가지 . 갑작스러 요구 사항 변경으 필드 추가하거, 필드 삭제하 메소드 부르 작업 하거 삭제 해야 . (깜빡하 삭제하 않으 당연 엑셉션 발생하 )

효율 틀림없.

때문 나온 AOP 기법이.

AOP(Aspect Oriented Programming) 관심사항 대하여 발생하 복잡성 중복 해소 프로그래 기법이.

여기 중요 개념 Aspect, Aspect 모듈 로직 구현 클래스 적용된.

(써놓 난해하;;;)

한마디 관심사 관해서 관심사 사용 객체들 관심( ) 접근하 프로그램 복잡도 증가 시키, 코드 중복 시키 결합도 객체지향적이 못해지 요인으 작용하므, 그렇 ( 관심사 사용 놈들 생성해 지지 ) 외부에 이쁘 처리하~! 이말이.

< 관심 클래> - 아래 클래스 우리 관심사로 사용 클래 .

public class LoggingAspect {

private Log log = LogFactory.getLog(getClass());

public Object logging(ProceedingJoinPoint joinPoint) throws Throwable {

log.info("기록시작);

StopWatch stopWatch = new StopWatch();

try {

stopWatch.start();

Object retValue = joinPoint.proceed();

return retValue;

} catch (Throwable e) {

throw e;

} finally {

stopWatch.stop();

log.info("기록종료);

log.info(joinPoint.getSignature().getName() + "메소드실행시간: "

+ stopWatch.getTotalTimeMillis());

}

}

}

그렇다 이놈 일일 사용 객체들에 접근하 어떻 ?

<bean id="logging" class="kame.spring.chap01.LoggingAspect" />

<aop:config>

<aop:pointcut id="servicePointcut" expression="execution(* *..*Service.*(..))" />

<aop:aspect id="loggingAspect" ref="logging">

<aop:around pointcut-ref="servicePointcut" method="logging" />

</aop:aspect>

</aop:config>

이렇 , expression="execution(* *..*Service.*(..))" /> 의해 Service 끝나 인터페이스 구현 객체들 대하 우리 관심 객체 적용 된다.

. . 자세 내용 해보아 . DI AOP맛보기 ~!

( : 최범균님 Spring 2.5 Programming, Spring in Action 이해하 잘되 두책 번갈 보면 공부하 효율적이. 그리 출판사에 나오 서적들 매력 느낀 . . Struts 그랫 . . EJB3.0 그렇 . .)

+ Recent posts