마치 외부에서 주입해주는 것 같다고 해서
DI(Dependency Injection) 우리말로 의존관계 주입 또는 의존성 주입이라 한다.
의존성 주입을 통해서 의존관계에 대한 고민은 외부에 맡기고 실행에만 집중하면 된다.
의존관계는 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계 둘을 분리해서 생각해야 한다.
프로그래머는 “추상화에 의존해야지, 구체화에 - 의존하면 안된다.” 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
의존관계 주입은 크게 4가지 방법이 있다.
- 생성자 주입
// 생성자 호출시점에 딱 1번만 호출되는 것이 보장된다.
// 불변, 필수 의존관계에 사용- 수정자 주입(setter 주입)
// 선택, 변경 가능성이 있는 의존관계에 사용- 필드 주입
// 코드가 간결해서 많은 개발자들을 유혹하지만 외부에서 변경이 불가능해서 테스트 하기 힘들다는 치명적인 단점이 있다.
// DI 프레임워크가 없으면 아무것도 할 수 없다.
// 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용- 일반 메서드 주입
// 한번에 여러 필드를 주입 받을 수 있다.
// 일반적으로 잘 사용하지 않는다
- @Bean - 스프링 컨테이너에 스프링 빈으로 등록
- 스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용한다. 여기서 @Bean 어노테이션이 있는 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
- 스프링 빈은 @Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.