오늘의 루틴
- Spring 강의 최소 4개는 듣기 (O)
- 개인과제 제출 및 해설 확인 (O)
- 저번에 배운 Spring 복습 (△)
IoC(제어의 역전), DI(의존성 주입) 이해하기
-------------------------------------------------------
🔻 Spring의 IoC와 DI
- IoC와 DI는 좋은 코드 작성을 위한 Spring의 핵심 기술 중 하나
- ‘DI 패턴을 사용하여 IoC 설계 원칙을 구현’
-------------------------------------------------------
🔻 의존성이란?
- Interface 다형성의 원리를 사용하여 구현하면 강한 결합에 쉽게 대처
- 약한 결합 및 약한 의존성
-------------------------------------------------------
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("피자를 먹는다.");
}
}
-------------------------------------------------------
🔻 주입이란?
- SpringframeWork가 class들을 Bean 객체로 등록을 해서 가지고 있다가 의존성 주입이 필요할 때 주입
- 그 방법은 Autowired Annotation에 달아서 알려준다
- 생성자가 하나만 있을 때는 Autowired가 생략이 가능하다.
- 주입 방법
- 필드 주입, 생성자 주입, 메서드 주입
- 생성자 주입을 가장 추천(객체의 불변성을 지켜 줄 수 있기 때문에)
-------------------------------------------------------
- 생성자 주입
public class Consumer {
Food food;
public Consumer(Food food) {
this.food = food;
}
void eat() {
this.food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer(new Chicken());
consumer.eat();
consumer = new Consumer(new Pizza());
consumer.eat();
}
}
-------------------------------------------------------
- 필드 주입
public class Consumer {
Food food;
void eat() {
this.food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.food = new Chicken();
consumer.eat();
consumer.food = new Pizza();
consumer.eat();
}
}
-------------------------------------------------------
- 메서드 주입
public class Consumer {
Food food;
void eat() {
this.food.eat();
}
public void setFood(Food food) {
this.food = food;
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.setFood(new Chicken());
consumer.eat();
consumer.setFood(new Pizza());
consumer.eat();
}
}
-------------------------------------------------------
🔻 제어의 역전이란?
- Consumer가 직접 Food를 만들어 먹었기 때문에 새로운 Food를 만들려면 추가적인 요리준비(코드변경)가 불가피
- 이때는 제어의 흐름이 Consumer → Food
- Consumer는 추가적인 요리준비(코드변경) 없이 어느 Food가 되었든지 전부 먹을 수 있음
- 제어의 흐름이 Food → Consumer 로 역전
-------------------------------------------------------