공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
네티를 공부하다가 스프링을 같이 연동해서 사용을 해야해서 스프링을 공부하고 있습니다.
이번 포스팅에서는 DI(의존관계주입) 에 대해서 알아보겠습니다.
의존관계가 먼저 무엇인지에 대해 알아보겠습니다.
세 개의 클래스가 있습니다.
MainClass, Sub1, Sub2
MainClass 는 혼자서 동작하지 못하고, Sub1 과 Sub2 를 의존해서 동작합니다.
즉 Sub1 이나 Sub2 가 변경되거나 무언가 추가가 되거나 형식이 바뀐다면,
그 영향이 MainClass에 전달된다는 것입니다.
대표적 예가 MainClass 에서 Sub1의 메서드를 호출하는 경우입니다.
Sub1의 메서드가 추가되거나 기존 메서드 형식이 변경된다면 그에 따라
MainClass 도 수정되거나 추가되어야 합니다.
이런 경우 MainClass 와 Sub1은 의존관계가 있다고 말 할 수 있습니다.
그리고 의존관계에는 방향성이 있습니다.
여기서 MainClass 는 Sub1에 의존하지만, Sub1은 MainClass에 의존하지 않습니다.
여기서 의존하는 방법에는 두 가지가 있습니다.
첫 번째 우리가 아주 잘 알고 있는 new 연산자를 통해서
MainClass 내부에 Sub1 객체와 Sub2 객체를 생성해서 사용하는 것입니다.
두 번째는 Sub1과 Sub2 의 객체를 외부에서 만들어서 MainClass에 주입해주는 것입니다.
주입해주는 방법에는 setter 와 constructor 가 있습니다.
스프링에서는 바로 두 번째 방법을 사용합니다.
[ 광고 보고 가시죠! ]
[ 감사합니다! ]
첫 번째 방법의 경우(스프링이 적용되지 않은 방법)
Running.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Running { public static void main(String[] args) { MyCalc mCal = new MyCalc(); // 직접 new 연산자로 객체 생성 mCal.setCalculator(new Calc()); mCal.setFirstNum(10); mCal.setSecondNum(2); mCal.add(); mCal.sub(); mCal.mul(); mCal.div(); } } | cs |
Calc.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public class Calc { public void add(int f, int s) { System.out.println("add()"); int result = f + s; System.out.println(f + " + " + s + " = " + result ); } public void sub(int f, int s) { System.out.println("sub()"); int result = f - s; System.out.println(f + " - " + s + " = " + result ); } public void mul(int f, int s) { System.out.println("mul()"); int result = f * s; System.out.println(f + " * " + s + " = " + result ); } public void div(int f, int s) { System.out.println("div()"); int result = f / s; System.out.println(f + " / " + s + " = " + result ); } } | cs |
MyCalc.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | public class MyCalc { Calc calculator; private int first; private int second; public MyCalc() { } public void add() { calculator.add(first, second); } public void sub() { calculator.sub(first, second); } public void mul() { calculator.mul(first, second); } public void div() { calculator.div(first, second); } public void setCalculator(Calc calculator) { this.calculator = calculator; } public void setFirstNum(int first) { this.first = first; } public void setSecondNum(int second) { this.second = second; } } | cs |
이번에는 스프링이 적용된 위에서 말한 두 번째 방법입니다.
Running.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Running { public static void main(String[] args) { String configLocation = "classpath:applicationContext.xml"; AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation); MyCalc myCalculator = ctx.getBean("myCalc", MyCalc.class); myCalculator.add(); myCalculator.sub(); myCalculator.mul(); myCalculator.div(); } } | cs |
Calc.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class Calc { public void addition(int f, int s) { System.out.println("addition()"); int result = f + s; System.out.println(f + " + " + s + " = " + result ); } public void subraction(int f, int s) { System.out.println("subraction()"); int result = f - s; System.out.println(f + " - " + s + " = " + result ); } public void multiplication(int f, int s) { System.out.println("multiplication()"); int result = f * s; System.out.println(f + " * " + s + " = " + result ); } public void division(int f, int s) { System.out.println("division()"); int result = f / s; System.out.println(f + " / " + s + " = " + result ); } } | cs |
MyCalc.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class MyCalc { Calc calc; private int first; private int second; public MyCalc() { } public void add() { calc.addition(first, second); } public void sub() { calc.subraction(first, second); } public void mul() { calc.multiplication(first, second); } public void div() { calc.division(first, second); } public void setCalc(Calc calc) { this.calc = calc; } public void setFirst(int first) { this.first = first; } public void setSecond(int second) { this.second = second; } } | cs |
applicationContext.xml 이파일은 src/main/resources 아래에 생성하시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?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-4.3.xsd"> <bean id="calc" class="org.mon.altong.on.Calc"/> <bean id="myCalc" class="org.mon.altong.on.MyCalc"> <property name="calc" ref="calc"/> <property name="first" value="10"/> <property name="second" value="2"/> </bean> </beans> | cs |
new 연산자 대신에 <bean> 이라는 태그로 객체를 생성합니다.
이 bean을 통해 생성된 객체는 기본적으로 싱글톤입니다.
간단히 알아보았는데요.
다음포스팅에서는 첫 번째 방법과 두 번째 방법의 상관관계와
xml로 DI, Java 코드로 DI 하는 방법에 대해 알아보겠습니다.
이상입니다.
감사합니다.
'Spring(스프링), Spring Boot(스프링부트), JSP' 카테고리의 다른 글
스프링(Spring) DI설정방법[2] : DI in JAVA (0) | 2018.01.02 |
---|---|
스프링(Spring) DI설정방법[1] : DI in XML (0) | 2017.12.28 |
스프링(Spring) new 연산자를 이용한 객체생성과 DI를 이용한 객체생성의 관계 (0) | 2017.12.28 |
스프링(Spring) jdbcTemplate.queryForInt is Deprecated. 대체 방법 (1) | 2017.11.14 |
NoClassDefFoundError: org/junit/runner/JUnitCore 해결 방법 (0) | 2017.11.10 |