본문 바로가기

Backend/Spring

1. Spring IoC / DI

IoC(Inversion of Control) : 그동안은 개발자가 객체를 new(방식을)를 통해 만들고 제어권을 가지고 있었다면,

스프링에선 Spring Bean Configuration file, java file 로 스프링 자체에서 객체 생성이 가능하고 즉 이 만들어주고 관리해주는 컨테이너에게 제어권을 반환해준다는 의미

 

DI(Dependency Injection) : 의존성 삽입. 그동안은 개발자가 생성자와 setter를 통해서 값을 주입했다면 DI는 스프링이 알아서 객체에 "값을 주입"한다. 

Spring이 지원하는 2가지 DI  유형  - SI (Setter Injection): Setter Method를 명시하여 자동적으로 의존성 삽입이 이루어 지는 유형

                                                    - CI (Constructor Injection): 인자를 가지고 있는 생성자를 호출 할때 의존성 삽입이 이루어 지는 유형

 

 

예시를 볼까. 

bean-context.xml 파일 (메타데이터를 bean화 시켜 생성, 관리하는 파일)

 

bean.context 1번 

<bean id="calc" class="spring.Calculator"  />

 

bean.context 2번 

<bean id="computer" class="spring.Computer">

   <property name="model"> <!-- 필드 중 1개 -->

      <value>IMac</value> <!-- 필드의 일반 값 -->

   </property> 

   <property name="a"> <!-- 필드 중 1개 -->

      <value>10</value> <!-- 필드의 일반 값 -->

   </property>

   <property name="b">  <!-- 필드 중 1개 -->

      <value>3</value> <!-- 필드의 일반 값 -->

  </property>

  <property name="calculator"><!-- 필드 중 1개 -->

      <ref bean ="calc" />  <!-- 필드의 다른 빈을 값으로 가지는 경우 *ref* -->

  </property>

</bean>

 

bean.context 3번

<bean id="computer2" class="spring.Computer">

   <property name="model" value="Samsung" />

   <property name="a" value="1" />

   <property name="b" value="2" />

   <property name="calculator" ref="calc"  />

</bean>

 

bean.context 4번

<bean id="computer3" class="spring.Computer">

  <constructor-arg>

  <value>LG</value>

  </constructor-arg>

  <constructor-arg>

  <value>5</value>

  </constructor-arg>

  <constructor-arg>

  <value>1</value>

  </constructor-arg>

  <constructor-arg>

  <ref bean="calc" />

  </constructor-arg>

  </bean>

IoC 적용 없이 개발자가 직접 처리하는 경우

// bean.context 1번 적용

Calculator calc = new Calculator(); // 개발자가 직접 객체 생성

Computer computer = new Computer();  // 디폴트 생성자

 

computer.setModel("IMac"); // 값의 주입 (setter이용)

computer.setA(10);            // 값의 주입 (setter이용)

computer.setB(5);              // 값의 주입 (setter이용)

computer.setCalculator(calc);  // 값의 주입 (setter이용)

 

System.out.println(computer.getModel());

computer.add();

computer.sub();

computer.mul();

computer.div();

 

 

*참고*  Spring에서 spring 기능 한번 사용 없이 java만 사용해도 동작은 잘 된다.

 

 IoC 적용 : bean-context.xml 을 보고 spring이 bean을 생성한다.

String resourceLocations = "classpath:bean-context.xml";

AbstractApplicationContext ctx = new GenericXmlApplicationContext(resourceLocations);

 

// bean.context 3번 적용<ctx.getBean("<bean id>", "<bean class>".class)

Computer myCom = ctx.getBean("computer", Computer.class);

System.out.println(myCom.getModel());

myCom.add();

myCom.sub();

myCom.mul();

myCom.div();

 

// bean.context 3번 적용

Computer yourCom = ctx.getBean("computer2", Computer.class); 

System.out.println(yourCom.getModel());

yourCom.add();

yourCom.sub();

yourCom.mul();

yourCom.div();

 

// bean.context 4번 적용

Computer ourCom = ctx.getBean("computer3", Computer.class);

System.out.println(ourCom.getModel());

ourCom.add();

ourCom.sub();

ourCom.mul();

ourCom.div();

 

ctx.close();

// spring이 대신 new 작업(객체생성)을 해주어 똑같이 실행이 가능하다.