📝 DI와 DIP 에 추가적으로 학습한 내용
: 의존성 주입, IoC의 원칙(역제어)을 구현하기 위해 사용되는 방법 중 하나
class A {
B b = new B();
C c = new C();
}
new연산자를 이용해 직접 객체를 생성할 경우, A클래스가 B,C객체에 강한 의존 관계가 성립된다. 💡응집도와 결합도
- 응집도 : 모듈에 포함된 내부 요소들이 연관되어 있는 정도
하나의 변경을 수용하기 위해 모듈 전체가 함께 변경 -> 응집도가 높은 것- 결합도 : 의존성의 정도, 다른 모듈에 대해 얼마나 많이 관여하고 있는지에 대한 척도
다른 모듈에 대해 자세히 알수록 결합도가 높은 것 -> 서로 연관되어 있기 때문에 결합도가 높을 수록 변경 사항을 수용하기 어렵다.객체지향적 설계의 목표😠👊
코드의 재사용성, 원활한 유지보수(변경 용이), 중복된 코드 제거
class A {
B b;
C c;
// 생성자를 통해 주입
public A(B b) {
this.b = b;
}
public A(C c) {
this.c = c;
}
}

MemberService에서 생성된 MemberRepository로 카페 손님의 이름과 주문이 저장되었고, 저장된 내역에 따라 주문 받은 것을 손님에게 주어야 하는데 OrderService에 생성된 MemberRepository은 MemberService에서 생성된 것과 달라 주문 내역이 저장되어 있지 않다.MemberRepository를 사용하지 않고 각각 별도의 객체를 생성하여 여러가지 문제가 발생할 수 있다.
MemberRepository를 사용할 수 있고 추후에 MemberRepository에 문제가 발생하더라도 MemberRepository의 파일만 변경하면 되므로 유지보수가 상대적으로 쉽다.: 의존성을 주입하는 방법에는 4가지 방법이 존재한다.
@Autowired어노테이션을 입력하는 방법@Autowired어노테이션을 생략할 수 있다.@Component
public class CoffeeService {
private final MemberRepository memberRepository;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, {
this.memberRepository = memberRepository;
}
}
@Autowired어노테이션을 입력하는 방법@Autowired어노테이션 생략 불가@Autowired어노테이션을 입력하는 방법@Autowired어노테이션을 입력하는 방법💡생성자 주입을 권장하는 이유
1. 생성자는 객체를 생성할 때 단 한번만 호출되므로 종료 전까지 변경될 일이 없다.
2. 의존성 주입이 필요한 필드를 final로 선언할 수 잇따.
3. 테스트 코드 작성이 용이하다.
4. 순환 참조를 방지할 수 있다.