본문 바로가기

SpringBoot/스파르타 스프링 심화

[스파르타 스프링 심화] 01.15 DI (dependency Injection,의존성 주입) 사용하기 , Ioc(제어의 역전)

728x90
반응형

##중복 객체생성과 강한열결 문제 

-중복객체생성: 여러개의 컨트롤러, 서비스,리파지토리가 있을 때 각 클래스 마다 서비스,리파지토리를 생성되 불필요한 여러개의 객체가 생성됨

-강한연결: 리파지토리에 변수가 추가 되었다면 -> 서비스, 컨트롤러에서 일일히 고쳐야 됨

-해결하기위해 DI 사용!!

 

##의존관계 다이어그램

-Repository1 객체 생성-> Service1 객체 생성(Repository1 을 DI 받음) -> Controller 5개 생성(Service1 을 DI 받음)

 

 

1. DI(dependency Injection) 의존 주입 사용하기

1) 서비스에서 리파지토리 이용하기

-만약 리파지토리가 하나 생성이 되어 있다면 ProductService 클래스에서는 미리 생성되어 있는 ProductRepository 객체를 그냥 가져다 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
public class ProductService {
    // 멤버 변수 선언
    private final ProductRepository productRepository;
 
    // 생성자: ProductService() 가 생성될 때 호출됨
    public ProductService(ProductRepository productRepository) {
        // 멤버 변수 생성
        this.productRepository = productRepository;
    }
}
 
ProductService productService = new ProductService(productRepository);
cs

 

2)ProductController 클래스도 마찬가지로 미리 생성되어 있는 ProductService 를 사용

 

-

1
2
3
4
5
6
7
8
9
10
11
12
public class ProductController {
    // 멤버 변수 선언
    private final ProductService productService;
 
    // 생성자: ProductController() 가 생성될 때 호출됨
    public ProductController(ProductService productService) {
        // 멤버 변수 생성
        this.productService = productService;
    }
}
 
ProductController productController = new ProductController(productService);
cs

 

 

2. 강한연결 문제 해결

- 위의 코드처럼 DI를 이용해 객체를 생성했다면 리파지토리에 변수가 추가되어도 

ProductService ,ProductController 의 코드는 변화가 필요 없음.

 

 

3. 제어의 역전 (IoC: Inversion of Control) 

:DI를 사용하면 프로그램 제어 흐름의 반대가 됨. 사용자가 자신이 필요한 객체를 생성해서 사용하는 것이 일반적인데, 반대로 필요한 객체를 요청하면 어디서 어떻게 만들어졌는지 알 필요 없는 객체가 사용자에게 제공 되는 것.

반응형