IoC와 DI는 어떠한 개념인지?
IoC → 설계원칙에 해당 → 잘만드는 방법
DI → 디자인 패턴에 해당 → 잘만드는 과정 레시피
Spring은 위와 원칙(건축의 설계도, 규정, 시공 수칙 등)과 디자인 패턴(설계 및 시공 순서)를 잘 준수 할 수 있도록 도움을 주는 역할(어떠한 구조 건물의 안전 시공 가이드, 체크리스트) 을 한다고 볼 수 있다.
의존성이란?
말 그대로 의존적인 상황을 이야기하며, 강하게 의존된 경우 강한 결합을 가지고 있다고 한다. 말보다 코드가 더 쉽게 이해 될 수 있다.
치킨 예시 강한 결합
public class Consumer {
void eat() {
Chicken chicken = new Chicken();
chicken.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.eat();
}
}
class Chicken {
public void eat() {
System.out.println("치킨을 먹는다.");
}
}
Java
복사
치킨은 강하게 결합되어 피자를 먹고 싶다면 코드를 중복해서 작성해야 하는 불편함이있다.
인터페이스로 구현한 음식에서의 치킨, 피자 등의 예시, 약한 결합
public class Consumer {
void eat(Food food) {
food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.eat(new Chicken());
consumer.eat(new Pizza());
}
}
interface Food {
void eat();
}
class Chicken implements Food{
@Override
public void eat() {
System.out.println("치킨을 먹는다.");
}
}
class Pizza implements Food{
@Override
public void eat() {
System.out.println("피자를 먹는다.");
}
}
Java
복사
음식이라는 부모 클래스 또는 인터페이스 등으로 객체의 다형성을 활용하게 된다. 실행부에서 음식의 타입으로 피자, 치킨 등 수많은 자손 객체를 생성하면 메소드의 코드 중복을 피하고, 재사용성을 강화시킬 수 있다. → 강한 결합성을 약하게 풀어낼 수 있다.
제어권은 누가 가지고 있는가? 의존성 주입(DI)를 통해 제어의 역전(IoC)를 진행
치킨에서 새로운 음식인 피자를 먹고 싶을때 첫번째 강한 결합 케이스의 경우 피자를 Customer 객체가 만들어야 하므로 제어권이 Customer에게 있다. 손님이 음식을 만들어야 하는 상황인 것이다.
하지만 두번째 경우 외부(메인)에서 Customer객체를 만들지만 그 안의 음식은 자손 Chicken, Pizza 클래스가 담당하고 있다. 따라서 외부에서 음식들 또한 객체를 생성하고, Customer 객체는 음식들의 조상 클래스인 Food를 사용하기만 한다. 결국 식당이라는 곳에서, 손님은 식당에서 만든 음식들을 먹는 상황인 것이다. 이것이 일반적인 상식이며 Customer가 부모 클래스 또는 인터페이스를 주입받으면서 그 자손들을 이용 할 수 있다. 이를 주입을 통해 제어권이 역전되었다고 볼 수 있다.
위 묘사를 통해서 부모 클래스 또는 인터페이스(Food)를 주입 받아서(=DI를 통해서) 약한 결합성으로 변경되었으며 제어권이 변경(Customer→외부(=식당))되었음을 파악 할 수 있다.