- 일반적인 Java코드를 사용해 관계를 구성할 수 있다.
- 스프링 프레임워크에서는 개발자들이 필요한 부분을 개발하여 '끼워넣기' 방식으로 완성한다.
- 완성된 코드는 개발자가 아닌 프레임워크의 내부에서 결정된 대로 최종 호출이 이루어지게 되는데 이 현상을 바로 "제어의 역행" 이라고 한다.
- IoC가 일어날 때 스프링이 Bean들 간의 의존 관계를 관리할 때 사용된다. (스프링이 Bean들 간의 연결 관계를 짓기 때문에 필요한 객체를 스프링이 알아서 주입해준다.)
- 스프링 프레임워크에서는 의존적인 객체를 직접 생성/제어하지 않는다.
MemberController 에 MemberService 가 주입되고, MemberService에 MemberRepository가 주입된다.
@Controller
public class SearchController {
private final MovieService movieService;
public SearchController(MovieService movieService) {
this.movieService = movieService;
}
}
@Controller
public class SearchController {
private MovieService movieService;
public void setMovieService(MovieService movieService) {
this.movieService = movieService;
}
}
@Controller
public class SearchController {
@Autowired
private MovieService movieService;
}
Intellij IDE에서 @Autowired를 사용하는 경우 "Field Inject is not recommend" 라는 경고를 볼 수 있다. Spring 팀에서도 Constructor Injection을 권고하고 있는데 그 이유는 다음과 같다.
1. 테스트코드 작성이 쉽다.
final 선언이 가능하기 때문에 불변성을 유지할 수 있다.
한 클래스에 많은 의존성을 갖고 있는 경우 Constructor Injection 의 경우 생성자의 인자 수가 많아지므로 리팩토링을 통해 코드의 품질을 높힐 가능성이 높다.
순환 참조 오류가 발생하는 경우 컴파일 시 막을 수 있다.