b. IoC Containers - kimxavi/spring_tutorial GitHub Wiki

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฝ”์–ด์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๊ฒƒ ๋“ค์„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋ฉฐ, ๊ทธ๊ฒƒ๋“ค์„ ์„ค์ •ํ•ด์ฃผ๊ณ , ์ƒ์„ฑ๋ถ€ํ„ฐ ํŒŒ๊ดด๊นŒ์ง€์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํผ๋„ŒํŠธ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ dependency injection (DI)๋ฅผ ์“ด๋‹ค. ๊ทธ ๊ฐ์ฒด๋“ค์„ Spring Beans๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋Š” ์ œ๊ณต๋œ ์„ค์ • ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์Œ์œผ๋กœ์จ ์กฐ๋ฆฝ๋˜๊ณ , ์„ค์ •๋˜๊ณ , ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์ธ์Šคํ„ด์Šคํ™” ๋˜๋Š”์ง€ ๋“ฑ๋“ฑ์˜ ์ง€์‹œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์„ค์ • ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋Š” XML, Java ์–ด๋…ธํ…Œ์ด์…˜ ๋˜๋Š” ์ž๋ฐ” ์ฝ”๋“œ์œผ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์™„์ „ํžˆ ๊ตฌ์„ฑ ๋˜์–ด์ง€๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์ด๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ” POJO ํด๋ž˜์Šค์™€ ๊ตฌ์„ฑ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง์€ ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Spring BeanFactory Container

DI์™€ ๊ธฐ๋ณธ์ ์ธ ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. org.springframework.beans.factory.BeanFactory ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜๋œ๋‹ค. BeanFactory ์™€ BeanFactoryAware, InitializingBean, DisposableBean ๊ฐ™์€ ๊ด€๋ จ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๋“ค์€ ์ด์ „ ๋ฒ„์ „, ๋‹ค๋ฅธ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค.

๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” BeanFactory ๊ตฌํ˜„์ฒด๋Š” XmlBeanFactory ํด๋ž˜์Šค ์ด๋‹ค. ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” XML ํŒŒ์ผ๋กœ ๋œ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์‹œ์Šคํ…œ์ด๋‚˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. BeanFactory๋Š” ๋ณดํ†ต ์ž์›์ด ์ œํ•œ์ ์ธ ๊ณณ์—์„œ ์„ ํ˜ธ๋œ๋‹ค.

HelloWorld.java

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }

   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

MainApp.java

package com.tutorialspoint;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class MainApp {
   public static void main(String[] args) {

      XmlBeanFactory factory = new XmlBeanFactory
                             (new ClassPathResource("Beans.xml"));

      HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
      obj.getMessage();
   }
}
  • XmlBeanFactory() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Bean์„ ์ƒ์„ฑํ•˜๋Š” Factory ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.XmlBeanFactory() API๋Š” ์„ค์ •ํŒŒ์ผ์—์„œ ์–ธ๊ธ‰๋˜๋Š” ๋ชจ๋“  bean ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.ClassPathResource() API ๋ฅผ ์จ์„œ Bean ์„ค์ • ํŒŒ์ผ์„ CLASSPATH์—์„œ ๋กœ๋“œํ•œ๋‹ค.
  • ์ƒ์„ฑ๋œ BeanFactory ์˜ getBean() ์„ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ Bean ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์‹ค์ œ ๊ฐ์ฒด๋กœ ์บ์ŠคํŒ… ํ•ด์•ผ๋˜๋Š” ๊ฐ์ฒด๋ฅผ bean ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ๊ฐ€์ ธ์˜จ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Beans.xml
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
       <property name="message" value="Hello World!"/>
   </bean>

</beans>

Spring ApplicationContext Container

Application Context๋Š” ์Šคํ”„๋ง์˜ ์ข€ ๋” ์ง„๋ณด๋œ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค. BeanFactory์™€ ์œ ์‚ฌํ•˜๊ฒŒ bean์˜ ์ •์˜๋ฅผ ๋กœ๋“œํ•˜๊ณ , bean๋“ค์„ ์—ฐ๊ฒฐํ•˜๊ณ , ์š”์ฒญ์— ๋”ฐ๋ผ bean์„ ์กฐ์ œํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ๋กœ ๋ถ€ํ„ฐ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€๋“ค์„ ๋ถ„ํ•ดํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ๊ด€์‹ฌ์žˆ๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” org.springframework.context.ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜๋œ๋‹ค. ApplicationContext๋Š” BeanFactory์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ BeanFactory ๋ณด๋‹ค ๊ถŒ์žฅ๋œ๋‹ค.

  • FileSystemXmlApplicationContext : ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” XML ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ Bean์˜ ์ •์˜๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์ธ๋‹ค. ์ƒ์„ฑ์ž์— XML bean ์„ค์ • ํŒŒ์ผ์˜ full ๊ฒฝ๋กœ๋ฅผ ์ค˜์•ผํ•œ๋‹ค.
  • ClassPathXmlApplicationContext : ์œ„์™€ ๋‹ฌ๋ฆฌ, CLASSPATH ์—์„œ bean XML ์„ค์ • ํŒŒ์ผ์„ ์ฐพ์•„๋‚ธ๋‹ค.
  • WebXmlApplicationContext : ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๊ฐ์ฒด ์ •์˜ ํŒŒ์ผ๋“ค์„ ์ฝ์–ด๋“ค์ธ๋‹ค.

HelloWorld.java

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }

   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
}

MainApp.java

package com.tutorialspoint;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {

      ApplicationContext context = new FileSystemXmlApplicationContext
            ("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml");

//      ApplicationContext context = 
//             new ClassPathXmlApplicationContext("Beans.xml");

      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      obj.getMessage();
   }
}

  • C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml ์ฒ˜๋Ÿผ ๊ฒฝ๋กœ๋ฅผ ์ฃผ๋Š” ์ ์ด ํŠน์ดํ•˜๋‹ค.

beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
       <property name="message" value="Hello World!"/>
   </bean>

</beans>
โš ๏ธ **GitHub.com Fallback** โš ๏ธ