Language/Spring / / 2009. 7. 16. 16:59

Spring DI(Dependency Injection)와 AOP(Aspect Oriented Programming) 이란?

반응형

 DI와 AOP에 대해 간략히 알아보자.

Spring Framework 개요.



Spring 프레임웍은 DI,AOP와 같은 기능도 지원하고 있다.

● DI
DI 또는 Ioc(inversio Of Control) 패턴은  객체 간의 의존성을 최소화하여 관리해 주는 방식이다. 위 그림에서 Core 부분의 Ioc container에 해당한다.

그럼 여기서 의존성은 무엇일까.
예를 들어, 서비스 레이어와 DAO 레이어가 있다고 하였을 경우 서비스 레이어에서 DAO 레이어를 사용하여 구현된다고 할때,


서비스 레이어에서는

TestServiceImpl
public class TestServiceImpl {
    TestDAO testDAO = new ATestDAOImpl();
....
}

라고 직접 생성을 해야 한다.

TestServiceImpl -> ATestDAOImpl

그림으로는 TestDAO와 의존성이 있는걸로 보이지만 위처럼, ATestDAOImpl 클래스의 객체에 의존하게 된다. 이와 같은 관계가 되는 것을 의존성이라 한다.

하지만 이와 같이 직접 호출하는 것은 단위테스트가 어려워진다. TestServiceImpl 클래스를 테스트 하기 위해서는 반드시 정상 작동하는 ATestDAOImpl 클랙스가 존재해야 한다.
또한, ATestDAOImpl 클래스가 이름이 바뀌었을 경우 해당 소스 전체를 수정하고 컴파일해야 하는 문제점이 있다.

이런 의존 관계를 해결 하는 방법이 DI 이다. (해결 방법으로는 Factory 패턴이나 JNDI 등을 사용할 수도 있다.)

DI 패턴은 직접생성하는 대신 외부에서 객체 사이의 의존관계를 설정해 준다.
Spring에서는 이런 DI 패턴 적용 방법을 설정파일로 제공하며, Annotation을 사용할 수도 있다.

DI 에는 3가지로 나뉜다. Setter Injection, Constructor Injection, Method Injection 으로 나뉜다.
Setter Inject은 사용하고자 하는 Bean 에 Setter 가 존재하여 applicationContext*.xml에 설정하여 클래스를 전달하는 방식이다.

public class TestServiceImpl {
private TestDAO testDAO;

//Setter Injection
public void setTestDAO(TestDAO testDAO){
this.testDAO = testDAO;
}

//생성자를 이용한 Constructior Injection
public TestServiceImpl(TestDAO testAO) {
this.testDAO = testDAO;
}
........
}


<bean id="testService"

class="srue.TestService">

             <constructor-arg >

                           <ref local="aTestDAO"/>    <!-- Constructior Injection -->

             </constructor-arg>

             <property name=" testDAO" ref="aTestDAO" />   <!-- Setter Injection -->

</bean>

 

<bean id="aTestDAO"

class="srue.ATestDAOImpl" />



Setter Injection과 Constructior Injection 두가지 방식을 사용한 예이다.


위와 같이 XML 로 넘기기 때문에  의존성이 TestDAO에만 가지고 ATestDAOImpl에는 의존성이 없어진다. 그래서 의존성을 최소화 할 수 있고, 설정 파일 변경 만으로 ATestDAOImpl 파일 변경이라던지 BTestDAOImpl로 변경이라던지가 가능해 진다.


● AOP

Aspect Oriented Programming 관점 지향 프로그래밍? 무슨 말일까?

AOP는 공통적으로 사용하는 것들에 대한 의존 관계의 복잡성과 코드의 중복을 해소해 주는 프로그래밍 기법니다. 공통적으로 어플리케이션 전반적으로 사용하게 된다면 상속이나 패턴등 객체지향기법등으로는 한계에 부닥친다. 공통 모듈 사용이 많을 수록 의존관계가 더 심해질 것이다.

먼저 AOP에서 주로 사용하는 용어를 정리해 보자.

Aspect : 여러 객체에 공통적으로 적용되는 공통 관심사항. 예:트랜잭션이나 보안 등

Advice: Aspect를 핵김 로직에 적용할지 정의. 예 : 메소드 호출전에 트랜잭션 시작.

Joinpoint : Advice 적용 가능한 지점. 예: 메소드 호출, 필드값 변경

Pointcut : Joinpoint 의 부분집합. Advice가 적용되는 Joinpoint

Weaving : Adivce를 핵심로직 코드에 적용하는 것.

중요한 점은 Aspect가 핵심로직 구현 클래스에 의존하지 않는다는 것이다. 설정 파일이나 설정 클래스 등을 이용하여 Aspect를 여러 클래스에 적용할 수 있도록 하고 있다,

 <bean id="logging" class="srue.LogginAspect" />

 <aop:config>
        <aop:pointcut id="managerTx" expression="execution(* *..*Service.*(..))" />
        <aop:aspect id="loggingAspect" ref="logging">
<aop around pointcut-ref="managerTx" method="logging" />
        </aop>
 </aop:config>



반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유