스프링 프레임워크 IoC컨테이너/DI개요, DI HelloWorld, 세터주입, 생성자주입 실습(자바교육/스프링교육/SpringFramework/스프링학원)
1. Spring IoC
마틴 파울러는 2004년의글에서 제어의 어떤 측면이 역행되는 것인지에 대한 의문을 제기하고 의존하는 객체를 역행적으로 취득하는 것이라는 결론을 내렸다. 그는 그와 같은 정의에 기초하여 제어 역행이라는 용어에 좀더 참신한 ‘의존성 주입(DI,dependency injection)’이라는 이름을 지어줬다.
IoC(Inversion of Control)는 디자인 패턴, 팩토리 패턴 및 DI (Dependency Injection)와 같은 메커니즘을 통해 달성 할 수 있다.
모든 어플리케이션은 비지니스 로직을 수행하기 위해 서로 협업하는 여러 객체들로 이뤄진다. 전통적으로 각 객체는 협업할 객체의 참조를 취득(Emp e = new Emp())해야 하는 책임이 있는데 이것이 의존성이다. 이는 결합도가 높으며 테스트하기 어려운 코드를 만들어 낸다.
IoC를 적용함으로써 객체들은 시스템 내의 각 객체를 조정하는 어떤 외부의 존재(스프링의 경우 IoC 턴테이너)에 의해 객체참조를 제공받는데 이를 주입(inject)이라고 한다.
따라서 IoC는 한 객체가 협업해야 하는 다른 객체의 참조를 취득하는 방법에 대한 제어의 역행이라는 의미를 갖는다.(new 해서 참조를 취득하지 않고 스프링 IoC 컨테이너로 부터 객체를 주입 받음)
2. Spring Ioc Container
Spring IoC 컨테이너는 객체를 만들고, 연결하고, 구성하고, 생성부터 파괴까지 전체 수명주기를 관리한다.
Spring 컨테이너는 DI(Dependency Injection, 의존성주입)를 사용하여 애플리케이션을 구성하는 구성 요소를 관리한다. 이러한 객체를 Spring Beans 라고 한다.
Spring IoC 컨테이너는 제공된 설정정보(자바빈에 대한 정보)를 읽어 객체를 new하여 생성하고 이름을 부여하고 객체(빈)을 주입해 달라고 하는 곳에 주입을 시키고 객체를 전체적으로 관리한다.
설정정보는 XML 또는 XML을 대신한 어노테이션, 자바 설정파일(자바라이브러리의 클래스를 빈으로 등록하는 경우 주로 사용) 로 정의한다.
3. Spring DI
IoC를 구현하는 하나의 방법이다.(또한 DL이라고 빈을 룩업하는 것도 이해를 돕기 위해 보면 좋지만 큰 의미 없다.)
class A {
public static void main(String[] args) {
B b = new B(); String s = b.sayHello();
}
}
위 코드에서 “A는 B에 종속된다.” “A는 B를 의존한다.”, “B는 A의 의존객체"라고 한다. A와 B는 종속관계에 있으며 A에서 B의 인스턴스(객체)가 필요하다. Spring IoC 컨테이너는 이러한 종속성을 DI(Dependency Injection)로 해결한다.
Setter Dependency Injection (SDI) – XML 또는 어노테이션 방식
Constructor Dependency Injection (CDI) - XML 또는 어노테이션 방식
[실습]
0. 전통적인 코딩 방식
package spring;
class Hello {
void sayHello(String name) {
System.out.println("Hello~ " + name);
}
}
public class HelloSpring {
public static void main(String[] args) {
Hello h = new Hello();
h.sayHello("이종철");
}
}
1. 세터 XML ---------------------------------------------------
package spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
class Hello1 {
void sayHello(String name) {
System.out.println("Hello~ " + name);
}
}
public class HelloSpringSDI1 {
static Hello1 hello;
public void setHello(Hello1 hello) {
this.hello = hello;
}
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:SDI1.xml");
hello.sayHello("이종철");
}
}
<?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="h" class="spring.Hello1"/>
<bean id="sdi1" class="spring.HelloSpringSDI1">
<property name="hello">
<ref bean="h"/>
</property>
</bean>
</beans>
2. 세터 어노테이션 ---------------------------------------
package spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
@Component
class Hello2 {
void sayHello(String name) {
System.out.println("Hello~ " + name);
}
}
@Component
public class HelloSpringSDI2 {
static Hello2 hello;
@Autowired
public void setHello2(Hello2 hello) {
this.hello = hello;
}
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:SDI2.xml");
hello.sayHello("이종철");
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="spring" />
</beans>
3. 생성자 XML -----------------------------------
package spring;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
class Hello3 {
void sayHello(String name) {
System.out.println("Hello~ " + name);
}
}
public class HelloSpringSDI3 {
static Hello3 hello;
public HelloSpringSDI3(Hello3 hello) {
this.hello = hello;
}
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:SDI3.xml");
hello.sayHello("이종철");
}
}
<?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="h" class="spring.Hello3"/>
<bean id="sdi3" class="spring.HelloSpringSDI3">
<constructor-arg ref="h"/>
</bean>
</beans>
4. 생성자 어노테이션 -------------------------------------
package spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
@Component
class Hello4 {
void sayHello(String name) {
System.out.println("Hello~ " + name);
}
}
@Component
public class HelloSpringSDI4 {
static Hello4 hello;
@Autowired
public HelloSpringSDI4(Hello4 hello) {
this.hello = hello;
}
public static void main(String[] args) {
ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:SDI4.xml");
hello.sayHello("이종철");
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="spring" />
</beans>
#스프링DI, #스프링IoC, #SpringDI, #SpringIoC, #자바스프링, #Spring동영상, #Spring강의, #스프링프레임워크, #스프링교육, #스프링학원, #스프링강좌, #스프링강의, #자바학원, #자바, #스프링동영상, #자바동영상, #스프링프레임워크교육, #스프링프레임워크강의, #스프링프레임워크학원
댓글 없음:
댓글 쓰기