leelee.log

[Spring] Inversion of Control 본문

개발/Backend

[Spring] Inversion of Control

leeleelee3264 2020. 2. 8. 11:55

spring framework

*얼마전부터 유튜브에 열려있는 백기선님의 '스프링 입문' 이라는 강좌를 듣기 시작했다. 몇몇 개념들은 정리를 해두면 좋을 것 같아서 블로그 포스팅을 하려고 한다. 다른 분들을 위해 강좌 링크를 밑에 남겨두겠다.*


 스프링을 사용하면서 DI(dependency injection) 이라는 개념을 들어봤는데 Inversion of Control이라는 중요한 개념이 있었다. 내가 사용할 의존성을 내가 관리하지 않고 누군가 만들어서 주기 때문에 원래 내가 가지고 있어야 할 제어권이 넘어갔다고 하여 제어권 역전 이라고 한다. 스프링은 분명 개발 언어로 자바를 사용하고 있는데 이 inversion of control 때문에 우리가 객체를 사용하고자 할 때 일반 자바와 사용하는 방법에 약간의 차이가 있다.

 

<일반 자바>

<스프링에서 사용하는 자바>

 

 

1. 자바에서 어떤 클래스 객체를 사용하고자 하면 new 키워드를 사용하여 생성자를 호출하여 객체를 '생성' 해야한다.

2. 스프링에서는 사용하려는 객체를 직접 만들지 않고, 객체를 사용하려는 클래스(여기서는 foo class)의 생성자에 포함시켜, this 를 해주기만 하면 된다.

3. foo class에서는 Student 객체를 만든적이 없는데, 그럼 Student 객체는 누가 만들어서 넣어주는걸까?

3번의 역할을 하는 게 바로 Spring이고, 의존성을 주입해준다고 하는 것이다. 그리고 내가 사용하려는 객체의 의존성을 내가 만들지 않고, Spring이 해버리니 프로그래머의 입장에서는 의존성제어 권한을 역전 당한 것이라서 Inversion of Control 이라고 한다.

*Spring에서 사용하는 의존성 주입은 @Autowired 어노테이션이 사용되는 Field Injection, Setter Injection, Constructor Injection이 있는데 Dependency Injection에 대한 포스트에서 자세히 다루도록 하겠다.*

 

 

그럼 Spring은 어떻게 이런 일을 할까?

 

IoC Container
우리가 아는 컨테이너

 Spring은 IoC 컨테이너 라는 걸 가지고 있다. (DI container, Spring container 라고 혼용된다). 보통 떠오르는 컨테이너는 위 그림과 같은데, 컨테이너라고 하면 안에 무엇인가로 가득 채워져있다. IoC 컨테이너도 마찬가지인데, IoC는 Bean으로 잔뜩 채워져있고 Bean을 관리하고 있다. (여기서는 Spring에서 사용하는 객체를 Bean이라고 부른다 정도로만 알고있자) Spring은 IoC 컨테이너에서 Bean을 가지고 있다가 우리가 사용하는 @Autowired 어노테이션을 보고 컨테이너에서 Bean을 꺼내와 주입해준다.

 

다시 한 번 스프링의 코드를 생각해보자.

평소에 아무런 생각없이 사용을 했지만 이 짧은 코드를 잘 살펴보면 결국 foo class는 클래스 내부에서 사용하는 Studnet 객체가 없으면 애초에 만들어질 수 없다. 그래서 조금 더 안전한 코드가 된다는 걸 강의를 들으면서 알았다.

 

 

Conclusion

 IoC와 DI 개념이 나온 이유는 클래스들 사이의 의존성 때문이다. 한 클래스 안에서 다른 클래스의 객체를 생성하고 사용하면 의존성이 아주 강한 코드가 되어버리고 만다. IoC 패턴을 따르다보면 제어권이 내가 짠 코드에 없고 라이브러리(여기서는 spring framework)에 있다고 보면 된다. 그래서 사실 내가 짠 코드들은 서로 얘가 있나? 선언이 되어있나? 그런 사실을 모르고 spring이 알아서 관리해주겠지~ 하고 자기 할 일만 열심히 한다. 굉장히 추상적이 된 것이다. 예를 들면 학생들(클래스들)끼리 서로 연락을 주고 받지 않고, 선생님을 통해서(IoC 컨테이너) 다른 학생들과 소통한다고 생각했다. 클래스들 끼리의 의존성은 떨어지는 것이다.


참고자료

https://youtu.be/NZ_lPFvu9oU

IoC 컨테이너

https://jojoldu.tistory.com/28

 

ServletContainer? DI Container? Bean? POJO?

매주 월/목요일 저녁마다 박재성(a.k.a 자바지기)님의 Java 강의를 수강중이다. (현재 1기인데 다음 2기가 시작되면 꼭꼭 듣길 추천한다. 참고) 매 시간마다 즐거운 깨달음의 연속이지만 특히나 어제 (2016년 7월..

jojoldu.tistory.com

IoC 컨테이너에 대해 설명하면서 application context에 대한 설명도 나와있다.

https://homesi.tistory.com/entry/IoCInversion-of-Control-%EC%A0%9C%EC%96%B4%EC%9D%98-%EC%97%AD%EC%A0%84

 

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

[IoC(Inversion of Control- 제어의 역전)란?] : IoC란 프로그램의 제어 흐름 구조가 바뀌는 것 ** 일반적인 프로그램의 흐름 구조는 main()과 같은 프로그램이 시작되는 지점에서 사용할 오브젝트를 결정, 생성하..

homesi.tistory.com

swift로 코드의 의존성과 Ioc, di 의 필요성에 대한 설명이 매우 잘 나와있다.

https://develogs.tistory.com/19

 

제어의 역전(Inversion of Control, IoC) 이란?

Head First OOAD, Gof Design Pattern 같은 OOP 기본서에서 'Hollywood principle'이나 'Inversion of Control'이란 용어를 많이 들어봤을 것이다. 이런 디자인 관련 책들에서 굉장히 반복적으로 나오는 용어인 것..

develogs.tistory.com