본문 바로가기

스터디/성희

IoC 컨테이너의 개념 및 역할

컨테이너란?

쉽게 예시를 들자면, 현재 컴퓨터 조립하는 회사에 다닌다고 가정.

고객에게 주문서가 들어오면 우리는 주문서대로 컴퓨터를 만들기 위한 부품들을 박스에 담게 되는데 그것이 컨테이너.

마찬가지로 우리가 스프링을 사용할 때 만들어야 할 주문서대로 객체를 담아야 하는데, 소프트웨어상 그 객체들을 담는 공간을 일반적으로 컨테이너라고 한다.

 

⇒ 객체의 생성과 관리를 담당하며 객체 운용에 필요한 다양한 기능을 제공하는 것으로 이해하면 된다.

 

IoC란?

Inversion Of Control 제어 반전, 제어의 역전

 

객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.

 

우리가 사용하던 자바 프로그램에서는 개발자가 직접 객체를 생성하고, 원하는 클래스 내에서 다른 객체를 생성해 사용했다.

→ 이 경우 개발자가 객체의 생명 주기를 관리하고 있다.

 

제어의 역전이 일어나면, 개발자가 아닌 다른 무언가가 관리를 위임하게 된다. 개발자의 제어 권한을 다른 주체에게 넘기는 것을 IoC(제어의 역전)라고 한다.  Spring은 직접 자바 객체를 생성하고 관리하기 때문에 이 관리 위임 주체는 Spring이 된다.

 

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

 

스프링 프레임워크도 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데, 그것이 바로 IoC 컨테이너(= 스프링 컨테이너)이다.

 

loC 컨테이너의 역할

Spring IoC 컨테이너는 객체의 생명주기(객체가 생성되고 사용되는 전체 과정)를 관리하고, 필요한 객체를 생성하며, 의존성을 해결하여 개발자가 더욱 편리하게 애플리케이션을 개발할 수 있도록 돕는다.

  • 객체의 생성과 관리
    • 어플리케이션에서 필요로 하는 객체들을 컨테이너가 생성하고 관리해준다.
    • 예시
      • xml과 같은 설정 파일을 사용하여 객체의 생성 및 관리 정보를 정의한다.
      <beans>
          <bean id="userService" class="com.example.UserService"/>
          <bean id="userDao" class="com.example.UserDao"/>
      </beans>
      
      • 어노테이션을 이용하여 객체를 생성하고 관리한다. ex) @Component, @Service 등
  • 의존성 주입 (Dependency Injection)
    • 의존성 주입 : 객체가 필요로 하는 다른 객체를 생성하는 것이 아니라, 외부에서 필요한 객체를 주입받아 사용하는 것.
  • 스코프 관리
    • 빈이 생성되고, 존재하고, 적용되는 범위를 빈의 스코프(scope)라고 한다.
    • 스프링은 다양한 스코프를 지원하며, IOC 컨테이너는 빈의 스코프를 관리한다.

 

+ 장점

  • 객체 관리 주체가 컨테이너가 되기 때문에 개발자는 비즈니스 로직에 집중할 수 있다.

  • 객체 생성 코드가 없으므로 TDD가 용이하다.
    + TDD (Test-Driven Development) : 테스트를 먼저 작성하고 그 후에 해당 기능을 구현하는 방식
    • 의존성 주입을 통해 테스트용 객체를 주입할 수 있다. IoC 컨테이너를 사용하면 개발자는 테스트 코드에서 객체를 직접 생성하거나 관리할 필요가 없다.
    • → 테스트 작성을 단순화 / 테스트 코드의 가독성 향상 / 테스트 용이성 향상
  • 의존성을 주입받는 객체를 재사용할 수 있음
    • 코드의 재사용성을 높이고 중복을 줄여준다.
    • 객체 간의 결합도를 낮추고 유연성을 높일 수 있다.

 

요약

개발자의 제어 권한을 다른 주체에게 넘기는 것을 IoC(제어의 역전)라고 한다. 
스프링 프레임워크도 객체를 생성, 관리, 책임지고 의존성을 관리해주는 컨테이너가 있는데 그것이 바로 IoC 컨테이너이다.
IoC 컨테이너는 객체 생성, 생명주기 관리, 의존성 해결을 자동화하여 개발자가 직접 관리하지 않고도 애플리케이션을 구축할 수 있게 해준다.

 

 

+ 참고한 블로그

https://choicode.tistory.com/31

https://dev-coco.tistory.com/80

https://velog.io/@jkijki12/Spring-스프링-Bean-IoC-Container-DI가-뭔데

'스터디 > 성희' 카테고리의 다른 글

Servlet Filter, Spring Interceptor 차이  (0) 2024.04.24
BufferedReader, BufferedWriter  (1) 2024.04.08