Inversion of Control 이라고도 하는 의존 관계 주입(Dependency Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법이다. (new 연산자를 이용해서 객체를 생성하는 것이라고 생각하면 된다)
객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조이다. A 클래스 내부에서 B 라는 객체를 직접 생성하고 있다면, B 객체를 C 객체로 바꾸고 싶은 경우에 A 클래스도 수정해야 하는 방식이기 때문에 강한 결합이다.
객체를 주입 받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해서 넘겨받는 것이다. 이렇게 하면 결합도를 낮출 수 있고, 런타임시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.
IoC(Inversion of Control)란 "제어의 역전" 이라는 의미로, 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
IoC는 제어의 역전이라고 말하며, 간단히 말해 "제어의 흐름을 바꾼다"라고 한다.
객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.
객체 생성
의존성 객체 생성
클래스 내부에서 생성
의존성 객체 메소드 호출
객체 생성
의존성 객체 주입
스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입한다.
의존성 객체 메소드 호출
빈이란 스프링 IoC 컨테이너가 관리하는 자바 객체를 의미한다.
Bean을 등록하기 위해서는 @Component Annotation을 사용한다. @Component가 등록되어 있는 경우에는 스프링이 확인하여 빈으로 등록시킨다.
직접 @Component를 작성하여도 되며, 스테레오 타입(stereotype)인 @Controller, @Service, @Repository와 같은 어노테이션들도 자동으로 스캔하여 빈에 등록된다.
해당 방법은 @Configuration과 @Bean 어노테이션을 사용한다.
@Configuration 어노테이션의 경우 간단하게 말하면 해당 파일에 빈을 등록할 것이니 조회해라!라는 것이다.
@Configuration 어노테이션이 붙은 파일 내에서 @Bean 어노테이션을 사용해서 빈을 직접 등록하는데, @Bean을 사용해 수동으로 등록할 때에는 해당 메서드 이름이 빈 이름으로 결정된다.