기록과 정리

DI ( Dependency Injection ) , IoC (Inversion Of Injection )이란? 본문

IT/Spring

DI ( Dependency Injection ) , IoC (Inversion Of Injection )이란?

zepetto 2021. 6. 5. 19:35

이 글은 해당 Link 영상 및 글을 참고 하였습니다.

https://www.youtube.com/watch?v=fGOU7JqNHyE&t=47s 

DI ( Dependency Injection )

의존 주입은 스프링뿐만 아니라, 자바 객체 지향에서 중요한 개념으로써 객체지향프로그램에서 다른 객체에 의존하거나 , 내가 직접 생성하여 사용할 수 있다. 

 

강한 결합/ 약한 결합

- 강한 결합은 직접 객체를 생성함을 의미

- 일체형 , 그 자리에서 부품을 만들어 사용한다.

 

약한 결합은 생성된 객체를 주입 받음 -> Dependency Injection 

- 부품을 만들어서 꽂는 작업. 객체를 조립해서 사용하는 것에 어떠한 장점이 있는가?

- 다른 class의 변화에 보다 유연하게 대처할 수 있는 프로그래밍

- 실제 스프링 컨테이너가 웹에서 사용하도록 많은 클래스를 만들어 놓았기때문에 웹 개발을 보다 손쉽게 할 수 있다.

( 결합도는 낮추고 , 유연성과 확장성은 확장 )

- 객체간의 의존관계를 줄이거나 없앨 수 있다. ( 아래 참고 )

Member가 private 으로 설정시, 강한 결합은 영향을 받는다.

DI를 하는 방법

DI를 스프링에서 구현하는 방법은 크게 3가지이다. 

 

1. Field Injection

2. Setter Injection

3. Constructor Injection

 

Field Injection 

 

Field를 선언한뒤 @Autowired 키워드로 인한 주입

@Autowired 외에도 @Qulifier("bean이름") 으로 주입받는 것이 가능하다. 간단하지만 스프링에 의존적인 주입방법이다. 

의존 관계가 눈에 잘 보이지 않고 추상적이다. 이로인해 의존관계가 복잡해질 수 있다.  - 의존성이 숨는다

 

또한 필드에 final 선언이 불가하다. 객체가 변할 수 있다. - 불변성(Immutability)

 

여기서 Constuctor Injection을 사용하면 Constructor의 파라미터가 많아짐에 동시에 하나의 클래스가 많은 책임을 가진다. 

또한 Setter나 Constructor와 달리 개발자들에게 확실한 커뮤니케이션이 되지 않는다. - 단일 책임의 원칙 위반 

 

DI프레임워크의 핵심은 , 관리되는 클래스가 독립적으로 인스턴스화 되는 POJO 객체이어야한다. DI 컨테이너 없이도 유닛테스트에서 인스턴스화하여 테스트가 가능하도록 한다. 하지만 Field Injection은 필요 의존성을 가진 클래스를 곧바로 인스턴스화할 수 없다.

- DI 컨테이너와 결합성과 테스트 용이성

 

즉, 읽기 쉽고 선언하기 쉬운 장점밖에 없다. 

 

Setter Injection

 

객체 생성시, 의존관계를 주입하지 않아도 객체 생성이 가능하다. 그렇게 때문에 NullPointerException 발생가능성이 있어 해당 객체의 참조가 null인지 확인햊야하는 로직이 필요하다. field Injection과 마찬가지로 final 은 선언 불가하다. 

 

Construction Injection

Constructor Injection

Spring 4.3이상 부터 권고 , 의존성 주입 대상 필드를 final로 불변 객체 선언할 수 있으며 테스트 코드 작성시 생성자를 통해 의존성 주입이 용이하다. 또한 위에서 언급한 null을 직접적으로 주입하지 않는 한 객체는 NullPointerException을 발생하지 않는다. 

 

단점으로는 구현이 번거롭다는 점인데, 이러한 부분은 Lombok을 이용하여 간단한 주입 방식으로 해결 가능하다. 

 

순환참조가 발생시 , 생성자 주입으로 해결하기 어려운 단점이 있다. 이럴 때는 다른 주입 방법으로 해결 ( 순환 참조가 안일어나게 하는게 더 중요 ) 하지만 BeanCurrentlyCreationException 을 발생시켜 순환참조를 알 수 있다.

제어의 역전 - IoC ( Inversion Of Control ) 

객체를 생성하고 라이프사이클을 관리하는 컨테이너 ( 스프링 )로 제어권이 넘어갔다는 의미로 IoC ( Inversion Of Control ) 이라 명명한다. 객체간 의존관계는 스프링 컨테이너가 관리하므로 사용만하면 되어 개발자의 관리가 적어진다는 장점이 있다. 

 

제어의 역전은 추후 포스팅에 자세히 정리해보자.

 

 

'IT > Spring' 카테고리의 다른 글

RestTemplate vs WebClient 비교  (0) 2022.07.14
ResourceLoader 인터페이스  (1) 2021.01.26
MessageSource 인터페이스  (0) 2021.01.26
InternalResourceViewResolver  (0) 2021.01.25
EnviromentCapable & @Profile & 프로퍼티  (0) 2021.01.25