2023. 11. 13. 20:40ㆍ카테고리 없음
IoC(제어의 역전이란 무엇일까?)
제어의 역전이란 쉽게말하면 말그대로 프로그렘의 제어 흐름이 역전되는 것이다. 이게 왜필요한걸까?
1. 코드 유지보수 용이성
제어의 역전은 의존성 주입을 사용하기 때문에 객체를 재사용하기가 변경에대한 유연성이 증가한다.
2. 낮은 결합
제어의 역전은 각 모듈간의 결합도를 낮추기때문에 객체에서 직접적으로 타 객체에 읜존성을 만들지 않고 외부에서 주입을 받아 의존성을 줄인다.
그렇다면 어떤게 강하게 결합된 코드고 분리방법은 뭘까?
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("치킨을 먹는다.");
}
}
위 코드에서 컨슈머와 치킨은 강하게 결합되었는 상태라고 말한다.
이유는 컨슈머는 치킨이라는 음식을 먹는것에는 문제가 발생하지 않지만 컨슈머가 치킨을 직접적으로 들고있기 때문에
다른 음식을 먹고싶으면 통째로 코드를 갈아엎어야 하는 문제가 발생한다.
위같이 간단한 상태라면 바꾸면 그만이지만 코드가 길고 복잡해질수록 문제는 커질것이다.
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("피자를 먹는다.");
}
}
다음 예시코드와 같이 Interface를 사용하면 치킨이 아닌 음식 food 를 사용하기에 Cosumer가 다른 음식을
요구하게 되어도 그 음식의 객체만 넣어주면 대응이 매우 쉬워진다.
다시말해 새로운 요구사항이 생겨도 그 요구사항만을 '주입' 시켜주면 그만이라는것이다.
이러한 주입의 방식에는 몇가지가 존재한다.
- 필드에 주입
- 메서드를 통한 주입
- 생성자를 통한 주입
미리 만들고있던 메모장 프로젝트에서도 각 Controller가 필요한 서비스 객체를 매번 만들어서 무려 5개나 만들고
일부필요한 기능을 불러오기위해서 너무 많은 연결때문에 해당 기능에서 쓰이지 않는 객체역시 생성해서
필요한 객체를 넘겨받고 있었다 이런것역시 분리가 필요한것이다