카테고리 없음
[Spring] DI가 뭐야? (Spring DI 개념, 구현방법, 활성화)
yoozung
2024. 11. 25. 22:20
DI(Dependency Injection)란?
의존성 주입으로 객체가 필요한 의존성을 스스로 생성하지 않고 외부에서 주입 받는 방식.
객체 간의 의존 관계를 코드 내부에서 직접 정의하지 않고 스프링 컨테이너가 관리하며 객체를 생성하고 필요한 곳에 전달한다.
쉽게 말하면 프로그램에서 필요한 걸 직접 만드는 대신, 스프링이 대신 준비해서 전달해주는 역할을 하는 것
DI가 왜 필요할까?
객체 간의 결합도를 낮추고 코드의 유연성과 재사용성을 높이기 위함.
쉽게 말하면 프로그램을 더 깔끔하고 관리하게 좋게 만드는 것
Spring DI의 특징
1. 객체 재사용성 향상
- 객체간 결합도가 낮아서 테스트나 유지보수가 쉽다
2. IoC(Inversion of Control) 구현
- 객체 생성과 생명주기를 스프링 컨테이너가 관리한다
- 객체가 자신의 의존성을 직접 제어하지 않고 제어권이 컨테이너에 있다
3. 결합도 낮춤
- 객체 간의 직접적인 연결을 없애고 외부 컨테이너가 의존 관계를 관리하여 코드의 유연성을 높임
Spring에서 DI를 구현하는 방법
1. 생성자 주입
- 의존성을 생성자의 매개변수로 전달하는 방법
- 주로 필수적인 의존성을 주입할 때 사용한다
- 가장 명확하게 의존성을 표현할 수 있는 방법이라 생성자 주입 사용을 권장한다
- 주입받는 의존성이 변경되지 않을 때 사용하는 것이 적합하다
- 필수 의존성을 강제로 주입 받아야 해서 안전하다는 특징이 있다
@Component
public class UserService {
private final NotificationService notificationService;
@Autowired
public UserService(NotificationService notificationService) {
this.notificationService = notificationService;
}
}
2. Setter 주입
- Setter 메서드를 통해 의존성을 주입하는 방법이다
- 선택적인 의존성을 주입할 때 적합하다
- 의존성을 선택적으로 주입하거나 나중에 변경이 필요한 경우에 유용하다
@Component
public class UserService {
private NotificationService notificationService;
@Autowired
public void setNotificationService(NotificationService notificationService) {
this.notificationService = notificationService;
}
}
3. 필드 주입
- 필드에 바로 의존성을 주입하는 방법이다
- 코드가 간결하지만 테스트나 유지보수에서 불편할 수 있어 권장하지 않는다
- 간단하고 빠르게 구현할 수 있지만 의존성이 명확히 드러나지 않아서 테스트나 변경이 힘들다
@Component
public class UserService {
@Autowired
private NotificationService notificationService;
}
Spring DI 활성화하는 방법
1. CompoenetScan 사용
- @Component, @Service, @Repository, @Controller를 클래스에 붙이면 스프링이 해당 객체를 자동으로 관리한다
- @Autowired를 사용해 의존성을 주입받는다
2. Java Config 사용
- @Configuration과 @Bean을 사용해 의존성을 설정할 수 있다
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(notificationService());
}
@Bean
public NotificationService notificationService() {
return new NotificationService();
}
}
3. XML Config 사용
- XML 파일에 의존성을 정의해 주입할 수 있으나 예전 방식이라 잘 사용하지 않는다