스프링 프로젝트를 하고 있는 중에도 아직도 뭔지 잘 모르겠고 썼다가 안썼다가 내맘대로 막 쓰고 있는 @Autowired
라는 놈에 대해 파헤쳐보려고 한다.
@Component
나 @Bean
어노테이션을 붙여서 등록할 수 있다.클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말한다.
💡여기서 잠깐!
객체A
가 객체B
의 변화에 영향을 받으면A
는B
에 의존한다고 말한다.
A
와B
가 상호작용을 하면A
와B
는 의존관계에 있다고 말하는데, 이때 사용할 객체에 대한 레퍼런스를 외부에서 제공해줘야 한다.
이것을 바로 '의존성주입', 즉 DI라고 한다.
>> 의존성을 주입할 때는 @Autowired
라는 어노테이션을 사용한다.
@Autowired
@Autowired
를 붙이면 의존성 주입이 완료된다.@Autowired
는 생성자, 수정자, 필드에 붙여서 사용할 수 있다.final
로 선언할 수 있다.@Autowired
를 생략할 수 있다.private final
로 선언하고, 생성자를 통해 해당 객체들을 주입받고, 생성자 위에 @Autowired
를 붙인다.@Component
public class MyService {
private final MyRepository myRepository;
private final ExampleBean exampleBean;
@Autowired
public MyService(MyRepository myRepository, ExampleBean exampleBean) {
this.memberRepository = memberRepository;
this.exampleBean = exampleBean;
}
}
private
으로 선언한다.@Autowired
를 붙인다.@Autowired
가 붙은 수정자를 모두 찾아서 의존관계를 주입한다.@Component
public class MyService {
private MyRepository myRepository;
private ExampleBean exampleBean;
@Autowired
public void setMyRepository(MyRepository myRepository) {
this.myRepository = myRepository;
}
@Autowired
public void setExampleBean(ExampleBean exampleBean) {
this.exampleBean = exampleBean;
}
}
@Autowired
를 붙인다.@Component
public class MyService {
@Autowired
private MyRepository myRepository;
@Autowired
private ExampleBean exampleBean;
}
1) 생성자 어노테이션 1개 + Autowired 생략
2) 생성자 1개 직접 작성 + Autowired 생략
3) 생성자 없이 필드 주입
[Spring] IoC 컨테이너 (Inversion of Control) 란?
[Spring] @Autowired를 통한 의존 관계 주입