##중복 객체생성과 강한열결 문제
-중복객체생성: 여러개의 컨트롤러, 서비스,리파지토리가 있을 때 각 클래스 마다 서비스,리파지토리를 생성되 불필요한 여러개의 객체가 생성됨
-강한연결: 리파지토리에 변수가 추가 되었다면 -> 서비스, 컨트롤러에서 일일히 고쳐야 됨
-해결하기위해 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를 사용하면 프로그램 제어 흐름의 반대가 됨. 사용자가 자신이 필요한 객체를 생성해서 사용하는 것이 일반적인데, 반대로 필요한 객체를 요청하면 어디서 어떻게 만들어졌는지 알 필요 없는 객체가 사용자에게 제공 되는 것.
'SpringBoot > 스파르타 스프링 심화' 카테고리의 다른 글
[스파르타 스프링 심화] 01.18 스프링이 제공하는 프레임워크를 이용해 서비스 변경하기(@Service ,@Transactional,JpaRepository 등) (0) | 2021.08.12 |
---|---|
[스파르타 스프링 심화] 01.16 스프링 IoC 컨테이너 사용하기 (0) | 2021.08.12 |
[스파르타 스프링 심화] 01.14. DI (의존성 주입)의 이해 (0) | 2021.08.12 |
[스파르타 스프링 심화] 01.12. 관심사 별 코드 분리해보기 (0) | 2021.08.12 |
[스파르타 스프링 심화] 01.11 관심사 분리해보기 (0) | 2021.08.12 |