Spring

[Spring] IoC, DI, DIP

개발 공주 2023. 6. 15. 10:34
728x90

IOC란

" 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다. "

스프링 프레임 워크는 IOC기반이다.

IOC는 Inversion of Control의 약자로 말 그대로 제어의 역전이다. 제어의 역전은 무엇일까

 

  • 제어
    객체 생명주기나 메서드의 호출을 직접 제어한다.(= 관리한다는 의미)
    ex) 직접 객체를 생성하여 코드를 '제어'한다.
  • 역전
    프로그램의 제어흐름을 직접 제어(관리)하는 것이 아니라 역전시켜 외부에서 관리하는 것. (= 제어를 역전시켰다)
    ex) 외부로부터 b를 인자로 받아 초기화한다.

클라이언트 구현 객체가 직접 다른 구현체를 지정,호출하는 것이 아니라 프레임워크가 대신 호출해줌으로써 제어의 흐름을 가져가는 것이다. (여기서 외부 라 함은 객체를 기준으로 봤을 때의 외부를 의미한다.)
이제 구현체는 자신의 로직만 담당할뿐 어떤 구현 객체들이 실행될지는 모른다. (인터페이스만 알고있는 것이다)

이를 통해 객체 생명주기 관리 개발자 대신 스프링(컨테이너) 가 관리해주게 된다.

 

 

DI란

" 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다. "

 

의존관계 주입에서 의존관계  주입 은 무엇일까?

  • 의존성
    클래스 간 의존 관계(의존성)가 있다면, 한 클래스가 바뀌면 다른 클래스도 영향을 받는다.
    결국 의존은 영향을 받는 관계라는 것을 의미한다.
  • 주입
    의존성을 다른 곳으로부터 주입해주는 것이다.

의존관계 주입이란?

이처럼 의존성 주입 DI(Dependency Inversion) 
제어의 역전이 일어나는것을 전제 로 스프링 내부의 객체들 간의 관계를 관리할 때 사용한다.

애플리케이션 실행 시점(런타임)에 (이전에는 인터페이스) 객체 외부에서 실제 구현 객체를 생성해서 그 참조값을 전달하므로써, 클라이언트와 서버의 실제 의존관계가 연결 되는 것이다. (이때, 자바에서는 인터페이스를 사용하려 의존적인 관계를 처리한다./ DIP가 적용된 DI의 경우)

의존관계 주입의 장점은 애플리케이션 코드를 변경하지 않고도 이제 의존관계를 변경할 수 있다는 점이다.

 

의존관계 자동 주입

스프링에서 객체 생성을 자동으로 생성해주는 역할
스프링 빈으로 등록되면 스프링이 자동으로 인스턴스를 생성하며 이때 필요한 의존성도 주입해준다.

Spring의 의존관계를 자동으로 주입하는 방법은 @Autowired 를 사용하면 된다.
@Autowired는 스프링 컨테이너가 주입하려 하는 객체의 타입이 일치하는 객체를(등록된 스프링 빈을) 찾아서 자동으로 주입 한다.

 

의존성주입 방법

3가지 방법이 존재한다.
1.생성자 주입 , 2.Setter 주입 , 3.Interface 주입

 

DIP

의존관계 역전 원칙 - 추상화에 의존할 것, 인터페이스(역할)가 중심이 되어야한다. 구현체에 의존하면 다형성을 잃는다(재활용성을 잃는다)

 

만약 DIP를 적용하지 않는다면

의존성을 주입(DI)하더라도 구체 클래스로 의존성을 주입하게 되면 변경이 어렵게된다.
때문에 DIP를 이용하여 의존성을 분리 시켜야한다.
즉, 상위계층이 하위계층에 의존하는 상황을 Interface를 이용해 반전시켜 하위계층의 구현으로부터 독립시킨다.
DIP를 적용하게되면 기존 생성자 주입 코드와 비교할 때 의존의 방향이 역전되며 변경으로부터 자유로워진 것을 알 수 있다.

 

IoC, DI, DIP 정리

IoC, DIP 는 원칙(Principle)이고, DI는 IoC를 달성하기 위한 디자인 패턴 중 하나이다.
Spring DI/IoC는 프레임워크로 스프링이 DI를 자동으로 해줌으로써 프로그램의 제어권을 가져가는 역할을 해준다.

 

IoC 와 DIP 의 목적/관계

둘 다 클래스 간 결합을 느슨히 하기 위한 목적을 지녔다.
한 클래스의 변경이 다른 클래스들에게 미치는 영향을 최소화 함으로써 애플리케이션을 지속가능성있고 확장성있게 만들 수 있게 한다.


참고

https://velog.io/@yyy96/Spring

https://www.saichoiblog.com/javaforspring/

'Spring' 카테고리의 다른 글

[Spring] 객체 지향 설계의 5가지 원칙 (SOLID)  (1) 2023.06.18
[Spring] 스프링배우기전에 꼭 보기  (0) 2023.06.15
[Spring] AOP  (0) 2023.06.15
[Spring] Spring Framework란  (0) 2023.06.15
[Spring] @RequestParam  (0) 2023.06.12