**의존성 주입 (Dependency Injection, DI)**은 소프트웨어 개발에서 객체 간의 의존성을 관리하는 방법 중 하나다. 스프링 프레임워크와 같은 현대적인 프레임워크에서는 DI를 통해 객체의 생성과 의존성 관리를 자동으로 처리할 수 있다.
DI란 무엇인가?
DI는 객체가 필요로 하는 다른 객체(종속성)를 외부에서 주입해주는 패턴이다. 객체가 스스로 종속성을 생성하지 않고, 외부에서 제공받기 때문에 코드의 결합도를 줄이고 유연성을 높인다.
DI의 주요 개념
1. 의존성 (Dependency)
의존성은 객체가 동작하기 위해 필요한 다른 객체를 의미한다. 예를 들어, OrderService가 OrderRepository를 필요로 하는 경우, OrderRepository가 의존성이다.
2. 주입 (Injection)
주입은 의존성을 객체에 제공하는 방법이다. 주입 방식에는 몇 가지가 있다:
- 생성자 주입 (Constructor Injection): 객체를 생성할 때 필요한 의존성을 생성자의 매개변수로 전달한다.
- 세터 주입 (Setter Injection): 객체가 생성된 후 세터 메서드를 통해 의존성을 주입한다.
- 필드 주입 (Field Injection): 객체의 필드에 직접 의존성을 주입한다.
3. 역할
- 객체의 생성: DI 컨테이너가 객체를 생성하고 관리한다.
- 의존성의 주입: 필요한 의존성을 객체에 주입하여 객체가 정상적으로 동작할 수 있도록 한다.
스프링에서의 DI
스프링 프레임워크는 DI를 핵심 기능으로 제공한다. 스프링은 ApplicationContext라는 DI 컨테이너를 통해 객체를 생성하고, 의존성을 주입한다.
1. 빈(Bean)
스프링에서 DI를 통해 관리되는 객체를 **빈(Bean)**이라고 한다. 빈은 스프링 컨테이너에 의해 생성되고, 의존성이 주입된 후 사용된다.
2. 설정 방법
- 생성자 주입: @Autowired 애너테이션을 생성자에 붙여서 의존성을 주입한다.
@Service
public class OrderService {
private final OrderRepository orderRepository;
@Autowired
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
}
- 세터 주입: @Autowired 애너테이션을 세터 메서드에 붙여서 의존성을 주입한다.
@Service
public class OrderService {
private OrderRepository orderRepository;
@Autowired
public void setOrderRepository(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
}
- 필드 주입: @Autowired 애너테이션을 필드에 직접 붙여서 의존성을 주입한다.
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
}
DI의 장점
- 결합도 감소: 객체가 자신의 의존성을 직접 생성하지 않기 때문에, 코드 간의 결합도가 줄어든다.
- 테스트 용이성: 의존성을 외부에서 주입받기 때문에, 테스트 시 Mock 객체로 쉽게 대체할 수 있다.
- 유연성 증가: 의존성 주입을 통해 코드의 변경 없이 의존성만 변경할 수 있다.
결론
DI는 소프트웨어 설계에서 객체 간의 결합도를 줄이고, 유연하고 유지보수하기 쉬운 코드를 작성할 수 있게 해준다. 스프링 프레임워크에서는 DI를 통해 객체의 생명 주기와 의존성 관리를 효율적으로 처리할 수 있다.
'SPRING&BOOT' 카테고리의 다른 글
Path Variable과 Request Param (0) | 2024.08.15 |
---|---|
IoC (제어의 역전) 이해하기 (0) | 2024.08.13 |
3 Layer Architecture (0) | 2024.08.12 |
MVC 디자인 패턴 (0) | 2024.08.09 |
그레이들(Gradle)이란? (0) | 2024.08.09 |