1. 제어의 역전 IOC (Inversion of Control)
- 보통 프레임워크 없이 개발 할 경우, 객체의 생성, 설정, 초기화, 메서드 호출, 소멸, 즉 한 객체의 모든 것을 프로그래머가 직접 관리한다.
- 하지만 프로그래머가 작성한 객체, 그리고 포함된 메서드를 개발자가 아닌, 외부에서 제어하는 것을 제어의 역전(IOC)이라고 한다.
- 따라서 프로그래머는 핵심 코드 개발에 더 집중할 수 있고, 프로그램의 제어 책임은 프레임워크로 넘어간다는 장점이 있다.
- 위에서 자주 나온 내용인 "프레임워크"와 우리가 일반적으로 사용하는 라이브러리를 구분하는 방법은 다음과 같다.
-> 프레임워크 : 내가 작성한 코드를 제어하고, 대신 실행한다.
-> 라이브러리 : 내가 작성한 코드를 직접 제어한다.
(내가 작성한 코드가 제어의 흐름을 담당하는 것도 이에 해당된다.)
- 아래서 나올 AppConfig가 IOC의 예시이다. (AppConfig가 다른 구현 객체를 생성하고 실행할 수 있다.)
2. 의존관계 주입 DI(Dependency Injection)
- 프로그램을 개발하면서 OCP, DIP를 지키면서 객체지향스럽게 프로그래밍 할 수 있도록 해주는 개념이다.
- 객체 간의 관계를 직접 맺지 않고, DI 컨테이너와 인터페이스의 도움을 받아 관계를 맺는 방식이다.
모든 설명에 나오는 예시 프로젝트의 설계 방식은 아래 링크를 참고 https://imgzon.tistory.com/114 |
- 간단한 예시를 들어보자
- 1. 의존관계 주입을 사용하지 않을 경우
// DiscountPolicy라는 인터페이스가 있고,
// 이를 구현한 FixDiscountPolicy, RateDiscountPolicy가 있다고 가정하자
class OrderServiceImpl {
private DiscountPolicy = new FixDiscountPolicy;
//private DiscountPolicy = new RateDiscountPolicy;
}
- 위와 같이 설계를 한 후 할인 정책을 바꾸고 싶으면, 직접 구체화하는 객체를 고쳐야 한다.
- 따라서 좋은 객체 지향 설계 원칙 SOLID중 OCP, DIP를 어기게 된다.
- 2. 의존관계 주입을 사용할 경우
// DiscountPolicy라는 인터페이스가 있고,
// 이를 구현한 FixDiscountPolicy, RateDiscountPolicy가 있다고 가정하자
class OrderServiceImpl {
private DiscountPolicy discountPolicy;
public OrderServiceImpl(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy
}
}
// 서로 다른 클래스이므로, 위 클래스와 다른 파일이라고 생각하자
// OrderService 인터페이스를 구현한 구현체가 OrderServiceImpl
class Appconfig {
public OrderService fixDiscountPolicy() {
return new OrderServiceImpl(new FixDiscountPolicy);
}
}
- 위와 같은 경우, OrderServiceImpl 클래스의 입장에서는 외부에서 할인 정책을 결정해주게 된다.
- 따라서 할인 정책이 변경되어도, OrderServiceImpl 클래스의 코드를 변경할 필요가 없어진다!
- 1번의 방식은 FixDiscountPolicy 혹은 RateDiscountPolicy, 즉 구현체에 의존하였지만, 2번의 방식은 DiscountPolicy 에만 의존하게 된다.
- > OCP, DIP를 모두 지킬 수 있게 되었다
- 마치 외부 요인이 OrderServiceImpl의 의존관계를 생성자를 통해 주입한 형태이다.
3. IOC 컨테이너, DI 컨테이너
- 위 예시의 AppConfig 처럼, 객체를 생성하고 관리하며 의존관계를 연결해 주는 것을 IOC 컨테이너 혹은 DI 컨테이너라고 한다.
- 주로 의존관계 주입에 초점을 맞춰서, DI 컨테이너라고 많이 부른다.
위 내용은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편"의 내용과 강의자료를 토대로 작성된 게시글입니다.
강의 링크:
'Web > spring study' 카테고리의 다른 글
[Spring] 스프링 빈과 스프링 컨테이너 (0) | 2023.01.09 |
---|---|
[Spring] 예시 스프링 프로젝트 설계 (0) | 2023.01.09 |
[Spring] 객체 지향 설계와 스프링 (0) | 2022.05.26 |
[Spring] 좋은 객체 지향 설계 5가지 원칙(SOLID) (0) | 2022.05.26 |
[Spring] 좋은 객체지향 프로그래밍이란? (0) | 2022.05.17 |
댓글