본문 바로가기
프로그래밍/Spring

Spring의 필요성 / Spring을 사용 했을 때

by 소소로드 2018. 4. 7.

[Spring의 필요성] 




: 우선 눈에 익도록 반복해서 볼 필요가 있는 구조

  ConfigurableApplicationContext 인터페이스를 상속받은 수많은 클래스들



 String configLocation = "classpath:applicationContext.xml";

        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);


ctx로 파싱할 때는 AbstractApplicationContext를 이용하고

xml파일을 담을 때는 GenericXmlApplicationContext를 이용하는 구나 하고 가볍게 넘어가면 된다.






- Spring을 사용 했을 때




Calculcator.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Calculcator {
    
    public void add(int firstNum, int secondNum) {
        System.out.println("add = " + (firstNum + secondNum));
    }
    public void sub(int firstNum, int secondNum) {
        System.out.println("sub = " + (firstNum - secondNum));
    }
    public void mul(int firstNum, int secondNum) {
        System.out.println("mul = " + (firstNum * secondNum));
    }
    public void div(int firstNum, int secondNum) {
        System.out.println("div = " + (firstNum / secondNum));
    }
}
 
cs




MyCalculator.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
40
41
42
43
44
45
46
public class MyCalculator {
    
    Calculcator calculator;
    private int firstNum;
    private int secondNum;
    
    
    public Calculcator getCalculator() {
        return calculator;
    }
    
    public void setCalculator(Calculcator 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;
    }
    
    public void plus() {
        calculator.add(firstNum, secondNum);
    }
    public void substract() {
        calculator.sub(firstNum, secondNum);
    }
    public void multiply() {
        calculator.mul(firstNum, secondNum);
    }
    public void divide() {
        calculator.div(firstNum, secondNum);
    }
    
}
 
cs


*

Calculcator와 MyCalculator는 앞선 예제와 동일하다.





MainClass.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main(String[] args) {
        
        String configLocation = "classpath:applicationContext.xml";
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
        
        MyCalculator myCalulator = ctx.getBean("myCalculator", MyCalculator.class);
        
        myCalulator.plus();
        myCalulator.substract();
        myCalulator.multiply();
        myCalulator.divide();
        
        ctx.close();
    }
 
}
 
cs


*
configLocation : 이 친구를 통해 classpath를 applicationContext.xml로 쓰겠다! 라고
위치를 지정해주면 스프링 컨테이너(IOC컨테이너)가 만들어진다.

AbstractApplicationContext : 컨택스트를 생성하는 인터페이스

getBean : applicationContext.xml에 지정된 bean id에서 뽑아오겠다 라는 의미이다.
MyCalculator.class는 해당클래스를 나타낸다.



*
즉, 설정파일.xml로 위치를 지정해주고
AbstractApplicationContext라는 인터페이스를 통해서 저장한 파일을 ctx에 담고
getBean을 통해서 xml에 있는 클래스와 해당 정보를 담는 것




applicationContext.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
 
    <bean id="calculator" class="com.yul.ex03_di.Calculcator"/>
    
    <bean id="myCalculator" class="com.codeWriter.ex03_di.MyCalculator">
        <property name="calculator" ref="calculator"/>
        <property name="firstNum" value="10"/>
        <property name="secondNum" value="2"/>
    </bean>
 
</beans>
 
cs
*
xml을 통해 매핑할 때는 차례대로 student의 생성자 or setter에 맞게 쓰면 된다.

bean : class를 한 뭉텡이를 지정한 뭉텡이라고 해야할까
id : 클래스 이름
class : 해당 클래스 주소

property : setter로 만들어진 이들을 이렇게 표현한다. MyCalculator에 세가지 객체가
setter로 지정되어있는 것을 볼 수 있다.
ref : 무엇을 참조하는지 - MyCalculator의 Calculcator calculator를 이렇게 표현한다.



Spring의 필요성?

자바는 털 끝하나 건드릴 필요없이 xml만 수정하면 되기 때문에 부품을 생성하고 조립하는데 편리하다.
당장 길이가 짧은 예제로는 와닿지 않아도 대형 프로젝트나 개인 프로젝트를 할 때
MainClass를 수정하지 않아도 되는 편리함이 좋다고 하니 일단 그렇다고 해두자.