본문 바로가기
Backend/Spring Boot

Spring IoC

by 이은선 2024. 6. 30.
728x90
SMALL

개념

IoC(Inversion of Control)란 “제어의 역전”이라는 의미로, 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.

즉, IoC는 사용할 객체를 직접 생성하지 않고, 객체의 생명주기 관리를 외부(스프링 컨테이너)에 위임하는 것이다.

 

IoC 컨테이너

  • 스프링에서는 IoC를 담당하는 컨테이너를 빈 팩토리, DI 컨테이너, 애플리케이션 컨텍스트라고 부른다.
  • 오브젝트의 생성과 오브젝트 사이의 런타임 관계를 설정하는 DI 관점으로 보면, 컨테이너를 빈 팩토리 또는 DI 컨테이너라고 부른다.
  • 그러나 스프링 컨테이너는 단순한 DI 작업보다 더 많은 일을 하는데, DI를 위한 빈 팩토리에 여러 가지 기능을 추가한 것을 애플리케이션 컨텍스트라고 한다.
  • 정리하자면, 애플리케이션 컨텍스트는 그 자체로 IoC와 DI 그 이상의 기능을 가졌다고 보면 된다.

→ 스프링 애플리케이션에서는 객체(빈)의 생성과 관계 설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 스프링 컨테이너가 담당하는데, 이를 IoC 컨테이너라고 한다.

 

장점

객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고, 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.

 

IoC 컨테이너의 장점

  • 스프링 애플리케이션의 객체인 빈을 IoC 컨테이너가 관리해줌으로써 개발자의 부담이 줄고 비즈니스 로직에 더욱 집중할 수 있다는 장점이 있다.

 

스프링 IoC의 용어 정리

빈(bean)

빈 또는 빈 오브젝트는 스프링이 IoC 방식으로 관리하는 오브젝트라는 뜻이다. 애플리케이션 실행 중 만들어지는 오브젝트가 다 빈인 것은 아니다. 그 중에서 스프링이 직접 생성과 제어를 담당하는 오브젝트만을 빈이라고 부른다.

빈 팩토리(bean factory)

  • 스프링 컨테이너의 최상위 인터페이스
  • 스프링의 IoC를 담당하는 핵심 컨테이너를 가리킨다.
  • 스프링 빈을 등록하고, 생성하고, 조회하고, 돌려주고, 그 외에 부가적인 빈을 관리하는 기능을 담당한다.

애플리케이션 컨텍스트

  • 빈 팩토리를 확장한 IoC 컨테이너로, 애플리케이션 컨텍스트는 빈 팩토리 기능을 모두 상속 받아서 제공
  • 빈을 등록하고 관리하는 기본적인 기능은 빈 팩토리와 동일하다. 여기에 스프링이 제공하는 각종 부가 서비스를 추가로 제공한다.
    • 메시지 소스를 활용한 국제화 가능
      • 한국에서 들어오면 한국어로, 영어권에서 들어오면 영어로 출력
    • 환경 변수
      • 로컬, 개발, 운영 등을 구분해서 처리
    • 애플리케이션 이벤트
      • 이벤트를 발행하고 구독하는 모델을 편리하게 지원
    • 편리한 리소스 조회
      • 파일, class path, 외부 등에서 리소스를 편리하게 조회
  • 빈의 생성과 제어의 관점에서는 빈 팩토리라고 부르고, 애플리케이션 컨텍스트라고 할 때는 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기하는 것이라고 보면 된다.

설정 메타 정보

  • 스프링의 설정 메타 정보란 애플리케이션 컨텍스트 또는 빈 팩토리가 IoC를 적용하기 위해 사용하는 메타정보를 말한다.
  • 스프링 컨테이너가 관리하는 오브젝트인 빈을 어떻게 만들고 동작하게 할 것인지에 대한 정보이다.
  • 스프링 컨테이너는 자바 코드, XML, Groovy 등 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어 있다.

스프링 빈 설정 메타 정보 - BeanDefinition

  • 스프링은 어떻게 다양한 형식을 지원하는 것일까? 그 중심에는 BeanDefinition이라는 추상화가 있다.
  • 쉽게 말하자면, XML을 읽어서 BeanDefinition을 만들고, 자바 코드를 읽어서 BeanDefinition을 만든다. 따라서, 스프링 컨테이너는 자바 코드인지, XML 코드인지 몰라도 되고 오직 BeanDefinition만 알면 된다.
  • BeanDefinition을 빈 설정 메타 정보라고 하는데, @Bean과 <Bean>당 각각 하나씩 메타 정보가 생성된다.
  • AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서 AppConfig.class를 읽고 BeanDefinition을 생성한다.
  • GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefintion을 생성한다.
  • 새로운 형식의 설정 정보가 추가되면 XxxBeanDefinitionReader를 만들어서 BeanDefinition을 생성하면 된다.

컨테이너 또는 IoC 컨테이너

IoC 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 컨테이너 또는 IoC 컨테이너라고도 한다.

[Spring] Spring IoC와 DI란?

 

[Spring] Spring IoC와 DI란?

spring-study에서 스터디를 진행하고 있습니다. IoC란? IoC란 Inversion of Control의 줄임말이며, 제어의 역전이라고 한다. 스프링 애플리케이션에서는 오브젝트(빈)의 생성과 의존 관계 설정, 사용, 제거

steady-coding.tistory.com

 

 

728x90
LIST

'Backend > Spring Boot' 카테고리의 다른 글

Spring DI  (1) 2024.06.30
인텔리제이 단축키 모음  (0) 2024.01.06