record logo record

DI(Dependency Injection) 란?

DI는 기존처럼 개발코드 부분에서 객체를 생성(Ex. new wellcomeService())하는 것이 아니라, 팩토리 패턴처럼 객체의 생성과, 데이터를 주입만 담당하는 Factory에 해당 하는 별도의 공간에서 객체를 생성하고 데이터간의 의존성을 주입해 개발코드에서는 이를 가져다 씀으로서 의존성을 줄이는 방식입니다. 이때, Factory 패턴의 Factory Class의 역할을 스프링의 환경설정 파일이 담당합니다.

//==팩토리 클래스==//
public class DAOFactory {
    /**
     * DAOFactory클래스의 메서드는 Member 타입의 오브젝트를 어떻게 만들고, 어떻게 준비시킬지를 결정한다.
     */
    public MemberDAO memberDAO() {
        return new MemberDAO(makeConnectionMaker());
    }
}
//==메인 클래스==//
public class Main {
    public static void main(String[] args) throws Exception {
        /** 
         * 1.팩토리 객체에서 memberDAO 객체 생성, 의존성 주입
         * 2.이제 MemberDAO가 어떻게 만들어지는지, 어떻게 초기화되어 있는지에 신경쓰지 않는다.
         * 팩토리로부터 MemberDAO 오브젝트를 받아서 사용할 뿐이다.
         */
        MemberDAO memberDAO = new DAOFactory().memberDAO();
        Member member = new member();
        member.setId("memberA");
        
        memberDAO.add(member);
    }
}

위 코드를 보면 자신이 사용할 오브젝트를 선택하지도, 생성하지도 않는다. 그리고 자신이 어떻게 만들어지고 어디서 사용되는지를 알 수가 없다. 이것이 인스턴스를 제어하는 주도권이 역전(Inversion of Control) 됐다는 의미이다.

IoC(Inversion of Control) 란?

IoC 컨테이너

왜 제어의역전이 필요한가?

[참고] 오브젝트 팩토리와 애플리케이션 컨텍스트 적용의 차이

오브젝트 팩토리인 DAOFactory와 이를 수정하여 애플리케이션 컨텍스트를 적용한 것과는 어떤 차이가 있을까?

오브젝트 팩토리는 DAO 오브젝트 팩토리를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적인 역할을 수행하지만 애플리케이션 컨텍스트는 IoC를 적용하여 관리해야 하는 모든 오브젝트에 대한 생성과 관계의 설정을 수행한다.

[참고] 애플리케이션 컨텍스트의 장점은 무엇일까?