티스토리 뷰

728x90
짧게 정의 내리자면..
불필요한 의존 관계가 생기지 않도록 하거나 최대한 줄여주는 것이다
(A 클래스에서 B 클래스의 속성이나 기능을 사용하기 위해서 직접 new 하지 않는다는 것이다)

여기서 얘기하는 의존 관계라는 것은 각 클래스간의 결합(?) 정도라고도 할 수 있을 것 같다

한 클래스에서 다른 클래스를 이용하는 방법에는 여러가지가 있다

1. 직접 호출

public class A {
    public void method() {
        AlphabetDao dao = new BAlphabetDao();
        dao.xxxx;
        .....
    }

이런 경우에 BAlphabetDao 클래스가 오류없이 제대로 동작되어야 하고 만약 CAlphabetDao 클래스로 바뀔 경우 소스를 수정해야 하는 단점이 있다

2. Factory 패턴

public class A {
    public void method() {
        AlphabetDao dao = AlphabetDaoFactory.create();
        dao.xxxx;
        .....
    }

팩토리 클래스를 이용한 방법이다 
이 경우는 C 클래스가 수정되더라도 A 클래스에서 직접 수정하지 않아도 되지만 팩토리 클래스에 대한 의존 관계가 생기게 된다

3. 조립기(Assembler) 사용 <== DI 패턴

public class A {
    private AlphabetDao dao;

    public A(AlphabetDao dao) {
        this.dao = dao;
    }

    .....
}

A 클래스는 의존 클래스를 생성하거나 팩토리를 이용하지도 않았다
A 클래스는 단지 의존 클래스를 전달 받을 수 있는 메소드나 생성자만을 제공한다

public class Assembler {
    public AlphabetDao getAlphabetDao() {
        AlphabetDao dao = new BAlphabetDao();
        AService service = new A(dao);
        return service;
    }

조립기가 직접 A클래스에 BAlphabetDao 클래스를 넣어준다
위 코드는 조립기 클래스에서 직접 BAlphabetDao라고 입력했지만
XML 등을 이용해서 완전 외부 환경설정 형식으로 사용할 수 있도록 바꿔주면 된다

이렇게 하면 A 클래스 입장에서는 AlphabetDao 인터페이스에만 의존하게 되고 다른 클래스와는 상관없게 된다

또 DI 패턴을 사용하면 단위 테스트가 수월해 진다고 한다

참고로 이런 조립기를 프로그래머가 직접 만들어 쓸수도 있겠지만 복잡하고 힘드므로
DI 패턴을 지원해주는 프레임워크를 사용하는 것이 좋다고 한다

아직까지는 제대로된 프로젝트도 못해보고 공부만 하는 상황이라 확~ 와닿지는 않는다
팩토리 방식과 비교해서 그다지 좋아보이지도 않고.. 

'프로그래밍 > Spring' 카테고리의 다른 글

[Spring] 파일 업로드  (3) 2011.08.17
[Spring] 파일 다운로드  (2) 2011.08.17
[Spring] 기본 설정  (1) 2011.07.27