본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


ktko.zip


따로 Spring Project를 만든 것이 아니라 Maven Project로 생성해보았다. Maven개념과 하나하나 셋팅해보는 것도 재미랄까.... 중요한 것은 DI가 무엇이고 어떤 개념인지 아는 것이 중요하니 설정 방법에 대해서는 따로 설명하지 않겠다. 예제는 첨부파일에 올려놓겠다. 항상 스프링 책을 보면 XML에 bean에 생성을 해 놓고 메인에서 GenericXmlApplicationContext로 생성된 bean을 가져오는 것을 볼 수 있다. GenericXmlApplicationContext 클래스는 XML로부터 정보를 읽어와 객체 생성과 초기화를 수행하는데, XML 파일이 아닌 자바 설정 코드나 그루비 설정 코드를 이용해 객체 생성 및 초기화를 수행하는 클래스를 제공하고 있다.


아래 사진은 GenericXmlApplicationContext의 계층도를 보여주고 있다. BeanFactory 인터페이스는 객체 생성과 검색에 대한 기능을 정의한다. 예를 들어 생성된 객체를 검색하는데 필요한 getBean() 메서드가 BeanFactory에 정의되어 있다. 객체를 검색하는 것 외에 싱글톤/프로토타입 빈인지 여부를 확인하는 기능도 제공한다.



GenericXmlApplicationContext : XML로부터 객체 설정 정보를 가져온다.

AnnotationconfigApplicationContext : 자바 어노테이션을 이용한 클래스로부터 객체 설정 정보를 가져온다.

GenericGroovyApplicationContext : 그루비 코드를 이용해 설정 정보를 가져온다.


어떤 구현 클래스를 사용하던, 각 구현 클래스는 빈(Bean)이라고 불리는 객체를 생성하고 그 객체를 내부에 보관한다. 그리고 getBean() 메서드를 실행하면 해당하는 빈 객체를 제공한다.


ApplicationContext 또는 BeanFactory는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하는데, 이런 이유로 ApplicationContext를 컨테이너라고 부른다. 


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
public class Greeter {
    
    private String format;
    
    public String greet(String guest) {
        return String.format(format,  guest);
    }
    
    public void setFormat(String format) {
        
        this.format = format;
    }
}
 
public class Main {
    public static void main(String[] args) {
        //설정 정보를 이용해서 빈 객체를 생성한다.
        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");
        
        //빈 객체를 제공한다.
        Greeter g = ctx.getBean("greeter", Greeter.class);
        
        String msg = g.greet("ktko");
        System.out.println(msg);
        
        ctx.close();
    }
}



1
2
3
4
5
6
7
8
9
10
11
<?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="greeter" class="ktko.Greeter">
        <property name="format" value="%s, 안녕하세요.!"/>
    </bean>
</beans>



getBean으로 가져오게 되면 싱글턴을 보장한다. 


아래 코드를 보면 getBean()으로 g, g2에 대한 객체를 가져옴을 알 수 있다. 그리고 객체를 == 비교하면 true가 나옴을 알 수 있다. 그 말은 getBean()은 단일 객체를 의미하며, 스프링은 기본적으로 한 개의 <bean> 태그에 대해 한 개의 빈 객체를 생성한다는 것을 알 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
    //설정 정보를 이용해서 빈 객체를 생성한다.
    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");
    
    //빈 객체를 제공한다.
    Greeter g = ctx.getBean("greeter", Greeter.class);
    Greeter g2 = ctx.getBean("greeter", Greeter.class);
    
    
    String msg = g.greet("ktko");
    System.out.println(msg);
    
    String msg1 = g.greet("kyungtae");
    System.out.println(msg1);
    
    System.out.println(g == g2);
    
    ctx.close();
}



출처 - 최범균님의 초보 웹 개발자를 위한 Spring4 프로그래밍 입문