[SPRING 이론] [03] 의존성(의존관계) / 의존주입
✅ 의존성 ( Dependency ), 의존관계
- 어떤 메서드를 수행하는 주체가 되면 의존관계가 발생
한 객체가 다른 객체를 참조하거나, 다른 객체의 메서드를 호출하거나,
다른 객체로부터 데이터를 받아오는 등의 상호작용이 발생하는 것을 의미
ex)
자동차(Car)와 엔진(Engine) 객체를 가지고 있다고 가정해봅시다.
자동차는 엔진에 의존합니다. 즉, 자동차 객체가 생성되기 위해서는 엔진 객체가 필요합니다.
사용(Use) 의존성의 예시
// 엔진 클래스
public class Engine {
public void start() {
System.out.println("Engine started!");
}
}
// 자동차 클래스
public class Car {
private Engine engine;
// 의존성 주입을 위한 생성자
public Car(Engine engine) {
this.engine = engine;
}
public void drive() {
engine.start(); // 자동차가 주행하기 위해 엔진을 시작합니다.
System.out.println("Car is driving!");
}
}
엔진(Engine) 객체를 생성하고, 이를 자동차(Car) 객체에 의존성 주입
drive() 메서드를 호출하여 자동차를 주행
public class Main {
public static void main(String[] args) {
// 엔진 객체 생성
Engine engine = new Engine();
// 자동차 객체 생성 및 의존성 주입
Car car = new Car(engine);
// 자동차 주행
car.drive();
}
}
✅ 의존주입 (DI, Dependency Injection), 의존성주입
의존 주입은 객체 지향 프로그래밍에서 사용도는 디자인 패턴중 하나로, 객체 간의 의존 관계를 느슨하게 만드는 방법
주입 이란말은 new를 해줘야 된다는 말 == new,초기화
ex)
우리는 자동차(Car)와 엔진(Engine) 객체를 가지고 있다고 가정해봅시다.
자동차는 엔진에 의존합니다. 즉, 자동차 객체가 생성되기 위해서는 엔진 객체가 필요
❌ 의존성 주입을 사용하지 않는 경우:
Car 클래스가 자신이 필요한 Engine 객체를 직접 생성
▶ 자동차 객체와 엔진 객체 간의 결합도가 높아지고, 유연성과 재사용성이 떨어짐
// java
public class Car {
private Engine engine;
// Car 객체가 엔진을 생성하는 경우
public Car() {
this.engine = new Engine();
}
// 자동차 주행 메서드
public void drive() {
engine.start(); // 자동차가 주행하기 위해 엔진을 시작합니다.
System.out.println("Car is driving!");
}
}
⭕ 의존성 주입을 사용하는 경우:
Car 클래스는 생성자를 통해 Engine 객체를 주입
▶ 외부에서 Car 객체를 생성할 때 필요한 Engine 객체를 주입하게 됨
// java
public class Car {
private Engine engine;
// 의존성 주입을 통해 엔진 객체를 받아옴
public Car(Engine engine) {
this.engine = engine;
}
// 자동차 주행 메서드
public void drive() {
engine.start(); // 자동차가 주행하기 위해 엔진을 시작합니다.
System.out.println("Car is driving!");
}
}
📌 의존주입 방법
🔽 <bean>을 사용하여 객체 생성하고 의존성 주입 해줄 경우
XML 설정 파일
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 엔진 빈 정의 -->
<bean id="engine" class="com.example.Engine" />
<!-- 자동차 빈 정의 -->
<bean id="car" class="com.example.Car">
<!-- 의존성 주입 -->
<constructor-arg ref="engine" />
</bean>
</beans>
// java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
// XML 설정 파일을 이용하여 ApplicationContext 생성
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 빈 가져오기
Car car = (Car) context.getBean("car");
// 자동차 주행
car.drive();
}
}
🔽 @Autowired 어노테이션을 사용하여 의존성을 주입 해줄 경우
1 | 2 | 3 | 4 |
생성자 주입 | setter 주입 | 필드 주입 | 메서드 주입 |
1️⃣ 생성자 주입
<bean id="car" class="com.example.Car" />
public class Car {
private Engine engine;
@Autowired
public void setEngine(Engine engine) {
this.engine = engine;
}
}
2️⃣ setter 주입
<bean id="car" class="com.example.Car" />
public class Car {
private Engine engine;
@Autowired
public void setEngine(Engine engine) {
this.engine = engine;
}
}
3️⃣ 필드 주입
일반적으로 권장되지 않습니다
<bean id="car" class="com.example.Car" />
public class Car {
@Autowired
private Engine engine;
}
4️⃣ 메서드 주입
<bean id="car" class="com.example.Car" />
public class Car {
private Engine engine;
@Autowired
public void injectEngine(Engine engine) {
this.engine = engine;
}
}