오늘은 Spring 프레임워크의 IOC(Inversion Of Control)에 대해 알아보려고 합니다.
맨 처음 Spring을 사용했을 때부터 지금까지 IOC에 대한 구체적인 이해없이 개발을 하다보니 무언가 개발을 할 때 이해없이 결과만을 보고 구현하는 사람이 된 것 같았고, 팀 동료들에게 코드에 대한 설명을 진행할 때, 왜 다음과 같이 구현했는지 깔끔하게 설명하지 못했습니다.
이번 글을 작성하며 Spring 프레임워크의 이해도를 높이고 의미있는 코드를 작성하는 개발자로서 성장하고자 합니다.
IOC(Inversion Of Control)란 제어의 역전이라는 의미입니다. 보통 제어의 역전이라는 단어를 들었을 때 어떤 생각이 드나요?
보통 제어의 역전이라는 단어를 들으면 '뭔 개소리지?'라고 생각할 것 같습니다. 그건 주체가 빠져있어서 그렇다고 생각합니다. 만약 "제어의 역전"이라는 단어 앞에 "개발자와 프레임워크간"이라는 단어가 포함된다면 어떤 의미로 받아들여질까요?
개발자와 프레임워크간 제어의 역전
Spring IOC란, 개발자가 제어해야할 요소들을 Spring Framework에서 대신 제어해준다는 의미를 가집니다. 그럼 무엇을 개발자 대신 프레임워크가 제어해줄까요?
Spring IOC를 검색했을 경우 다음과 같은 설명이 나옵니다.
Spring IoC Container is the core of Spring Framework.
It creates the objects, configures and assembles their dependencies, manages their entire life cycle.
The Container uses Dependency Injection(DI) to manage the components that make up the application.
It gets the information about the objects from a configuration file(XML) or Java Code or Java Annotations and Java POJO class.
These objects are called Beans. Since the Controlling of Java objects and their lifecycle is not done by the developers, hence the name Inversion Of Control.
다음을 설명을 요약하면 다음과 같습니다.
Spring IoC Container
는 Spring Framework의 핵심 요소로, 객체를 생성하고 의존성을 구성하고 결합하며 생명 주기를 관리합니다.
Spring IoC Container
는 DI(Dependency Injection)를 사용해 어플리케이션에서 구성하는 컴포넌트들을 관리합니다.
Spring IoC Container
는 xml파일과 java 코드, 어노테이션, java POJO 클래스를 통해 객체에 대한 정보를 가져오는데, 이러한 객체들을 Bean이라 부릅니다.
객체들의 생명주기가 개발자가 아닌 프레임워크의 제어를 통해 진행되기 때문에, Inversion Of Control이라는 명칭을 가지게 되었습니다.
POJO란 Plain Old Java Object 라는 의미로 말 그대로 번역하면 오래되고 간단한 자바 객체라는 의미입니다. 간단하게 말하면 객체지향적으로 구현한 자바 객체라고 생각하면 될 것 같습니다.
Bean이란, Spring IoC Container에서 관리하고 있는 인스턴스화 된 객체를 의미합니다. 애플리케이션을 실행할 때, 인스턴스화 되는 객체들은 개발자가 아닌 Spring IoC Container에서 관리하는데, 이를 Bean이라 부릅니다.
다음 다이어그램을 보면 Spring IOC Container가 어떻게 동작하는지 알 수 있습니다.
어플리케이션을 실행할 경우, 기본적으로 구성 메타데이터(xml)와 POJOs를 Spring IOC Container에서 읽어 Bean을 생성하고 해당 Bean들을 통해 시스템을 사용할 수 있도록 구성합니다.
Spring IOC Container가 과거에 없을땐 개발자가 다 관리했었는데... 이제 다 해주니 감사히 여기면서 Spring Boot를 이용해 개발합시다!
geeksofgeeks - spring ioc container
baeldung - inversion of control