구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다.
코드 재사용성을 높이고 모듈간 결합도를 낮춘다.
객체 협력간 생기는 결합도
- 컴파일타임 의존성 : 코드작성 시점에서 발생,
- 런타임 의존성 : app 실행 시점에서 발생.
- 생성자 주입
- 세터 주입
- 필드에서 주입
부가적으로 @Autowired를 활용하는 방법이 있는데 각각의 방법에 애노테이션을 붙이면된다. 만약 생성자의 경우 단일생성자라면 자동으로 붙여준다.
- 초기화시 모든 의존관계를 형성하여 안전함
- 잘못된 패턴을 찾을 수 있음
- 테스트가 쉽다
- 불변성을 확보할 수 있다
객체와 객체간의 연결을 할때 본인이 필요한 객체를 직접 명시하는 것이 아니라,
이 연결을 관리하는 프레임워크를 두어서 제어에 대한 권한을 역전시키는 것.
이로서 객체간의 연결에 대한 책임에서 벗어나서 결합도가 낮춰지는 효과를 얻고, 이로 인해 수정 등이 쉬워진다.