
- HelloController는 HelloService라는 인터페이스를 사용함으로써 소스 코드를 변경하지 않고도 기능을 바꿔달 수 있음
- DI란 두개의 의존관계가 있는 객체를 Assembler가 런타임시에도 주입을 통해서 관계를 맺어주는 것.
- 다만 소스코드에선 인터페이스만 이용하기 때문에 어떤 구현 클래스를 사용하는지는 알 수가 없음. 둘 사이의 연관 관계를 만들어주는 작업이 필요함. 그 작업을 DI라고 하는 것. 동시에 그 DI를 수행해줄 수 있는 [제3의존재]가 필요함. 그 [제3의존재]를 바로 Assembler라고 함
- 즉, HelloController가 내부에서 new 키워드로 인스턴스 객체를 생성하게끔 하는 것이 아니라, 외부(Assembler)에서 인스턴스 객체를 생성해 주입해주는 것. 이게 바로 DI이며 이 작업을 해주는 것을 Assembler라고 하는 데, Assembler == 스프링 컨테이너!
- 원래는 아무런 관계가 없는 객체들 사이에 의존관계를 만들어주는 것! 그걸 DI라고 하며 스프링 컨테이너는 이러한 역할을 하는 존재
- 스프링 컨테이너의 역할
- 우리가 meta정보를 주면 그걸 가지고 클래스의 싱글톤 객체를 생성함
- DI 의존관계주입을 수행함
- 서블릿 컨테이너는 서블릿 객체를 만들어 직접 집어넣었던 반면, 스프링 컨테이너는 meta 정보를 받아서 직접 객체를 생성
- 보통 DI 방식엔 생성자 주입, 팩토리 메소드 주입, 세터 메소드 주입 등이 있음