📝 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. 순환 참조를 방지할 수 있다.