DI(Dependency Injection) 란?
- 의존 관계 주입 을 의미한다.
- 객체 간의 의존 관계 를 만드는 것이다.
- Spring의 IOC 컨테이너의 구체적인 구현 방식이다.
- 스프링 프레임워크는 런타임시 사용할 객체들의 의존 관계를 부여 한다.
- 객체 간의 결합도를 낮춘다.
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) 란?
- 역전 제어, 즉 인스턴스를 제어하는 주도권이 역전 된다는 의미
- 컴포넌트를 구성하는 인스턴스 생성과 의존 관계 연결을 개발자의 소스 코드가 아닌 DI 컨테이너가 대신해 주기 때문에 제어가 역전되었다고 정의함
IoC 컨테이너
- 스프링 빈의 생성, 관계, 조립, 생명주기를 관리하는 스프링 프레임워크의 핵심
- 의존관계주입(Dependency Injection) 을 이용하여 어플리케이션을 구성하는 컴포넌트들을 관리한다.
- 인터페이스와 외부 메타 정보를 결합해 의존성을 해결하는 기술
- 스프링 프레임워크가 제공하는 IoC 컨테이너를 통해 인스턴스의 생명주기 관리 및 의존 관계 주입을 처리한다.
왜 제어의역전이 필요한가?
- 생성자 호출 뿐만 아니라, 생성된 객체의 생명주기 관리까지 모든 객체에 대한 제어권을 프레임워크(컨테이너)에게 주면서 개발자는 비즈니스 로직에만 신경 쓸 수 있도록 해주기 때문이다.
[참고] 오브젝트 팩토리와 애플리케이션 컨텍스트 적용의 차이
오브젝트 팩토리인 DAOFactory와 이를 수정하여 애플리케이션 컨텍스트를 적용한 것과는 어떤 차이가 있을까?
오브젝트 팩토리는 DAO 오브젝트 팩토리를 생성하고 DB 생성 오브젝트와 관계를 맺어주는 제한적인 역할을 수행하지만 애플리케이션 컨텍스트는 IoC를 적용하여 관리해야 하는 모든 오브젝트에 대한 생성과 관계의 설정을 수행한다.
[참고] 애플리케이션 컨텍스트의 장점은 무엇일까?
- 클라이언트가 구체적인 팩토리 클래스를 알 필요가 없다.
- 오브젝트 팩토리의 개수가 많아져도 어떤 팩토리 클래스를 생성해야 하는지, 필요할 때마다 팩토리 오브젝트를 생성해야 하는 번거로움이 없다.
- 종합적인 IoC 서비스를 제공한다.
- 오브젝트의 생성과 관계 설정뿐만 아니라 오브젝트가 만들어지는 방식, 시점과 전략, 부가적인 자동생성, 오브젝트에 대한 후처리 기능 그리고 인터셉터의 수행 등 다양한 기능을 제공한다.