<aside> 1️⃣ 의존성과 의존성 주입의 개념
</aside>
// 의존성 주입을 사용한 예시: 주문 서비스 클래스가 결제 서비스 클래스를 주입받음
public class OrderService {
private final PaymentService paymentService; // 결제 서비스에 대한 의존성을 가지고 있다.
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService; // 외부에서 주입받은 결제 서비스를 사용한다.
}
public void placeOrder() {
// 주문 처리 로직
paymentService.processPayment(); // 외부에서 주입받은 결제 서비스 메서드를 호출하여 사용한다.
}
}
// 외부에 있는 하나의 클래스
public class PaymentService {
public void processPayment() {
// 결제 처리 로직
}
}
OrderService
클래스는 외부에서 주입받은 결제 서비스를 사용할 수 있게 되며, 의존성을 직접 생성하거나 결정하지 않습니다.new PaymentService()
**와 같이 의존하는 객체를 new를 통해 직접 생성하는 것을 의미한다.
이 경우에는 의존성을 갖는 클래스가 해당 의존성 객체를 직접 생성하고 사용하게 된다.
반면 "의존성 주입을 사용한다"는 것은 외부에서 의존성 객체를 생성하고, 그것을 클래스의 생성자, 세터 메서드, 또는 필드에 주입하는 방식을 의미한다.
이렇게 외부에서 의존성을 주입받는 방식을 통해 클래스는 의존성을 직접 생성하거나 결정하지 않고, 외부에서 주입받은 의존성을 사용하게 된다.의존성 주입을 사용하면 클래스는 외부에서 주입받은 의존성 객체를 사용하므로, 의존성과 클래스 간의 결합도가 낮아지며 유연성과 재사용성이 향상된다. 이는 객체 지향 설계 원칙 중 하나인 "의존성 역전 원칙(Dependency Inversion Principle)"을 따르는 것이기도 하다.
<aside> 2️⃣ Spring Boot에서의 DI(Dependency Injection)
</aside>
@Autowired
어노테이션을 통해 의존성을 주입받을 수 있다.@Component
public class OrderService {
private PaymentService paymentService;
// @Autowired -> 생성자가 1개일때는 작성해도 괜찮고 안해도 괜찮다.
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void placeOrder() {
// 주문 처리 로직
paymentService.processPayment();
}
}
@Component
public class PaymentService {
public void processPayment() {
// 결제 처리 로직
}
}
OrderService
클래스는 PaymentService
의존성을 @Autowired
어노테이션을 통해 주입받고 있다.<aside> 2️⃣ -1️⃣ @Autowired란 무엇인가
</aside>
@Autowired
**는 Spring Framework에서 사용되는 어노테이션으로, 의존성 주입(Dependency Injection)을 수행하는 데에 사용된다.
주로 생성자, 필드, 세터 메서드에 적용되어 해당 위치에 자동으로 의존성을 주입한다.