Dependency Injection

이한주·2023년 3월 9일
0

IoC는 다양한 방법으로 만들 수 있다.
전략 패턴, 서비스 로케이터 패턴, 팩토리 패턴, 의존관계 주입 패턴들이 있다.
지금까지 쓴 생성자를 통해서 객체를 주입받는 패턴을 생성자 주입 패턴(DI)이라고 부른다.

스프링은 생성자 주입을 권장한다.

  • 애플리케이션 구성 요소를 불변 객체로 구현하고 필요한 종속성이 null이 되지 않도록 보장한다.
  • 생성자의 파라미터는 항상 초기화된 상태로 클라이언트 코드로 반환된다.

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-setter-injection

의존성 주입 과정은 다음과 같다.

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-dependency-resolution

예시

현재 Config 파일은 다음과 같다.

@Configuration
public class AppConfiguration {

	@Bean
	public VoucherRepository voucherRepository() {
		return new VoucherRepository() {
			@Override
			public Optional<Voucher> findById(UUID voucherId) {
				return Optional.empty();
			}
		};
	}

	@Bean
	public OrderRepository orderRepository() {
		return new OrderRepository() {
			@Override
			public void insert(Order order) {

			}
		};
	}

	@Bean
	public VoucherService voucherService() {
		return new VoucherService(voucherRepository());
	}

	@Bean
	public OrderService orderService() {
		return new OrderService(voucherService(), orderRepository());
	}

}

이를 생성자 주입으로 다음과 같이 바꿀 수 있다.

@Bean
public VoucherService voucherService(VoucherRepository voucherRepository) {
    return new VoucherService(voucherRepository);
}

@Bean
public OrderService orderService(VoucherService voucherService, OrderRepository orderRepository) {
    return new OrderService(voucherService, orderRepository);
}

코드

https://github.com/yanJuicy/kdt-spring-order/tree/c793db236e3885512222b7446cc26e002ba9b8b5

0개의 댓글