본문 바로가기
Web/spring study

[Spring] IOC, DI, 컨테이너

by 장인이 2022. 12. 17.

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를 어기게 된다.

(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 컨테이너라고 많이 부른다.

 

 


위 내용은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

댓글