πŸ’Š Java & Kotlin & Spring/- spring framework +

[Spring Framework] DI Application을 λ§Œλ“€μ–΄λ³΄μž.

Wonit 2020. 9. 5. 17:46
이번 κΈ€μ˜ μ†ŒμŠ€ μ½”λ“œλŠ” SKplanet Tacademy - Spring Framework Basic λ™μ˜μƒ κ°•μ˜ μžλ£Œμ— μžˆλŠ” μ†ŒμŠ€μ½”λ“œλ₯Ό κ°€μ Έλ‹€κ°€ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ§€λ‚œ μ‹œκ°„ IoC μ»¨ν…Œμ΄λ„ˆμ™€ DI에 λŒ€ν•œ 기본적인 κ°œλ…κ³Ό μš©μ–΄λ“€μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜λ‹€.


이제 μ˜€λŠ˜μ€ Ioc Container(DI Container)λ₯Ό μ–΄λ–»κ²Œ Springμ—μ„œ μ‚¬μš©ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μž.

  • POJO 클래슀 μž‘μ„±
  • μ„€μ • 메타정보 XML μž‘μ„±
  • DI ν…ŒμŠ€νŠΈ 클래슀 μž‘μ„±

POJO 클래슀의 λ‹€μ΄μ–΄κ·Έλž¨

μš°λ¦¬κ°€ 예제둜 ꡬ성할 POJO클래슀의 λ‹€μ΄μ–΄κ·Έλž¨μ€ μ•„λž˜μ™€ 같은 ν˜•νƒœλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

  • Hello.class
  • Printer.interface
  • StringPrinter.class
  • ConsolePrinter.class
  • beans.xml :: XML μ„€μ • 파일둜

Hello ν΄λž˜μŠ€λŠ” StringPrinterλ‚˜ ConsolePrinterλ₯Ό 직접 μ˜μ‘΄ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, Printer μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ˜μ‘΄ν•˜λŠ” ν˜•νƒœλ‘œ μž‘μ„±ν•œλ‹€.


그리고 XML μ„€μ • νŒŒμΌμ—μ„œ Hello ν΄λž˜μŠ€κ°€ μ–΄λ–€ Printerλ₯Ό μ˜μ‘΄ν•˜λŠ”μ§€λ₯Ό λͺ…μ‹œν•΄ 쀄 것이닀.

 

POJO 클래슀 μž‘μ„±

Hello.class

public class Hello {

    private String name; // value type
    private Printer printer; // ref type

    public Hello(){}

    /* μœ„μ— μ‘΄μž¬ν•˜λŠ” 두 가지 멀버 λ³€μˆ˜μ— λŒ€ν•œ setter λ©”μ„œλ“œ */
    public void setName(String name) {
        this.name = name;
    }

    /* μœ„μ— μ‘΄μž¬ν•˜λŠ” 두 가지 멀버 λ³€μˆ˜μ— λŒ€ν•œ setter λ©”μ„œλ“œ */
    public void setPrinter(Printer printer) {
        this.printer = printer;
    }


    String sayHello() {
        return "Hello " + name;
    }

    public void print() {
        this.printer.print(sayHello());
    }
}

Printer.interface

public interface Printer {
    void print(String message);
}

StringPrinter

public class StringPrinter implements Printer{
    private StringBuffer sb = new StringBuffer();

    @Override
    public void print(String message) {
        this.sb.append(message);
    }

    public String toString() {
        return this.sb.toString();
    }
}

ConsolePrinter

public class ConsolePrinter implements Printer{

    @Override
    public void print(String message) {
        System.out.println(message);
    }
}

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.xsd">

    <bean id="hello" class="Hello">
        <property name="name" value="Spring"/>
        <property name="printer" ref="printer"/>
    </bean>

    <bean id="printer" class="StringPrinter" />
    <bean id="consolePrinter" class="ConsolePrinter" />
</beans>

ν˜„μ œ DIλ₯Ό setter Injection으둜 지정이 λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— <property> νƒœκ·Έλ₯Ό μ‚¬μš©ν–ˆλ‹€.

HelloBeanTest.class

HelloBeanTest λŠ” Hello Bean의 ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€μ΄λ‹€.

ν…ŒμŠ€νŠΈμ˜ μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. Create IoC Container
  2. Get Hello Bean
  3. Get StringPrinter Bean

이제 클래슀λ₯Ό μž‘μ„±ν•΄λ³΄μž.

public class HelloBeanTest {  
public static void main(String\[\] args) {
    /*IOC Container*/
    ApplicationContext context = new GenericXmlApplicationContext("resource/beans.xml");

    Hello hello = (Hello) context.getBean("hello"); // XML 의 Hello
    System.out.println(hello.sayHello());
    hello.print();

    Printer printer = (Printer)context.getBean("printer"); // XML 의 StringPrinter
    System.out.println(printer.toString());

    Hello hello2 = context.getBean("hello", Hello.class); // XML 의 Hello
    hello2.print();

    System.out.println(hello == hello2);
}
}  

그럼 κ²°κ³Όλ‘œλŠ” μ•„λž˜μ™€ 같이 λ‚˜νƒ€λ‚˜κ²Œ λœλ‹€.

 

μ—¬κΈ°μ„œ 말 ν•˜λŠ” trueλŠ” Spring이 SingleTonμ΄λΌλŠ” 것을 증λͺ…ν•΄μ£ΌλŠ” 것이 λœλ‹€.

 


λ‹€μŒ μ‹œκ°„μ—λŠ” SingleTon에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.