IoC(Inversion of Control)란?
제어의 역전이라는 뜻입니다. 프로그램의 흐름을 개발자가 아닌 프레임워크가 제한하는 것을 말합니다.
말로는 잘 이해가 안되니 코드로 설명하겠습니다.
주문 시스템 클래스 다이어그램
OrderServiceImpl 클래스
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(DiscountPolicy iscountPolicy) {
this.discountPolicy = discountPolicy;
}
...
}
AppConfig 클래스
public class AppConfig {
public OrderService orderService() {
return new OrderServiceImpl(discountPolicy());
}
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy(); //비율할인
//return new FixDiscountPlicy(); 정액할인
}
}
클래스 다이어그램을 보면 정액 할인(FixDiscountPolicy)과 비율 할인(RateDiscountPolicy)은 DiscountPolicy를 의존하고 있습니다.
이때, OrderServiceImpl의 코드에서 정액 할인을 쓸지, 비율 할인을 쓸지 알 수 있을까요?
코드만 봤을 때는 모릅니다.
그럼 AppConfig클래스 코드를 봅시다. 클래스 다이어그램대로 discountPolicy메서드에서 비율 할인인지, 정액 할인인지를 결정해주는 걸 확인할 수 있습니다.
결론
이런 상황처럼 클라이언트 구현 객체가(OrderServiceImpl) 직접 객체를 생성하고 할당하는 것이 아닌, AppConfig가 객체를 만들어주고 조종합니다. 이렇듯 제어 흐름을 직접 제어하는 것이 아닌 외부에서 관리하는 것을 제어의 역전이라고 합니다.
DI(Dependency Injection) 의존성 주입이란?
의존성 주입은 외부에서 주입되는 의존성 관계입니다.
DI는 정적, 동적 의존관계가 있습니다.
- 정적인 클래스 의존관계 : import만 보고 클래스의 관계를 판단 가능
- 동적인 클래스 의존관계 : 코드가 실행되기 전까지 의존관계를 모름.
위의 코드를 가지고 설명을 하면, 코드가 실행되기 전까지 할인 정책이 비율 할인인지, 정액 할인 인지 구분을 못하고 외부에서 제공(주입)해줘야 합니다.
개인적인 생각으로 IoC가 더 넓은 개념이고 DI가 더 세부적인 개념인 거 같습니다.
컨테이너
IoC, DI를 다 이해했다면 컨테이너는 쉽습니다. AppConfig처럼 외부에서 객체를 생성하고 결정해 주는 것을 컨테이너라고 합니다.
그럼 이것들을 하는 이유가 뭘까요? 객체지향의 5원칙중 OCP, DIP를 위반하지 않기 위해서 입니다.
비록 지금은 이해하기 쉽도록 스프링을 사용하지 않았지만, 다음 게시물에선 스프링 컨테이너와 싱글톤패턴에 대해
설명하겠습니다...끝!
출처
김영한. 스프링 핵심 원리 - 기본편
'웹 > 백엔드, Spring' 카테고리의 다른 글
[Java] 스프링 컨테이너와 싱글톤 컨테이너 (0) | 2021.07.21 |
---|---|
[Java] Spring과 SOLID - 2편 (0) | 2021.07.19 |
[Java] Spring과 SOLID - 1편 (1) | 2021.07.19 |
[간단한 게시판 만들기] - 3. 게시글 쓰기 (0) | 2020.10.19 |
[간단한 게시판 만들기] - 2. 로그인 기능( 세션, 쿠키 설정) (0) | 2020.10.17 |