스프링에서 의존성을 주입하는 방법은 생성자 주입, @Autowired 를 사용하는 필드 주입, 수정자 주입이 있다.
생성자 주입(Constructor Injection)
스프링 프레임워크 4.3 버전부터는 의존성 주입으로부터 클래스를 완벽하게 분리할 수 있다.
단일 생성자인 경우엔 어노테이션조차 필요 없지만 생성자가 2개 이상인 경우에는 생성자에 어노테이션을 붙여줘야 한다.
필드 주입(Field Injection)
필드에 @Autowired 어노테이션을 붙여주면 자동으로 의존성이 주입된다.
수정자 주입(Setter Injecion)
수정자를 이용한 주입 방법도 있다. 보통은 setter 메서드를 사용해서 주입한다.
생성자 주입 방법만의 장점
- 순환 참조를 방지할 수 있다.
- 테스트에 용이하다.
- 코드 속 나쁜 냄새를 없앤다.
- 불변성
- 오류를 방지할 수 있다.
순환 참조를 방지할 수 있다.
생성자 주입은 생성자로 객체를 생성하는 시점에 필요한 빈을 주입한다.
수정자 주입은 주입 받으려는 빈의 생성자를 호출하여 빈을 찾거나 빈을 팩토리에 등록한다. 그 후에 생성자 인자에 사용하는 빈을 찾거나 만든다. 그 이후에 수정자를 호출하여 주입한다.
필드 주입도 수정자 주입과 동이랗게 먼저 빈을 생성한 후에 필드에 주입하는 방법이다.
-> 생성자 주입에서만 오류를 통해 순환 참조 문제를 방지할 수 있다.
테스트에 용이하다.
생성자 주입을 사용하지 않으면 단위테스트를 진행할 때 객체를 생성해서 주입할 방법이 없다.
코드 속 나쁜 냄새를 없앤다.
Autowired를 일일이 써줌에 따라 코드의 품질을 떨어뜨리게 된다.
불변성
필드 주입과 수정자 주입은 해당 필드를 final로 선언할 수 없다.
오류를 방지할 수 있다.
의존하는 객체가 null인 경우를 미리 방지할 수 있다.
'Spring' 카테고리의 다른 글
Spring - @Component와 @Service, @Controller의 차이 (0) | 2022.05.12 |
---|---|
Spring - RestTemplate (0) | 2022.03.11 |
@RequestParam와 @PathVariable은 무엇이 다른가? (0) | 2021.11.05 |
Spring - AOP (0) | 2021.09.28 |
Spring - 빈 등록 (0) | 2021.09.27 |