의존 관계란?
'클래스 A가 클래스 B를 의존한다' 라고 했을 때,
B클래스의 기능이 추가 또는 변경되거나 형식이 바뀌면 그 영향이 A에 미친다는 것이다.
그래서 직접적으로 클래스를 의존하는 것보다, 인터페이스로 추상화하면 더 다양한 클래스가 의존받을 수 있다.
추상화를 함으로써 더 다양한 의존 관계를 맺을 수가 있고, 실제 구현 클래스와 느슨한 결합 관계를 유지할 수 있다.
DI란?
생성자 주입. 의존 관계를 외부에서 결정하도록 하는 것이다.
즉, A클래스를 사용하고자 하는 또 다른 클래스에서 의존 관계를 결정하도록 하는 것이다.
DI를 위한 방법은 여러가지가 있다.
- 생성자 주입
- 생성자를 통해서 의존 관계를 주입하는 방법
- 생성자 호출 시(빈 등록 시), 예를 들어 @Autowired 등의 의존 관계를 보고 스프링 컨테이너에서 스프링 빈을 꺼내서 주입
- 생성자 호출 시점에 딱 1번만 호출되어 이후에 값을 세팅하지 못하게 막을 수 있어서 불변, 필수적인 의존관계에 사용
- 값이 누락된 경우 컴파일 오류가 발생해서 IDE로 어디서 문제가 발생했는지 확인 가능
- 수정자 주입(setter 주입)
- setter 메소드를 통해 필드의 값을 변경하여 의존 관계를 주입하는 방법
- 컨테이너에서 빈 등록 시가 아니라, 빈을 등록하고 난 이후에 의존관계 주입 시에 주입
- public으로 열려 있어서 잘못 건드려서 에러 발생 가능성 존재
- 선택, 변경 가능성이 있는 의존 관계에 사용
- 필드 주입
- 필드에 바로 주입하는 방법
- 외부에서 변경이 불가능해서 테스트하기 힘들다는 단점
- 지양하는 방법
'Spring' 카테고리의 다른 글
[Spring] @Qualifier, @Primary (0) | 2021.12.07 |
---|---|
[Spring] @Autowired 의존관계 주입시 조회되는 빈이 여러개일때 (0) | 2021.11.29 |
[Spring] @ComponentScan 과 @Autowired (0) | 2021.11.29 |
[Spring] 싱글톤 컨테이너와 @Configuration (0) | 2021.11.28 |
[Spring] @Configuration, @Bean 이해하기 (0) | 2021.11.26 |