스프링의 IoC와 DI
IOC/DI는 스프링 프레임워크의 근간
오브젝트 생명주기와 의존관계에 대한 프로그램이 모델
유연하고 확장성이 뛰어난 크도를 만들 수 있게 해주는 프로그래밍 모델
유연하고 확장성이 뛰어나다라는 의미
= 변경이 있을 때 수정이 쉽자 = 수정할 부분만 수정하면 된다 = 관심사의 분리가 잘 이루어져있다
public class Car{
private MovingStrategy movingStrategy;
private int distance;
public Car(MovingStrategy movingStrategy){
this.movingStarategy = movingStrategy;
this.distnace = 0;
}
void move(){
if(movingStragy.isMovable()){
distance++;
}
}
}
움직임에 대한 코드를 수정하고 싶을때 Car를 수정하지않고 인터페이스만 수정하면 됩니다. car 객체는 스스로 MovingStrategy를 선택할 수 없다. 카 객체에 스스로에 대한 주도권이 없다. 제어권은 카 객체를 사용하는 쪽에 있다.
public class Racing{
private static final int NUM_OF_CARS = 10;
private List<Car> cars = new ArrayList<>();
public Racing(){
MovingStrategy strategy = new RandomMovingStrategy();
for(int i=0;i<NUM_OF_CARS;i++){
cars.add(new Car(strategy));
}
}
public void move() {
cars.forEach(Car::move);
}
}
카 객체에 대한 제어권을 다 가지고 있습니다. 카 객체를 어떤 MovingStrategy를 사용할 지 정해서 생성하고 있습니다. 카 객체가 어떻게 행동할지도 다 제어하고 있습니다. 하지만 이 코드도 관심사의 분류가 나눠졌다고 보기 어렵습니다. Racing이라면 자동차를 생성하는 것이 아닙니다. 여기에는 자동차를 생성하는 관심사가 섞어들어있습니다.
제어에는 두가지 관점이 있습니다.
생성에 대한 제어, 행동에 대한 제어
public class CarFactory{
public static Car car(){
return new Car(movingStrategy());
}
private static MovingStrategy movingStratgy(){
return new RandomMovingStrategy();
}
}
public class Racing{
private static final int NUM_OF_CARS = 10;
private List<Car> cars = new ArrayList<>();
public Racing(){
for(int i=0;i<NUM_OF_CARS;i++){
cars.add(CarFactory.car());
}
}
public void move(){
cars.forEach(Car::move);
}
}
이 객체로 관심사의 분리가 적절히 이루어졌습니다.
다른 움직임을 사용하고 싶을 때는 MovingStrategy의 구현체를 만들어 팩토리에 대신 넣으면 됩니다.
Racing방식을 바꾸고 싶을 때는 Racing 부분을 수정하면 됩니다.
스프링 IOC가 이런 방식으로 동작합니다.
스프링의 IoC/ DI?
제어의 두가지 관점
어떤 연관관계를 맺으며 생성될 것인가?
- 팩토리 -> 빈 컨테이너
어떻게 사용될 것인가?
- 클라이언트 -> 스프링 내부 코드
연관관계를 맺고 생성될 것인가는 모두 스프링의 빈 컨테이너가 맡아주고 있습니다. 우린 Controller가 어떻게 사용되고 Service가 어떻게 사용되는지 작성한 적이 없습니다. 내부코드가 다 맡아주고 있습니다. 각종 빈들에 대한 구현은 하고 있지만 어떻게 생성되고 어떻게 연관관계를 맺는지 이런건 전부 Configuration 빈컨테이너가 전부 감당해주고 우린 관심을 가지지 않습니다. 우린 Controller로 Service가 어떻게 호출되서 어떻게 동작하는지 이런 코드들을 한번도 작성해본 적이 없습니다. 이런것들도 스프링의 클라이너트 내부 코드가 모두 감당하고 있습니다.
++
IoC
DI
DI의 세가지 방법은?
필드 주입을 안쓰는 이유
라이브러리와 프레임워크의 차이점
자바 리플렉션