[스프링(spring)]IoC와 DI

allnight5·2022년 12월 7일
0

스프링

목록 보기
3/62

참조Dev.Back-End(이동하고 싶으면 참조를 누르세여)
참조사이트 2 좀더 깨닫기 쉽다

1. IoC(Inversion of Control)이란?

IoC란 Inversion of Control의 약자로 해석하자면 제어의 역전이다.
제어권이 뒤 바뀌었다는 뜻이다. 이말은 기존의 제어방식을 뒤집었다는 말이 된다.

자바가 등장하고 자바 기반의 어플리케이션이 개발되던 초기에는 자바 객체를 생성하고 객체간의 의존관계를 연결하는 등의 제어권을 개발자가 직접 가지고 있었다고 한다. 그러나 서블릿, EJB가 등장하면서 개발자가 독점적으로 가지고 있던 제어권이 서블릿과 EJB를 관리하는 외부의 컨테이너로 넘어갔고 객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 IoC, 제어의 역전이라 하는것이다.

  1. IoC Container
    모든 작업을 사용하는 쪽에서 제어하게 되면서 IoC컨테이너에서 제어하게 되는데, 기본적으로 컨테이너는 객체를 생성하고 객체간의 의존성을 이어주는 역할을 한다.

1) BeanFactory
BeanFactory 인터페이스는 IoC컨테이터의 기능을 정의하고 있는 인터페이스이며, Bean의 생성 및 의존성 주입, 생명주기(lifecycle) 관리 등의 기능을 제공한다. 여기서 Bean이란 IoC컨테이너에 의해 생성되고 관리되는 객체를 의미한다.

2) ApplicationContext
BeanFactory 인터페이스를 상속받는 ApplicationContext는 BeanFactory가 제공하는 기능 외에 AOP, 메세지처리, 이벤트 처리 등의 기능을 제공한다.
모든 ApplicationContext 구현체는 BeanFactory의 기능을 모두 제공하므로, 특별한 경우를 제외하고는 ApplicationContext를 사용하는 것이 바람직하다.
Spring프레임워크에서는 다수의 ApplicationContext를 제공하는데 ClassPathXmlApplicationContext를 생성하는 예시를 보자.


ApplicationContext context = new ClassPathXmlApplicationContext("config/bean.xml");
MyBean bean = context.getBean("myBean");


2. DI(Dependency Injection)

DI란 IoC를 구현하는 방법으로 IoC와 DI의 관계에 대해 알아보자.

위의 그림처럼 IoC(Inversion of Control)를 구현하는 방법으로 DL, DI 2가지 방밥이 있다.
참조위와는 다른곳

예제 설명
A를 스마트폰, B를 배터리리라 하면,
일체형 스마트폰 (아이폰)은 바로 전원을 켜도 되지만,
배터리 탈부착 형태의 스마트폰 (갤럭시S)은 여기서는 배터리를 넣고, 전원을 넣어야 함.

일체형은 A라는 객체의 내부 프로세스에 대해 신경 쓸 필요가 없으며, 분리형은 A와 B를 개별적으로 세팅해 주어야 함. 단, 분리형은 내가 원하는 것(다른 배터리)으로 바꾸어 부착할 수 있음. 이것을 DI의 개념이라 보면 됨.
1) DL(Dependency Lookup) : 의존성 검색

컨테이너에서 제공하는 API를 이용해 사용하고자 하는 빈(Bean)을 저장소에서 Lookup하는 것을 말한다.

2) DI(Dependency Injection) : 의존성 주입

각 객체간의 의존성을 컨테이너가 자동으로 연결해주는 것으로 개발자가 빈(Bean) 설정파일에 의존관계가 필요한 정보를 추가해주면 컨테이너가 자동적으로 연결해준다.

Spring프레임워크에서는 Setter Injection(세터주입), Constructor Injection(생성자 주입)의 2가지 방식이 있다.
Setter Injection(세터주입)

Setter Injection
B b = new B();
A a = new A();
a.setB(b);


Injection(생성자 주입)

Construction Injection
B b = new B();
A a = new A(b);


Setter Injection은 인자(argument)가 없는 생성자를 사용하여 객체를 생성한 후, setter메소드를 사용하여 의존성을 주입하는 방식으로 element를 사용한다.


public class BeanExample { 
    private MyBean beanOne; 
    public void setBeanOne(MyBean beanOne){
        this.beanOne = beanOne;
    } 
}

객체가 생성되고 의존성을 삽입하는 방식으로 구현시 좀더 유연할 수 있으며, setter메소드를 통해 값이 할당되기 전까지 객체를 사용할 수 없다.

Constructor Injection

Constructor Injection은 인자(argument)를 갖는 생성자를 사용하여 의존성을 주입하는 방식으로 element를 사용한다.
생성자에 파라미터를 지정함으로써 객체가 필요로하는 값을 알 수 있으며, setter없이 간단하게 지정이 가능하다.

public class BeanExample {
 
    private MyBean beanOne;
    private YourBean beanTwo;
    private int i;
    
    public BeanExample(MyBean beanOne, YourBean beanTwo, int i){
        this.beanOne = beanOne;
        this.beanTwo = beanTwo;
        this.i = i;
    }
}

2-2) 스프링에서의 DI

  • 명세서에 따라서 자동적으로 부품을 활용하여 제품을 조립 => 스프링
  • 일체형 프로그램과는 반대로 제품을 생성.
  • 즉, 작은 부품부터 시작하여 큰 부품으로 이동하며 조립.
    => Inversion of Control (IoC)

스프링에서의 DI의 의미

  • 부품들을 생성하고, 제품을 조립해주는 공정과정을 대신해 주는 라이브러리 (역할자)
  • 개발 핵심 처리 루틴의 수정 없이 제품(객체)를 다른 제품(객체)로 쉽게 대체하여 생성 가능하도록 하는 역할을 함.

  • 명세서에 따라서 자동적으로 부품을 활용하여 제품을 조립.

  • 생성하기 원하는 객체를 명세서(XML)에 기술하고, 그 부품과 의존성(Dependency)들을 보관하는 일을 처리. 그러한 데이터를 보관하는 공간을 컨테이너라 함. (IoC 컨테이너)

제품 스프링
주문서설정파일(XML)
일반적은 순서의 공정 역방향 조립
profile
공부기록하기

0개의 댓글