Spring IoC / DI 개념 정리

ㅎㄱㅇ·2024년 5월 1일

면접 CS

목록 보기
2/2

🧸 Spring IoC (Inversion of Control)


👉 제어의 역전

프로그램을 구동하는데 필요한 객체 생성, 변경 등의 관리를 개발자가 아닌 프로그램을 구동하는 컨테이너에서 직접 관리하는 것을 말한다.
스프링은 IoC 구조를 통해 구동 시 필요한 객체의 생성부터 생명주기까지 해당 객체에 대한 관리를 직접 수행한다.

🎀 IoC컨테이너

컨테이너란

Containers are packages of software that contain all of the necessary elements to run in any environment.

  • 애플리케이션을 실행하기 위해 필요한 모든 요소를 포함하고있는 소프트웨어 패키지
  • 애플리케이션의 실행에 필요한 자원을 격리하여 관리함

스프링 프레임워크에서 객체를 생성 및 관리하는 컨테이너를 IoC컨테이너(=스프링 컨테이너)라고 함

스프링에서 관리하는 객체를 'Bean(빈)' 이라 하고, 해당 빈들을 관리한다는 의미로 컨테이너를 'Bean Factroy'라고 한다.

✨IoC컨테이너의 역할

  1. 객체의 생명주기와 의존성 관리
  2. VO(DTO/POJO) 객체의 생성, 초기화, 소멸 등
  3. 개발자가 직접 객체를 생성할 수 있지만 해당 권한을 컨테이너에 맡김으로써 소스코드 구현 시간을 단축할 수 있음

✨IoC컨테이너와 Bean 객체

Bean 빈

  • 스프링이 IoC 방식으로 관리하는 Class
  • 스프링이 직접 생명과 제어를 담당하는 객체

Bean Factroy 빈팩토리

  • 스프링 IoC를 담당하는 핵심 컨테이너
  • Bean을 등록, 생성, 조회, 반환하는 기능을 담당

ApplicationContext

  • BeanFactroy를 확장한 IoC컨테이너
  • Bean을 등록하고 관리하는 기능은 BeanFactory와 동일하지만 스프링이 제공하는 각종 부가 서비스를 추가로 제공

GenericXmlApplicationContext

  • ApplicationContext를 구현한 Class
  • 일반적인 XML 형태의 문서를 읽어 컨테이너 역할을 수행

Configuration metadata 설정 메타 정보

  • ApplicationContext 또는 BeanFactory가 IoC를 적용하기 위해 사용하는 설정 정보
  • 설정 메타 정보는 IoC컨테이너에 의해 관리되는 Bean 객체를 생성하고 구성할 때 사용



🧸 DI (Dependency Injection)


👉 의존성 주입

  • 사용하는 객체를 직접 생성하여 만드는 것이 아니라 컨테이너가 빈의 설정 정보를 읽어와 자동으로 해당 객체에 연결하는 것
  • 해당 객체를 수정해야 할 상황이 발생했을 경우 소스 코드의 수정을 최소화 할 수 있음

✨DI의 장점

  1. 개발자가 작성해야 할 코드가 단순해짐
  2. 각 객체 간의 종속 관계(결합도)를 해소할 수 있음

🎀종류

✨Setter 메소드를 통한 의존성 주입

  • 의존성 주입받는 Setter 메소드를 만들고, 이를 통해 의존성 주입
  • Setter 메소드를 통해 의존 관계가 있는 Bean을 주입하려면 <property> 태그를 사용

XML 선언 방법

<bean id="객체 이름" class="클래스 풀네임"
	<property name="이름" value="" />
    <property name="이름" ref="" />
</bean>

name 속성 : Class에서 선언한 필드 변수의 이름
value 속성 : 단순 값 또는 Bean이 아닌 객체를 주입할 때 사용
ref 속성 : Bean 이름을 이용해 주입할 Bean을 찾음

Setter 메소드를 통한 의존성 주입 예시

<bean id="student" class="com.kh.spring.person.model.vo.Student">
	<property name="name" value="홍길동" />
	<property name="wwallet" ref="money" />    
</bean>

<bean id="money" class="com.kh.spring.wallet.model.vo.Wallet" />

✨생성자를 통한 의존성 주입

  • 필요한 의존성을 포함하는 클래스에 생성자를 만들고, 이를 통해 의존성을 주입
  • Constructor를 통해 의존 관계가 있는 Bean을 주입하려면 <constructor-arg> 태그를 사용

XML 선언 방법

<bean id="불러 올 객체" class="클래스 풀네임">
	<constructor-arg index="번호" value="" />
    <constructor-arg name="이름" ref="" />
</bean>

name 속성 : Class에서 선언한 필드 변수의 이름
value 속성 : 단순 값 또는 Bean이 아닌 객체를 주입할 때 사용
ref 속성 : Bean 이름을 이용해 주입할 Bean을 찾음

Setter 메소드를 통한 의존성 주입 예시

<bean id=“student" class=“com.kh.spring.person.model.vo.Student“>
    <property name=“name” value=“홍길동”/>
    <property name=“wallet” ref=“money”/>
</bean>

<bean id=“money” class=“com.kh.spring.wallet.model.vo.Wallet” />

✨메소드를 통한 의존성 주입

  • 의존성을 입력 받는 일반 메소드를 만들고 이를 통해 의존성 주입

0개의 댓글