본문 바로가기

Java/Spring

Spring 3.0 프로그래밍 챕터1

3. DI(dependency Injection)

DI는 객체 사이의 의존 관계를 객체 자신이 아닌 외부의 조립기가 수행한다는 개념이다.


 위 그림의 WriteArticleServiceImpl클래스에서 ArticleDao인터페이스로 구현한 MysqlArticleDao 클래스 객체 또는 OracleArticleDao 클래스 객체를 의존하게 된다. MysqlArticleDao를 클래스 객체를 의존하게 된다면 실제 메모리에서 생성된 객체는 [그림 1.2]와 같이 의존 관계를 형성하게 된다.

 


코드에 직접 의존 클래스를 명시하는 것이 손쉬운 방법이긴 하지만 단위 테스트를 어렵게 만들고 articleDao 멤버 필드에 객체를 할당할 수 없기 때문에 클래스를 테스트하기 위해서는 반드시 올바르게 동작하는 MysqlArticleDao 클래스가 존재해야 한다.


 


그림 1.3 DI패턴에서는 조립기(Assembler)가 객체 간의 의존 관계를 관리

[그림 1.3]에서 WriteArticleServiceImpl 클래스의 코드는 MysqlArticleDao객체를 생성하거나 검색하기 위한 코드가 포함되어 있지 않다. 대신, 조립기의 역할을 하는 Assembler MyArticleDao객체를 생성한 뒤 WriteArticleServiceImpl객체에 전달해 주게 된다. 이렇게 조립기가 의존 관계를 관리해주는 방식을 DI패턴이라고 한다.

 -  Factory패턴과 DI패턴의 차이

Factory패턴 : 구현 클래스에 대한 의존 관계는 줄일 수 있지만, 대신 Factoru클래스에 대한 의존 관계가 추가된다.

DI 패턴 : WriteArticleServiceImpl클래스는 오직 ArticleDao 인터페이스만 의존하게 되며 그 회는 의존하지 안게 된다.

 

단위 테스트를 수월하게 수행하는 하려면 가짜 객체를 이용하여 클래스를 테스트한다. 그러면 완성된 클래스가 없이 단위 테스트를 수행할 수 있다. 단위 테스트는 코드의 품질을 향상시키고 개발 속도를 증가시키는데 도움이 되기 때문에, 중요한 장점이 된다.

 

4. AOP

어플리케이션을 개발하다 보면 여러 부분에 걸쳐서 공통으로 사용되는 기능이 필요한 경우가 있다. 예를 들어, 로깅이나, 트랜잭션 처리, 보안과 같은 기능은 대부분의 어플리케이션에서 필요로 한다. 이런 공통 관심 사항들은 객체 지향 기법을 사용해서 여러 모듈에 효과적으로 적용하는 데는 한계가 있으며, 이런 한계를 극복하기 위해 AOP라는 기법을 사용한다.

 


그림 1.4 공통으로 사용되는 모듈에 대한 복잡한 의존 관계

 

[그림 1.4]에서 볼 수 있듯이 어플리케이션 전반에 걸쳐서 공통으로 사용되는 기능이 많아 질수록, 그리고 공통 모듈을 사용하는 클래스가 많아 질수록 의존 관계는 점점 복잡해 질 것이다.

또한, 공통 모듈을 사용하는 코드가 여러 곳에서 중복되는 문제도 발생한다.

AOP(Aspect Oriented Programming)는 공통의 관심 사항을 적용해서 발생하는 의존 관계의 복잡성과 코드 중복을 해소해 주는 프로그래밍 기법이다. 각 클래스에서 공통 관심 사항을 구현한 모듈에 대한 의존 관계를 갖기 보다는, Aspect를 이용하여 핵심 로직을 구현한 각 클래스에 공통 기능을 적용하게 된다.

그림 1.5 AOP에서는 공통 관심 사항을 구현한 모듈에 의존 관계를 갖지 않는다.

 

    
AOP에서 중요한 점은 Aspect가 햄심 로직 구현 클래스에 의존하지 않는다는 첨이다. 일반적으로 AOP에서는 설정 파일이나 설정 클래스 등을 이용하여 Aspect를 여러 클래스에 적용할 수 있도록 하고 있다. 따라서, 하나의 Aspect를 개발하게 되면 여러 클래스를 수정할 필요없이 여러 클래스에 적용할 수 있다.

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

form으로 파일 전송  (0) 2012.06.28
spring + freemarker  (0) 2012.06.22
Spring 3.0 프로그래밍 챕터3  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터2  (0) 2011.05.31
XML을 출력하자  (0) 2011.05.20