신규 블로그를 만들었습니다!
DI(Dependency Injection)
스프링의 DI(Dependency Injection) 에 대해서 알아보겠습니다.
보통 프로젝트를 만들면, 여러개의 객체를 이용해서 만들게 됩니다.
예를들어, Main, Calculator, MyCalculator 라는 객체가 있습니다.
Main 객체가 Calculator, MyCalculator 객체를 이용을 할때,
Main객체는 Calculator, MyCalculator객체에 의존한다고 합니다.
그렇다면, Main 함수에서 Calculator, MyCalculator 객체들을 가지고 올때, 어떻게 할까요?
MyCalculator myCalculator = new MyCalculator();
Calculator Calculator = new Calculator();
위와 같이 할 것 입니다. 물론 틀린것은 아니지만,
스프링에서는 setter() 함수와 constructor() 생성자 함수를 이용해서
외부의 객체들을 가져옵니다.
이러한 방법을 의존성 주입 (Dependency Injection) 이라고 합니다.
이러한 방법을 예제를 통해 알아보도록 하겠습니다.
일단 프로젝트를 생성합니다.
저의 경우 Mac OS에서 하고 있기 때문에 인터페이스 약간은 다를 수 도 있습니다.
간단히 DI에 대해서 알아볼거라 Simple Spring Maven 으로 프로젝트를 생성 하겠습니다.
이름은 원하시는 걸로 아무거나 하셔도 됩니다.
그리고 총 4개의 파일을 만듭니다.
Main.java
MyCalculator.java
Calculator.java
applicationCTX.xml
코드 살펴보기
Calculator.java
package com.di.ex;
public class Calculator {
public void calc_add(int num1, int num2) {
System.out.println("add");
int result = num1 + num2;
System.out.println(num1 + "+" + num2 + "=" + result);
}
public void calc_sub(int num1, int num2) {
System.out.println("sub");
int result = num1 - num2;
System.out.println(num1 + "-" + num2 + "=" + result);
}
public void calc_mul(int num1, int num2) {
System.out.println("mul");
int result = num1 * num2;
System.out.println(num1 + "X" + num2 + "=" + result);
}
public void calc_div(int num1, int num2) {
System.out.println("div");
int result = num1 / num2;
System.out.println(num1 + "/" + num2 + "=" + result);
}
}
MyCalculator.java
package com.di.ex;
public class MyCalculator {
private Calculator calculator;
private int firstNum = 0;
private int secondNum = 0;
// set, get method
public Calculator getCalculator() {
return calculator;
}
public void setCalculator(Calculator calculator) {
this.calculator = calculator;
}
public int getFirstNum() {
return firstNum;
}
public void setFirstNum(int firstNum) {
this.firstNum = firstNum;
}
public int getSecondNum() {
return secondNum;
}
public void setSecondNum(int secondNum) {
this.secondNum = secondNum;
}
// calculator
public void add() {
calculator.calc_add(firstNum, secondNum);
}
public void sub() {
calculator.calc_sub(firstNum, secondNum);
}
public void mul() {
calculator.calc_mul(firstNum, secondNum);
}
public void div() {
calculator.calc_div(firstNum, secondNum);
}
}
applicationCTX.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="calculator" class="com.di.ex.Calculator" />
<bean id="myCalculator" class="com.di.ex.MyCalculator">
<property name="calculator">
<ref bean="calculator" />
</property>
<property name="firstNum" value="5" />
<property name="secondNum" value="3" />
</bean>
</beans>
xml 파일에 Calculator, MyCalculator 의 bean을 생성합니다.
Main.java
package com.di.ex;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Main {
public static void main(String[] args) {
// xml 파일 위치
String configLocation = "classpath:applicationCTX.xml";
// xml 파일 가져오기
AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
// MyCalculator 객체 가져오기
MyCalculator myCalculator = ctx.getBean("myCalculator", MyCalculator.class);
myCalculator.add();
myCalculator.sub();
myCalculator.div();
myCalculator.mul();
}
}
Main 클래스에서 AbstractApplicationContext 와 GenericXmlApplicationContext를 이용해서
applicationCTX.xml 파일을 가져옵니다.
그리고 getBean() 함수를 이용해서 MyCalculator 객체를 가져옵니다.
딱 보기에도 기존 방법과는 다른 것을 알 수 있고,
이러한 방식을 DI 의존성 주입이라 합니다.
== 추가 내용 (18.03.10) ==
DI를 사용하는 이유
간단한 프로젝트를 만들때는 DI를 왜 사용하는지 모를 수 도 있다.
더 복잡하다고 느낄 수 있다. 쓰는 이유는 유지 관리가 편하기 때문이다.
(마치 java에서 interface를 쓰는 이유와 비슷하다.)
프로젝트 규모가 커질수록 Spring을 사용하는 이유를 더욱 깨닫게 될 것이다.
※ 이 글은 Seoul Wiz - '실전 Spring 강좌'를 요약하여 작성하였습니다.
관련 글
2018/01/11 - [WEB/SpringMVC] - SpringMVC :: 스프링 프레임워크 설치하기 #1
2018/01/11 - [WEB/SpringMVC] - SpringMVC :: 스프링 property 설정 하는 방법 #3
'WEB > SpringMVC' 카테고리의 다른 글
SpringMVC :: 스프링(Spring)의 범위 scope, 싱글톤(singleton) (299) | 2018.03.10 |
---|---|
SpringMVC :: 스프링 컨테이너의 생명주기, 빈의 생명주기 (Life cycle), InitialzingBean, DisposableBean, @PreDestroy, @PostConstruct (1119) | 2018.03.10 |
SpringMVC :: java 파일을 이용해서 Bean(빈) 생성하기 (152) | 2018.03.10 |
SpringMVC :: 스프링 property 설정 하는 방법 #3 (0) | 2018.01.11 |
SpringMVC :: 스프링 프레임워크 설치하기 #1 (0) | 2018.01.11 |
최근댓글