본문 바로가기
Spring

Spring - @Autowired를 권장하지 않는 이유

by 밍상 2022. 5. 12.

스프링에서 의존성을 주입하는 방법은 생성자 주입, @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