객체의 생명주기(생성, 소멸 등)의 관리를 개발자가 직접 하는것에서 프레임워크가 하도록 위임한다.
A클래스와 B클래스가 있을때, B클래스에서 A클래스의 객체를 사용하는 형태로 설계가 되어있을때, 사용자는 코드에서 new 연산자를 통해 인스턴스를 생성해 주고, B클래스의 인스턴스에 클래스의 인스턴스를 넣어주어야한다. 이를 IoC컨테이너가 해소해주고, 코드 사이 결합도가 낮아진다.
의존성 주입에는 세 가지가 있다
- 필드 주입
- 세터 주입
- 생성자 주입
생성자 주입에는 필드에 final 키워드를 사용할 수 있다. final 키워드를 쓰려면 그 필드가 초기화 될거라는 보장이 있어야 하는데, 필드에 참조하는 빈을 선언하고 생성자에서 초기화 하는 코드가 작성이 가능하기 때문에 생성자주입만 유일하게 final 키워드를 쓸 수 있다.
순환 참조 발생시 필드주입과 세터주입은 메소드 실행 시점에만 에러가 발생하지만, 생성자 주입은 애플리케이션 실행 시점에 확인이 가능하다.
순환참조 : A클래스가 B클래스의 Bean을 주입받고, B클래스가 A클래스를 주입받는 상황처럼 순환되어 참조하는 경우.
관점 지향 프로그래밍
클래스들 간의 중복되는 코드를 aspect라고 한다.
이러한 aspect를 클래스마다 작성하는것이 아닌, 하나의 클래스에 작성하고 스프링 컨테이너가 필요한 위치에 소스코드를 넣어서 실행해준다.
낮은 결합도와 높은 응집도를 갖게 해준다.
특정 기술에대한 종속성을 낮추기 위해 만들어진 기술.
구현부분을 숨기고, 사용자에게 편의성을 제공한다. 추후에 기술이 변경되어 내부적으로 코드의 수정이 일어나도 구현되는 부분만 변경이 되므로, 사용자가 작성한 코드의 변경이 불필요하다.