- 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것입니다.
- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결 시켜준다.
- @Autowired 어노테이션을 이용한 다양한 의존성 주입(DI) 방법을 제공합니다.
의존성 주입을 해야하는 이유
- Test가 용이해진다.
- 코드의 재사용성을 높여준다.
- 객체 간의 의존성(종속성)을 줄이거나 없앨 수 있다.
- 객체 간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.
의존성 주입의 3가지 방법
1. 필드 주입(Field Injection)
@Controller
public class CocoController{
@Autowired
private CocoService cocoService;
}
- 필드에 @Autowired 어노테이션만 붙여주면 자동으로 의존성 주입됩니다.
- 단점
- 코드가 간결하지만, 외부에서 변경하기 힘들다.
- 프레임워크에 의존적이고 객체지향적으로 좋지 않다.
2. 생성자 주입(Constructor Injection)
@Controller
public class CocoController{
private final CocoService cocoService; // final 붙일 수 있다.
public CocoController(CocoService cocoService){
this.cocoService = cocoService;
}
}
- 클래스의 생성자가 하나이고, 그 생성자가 주입받을 객체가 빈으로 등록되어 있다면 @Autowired를 생략 할 수 있습니다.
- Spring Framwork reference에서 권장하는 방법
3. 수정자 주입(Setter Injection)
@Controller
public class CocoController{
private CocoService cocoService;
@Autowired
public setCocoController(CocoService cocoService){
this.cocoService = cocoService;
}
}
- setter 메소드에 @Autowired 어노테이션을 붙이는 방법입니다.
- 단점
- 수정자 주입을 사용하면 set~~ 메서드를 public으로 열어두어야 하기 때문에 언제 어디서든 변경이 가능하다.
생성자 주입 권장하는 이유
1. 순환 참조 방지
- 필드 주입과 수정자 주입은 빈이 생성된 후에 참조하기 때문에 아무런 오류 그리고 경고 없이 실행합니다. 실제코드가 호출될 때까지 문제를 알 수 없다는 것입니다.
- 생성자 주입 실행하면 BeanCurrentlyInCreationException 발생하게 됩니다.
- 생성자 주입은 순환 참조 뿐만아니라 의존 관계에 내용을 외부로 노출 시킴으로써 어플리케이션을 실행하는 시점에서 오류를 체크할 수 있습니다.
2. 불변성(Immutablility)
- 생성자 주입을 통해 변경의 가능성 배제하고 불변성 보장하는 것이 좋습니다.
3. 테스트 용이
출처
https://dev-coco.tistory.com/70
'이론 > 스프링' 카테고리의 다른 글
[Spring] AOP Transaction 설정 (0) | 2024.10.07 |
---|---|
[Spring] AOP (1) | 2024.10.07 |
[Spring]IoC 컨테이너(Inversion of Control) (0) | 2024.09.21 |
[Spring]스프링 MVC의 흐름 (0) | 2024.04.23 |