Spring 학습의 의존 주입

2534 단어

Spring 학습의 의존 주입


주입에 의존하는 기본 개념


의존 주입(Dependecy Injection)은 IoC(Invert of Control)라고도 부르며 기존 대상 대상 개발과는 다른 사상으로 주로 응용에 대한 디커플링에 사용된다.간단하게 이해하면 원래는 응용 서비스 자체가 만든 대상이고 데이터는 제3자에게 맡겨 창설, 준비를 하고 제3자가 대응하는 내용을 응용 서비스에 주입함으로써 대상의 창설이 대상의 응용 간의 결합을 실현했다. 이런 방식을 통해응용 서비스는 대상 실체와의 이전의 관련(사용만 하면 되고 그 출처, 대응하는 실현 등에 무관심)을 최소화하여 응용 서비스와 대상 간의 약한 결합 관계를 유지할 수 있다.

주입에 의존하는 간단한 실현


문자의 표현을 통해 의존 주입에 대한 이해가 잘 되지 않을 수도 있지만 간단한 코드를 통해 쉽게 이해할 수 있다. 다음은 원시적인 방법과 의존 주입에 대한 방법을 비교하여 의존 주입에 대한 이해를 깊이 있게 한다.
/**
*  
*/
class LogService{

    //  , LogDao 
    private LogDao logDao = new DBLogDao(); 

    public void save(){
        logDao.save();
    }
}

/**
*   DAO 
*/
interface LogDao{

    void save();
}

/**
*   DAO , 
*/
class DBLogDao implements LogDao{

    @Override
    public void save() {
        System.out.println("Save to Database");
    }
}


위의 코드에서 볼 수 있듯이 LogDao 대상이 필요할 때 서비스에서 구체적인 실현을 직접 만든다. 즉new DBLogDao(). 이런 방식은 편리하지만 어느 정도 단점이 있다. 예를 들어 대응하는 실현을 전환하고 싶을 때, 예를 들어 XMLLogDao를 바꾸려면 대응하는 코드를 열고 XMLLogDao 대상을 만들고 이를 LogService에 맡겨야 한다.그리고 만약에 LogDao의 창설 과정이 비교적 번거로울 때 LogService는 이런 실현 방식에서 LogDao의 실현 과정을 알아야 한다. 이것은 분명 합리적이지 않다. 왜냐하면 LogService는 LogDao의 존재와 사용 방식만 알면 되고 창설 과정을 알 필요가 없기 때문이다.
다음은 주입에 의존하거나 반전을 통제하는 것이 이런 문제들을 어떻게 해결하는지 살펴보자.

class LogService{

    //  , 
    private LogDao logDao;

    //  LogDao LogService , 
    //  
    public void setLogDao(LogDao logDao) {
        this.logDao = logDao;
    }

    public void save(){
        logDao.save();
    }
}

// LogDao DBLogDao , 

/**
*  , , 
*/
class Container{

    public void create(){
        
        //  
        LogService logService = new LogService();
        LogDao logDao = new DBLogDao();

        //  LogDao 
        logService.setLogDao(logDao);
    }
}


아마도 여기에서 create 방법에서도 수동으로 DBLogDao 대상을 만들었다고 생각할 것이다. 사실은 그렇지 않다. create 방법에 대해 말하자면 대상의 용도를 상관하지 않고 대상의 용도를 상관하지 않는다. 즉, 여기서 create 방법은 여러 가지 다른 수단을 통해 반사 기술을 활용하고 프로필을 통해 대응하는 종류의 정보를 설정할 수 있다. 이렇게 하면 구체적인 실현을 수정해야 할 때프로필만 수정하면 create는 해당하는 대상을 만들고 이를 LogService에 주입합니다. 이 과정은 LogService에 투명합니다. LogService는 자신이 LogDao의 대상이 있다는 것만 알고, LogDao 대상이 어떻게 생겼는지 알 필요도 없습니다.창설과 사용의 결합을 실현한 것이다.
반전을 제어하는 명사에 대해서도 명백하잖아요. 원래는 LogService가 직접 만든 대상이었는데 지금은 Container에게 맡겨서 만들었어요. 그러면 대상을 만드는 권한은 반전이 아니에요
일반적으로 의존 주입에는 세 가지 방식이 있는데 그것이 바로 속성 주입이다. 즉, 위에서 우리가 본 내용이고 또 하나는 구조기 주입이다. 즉, 구조기를 통해 대응하는 대상을 주입하고 자주 사용하지 않는 인터페이스 주입이다. 사실 본질적으로도 속성 주입에 속한다.

좋은 웹페이지 즐겨찾기