- 제어권이 역전
- 의존은 변경에 의해 영향을 받는 관계를 의미한다. - 한 클래스가 다른 클래스의 메서드를 실행할 때 이를 '의존한다'라고 한다. - A가 B를 사용해야만 A의 역할을 수행할 수 있는 경우
class CarController{ private final CarService carService; private final Cars cars; private void initCars(){ cars = carService.init(); } }
CarController는 CarService에 의존한다. CarService의 init메소드가 제거되거나, 이름이 변경되거나 리턴 타입이 바뀌는 등의 변경이 일어나면 CarController는 영향을 받는다.
'변경에 의해 영향을 받는 관계', 의존한다는 것은 변경에 유연하지 못함을 의미
일반적인 제어권
class OwnerController{ private OwnerRepository repository = new OwnerRepository(); }
OwnerController가 직접 생성하고 관리함
IOC: 내가 사용할 의존성을 누군가 알아서 준다
- 내가 사용할 의존성의 타입만 맞으면 상관x - 코드 테스트 하기 편함
class OwnerController{ private OwnerRepository repo; public OwnerController(OwnerRepository repo){ this.repo = repo; } //repo를 사용합니다 }
class OwnerControllerTest{ @Test public void create(){ OwnerRepository repo = new OwnerRepository(); OwnerController controller = new OwnerController(repo); } }
OwnerRepository를 사용은 하지만 객체를 생성은 하지 않음
외부에서 생성자를 통해 받아 온다
IoC는 넓은 범위의 용어
객체 생명 관리, 흐름 제어를 제 3자에게 위임하는 프로그래밍 모델
DI는 의존성을 주입하는 명확한 용어
스프링이 제공하는 IoC의 방식의 핵심을 짚어주는 의존관계 주입
이게 맞나?????
sample/SampleController
sample/SampleRepository
intellij 에서 테스트와 소스창 바꾸는 단축키 Ctrl+Shift+T