본문 바로가기
OOP

IoC - 제어의 역전에 대해서...

by Ahngyuho 2023. 9. 11.

이번 포스팅의 주제는 제어의 역전입니다. 스프링을 사용하다 보면 제어의 역전/의존성 주입 이라는 단어가 항상 눈에 띕니다.

그리고 프레임워크와 라이브러리의 차이가 제어의 역전에 있다는 문장을 접해본 적이 있었습니다. 뭔가 사용하는 데 있어서 다를게 없는 거 같은데 제어의 역전이라는 차이가 있다는 것에 흥미가 생겼습니다.

 

그래서 이번 주제는 제어의 역전이고, 개념을 최대한 정확하게 이해하고 정리해 볼게요!

 

IoC - 제어의 역전이란...

우선 여기서 제어의 흐름이라는 개념에 대해 알고 갈 필요가 있습니다.

제어의 흐름은 일반적인 프로그램의 흐름이 아닌 그와 반대되는 흐름을 가지는 것으로 볼 수 있습니다.

좀 더 자세히 살펴보겠습니다.

 

 일반적인 프로그램의 흐름은 대개 이렇게 흘러 갑니다. Java에서는 main 메서드를 작성하고 그 안에 사용할 객체를 생성하고, 그 객체 안에 여러 요소들이 호출되고 또 그 메서드 안에 존재하는 객체들에 의해 여러 다른 요소들이 작동하면서 프로그램은 동작합니다.

위의 프로그램의 흐름은 달리 말하면 각 객체들이 프로그램의 흐름에 적극적으로 참여하는 것으로 해석할 수 있습니다.

모든 객체들이 능동적이고 적극적으로 프로그램에 가담하는 것입니다.

 

제어의 역전이라는 것은 위의 흐름을 거꾸로 뒤집는 것입니다.

객체를 생성하는 것도, 객체의 메서드를 호출하는 것도 객체가 할 수 없는 것입니다. 그래서 객체 조차 자신들이 어떻게 사용되는 지 알 수가 없습니다. 모든 제어의 권한을 다른 대상에게 위임하는 것입니다.

 

왜 사용될까?

IoC라는 개념은 사실 좋은 객체 지향 설계를 하다보면 자연스럽게 등장하고 코드에 적용되는 개념인 것 같습니다.

 

 IoC를 적용하게 되면 설계가 깔끔해지고 유연성이 증가하며 확장성이 좋아지기 때문에 IoC 스타일의 설계와 코드를 만들어 사용하면 좋습니다.

 

 최근에는 마이크로 서비스 아키텍처로 SOA를 구축하는 일이 많아지고 있습니다. 각각의 기능을 담당하는 다양한 서비스들의 관리를 IoC가 맡아서 하게 되니 이러한 설계도 가능해 졌다고 생각합니다...

 

 IoC는 단위 테스트에서도 굉장히 중요합니다. 기능 하나를 테스트 하려고 해도 여러 요소들과 종속적인 관계를 유지하며 프로그램이 실행되는데  IoC를 사용하게 되면 이 모든 흐름을 관리하는 IoC가 존재하기 때문에 흐름을 의도적으로 바꿔 사용할 수 있게 되는 것입니다.

 

마치며

제가 설명드린 IoC는 스프링같은 프레임워크에서 작동되는 IoC 보다는 보다 더 폭 넓은 IoC의 개념에 대해서 설명드렸습니다. 

IoC라는 것은 사실 몰라도 프로그램 작성은 얼마든지 할 수 있습니다. 처음에 IoC와 같은 개념을 접하게 되면 어려워 보이고, 굳이 알아야 되나, 몰라도 지금까지 프로그램 작성하는데 큰 문제 없었던거 같은데... 이런 생각을 하게 되는 것 같아요.

 

 하지만 내가 사용하는 프레임워크의 핵심을 이해하게 되면 좀 더 폭 넓은 시야로 소프트웨어를 바라볼 수 있게 되는 것 같고, 이런 어려운 개념을 어느 정도 이해했다는 성취감이 참 좋은 것 같습니다.