본문 바로가기

spring

@Autowired

@Autowired

이 에너테이션은 스프링 컨테이너에 등록된 빈들 중에서 타입이 일치하는 빈을 찾아와 자동으로 주입시킨다.

 

생성자 주입

  • 생성자 호출 시점에 한번만 주입됨이 보장된다.
  • 의존관계를 처음 셋팅할 때 한번만 설정하고 이후에는 변경하고 싶지 않을때.
  • 의존 객체가 불변이 된다. (final 도 붙이자.)
  • final 이 붙은 필드는 초기화가 무조건 필요하다. (하지 않으면 컴파일타임에 에러남)
    • 생성자 주입이니 생성자에서 초기화해주며, 필수값임을 나타낼 수 있다.
  • 생성자가 하나라면, @Autowired 를 생략할 수 있다.
    • 생성자 오버로딩으로 두개 이상이라면 어떤 것을 의존관계 설정에 이용할 것인지 모르기 떄문에 생략하면 안되고 지정해줘야한다.

 

수정자(Setter) 주입

  • 선택적이다. 주입을 해도 되고 안해도 될 때 사용한다.
    • 생성자는 무조건 실행되므로 생성자 주입은 필수의 특징인 반면에의 특징이다. 
    • @Autowired 는 기본 동작이 주입할 대상이 없으면 오류가 발생한다. 
    • @Autowired(required = false) 를 쓸 수 있다.
  • 변경 가능성이 있을 때 쓴다. 불변이 아니다.
  • 자바 빈 프로퍼티 규약에 맞다.
  • 보통 생성자 주입을 쓰고, 선택적이 필요가 있을 때 가끔 쓴다.

 

스프링 빈은 크게 두가지 과정이 있다,

1. 빈을 등록하는 과정

2. 등록된 빈들의 의존관계를 주입하는 과정

 

하지만 생성자 주입은 해당 빈 객체를 등록하기 위해 생성할 때 주입되므로 위 두 과정이 같이 되긴한다.

또, 수동 빈 등록에서도 두 과정이 같이 일어난다.

 

생성자 주입과 setter 주입이 같이 있다면, 둘다 주입을 한다. 위의 두 과정이 일어나면서.

뭐, 스프링이 싱글톤을 보장해주므로 같은 빈이 주입되긴 한다.

 

반면에, Setter 주입이나 필드주입은 위의 과정이 따로 일어난다.

 

 

 

 

필드 주입

  • 필드가 private 이라도 주입을 해준다.
  • 치명적인 단점이 있다.
    • 단위테스트를 할 수 없다. (스프링 컨테이너를 띄우지 않고서는 테스트하기가 어렵다)
    • 다른 의존성을 단위테스트에서 주입해줄 방법이 없다.
  • 생성자 주입을 쓰자.
  • 필드 주입 괜찮은 경우
    • 테스트에서 간단히 사용할 때
    • @Configuration 에서 수동 등록할 때. (물론 다른 방법도 있다. 그래서 이 것도 사실 별로긴 하다.)

 

 

일반 메서드 주입

일반 메서드에 @Autowired 를 붙여서 주입할 수도 있다.

일반적으로 잘 쓰지 않는다.

 

 

 

 

@Autowired 는 @Component, @Controller 등등 스프링이 관리하는 빈이어야 동작한다.