제어역전의 설계 원칙을 위한 의존성 주입 방법에는 3가지가 있다.
필드 주입, 메소드 주입, 생성자 주입이다.
필드를 통한 주입
public class Consumer {
Food food;
void eat() {
this.food.eat();
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.food = new Pizza();
consumer.eat();
}
}
interface Food{
void eat();
}
class Pizza implements Food{
@Override
public void eat(){
System.out.println("피자를 먹어요");
}
}
Consumer 의 필드인 food 필드에 객체를 전달함으로 의존성을 주입하였다. Spring에서는 일반적으로 권장되지 않는 듯 하다.
왜? : 객체의 불변성을 해칠 수 있기 때문이다. 자바에서 클래스의 필드에 직접적으로 접근하지 않고 메소드를 통해서 접근하는 이유와 비슷하다.
생성자를 통한 주입
public class Consumer {
Food food;
void eat() {
this.food.eat();
}
Consumer(Food food){
this.food = food;
}
public static void main(String[] args) {
Consumer consumer = new Consumer(new Pizza());
consumer.eat();
}
}
interface Food{
void eat();
}
class Pizza implements Food{
@Override
public void eat(){
System.out.println("피자를 먹어요");
}
}
Consumer클래스의 생성자를 통하여 객체를 전달하여 의존성을 주입하였다.
final과 함께 사용하면 객체의 불변성을 지킬 수 있기 때문에 일반적으로 많이 사용된다.(final로 선언되면 생성자로 초기화 하는 방법 이외에는 값이 변하지 않는다.)
메소드를 통한 주입
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 Pizza());
consumer.eat();
}
}
interface Food{
void eat();
}
class Pizza implements Food{
@Override
public void eat(){
System.out.println("피자를 먹어요");
}
}
Consumer의 메소드인 setFood를 통하여 객체를 전달하여 의존성을 주입하였다. Food 인터페이스 자체가 수정되거나 할 거 같을 때 메소드를 통한 의존성 주입을 사용 할 수 있다.
'Spring & Boot' 카테고리의 다른 글
컴포넌트스캔 @Autowired (0) | 2024.03.30 |
---|---|
스프링 부트 큰 그림 (0) | 2024.03.21 |
ORM 그리고 객체지향 (0) | 2023.09.10 |
IoC, DI (0) | 2023.09.01 |
MVC패턴 (0) | 2023.08.29 |