Dependency Inject
개발자가 객체간 의존성을 직접 호출하는 대신 스프링 컨테이너에서 생성하여 넣어주는 방식
인터페이스를 사이에 두어 클래스 레벨에서 의존관계가 고정되지 않고, 런타임 시 관계를 동적으로 주입하여 유연성
을 확보하고 결합도
를 낮춘다.
의존성 주입에 사용되는 Annotation에는 @Autowired
, @Inject
, @Resource
가 있다.
1 | public class Contoller { |
1 | public class Controller { |
Spring 4.3 ~ 클래스 내 생성자는 단일
생성자로 주입 받을 객체가 Bean으로 등록되어 있다면 Autowired Annotation 생략 가능
1회 호출 보장 주입 받은 객체가 변하지 않거나, 반드시 객체 주입이 필요한 경우 강제하기 위해 사용
1 | public class Controller { |
코드가 굉장히 간결하지만 의존관계를 파악하기 힘듦
주입이 동시에 일어나 겹치는 경우 순환 참조 문제 발생
1 | public class Controller { |
setter 혹은 사용자 정의 메소드를 통해 의존관계 주입
각 주입 방식에 따라 순환참조 문제가 발생하는 시점이 다른데, 필드 주입과 수정자 주입은 런타임 시 발생하고 생성자 주입 방식은 컴파일 시 발생한다.
즉, 개발자가 먼저 대처하기 편한 방식은 생성자 주입
방식이다.
순환 참조: A객체는 B객체를 참조하고, B객체는 A객체를 참조 (서로 동시에 참조하고 있을때 발생)