오늘은 Spring에서 IoC(제어의 역전)와 DI(의존성 주입)의 개념을 학습하였다. 이 두 가지는 좋은 코드를 작성하기 위한 중요한 원칙이며, Spring의 핵심 기술 중 하나이다.
객체가 다른 객체를 직접 생성하여 사용하는 것을 강한 결합이라고 하며, 이는 코드 수정 시 많은 부분에서 변경이 필요하게 만든다. 이를 해결하기 위해 인터페이스를 사용하여 약한 결합으로 만들어야 한다.
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 {
public void eat() {
System.out.println("치킨을 먹는다.");
}
}
class Pizza implements Food {
public void eat() {
System.out.println("피자를 먹는다.");
}
}
이 코드는 인터페이스 다형성을 활용하여 서로 다른 음식 객체를 쉽게 교체할 수 있게 만들어준다. 이러한 방법이 약한 결합을 이루는 방법이다.
의존성을 주입하는 방법은 크게 필드 주입, 메서드 주입, 생성자 주입이 있다. 그 중, 생성자 주입이 가장 권장되는 방법이다.
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();
}
}
이 코드는 생성자를 통해 의존성을 주입받아 사용하는 방식이다. Consumer
클래스는 Food
객체에 의존하지만, 그 의존성은 외부에서 주입되므로 강한 결합을 피할 수 있다.
기존에는 Consumer
가 직접 Food
를 생성하고 사용했다면, 이제는 외부에서 생성한 Food
를 주입받아 사용한다. 이것이 제어의 흐름이 역전되었다는 의미이다.
오늘 학습을 통해 IoC와 DI가 객체 간의 결합도를 줄이고, 유지보수와 확장성을 높이는 데 얼마나 중요한지 알 수 있었다. Spring은 이 개념들을 통해 개발자들이 더 나은 코드를 작성할 수 있도록 돕는다.