본문 바로가기

💻WEB BackEnd/프레임워크 Spring

DI(Dependency Injection)

목차

  • DI(Dependency Injection)란?
  • 스프링 DI 설정 방법
  • 스프링 DI 예시
  • 다양한 의존 객체 주입 방법

 

DI(Dependency Injection)란?

다음 세 가지 경우 다 DI라고 할 수 있다.

 

다만, 조금씩의 차이가 있다.

  • 배터리 일체형 : 생성자에서 객체를 주입
  • 배터리 분리형(1) : setter를 사용해서 객체를 주입
  • 배터리 분리형(1) : 생성자, setter를 사용해서 객체를 주입
# 배터리 일체형
public class EletronicCarToy {
private Battery battery;

public ElectronicCarToy() {
    battery = new NormalBattery();
}
}

# 배터리 분리형(1)
public class EletronicRobotToy {
private Battery battery;

public EletronicRobotToy() {
}

//배터리가 떨어졌을 경우 새 배터리 넣을 수 있음
public void setBattery(Battery battery) {
    this.battery = battery
}
}

# 배터리 분리형(2)
public class EletronicRobotToy {
private Battery battery;

public EletronicRobotToy() {
    //공장에서 만들 때 새 배터리 넣어줌
    this.battery = battery
}

//배터리가 떨어졌을 경우 새 배터리 넣을 수 있음
public void setBattery(Battery battery) {
    this.battery = battery
}
}

 

 

스프링 DI설정 방법

 

 

스프링 DI 예시

toy01 패키지

//MainClass.java
package toy01;

import toy01.type.*;

public class MainClass {
	public static void main(String[] args) {
		ElectronicCarToy carToy = new ElectronicCarToy();
		ElectronicRobotToy robotToy = new ElectronicRobotToy();
	}
}

 

toy01.battery 패키지

// Battery.java
package toy01.battery;

public interface Battery {
	public int getBatteryValue();
}

//ChargeBattery.java
package toy01.battery;

public class ChargeBattery implements Battery {
	@Override
	public int getBatteryValue() {
		return 0;
	}
}

//NormalBattery.java
package toy01.battery;

public class NormalBattery implements Battery {
	@Override
	public int getBatteryValue() {
		return 0;
	}
}

배터리를 interface로 사용한 이유?  ☞ 유동성있게 객체를 사용하기 위함!

 

toy01.toy 패키지

//ElectronicCarToy.java
package toy01.type;

import toy01.battery.Battery;

public class ElectronicCarToy {
	private Battery battery;
	
	public ElectronicCarToy() {
		this.battery = battery; // 생성자에서 객체 주입
	}
}

//ElectronicRadioToy.java
package toy01.type;

import toy01.battery.Battery;

public class ElectronicRadioToy {
	private Battery battery;
	
	public ElectronicRadioToy() {
		this.battery = battery;  //생성자를 사용해서 객체를 주입
	}
	
	public void setBattery(Battery battery) {
		this.battery = battery;  //setter를 사용해서 객체를 주입
	}
}


//ElectronicRobotToy.java
package toy01.type;

import toy01.battery.Battery;

public class ElectronicRobotToy {
	private Battery battery;
	
	public ElectronicRobotToy() {
	}
	
	public void setBattery(Battery battery) {
		this.battery = battery;  //setter를 사용해서 객체를 주입
	}
}

 

+) 객체를 new로 생성하는 것이 아닌, 빈(bean) 객체로 생성한다면 더욱 스프링다운 DI 방법이다.

 

다양한 의존 객체 주입 방법

1) 생성자를 이용한 DI

<constructor-arg> : 생성자에 값 주입 (ref)

 

2) setter를 이용한 DI

<property> : 생성자에 값 주입 (name, value)

 

3) List타입 DI

<property> : 생성자에 값 주입 (name, list 형태의 value)

 

4) Map타입 DI

<property> : 생성자에 값 주입 (name, map형태의 value)